读取PDF多行内容打印正常但写入文本文件仅保留最后一行求助
问题原因
你代码里的核心问题是:每次匹配到含"Color"的行时,都会重新创建PrintStream和FileOutputStream,而FileOutputStream默认是覆盖写入模式——每一次创建都会清空文件原有内容,最后自然只剩下最后一次写入的行。
解决方案
把文件输出流的初始化移到循环外部,确保整个程序只打开一次流,所有符合条件的内容都写入同一个流中,同时通过参数控制写入模式(追加/覆盖)。
修改后的完整代码:
import java.io.FileOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class PrintingOnlyLastLine { public static void main(String[] args) { boolean ColorVal; String my_new_str_ColorVal; String[] lines; File root = new File("<pdf file folder list>"); File[] list = root.listFiles(); // 将输出流移至外层,仅初始化一次 // 第二个参数true表示追加写入,若要每次运行清空文件则去掉该参数 try (PrintStream out = new PrintStream(new FileOutputStream("Output.txt", true))) { for (File f : list) { if (f.isDirectory()) { continue; // 跳过目录,原代码中f.getAbsolutePath()无实际作用 } else { File pdffile = new File("<pdf file folder list>" + f.getName()); try { System.out.println(f.getName()); PDDocument document = PDDocument.load(pdffile); PDFTextStripper pdfStripper = new PDFTextStripper(); String text = pdfStripper.getText(document); lines = text.split("\\r?\\n", -1); for (String line : lines) { ColorVal = line.contains("Color"); my_new_str_ColorVal = line.replace(".", ""); if (ColorVal) { out.println(my_new_str_ColorVal); // 用println保证每行单独显示 System.out.println(my_new_str_ColorVal); } } document.close(); // 关闭PDF文档,释放资源 } catch (IOException e) { e.printStackTrace(); // 不要吞异常,方便排查问题 } } } } catch (IOException e) { e.printStackTrace(); } } }
关键修改说明
- 流的初始化位置:将
PrintStream移到最外层try-with-resources中,确保整个程序周期内只打开一次文件流,避免重复创建导致的覆盖问题 - 写入模式控制:
FileOutputStream的第二个参数设为true时,新内容会追加到文件末尾;若需要每次运行清空原有内容,去掉该参数即可(默认覆盖模式) - 资源释放:新增
document.close()关闭PDF文档,避免文件占用或资源泄漏 - 格式优化:用
out.println()代替out.print(),让每行内容单独占一行,和控制台输出格式一致
内容的提问来源于stack exchange,提问作者Das Ziel
相关产品推荐
相关产品推荐

