使用Powershell从PDF中剥离内容,同时保留PDF格式。
我的任务:如果文档不是PDF格式,我一直在尝试执行一项简单的任务。在大量可用数据开始之前,我有一堆PDF包含不需要的数据,这是文档中‘%PDF’之前的任何内容。需要一个脚本来提取所有需要的数据并将其导出到新文件。这部分非常简单。
问题是:导出的数据看起来格式正确,只是不再以PDF格式打开。我可以在Notepad++中打开它,它看起来与一个干净的手动和工作的完全相同。检查Powershell修改后的PDF的原始代码,似乎“行”比它们应该的要短得多。
$Path = 'C:\FileLocation'
$Output = '.\MyFile.pdf'
$LineArr = @()
$Target = Get-ChildItem -Path $Path -Filter *.pdf -Recurse -ErrorAction SilentlyContinue | Get-Content -Encoding default | Out-String -stream
$Target.Where({ $_ -like '*%PDF*' }, 'SkipUntil') | ForEach-Object{
If ($_.contains('%PDF')){
$LineArr += "%" + $_.Split('%')[1]
}
else{
$LineArr += $_
}
}
$LineArr | Out-File -Encoding Default -FilePath $Output我知道PDF格式并不真正使用线条,所以这可能就是问题所在。无论是在最初将数据放入数组中时,还是在写入数据时,PDF格式都可能被破坏。有没有一种方法可以在修改后保存PDF时保留其格式?这可能是因为我遗漏了一些简单的东西。
发布于 2016-08-19 04:25:07
所以我正要开始研究iTextSharp,并决定先尝试一种更老的语言,Winbatch。(哦!)我几乎做了一个屏幕抓取器来做这项工作,但走那条路的羞耻感让我不知所措。因此,函数库是下一站。
这只是我在没有进行错误检查或日志记录的情况下吐出的一小段格式回复。所有这些都将在以后的文件搜索中添加。总而言之,它设法清除了PDF中所有不需要的多余内容,但保留了PDF所需的确切格式。
strPDFdoco = "C:\TestPDFs\Test.pdf"
strPDFString = "%%PDF"
strPDFendString = "%%%%END"
If FileExist(strPDFdoco)
strPDFName = ItemExtract(-1, strPDFdoco, "\")
strFixedPDFFullPath = ("C:\TestPDF\Fixed\": strPDFName)
strCurrentPDFFileSize = FileSize(strPDFdoco) ; Get size of PDF file
hndOldPDFFile = BinaryAlloc(strCurrentPDFFileSize) ; Allocate memory for reading PDF file
BinaryRead(hndOldPDFFile, strPDFdoco) ; Read PDF file
strStartIndex = BinaryIndexEx(hndOldPDFFile, 0, strPDFString, @FWDSCAN, @FALSE) ; Find start point for copy
strEndIndex = BinaryEodGet(hndOldPDFFile) ; find eof
strCount = strEndIndex - strStartIndex
strWritePDF = BinaryWriteEx( hndOldPDFFile, strStartIndex, strFixedPDFFullPath, 0, strCount)
BinaryFree(hndOldPDFFile)
ENDIF现在我已经知道了这是如何工作的,在PS中制作一个工具来做这件事听起来更可行。有一个名为Get-HexDump的PS函数,它可能是我学习PS位和十六进制的一个很好的基础。因为这在Winbatch中有效,所以我假设在AutoIt中也有某种等价物,并且它可以在大多数basic语言中重现。
似乎有很多人试图在标题之前和PDF docos结束后清除crud,希望这能有所帮助,我有半个百万的脚本要用我将其变形成的脚本。如果我决定再次走这条路,如果我记得的话,我可能会用PS版本更新。
https://stackoverflow.com/questions/38854941
复制相似问题