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

将pdf从1.1版转换为1.4版(或更高版本),pdf,Pdf,如何将pdf文件从1.1版转换为1.4版(或更高版本) 实际上,我需要一些用于批量转换的命令行工具,或者一些能够动态转换多个文档的API。Pdf 1.1与Pdf 1.4向前兼容。pdf 1.1中的所有内容都将使用pdf 1.4,这是规范保证的。让我们假设您有一些合理的理由来解释为什么这对您来说不够好(例如,假设您有一个不符合规范的工具,它使用pdf并在低于1.4的任何文件版本上爆炸) 我们可以关注不同版本之间的主要句法差异 所有PDF文件的头都位于前1024字节的某个位置。在大多数情况下,这是第

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


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

Pdf 1.1与Pdf 1.4向前兼容。pdf 1.1中的所有内容都将使用pdf 1.4,这是规范保证的。让我们假设您有一些合理的理由来解释为什么这对您来说不够好(例如,假设您有一个不符合规范的工具,它使用pdf并在低于1.4的任何文件版本上爆炸)

我们可以关注不同版本之间的主要句法差异

所有PDF文件的头都位于前1024字节的某个位置。在大多数情况下,这是第一行,但这不能保证(我在看你的鬼脚本!)。标题如PDF 1.1中所示:

%PDF-1.1
在PDF 1.4中,它如下所示:

%PDF-1.4
#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;
}
因此,从理论上讲,您所需要的只是一个工具,它将在前1024个字节中查找“%PDF-1.1”的文件并将其更改为“%PDF-1.4”。您可以使用sed、perl等为您做类似的事情。您可以用C编写它,您可能会尝试这样做:

%PDF-1.4
#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节。

使用Ghostscript工具

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

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

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


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

您能描述一下为什么需要这个吗?1.1与Acrobat的所有版本都是向前兼容的。没有关于这种转换目标的更多细节,这个问题完全不清楚。目标非常简单。将pdf从1.1版转换为1.4版Adobe spec包含以下实现说明:14.Acrobat查看器也接受%格式的标题!附言−土砖−N.N PDF−M.M可能也值得一看这个表单。这个表单非常好用,谢谢,我希望其他人也能尝试一下。