You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:39:00