将PDF从版本1.1转换为1.4(或更高版本)
您很可能需要完整版Adobe Acrobat。 (与免费版本相反,Adobe Reader。)
其实我需要某种命令行工具进行批量转换或某些API能够动态转换。 – user285677 2010-08-10 15:46:10
您应该将此要求添加到问题的详细信息中。 – JYelton 2010-08-10 15:57:57
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节。
Adobe规范包含以下实现注意事项: 14.Acrobat查看器也接受 %的表头!PS-Adobe-N.n PDF-M。m 也可能值得去寻找这种形式。 – Bobrovsky 2010-08-11 18:38:33
你能描述一下你为什么需要这个吗? 1.1与所有Acrobat版本兼容。 – plinth 2010-08-10 17:55:00
没有关于这种转换目标的更多细节,这个问题完全不清楚。 – Bobrovsky 2010-08-10 21:08:22
目标非常简单。将pdf从版本1.1转换为1.4 – user285677 2010-08-11 09:18:38