Конвертировать PDF из версии 1.1 в 1.4 (или выше) - PullRequest
0 голосов
/ 10 августа 2010

Как я могу конвертировать pdf файлы с версии 1.1 до 1.4 (или выше)?

На самом деле мне нужен какой-то инструмент командной строки для пакетного преобразования или какой-то API, чтобы можно было динамически преобразовывать несколько документов.

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Pdf 1.1 совместим с pdf 1.4. Все в pdf 1.1 будет работать с pdf 1.4 - это гарантировано спецификацией. Давайте предположим, что у вас есть веская причина, почему это не достаточно хорошо для вас (допустим, например, что у вас есть инструмент, не соответствующий спецификации, который использует PDF и взрывается на любой версии файла, кроме 1.4).

Мы можем сосредоточиться на основных синтаксических различиях между версиями.

Все PDF-файлы имеют заголовок где-то в первых 1024 байтах. В большинстве случаев это самая первая строка, но это не гарантировано (я смотрю на вас, GhostScript!). Заголовок выглядит так в PDF 1.1:

%PDF-1.1

в PDF 1.4, это выглядит так:

%PDF-1.4

Таким образом, теоретически все, что вам нужно, - это инструмент, который будет искать в первых 1024 байтах файл для "% PDF-1.1" и изменять его на "% PDF-1.4". Вы можете использовать sed, perl и т. Д., Чтобы сделать что-то подобное для вас. Вы можете написать это на C, и у вас будет соблазн сделать что-то вроде этого:

#define PDFHEADERSIZE 1024
bool ChangeFileToNewPdfVersion(char *file)
{
    char *replacePoint = NULL;
    FILE *fp = fopen(file, "rw");
    char buf[PDFHEADERSIZE + 1];
    buf[PDFHEADERSIZE] = '\0';
    if (fread(buf, 1, PDFHEADERSIZE, fp) != PDFHEADERSIZE) { fclose(fp); return false; }
    fseek(fp, 0, SEEK_SET);
    if ((replacePoint = strstr(buf, "%PDF-1.1")) == NULL) { fclose(fp); return false; }
    replacePoint[7] = '4';
    if (fwrite(buf, 1, PDFHEADERSIZE, fp) != PDFHEADERSIZE) { fclose(fp); return false; }
    fflush(fp);
    fclose(fp);
    return;
}

, который будет работать в большинстве нормальных случаев. Он не будет работать, если файл начинается, например, с 0 байтов, которые будут служить нулевыми терминаторами в блоке данных.

Лучшим (на самом деле) выбором было бы создать простой конечный автомат, чтобы найти% PDF-1. считывая 1 байт за раз, пока он не найдет его или не пройдет 1017 (на 1024 меньше длины заголовка), затем читает следующий байт, если он равен «1», он ищет байт и записывает «4».

Единственное, о чем вам следует беспокоиться, это то, что в PDF 1.4 предлагается, чтобы в каталоге документов содержался ключ версии с версией файла. Так как это определено как необязательное в спецификации, вы можете игнорировать его.

Так что это решит вашу проблему. Я, однако, не считаю, что вам нужно это делать. Действительно.

Вам потребуется некоторое время, чтобы прочитать часть спецификации PDF, в частности, раздел I.2 о номерах версий и совместимости.

0 голосов
/ 10 августа 2010

Скорее всего вам понадобится полная версия Adobe Acrobat . (В отличие от бесплатной версии Adobe Reader.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...