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 о номерах версий и совместимости.