PowerShell批量提取PDF内容写入TXT出现覆盖问题如何修改代码
问题根源
- 循环内每次对
$text直接赋值,新的PDF提取内容会覆盖之前的所有内容,循环结束后$text仅保留最后一个PDF的文本 - 原有代码中
$outfile = $f -join ', '逻辑错误,不需要对单个文件路径做拼接操作,直接传入文件完整路径即可 Out-File默认配置为覆盖写入模式,即使前面内容收集正确,如果不加特殊参数也会覆盖已有文件内容
修复方案
有两种修改方式,更推荐第二种适配数千份PDF的大数量场景,避免内存占用过高:
方案1:先收集所有文本再统一写入
适合PDF数量少、总文件体积小的场景:
Start-Process powershell.exe -Verb RunAs { # 把dll加载放到函数外,仅加载一次避免重复加载报错 Add-Type -Path "C:\ps\itextsharp.dll" function convert-PDFtoText { param( [Parameter(Mandatory=$true)][string]$file ) $pdf = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $file for ($page = 1; $page -le $pdf.NumberOfPages; $page++){ $text=[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdf,$page) Write-Output $text } $pdf.Close() } $content = Read-Host "What are we looking for?: " $file1 = Read-Host "Path to search: " $all = Get-Childitem -Path $file1 -Recurse -Filter *.pdf # 初始化空数组存储所有文本内容 $text = @() foreach ($f in $all){ # 直接传入文件完整路径,追加内容到数组而不是覆盖 $text += convert-PDFtoText $f.FullName } $text | Out-File "C:\ps\bulk.txt" -Encoding UTF8 Select-String -Path C:\ps\bulk.txt -Pattern $content | Out-File "C:\ps\select.txt" -Encoding UTF8 Start-Sleep -Seconds 60 }
方案2:边遍历边追加写入
适合数千份PDF的大体积场景,内存占用更低:
Start-Process powershell.exe -Verb RunAs { Add-Type -Path "C:\ps\itextsharp.dll" function convert-PDFtoText { param( [Parameter(Mandatory=$true)][string]$file ) $pdf = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $file for ($page = 1; $page -le $pdf.NumberOfPages; $page++){ $text=[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdf,$page) Write-Output $text } $pdf.Close() } $content = Read-Host "What are we looking for?: " $file1 = Read-Host "Path to search: " $all = Get-Childitem -Path $file1 -Recurse -Filter *.pdf # 提前清空已有输出文件(可选,避免多次运行内容累加) "" | Out-File "C:\ps\bulk.txt" foreach ($f in $all){ # 提取内容后直接追加写入文件,加-Append参数 convert-PDFtoText $f.FullName | Out-File "C:\ps\bulk.txt" -Append -Encoding UTF8 } Select-String -Path C:\ps\bulk.txt -Pattern $content | Out-File "C:\ps\select.txt" -Encoding UTF8 Start-Sleep -Seconds 60 }
核心修改点说明
- 移除了逻辑错误的
$outfile = $f -join ', '代码,直接传入PDF文件的完整路径$f.FullName给转换函数 - 方案1通过数组追加的方式保留所有PDF的提取内容
- 方案2通过
Out-File的-Append参数实现写入时追加内容而非覆盖,新增-Encoding UTF8参数避免中文乱码 - 将itextsharp.dll的加载逻辑移到函数外部,避免重复加载报错
内容的提问来源于stack exchange,提问作者pastor_will
相关产品推荐
相关产品推荐

