使用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时保留PDF的格式?可能就是我错过了一些简单的事情。
答案 0 :(得分:0)
所以我即将开始关注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中有某种等价物,它可以用大多数基本语言复制。
似乎有很多人试图在标题之前和他们的PDF文档结束之后清除crud,希望这有帮助,我有一个半磨机用任何脚本命中我变形为。如果我决定再次走这条路线,我可能会更新PS版本,如果我记得的话。