diff --git a/src/cnki_pdf.c b/src/cnki_pdf.c index 0c1ebb0..d96ea49 100644 --- a/src/cnki_pdf.c +++ b/src/cnki_pdf.c @@ -850,73 +850,75 @@ cnki_pdf_hn(cnki_t **param) for (int i = 0, j = 0; i < ptr->text_size - 1;) { switch (((unsigned char) ptr->text[i + 1] << 8) + (unsigned char) ptr->text[i]) { case 0x8001: - if (ptr->address_next > ptr->address) - strcat(dictionary, "T*\n"); - case 0x8070: - if (ptr->address_next > ptr->address) { - i += 4; + if (ptr->address_next <= ptr->address) { + if (i + 7 >= ptr->text_size) { + i += 2; + break; + } - for (;;) { - if (i + 3 >= ptr->text_size || - (unsigned char) ptr->text[i + 1] == 0x80) - break; + conv_src[0] = ptr->text[i + 7]; + conv_src[1] = ptr->text[i + 6]; - conv_src[0] = ptr->text[i + 3]; - conv_src[1] = ptr->text[i + 2]; + //snprintf(buf, 64, "1 0 0 1 %d %d Tm\n") + //strcat(dictionary, buf); - //snprintf(buf, 64, "%f %f Td\n"); - //strcat(dictionary, buf); + conv_size = 6; - conv_size = 6; - - if (strconv(&conv_dst, "UTF-16BE", - conv_src, "GB18030", &conv_size) == 0) { - if (conv_size - 2 > 0) { - strcat(dictionary, " Tj\n"); + if (strconv(&conv_dst, "UTF-16BE", + conv_src, "GB18030", &conv_size) == 0) { + if (conv_size - 2 > 0) { + strcat(dictionary, "<"); + for (int k = 0; k < conv_size - 2; k++) { + snprintf(conv_hex, 3, + "%02x", (unsigned char) conv_dst[k]); + strcat(dictionary, conv_hex); } - free(conv_dst); + strcat(dictionary, "> Tj\n"); } - - i += 4; + free(conv_dst); } + i += 8; break; } - if (i + 7 >= ptr->text_size) { - i += 2; + strcat(dictionary, "T*\n"); + case 0x8070: + i += 4; + + if (ptr->address_next <= ptr->address) break; - } - conv_src[0] = ptr->text[i + 7]; - conv_src[1] = ptr->text[i + 6]; + for (;;) { + if (i + 3 >= ptr->text_size || + (unsigned char) ptr->text[i + 1] == 0x80) + break; - //snprintf(buf, 64, "%f %f Td\n"); - //strcat(dictionary, buf); + conv_src[0] = ptr->text[i + 3]; + conv_src[1] = ptr->text[i + 2]; - conv_size = 6; + //snprintf(buf, 64, "1 0 0 1 %d %d Tm\n") + //strcat(dictionary, buf); - if (strconv(&conv_dst, "UTF-16BE", - conv_src, "GB18030", &conv_size) == 0) { - if (conv_size - 2 > 0) { - strcat(dictionary, " 0) { + strcat(dictionary, "<"); + for (int k = 0; k < conv_size - 2; k++) { + snprintf(conv_hex, 3, + "%02x", (unsigned char) conv_dst[k]); + strcat(dictionary, conv_hex); + } + strcat(dictionary, "> Tj\n"); } - strcat(dictionary, "> Tj\n"); + free(conv_dst); } - free(conv_dst); + + i += 4; } - i += 8; break; case 0x800a: if (i + 27 >= ptr->text_size || j >= ptr->image_length) { diff --git a/src/jbig2.c b/src/jbig2.c index 9b3a9be..ea9233c 100644 --- a/src/jbig2.c +++ b/src/jbig2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, yzrh + * Copyright (c) 2022-2023, yzrh * * SPDX-License-Identifier: Apache-2.0 */ @@ -31,5 +31,6 @@ strdec_jbig2(char **bitmap, } jbig2_release_page(ctx, image); + jbig2_ctx_free(ctx); return 0; } diff --git a/src/pdf_writer.c b/src/pdf_writer.c index 465d26b..6afa89b 100644 --- a/src/pdf_writer.c +++ b/src/pdf_writer.c @@ -1,19 +1,39 @@ /* - * Copyright (c) 2020-2022, yzrh + * Copyright (c) 2020-2023, yzrh * * SPDX-License-Identifier: Apache-2.0 */ #include +#include #include +#include "version.h" #include "md5.h" #include "pdf.h" +static int +_info_obj(pdf_object_t **pdf) +{ + char dictionary[128] = "<<\n" + "/Producer (Melon " VERSION "." RELEASE "." PATCH EXTRA ")\n" + "/CreationDate (D:"; + + char buf[64]; + + time_t timestamp = time(NULL); + + strftime(buf, 64, "%Y%m%d%H%M%S", gmtime(×tamp)); + strcat(dictionary, buf); + strcat(dictionary, "+00'00')\n>>"); + + return pdf_obj_append(pdf, 0, NULL, dictionary, NULL, 0); +} + int pdf_dump_obj(pdf_object_t **pdf, FILE **fp) { - if (*pdf == NULL || *fp == NULL) + if (*pdf == NULL || *fp == NULL || _info_obj(pdf) != 0) return 1; long cur; @@ -152,18 +172,11 @@ pdf_dump_trailer(pdf_object_t **pdf, FILE **fp, int xref) while (ptr->next != NULL) ptr = ptr->next; - /* - * TODO: Document information dictionary - * `"/Producer (Melon)"' - * `"/CreationDate (D:YYYYMMDDHHmmSS+00'00')"' - * - * Trailer dictionary - * `"/Info %d 0 R"' - */ fprintf(*fp, - "/Size %d\n/Root %d 0 R\n", + "/Size %d\n/Root %d 0 R\n/Info %d 0 R\n", ptr->id + 1, - pdf_get_catalog_id(pdf)); + pdf_get_catalog_id(pdf), + ptr->id); fputs("/ID [", *fp); diff --git a/src/version.h b/src/version.h index 46eeb34..c3ff314 100644 --- a/src/version.h +++ b/src/version.h @@ -5,6 +5,6 @@ */ #define VERSION "0" -#define RELEASE "2" -#define PATCH "5" +#define RELEASE "3" +#define PATCH "0" #define EXTRA ""