这是一个简单的问题。有人告诉我,我可以对 pdf 文件进行逆向工程,提取并分析底层的 XML 文件,并找出这个 pdf 的创建者名称。
但是,我用谷歌搜索了一段时间,并没有找到可行的解决方案。任何人都可以阐明这一点..?先感谢您!
这是一个简单的问题。有人告诉我,我可以对 pdf 文件进行逆向工程,提取并分析底层的 XML 文件,并找出这个 pdf 的创建者名称。
但是,我用谷歌搜索了一段时间,并没有找到可行的解决方案。任何人都可以阐明这一点..?先感谢您!
PDF 格式不是基于 XML,而是使用受 PostScript 启发的字典格式作为其“对象”和其他数据(如图像)的流。文档元数据的存储位置如下:
/Info包含“Author”、“Producer”、“Title”等键的字典。/Metadata可能包含带有附加信息的 XML 流的字典。以下是使用Didier Stevens 的低级 PDF 解析工具检索此信息的示例:
首先,显示“预告片”(类似于 PDF 的目录):
pdf-parser.py -et Excite_Project_ZN.pdf
trailer
<<
/Size 3373
/Root 1 0 R
/Info 219 0 R
/ID [<3572219E83326040B0789EBEAE24A285><3572219E83326040B0789EBEAE24A285>]
>>
trailer
<<
/Size 3373
/Root 1 0 R
/Info 219 0 R
/ID [<3572219E83326040B0789EBEAE24A285><3572219E83326040B0789EBEAE24A285>]
/Prev 2126182
/XRefStm 2119246
>>
现在让我们检查/Info对象(编号 219):
pdf-parser.py -o 219 Excite_Project_ZN.pdf
obj 219 0
Type:
Referencing:
<<
/Title ()
/Author (Alex Matrosov)
/Keywords (CTPClassification=CTP_PUBLIC:VisualMarkings=)
/CreationDate "(D:20161121224130-08'00')"
/ModDate "(D:20161121224130-08'00')"
/Producer '(\xfe\xff\x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00\xae\x00 \x00P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00\xae\x00 \x002\x000\x001\x006)'
/Creator '(\xfe\xff\x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00\xae\x00\x00P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00\xae\x00 \x002\x000\x001\x006)'
>>
所以这里我们有磁贴和作者。但还有更多。如果我们检查 Root 对象(编号 1):
>pdf-parser.py -o 1 Excite_Project_ZN.pdf
obj 1 0
Type: /Catalog
Referencing: 2 0 R, 220 0 R, 3370 0 R, 3371 0 R
<<
/Type /Catalog
/Pages 2 0 R
/Lang (en-US)
/StructTreeRoot 220 0 R
/MarkInfo
<<
/Marked true
>>
/Metadata 3370 0 R
/ViewerPreferences 3371 0 R
>>
我们可以看到对 的引用/Metadata。让我们检查一下:
>pdf-parser.py -o 3370 Excite_Project_ZN.pdf
obj 3370 0
Type: /Metadata
Referencing:
Contains stream
<<
/Type /Metadata
/Subtype /XML
/Length 3230
>>
这是一个需要提取的流:
>pdf-parser.py -o 3370 -x metadata.xml Excite_Project_ZN.pdf
输出是这个 XML:
<?xml version="1.0"?>
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta x:xmptk="3.1-701" xmlns:x="adobe:ns:meta/">
<?xpacket end="w"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description xmlns:pdf="http://ns.adobe.com/pdf/1.3/" rdf:about="">
<pdf:Producer>Microsoft® PowerPoint® 2016</pdf:Producer>
<pdf:Keywords>CTPClassification=CTP_PUBLIC:VisualMarkings=</pdf:Keywords>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default"/>
</rdf:Alt>
</dc:title>
<dc:creator>
<rdf:Seq>
<rdf:li>Alex Matrosov</rdf:li>
</rdf:Seq>
</dc:creator>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<xmp:CreatorTool>Microsoft® PowerPoint® 2016</xmp:CreatorTool>
<xmp:CreateDate>2016-11-21T22:41:30-08:00</xmp:CreateDate>
<xmp:ModifyDate>2016-11-21T22:41:30-08:00</xmp:ModifyDate>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
<xmpMM:DocumentID>uuid:9E217235-3283-4060-B078-9EBEAE24A285</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:9E217235-3283-4060-B078-9EBEAE24A285</xmpMM:InstanceID>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>