如何解码PDF文件并将其编码回来?

问题描述

我的总体目标是出于存档目的使某些PD​​F文件符合PDF / A标准。它们没有满足一项要求,即某些字形映射不应该映射为0。

我通常的策略是使用旧的软件"Pdfedit"来解码PDF文件,然后所有字节流都将为人类可读,编辑包含字形映射的PDF的相关部分,然后使用自动重新编码的Adobe Acrobat打开文件

现在,我有一些PDF在打开时会导致“ Pdfedit”崩溃。我尝试使用PDF-Parser,但Adobe Acrobat无法对其输出进行重新编码。

此外,相关部分过去看起来像这样解码:

/CMapType 2 def
 1 begincodespacerange
 <00><04>
 endcodespacerange
 5 beginbfchar
 <00><0000>
 <01><0000>
 <02><263A>
 <03><0000>
 <04><0000>
 endbfchar
 endcmap

但是现在我使用以下命令python3 pdf-parser.py -f -n /path/to/file.pdf > dump.txt,并在dump.txt中,相关部分如下所示:

b'/CMapType 2 def\n1 begincodespacerange\n<00><04>\nendcodespacerange\n5 beginbfchar\n<00><0000>\n<01><0000>\n<02><263A>\n<03><0000>\n<04><0000>\nendbfchar\nendcmap\nCMapName currentdict/CMap defineresource pop end end'

因此它是一个字节字符串,任何换行符都按字面量表示为\n。包含此内容的txt文件不能被Adobe Acrobat解释为PDF。

我现在还意识到,%%EOF之类的许多元素都由''分隔。

真正的问题是如何从pdf-parser.py获取Acrobat可读的输出,因为shell命令>不起作用,并且shell中的stdout也有问题。

我将尝试一些方法,但实际上可能需要一些帮助!

解决方法

回答我自己的问题,以防与某人相关。

pdf解析器背后的开发人员迪迪尔·史蒂文斯(Didier Stevens)回答说,他的工具并非为此而设计。他推荐使用qpdf。

那确实是解决方案。确保使用标志--stream-data=uncompress,以便在输出中也可以访问压缩的部分。与qpdf一起使用的命令是:

qpdf old_file.pdf --stream-data=uncompress --decode-level=all new_file.txt

您也可以将new_file输出为.pdf。无论如何,您都可以在文本编辑器中将其打开。完成要应用的更改后,您可以将结尾更改为pdf,并使用acrobat或任何其他转换程序对其进行进一步处理。