使用iText与PowerShell拆分PDF每页为文本文件时的内容追加问题
问题原因与解决办法
你的问题核心是**SimpleTextExtractionStrategy是有状态的实例**——你在循环外初始化了一次这个策略,每次调用GetTextFromPage时,它会把当前页面的文本追加到自身已存储的内容里,而不是只返回当前页的文本。所以即使你清空了$text变量,策略本身已经累积了之前所有页面的内容,导致后续写入的文件会包含之前所有页的内容。
修复步骤
- 将策略的初始化代码移到
for循环内部,每次处理新页面时都创建一个全新的SimpleTextExtractionStrategy实例,确保每次只提取当前页的文本。 - 用
Join-Path拼接文件路径,避免手动拼接字符串出现路径分隔符的问题。 - 建议用
try/finally块确保PDF资源能被正确释放,防止文件占用。
修改后的代码
$pdfReader = [PdfReader]::new($pdfName); $pdfDocument = [iText.Kernel.Pdf.PdfDocument]::new($pdfReader); $totalPages = $pdfDocument.GetNumberOfPages(); try { for ($p = 1; $p -le $totalPages; $p++) { # 每次循环创建新的提取策略,避免内容累积 [ITextExtractionStrategy] $strategy = [SimpleTextExtractionStrategy]::new(); $page = $pdfDocument.GetPage($p); $text = [PdfTextExtractor]::GetTextFromPage($page, $strategy); # 用Join-Path安全拼接路径 $fileout = Join-Path -Path $pageHoldTempDir -ChildPath "$textVersion$p.txt"; $text | Out-File -Path $fileout -Encoding UTF8; } } finally { # 确保无论是否出错都关闭资源 $pdfDocument.Close(); $pdfReader.Close(); }
额外说明
Out-File默认是覆盖模式(-Append才是追加),所以只要$text是当前页的纯内容,就会正确覆盖生成单独的文件。- 加入
-Encoding UTF8可以避免不同系统下的文本编码问题,确保生成的TXT文件兼容性更好。
内容的提问来源于stack exchange,提问作者VACoder
相关产品推荐
相关产品推荐

