由PDF引起的XML解析错误(无效令牌)

时间:2017-08-19 07:40:56

标签: python xml pdf xfa

    我的一位同事填写了动态PDF表格,保存并发送给我。然而,由于可能使用了一些奇怪的符号,因此无法在同事或我的电脑上打开。它给出了 XML解析错误:格式不正确(无效令牌)(错误代码4)。该文档中有很多重要信息,所以我真的需要一种方法来恢复它。

    我尝试了许多推荐的东西,例如:     

            
  • 将官方Adobe Acrobat Reader升级到最新版本。然后修复它。
  •         
  • 使用其他软件打开,例如FOXIT阅读器,使用docs软件(Libre Office,记事本,Sublime等)。
  •         
  • 使用Adobe Acrobay Livecycle Design打开 - 创建了这个申请表(我想)的软件。
  •         
  • 使用不同的PDF2text库(用Python编写)。由于表格是动态的,这种方法效率低下
  •         
  • 在官方Adobe支持网站上发帖(是的,这是使用免费版软件从Adobe获得帮助的唯一途径)
  •     
    但是我想出了零结果。

error pic

    唯一成功的是用默认的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\00- 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

我尝试了许多不同的解码工具 - 没有成功。

1 个答案:

答案 0 :(得分:0)

您应该使用特定的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