如何将pdf文件从1.1版转换为1.4版(或更高版)?
实际上我需要某种命令行工具进行批量转换,或者某些API能够动态转换多个文档。
答案 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 并保存。就是这么简单。
这是文件的第一部分,是纯文本格式。