2013-06-23 30 views
0

我有供应商将其文档库作为一系列PDF文件(以及一些CHM文件)提供,并且还包含一个.PDX目录。如何在PowerShell中的PDF文档/ PDX目录中搜索

我想编写一个PowerShell脚本到前端(使用PowerShell表单或在asp.net中托管PowerShell)。

我处于早期阶段,我已经研究过如何从PDF流中获取文档信息(接近PDF文件末尾的xmpmeta XML元数据块 - 文件中的少数几个流之一明文),它看起来是这样的:

<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04 
     "><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about=" 
" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"><pdf:Producer>GPL Ghostscript 8.64</pdf:Producer><pdf:Keywo 
rds>86000056-413</pdf:Keywords></rdf:Description><rdf:Description rdf:about="" xmlns:xmp="http://ns.ad 
obe.com/xap/1.0/"><xmp:ModifyDate>2011-03-03T17:38:34-05:00</xmp:ModifyDate><xmp:CreateDate>2011-01-28 
T23:12:07+05:30</xmp:CreateDate><xmp:CreatorTool>PScript5.dll Version 5.2</xmp:CreatorTool><xmp:Metada 
taDate>2011-03-03T17:38:34-05:00</xmp:MetadataDate></rdf:Description><rdf:Description rdf:about="" xml 
ns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"><xmpMM:DocumentID>6cb2263d-2d61-11e0-0000-1390d57dcfcb</xmp 
MM:DocumentID><xmpMM:InstanceID>uuid:1a0e68ba-14ad-4a03-b7a1-0a0e127b8753</xmpMM:InstanceID></rdf:Desc 
ription><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:format>applicati 
on/pdf</dc:format><dc:title><rdf:Alt><rdf:li xml:lang="x-default">I/O Subsystem Programming Guide</rdf 
:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>Unisys Information Development</rdf:li></rdf:Seq 
></dc:creator><dc:description><rdf:Alt><rdf:li xml:lang="x-default">ClearPath MCP 13.1,Application Dev 
elopment,Administration,ClearPath MCP</rdf:li></rdf:Alt></dc:description></rdf:Description></rdf:RDF>< 
/x:xmpmeta> 

使用下面的代码(PowerShell的V3,在v2中,你需要选择,从而展开属性[string]$title = ($rdf.GetElementsByTagName('dc:title')| Select -expand Alt|Select -expand li)."#text"):

$file = ".\Downloads\68698703-007\PDF\86000056-413.pdf" 

#determine what line in file the xmpmeta string starts 
[int]$startln = (select-string -pattern '^<x:' $file).ToString().Split(":")[2] 

#determine what line in file the xmpmeta string ends 
[int]$endln = (select-string -pattern '^</x:' $file).ToString().Split(":")[2] 
$startln-- 

#grab the xmpmeta and cast as type xml 
[xml]$xmp = (gc $file)["$startln".."$endln"] 
[xml]$rdf = $xmp.xmpmeta.InnerXml 

#get title/creator/description element text 
[string]$title = $rdf.GetElementsByTagName('dc:title').Alt.li."#text" 
[string]$creator = $rdf.GetElementsByTagName('dc:creator').Alt.li."#text" 
[string]$description = $rdf.GetElementsByTagName('dc:description').Alt.li."#text" 

因为文件名是在这关键行为格式12345678-123.pdf因此,我可以生成一个文件列表(显示它们正确的标题,而不是真实的文件名),并允许它们启动,但我也想要能够使用PDX文件搜索所有文档,但绝不是纯文本!

我想我可以使用其中的一种工具将每个PDF转换为文本,搜索它,重复每个文档,然后返回每个文档的结果。

但是,Adobe Reader已经这么做了,所以我可以使用开关启动AcroRd32.exe来启动搜索,搜索条件已经传递到AcroRd32程序,或者我可以使用Adobe Powershell中的Search.API?

有关在Adobe Reader中自动加载.PDX并解除搜索或在PowerShell中使用Adobe API的任何想法?

编辑:
我现在可以从命令行和搜索杂技演员启动(所以可以在PowerShell中模仿这一点),但只搜索搜索PDF文件,而不是一个PDX目录时有效。两者都显示搜索窗格,但只有在PDF文档中才会填充搜索字段并执行搜索。

C:\Program Files (x86)\Adobe\Reader 10.0\Reader>AcroRd32.exe /A "search=trim" "P:\Doc Library\PDF\00_home.pdx" 

或者

C:\Program Files (x86)\Adobe\Reader 10.0\Reader>AcroRd32.exe /A "search=trim" "P:\Doc Library\PDF\86000056-413.pdf" 

问候, 格雷厄姆

回答

0

这是一个古老的职位,但要知道,你做搜索具有潜在的危险,并且有找到一个更好的办法PDF文件中的XMP元数据。 XMP专门设计为通过文本搜索“可找到”。为此,它定义了明确定义的开始和结束代码,以便您可以提取XMP数据,而不必解析PDF格式(或者可以嵌入XMP元数据blob的任何其他格式。)

您可以在这里下载XMP规范:http://www.adobe.com/devnet/xmp.html。第1部分是关于XMP Packets的解释说明文本扫描器如何更准确地找到XMP数据包的部分

最后,PDF有一个额外的怪癖,允许它以逐步更新。这可能会导致文件中出现多个XMP数据包(最后一个数据包通常是正确的数据包)。但令人讨厌的是,当从InDesign等应用程序中导出PDF时,PDF(和其他对象)中的图像可能也会附带自己的“对象”XMP。

因此,请考虑您的文件来自哪里,以及您可能会遇到多少奇怪的事情,并且您想要预备。但是阅读XMP规范肯定不是一个坏主意。

+0

感谢您提供的信息和XMP规范的链接,当我最初看到这个时我完全没有找到 - 我会给它看一看,尽管我只在一个供应商的PDF上使用它并且格式一致。 –

+0

阅读您的个人资料,您在Adobe领域做了很多工作,您是否知道如何解决我在网络浏览器中搜索PDX目录的问题? –

+1

不幸的是,这样做似乎并不容易。我听到的最后一个(这是旧信息)是该规范实际上是来自名为“Verity”的公司的专有信息,该公司现在称为HP网站。这可能意味着足迹在那里结束:-) –