2010-08-10 598 views
-1

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

其实我需要某种命令行工具进行批量转换或某些API能够动态转换整体文档。

+0

你能描述一下你为什么需要这个吗? 1.1与所有Acrobat版本兼容。 – plinth 2010-08-10 17:55:00

+0

没有关于这种转换目标的更多细节,这个问题完全不清楚。 – Bobrovsky 2010-08-10 21:08:22

+0

目标非常简单。将pdf从版本1.1转换为1.4 – user285677 2010-08-11 09:18:38

回答

0

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

+0

其实我需要某种命令行工具进行批量转换或某些API能够动态转换。 – user285677 2010-08-10 15:46:10

+0

您应该将此要求添加到问题的详细信息中。 – JYelton 2010-08-10 15:57:57

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 

所以从理论上讲,所有你需要的是一个工具,它会对着前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

Adob​​e规范包含以下实现注意事项: 14.Acrobat查看器也接受 %的表头!PS-Adobe-N.n PDF-M。m 也可能值得去寻找这种形式。 – Bobrovsky 2010-08-11 18:38:33

相关问题