将pdf从1.1版转换为1.4(或更高版本)

时间:2010-08-10 15:28:37

标签: pdf

如何将pdf文件从1.1版转换为1.4版(或更高版)?

实际上我需要某种命令行工具进行批量转换,或者某些API能够动态转换多个文档。

4 个答案:

答案 0 :(得分:1)

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

所以从理论上讲,你需要的只是一个工具,它会在前100个字节中查找“%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建议文档目录应包含带有文件版本的Version密钥。由于这在规范中被定义为可选项,因此您可以放弃它。

所以这将解决您的问题。但是,我并不相信你应该这样做。真。

您应该花一些时间阅读部分PDF规范,特别是有关版本号和兼容性的第I.2节。

答案 1 :(得分:0)

您很可能需要完整版Adobe Acrobat。 (与免费版Adobe Reader相反。)

答案 2 :(得分:0)

使用Ghostscript工具。

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o output.pdf input.pdf

答案 3 :(得分:0)

我刚刚遇到了这个问题。尝试向金融机构提交一些 PDF。 “我们只支持 PDF 1.4 或更新版本”。显然,我们的 HP 扫描仪创建了 1.3 版 PDF。

我用 Notepad++ 打开 PDF 文件,将 3 改为 4 并保存。就是这么简单。

这是文件的第一部分,是纯文本格式。