我有供应商将其文档库作为一系列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"
问候, 格雷厄姆
感谢您提供的信息和XMP规范的链接,当我最初看到这个时我完全没有找到 - 我会给它看一看,尽管我只在一个供应商的PDF上使用它并且格式一致。 –
阅读您的个人资料,您在Adobe领域做了很多工作,您是否知道如何解决我在网络浏览器中搜索PDX目录的问题? –
不幸的是,这样做似乎并不容易。我听到的最后一个(这是旧信息)是该规范实际上是来自名为“Verity”的公司的专有信息,该公司现在称为HP网站。这可能意味着足迹在那里结束:-) –