【问题标题】:Using Powershell to Strip Content from PDF使用 Powershell 从 PDF 中剥离内容
【发布时间】:2016-12-15 17:56:47
【问题描述】:

使用 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 的格式?可能是我遗漏了一些简单的东西。

【问题讨论】:

  • "检查 Powershell 修改后的 PDF 的原始代码,“行”似乎比应有的短得多。" - 它们缺少什么?跨度>
  • 据我所知,这是空白。编码被保留,所有字符看起来都一样。我敢肯定还有其他地方发生了变化。
  • PDF 文件结构引用了相对于文件开头的二进制偏移量,因此您必须正确解析它using iTextSharp
  • 我又看了一遍,似乎我愚蠢地误解了空白。字体是变化的。我可能会尝试一些 MS Word 方法来解决这个问题。 @wOxxOm 我一直在避免使用像 iTextSharp 这样的 3rd 方实用程序,主要是因为没有它我似乎非常接近。我昨天确实下载了它,但只是戳了一下它。如果此时我无法掌握似乎是字体问题的问题,我将花更多时间来解决 itextsharp。

标签: powershell pdf file-io


【解决方案1】:

所以我正要开始研究 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 文档结束之后清除杂物,希望这会有所帮助,我有半个磨坊可以使用我将其变形为的任何脚本.如果我决定再次走这条路,如果我记得的话,我可能会更新 PS 版本。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多