XML PDF 导致的解析错误(无效标记)
XML parsing error(invalid token) caused by PDF
我的一位同事填写了动态 PDF 表格,保存并发送给我。然而,由于可能使用了一些奇怪的符号,它没有打开,无论是在同事的还是我的电脑上。它给出 XML 解析错误:格式不正确(无效标记)(错误代码 4)。该文档中有很多重要信息,所以我真的需要一种方法来恢复它。
我尝试了很多推荐的东西,例如:
- 正在将官方 Adobe Acrobat Reader 升级到最新版本。之后修复它。
- 使用其他软件打开,例如 FOXIT reader,用于处理文档的软件(Libre Office、记事本、Sublime 等)。
- 使用 Adobe Acrobay Livecycle Design 打开 - 创建了此申请表(我想)的软件。
- 使用不同的 PDF2 文本库(用 Python 编写)。由于表单是动态的,这种方法效率低下
- 在官方 Adobe 支持网站上创建了 post(是的,这是使用免费版本软件从 Adobe 获得帮助的唯一途径)
但是我想出了零结果。
唯一成功的是使用默认 Windows 记事本打开 PDF。它显示了 XML 格式的代码,但是大部分代码都是编码的(在要点上,最后看到了一小部分编码代码,但还有更多)是这样的:
%PDF-1.6
%âãÏÓ
1 0 obj
<</AcroForm 59 0 R/MarkInfo<</Marked true>>/Metadata 2 0 R/Names 60 0 R/Pages 235 0 R/Type/Catalog/Perms 233 0 R/StructTreeRoot 243 0 R/NeedsRendering true>>
endobj
2 0 obj
<</Length 4114/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c005 78.150055, 2013/08/07-22:58:47 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:desc="http://ns.adobe.com/xfa/promoted-desc/">
<dc:format>application/pdf</dc:format>
<dc:creator>
<rdf:Seq>
<rdf:li>DAAD</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">PBF: Gutachtenformular</rdf:li>
</rdf:Alt>
</dc:title>
<pdf:Producer>Adobe XML Form Module Library</pdf:Producer>
<xmp:CreateDate>2008-08-14T09:56:29+02:00</xmp:CreateDate>
<xmp:CreatorTool>Adobe LiveCycle Designer ES 10.4</xmp:CreatorTool>
<xmp:MetadataDate>2017-03-17T09:14:06+01:00</xmp:MetadataDate>
<xmp:ModifyDate>2017-03-17T09:14:06+01:00</xmp:ModifyDate>
<xmpMM:DocumentID>uuid:d62a53c0-8974-4b14-888e-569579f416d8</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:c097e78e-1dd1-11b2-0a00-9e91daf58acd</xmpMM:InstanceID>
<desc:embeddedHref rdf:parseType="Resource">
<rdf:value>G:\Z2[=11=]- Verbindliche Formulare, Vorlagen\___Logo_fuer_Formulare_06_2015\DAAD_Globe_Logo-Supplement_eng_tl_rgb_300dpi.jpg</rdf:value>
<desc:ref>/template/subform[1]/pageSet[1]/pageArea[1]/draw[2]</desc:ref>
</desc:embeddedHref>
<desc:Schema-Anmerkung rdf:parseType="Resource">
<rdf:value>16 byte UUID in 32 chars (hexadecimal encoded)</rdf:value>
<desc:ref>/template/subform[1]/subform[1]/field[1]</desc:ref>
</desc:Schema-Anmerkung>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
endobj
214 0 obj
<</Filter[/FlateDecode]/Length 419>>stream
H‰¼“[kÂ0Çßýg}²LŠ¦àæC7'†nÞØžB°§.,¶¥IÕáüîKÓ8[´2˜¬”^’ÿ¹äwÎa>Tåg„¡_]û”°@HÊ9z6t:`%‡>гàërº%Æ‚…Á1UnnáÊiØ•M
我尝试了很多不同的解码工具 - 都没有成功。
你应该用过具体的FlateDecoding方法。
Stephen Haywood 编写了一个可行的解决方案。我在 Python 中检查了它的正确性 2. 只需将 PDF 标题更改为您的标题,并在终端中使用 python 命令将 运行 更改为您的标题。这是要点。
#!/bin/bash
import re
import zlib
pdf = open("some_doc.pdf", "rb").read()
stream = re.compile(r'.*?FlateDecode.*?stream(.*?)endstream', re.S)
for s in stream.findall(pdf):
s = s.strip('\r\n')
try:
print(zlib.decompress(s))
print("")
except:
pass
我的一位同事填写了动态 PDF 表格,保存并发送给我。然而,由于可能使用了一些奇怪的符号,它没有打开,无论是在同事的还是我的电脑上。它给出 XML 解析错误:格式不正确(无效标记)(错误代码 4)。该文档中有很多重要信息,所以我真的需要一种方法来恢复它。
我尝试了很多推荐的东西,例如:
- 正在将官方 Adobe Acrobat Reader 升级到最新版本。之后修复它。
- 使用其他软件打开,例如 FOXIT reader,用于处理文档的软件(Libre Office、记事本、Sublime 等)。
- 使用 Adobe Acrobay Livecycle Design 打开 - 创建了此申请表(我想)的软件。
- 使用不同的 PDF2 文本库(用 Python 编写)。由于表单是动态的,这种方法效率低下
- 在官方 Adobe 支持网站上创建了 post(是的,这是使用免费版本软件从 Adobe 获得帮助的唯一途径)
唯一成功的是使用默认 Windows 记事本打开 PDF。它显示了 XML 格式的代码,但是大部分代码都是编码的(在要点上,最后看到了一小部分编码代码,但还有更多)是这样的: 我尝试了很多不同的解码工具 - 都没有成功。%PDF-1.6
%âãÏÓ
1 0 obj
<</AcroForm 59 0 R/MarkInfo<</Marked true>>/Metadata 2 0 R/Names 60 0 R/Pages 235 0 R/Type/Catalog/Perms 233 0 R/StructTreeRoot 243 0 R/NeedsRendering true>>
endobj
2 0 obj
<</Length 4114/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c005 78.150055, 2013/08/07-22:58:47 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:desc="http://ns.adobe.com/xfa/promoted-desc/">
<dc:format>application/pdf</dc:format>
<dc:creator>
<rdf:Seq>
<rdf:li>DAAD</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">PBF: Gutachtenformular</rdf:li>
</rdf:Alt>
</dc:title>
<pdf:Producer>Adobe XML Form Module Library</pdf:Producer>
<xmp:CreateDate>2008-08-14T09:56:29+02:00</xmp:CreateDate>
<xmp:CreatorTool>Adobe LiveCycle Designer ES 10.4</xmp:CreatorTool>
<xmp:MetadataDate>2017-03-17T09:14:06+01:00</xmp:MetadataDate>
<xmp:ModifyDate>2017-03-17T09:14:06+01:00</xmp:ModifyDate>
<xmpMM:DocumentID>uuid:d62a53c0-8974-4b14-888e-569579f416d8</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:c097e78e-1dd1-11b2-0a00-9e91daf58acd</xmpMM:InstanceID>
<desc:embeddedHref rdf:parseType="Resource">
<rdf:value>G:\Z2[=11=]- Verbindliche Formulare, Vorlagen\___Logo_fuer_Formulare_06_2015\DAAD_Globe_Logo-Supplement_eng_tl_rgb_300dpi.jpg</rdf:value>
<desc:ref>/template/subform[1]/pageSet[1]/pageArea[1]/draw[2]</desc:ref>
</desc:embeddedHref>
<desc:Schema-Anmerkung rdf:parseType="Resource">
<rdf:value>16 byte UUID in 32 chars (hexadecimal encoded)</rdf:value>
<desc:ref>/template/subform[1]/subform[1]/field[1]</desc:ref>
</desc:Schema-Anmerkung>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
endobj
214 0 obj
<</Filter[/FlateDecode]/Length 419>>stream
H‰¼“[kÂ0Çßýg}²LŠ¦àæC7'†nÞØžB°§.,¶¥IÕáüîKÓ8[´2˜¬”^’ÿ¹äwÎa>Tåg„¡_]û”°@HÊ9z6t:`%‡>гàërº%Æ‚…Á1UnnáÊiØ•M
你应该用过具体的FlateDecoding方法。 Stephen Haywood 编写了一个可行的解决方案。我在 Python 中检查了它的正确性 2. 只需将 PDF 标题更改为您的标题,并在终端中使用 python 命令将 运行 更改为您的标题。这是要点。
#!/bin/bash
import re
import zlib
pdf = open("some_doc.pdf", "rb").read()
stream = re.compile(r'.*?FlateDecode.*?stream(.*?)endstream', re.S)
for s in stream.findall(pdf):
s = s.strip('\r\n')
try:
print(zlib.decompress(s))
print("")
except:
pass