【问题标题】:Mispositioned textboxes in Reading doc, pdf files using Apache POI and Apache PDFBox使用 Apache POI 和 Apache PDFBox 阅读文档、pdf 文件时出现错误定位的文本框
【发布时间】:2012-07-10 20:39:42
【问题描述】:

我正在尝试读取和处理 Java 中的 .doc、.docx、.pdf 文件,方法是使用 Apache POI(用于 doc、docx)和 Apache PDFBox 将它们转换为单个字符串(用于 pdf)库。
在遇到文本框之前它工作正常。 如果格式如下:

第 1 段
文本框 1
第 2 段
文本框 2
第 3 段

那么输出应该是:
第 1 段文本框 1 第 2 段文本框 2 第 3 段
但我得到的输出是:
第 1 段 第 2 段 第 3 段 文本框 1 文本框 2

它似乎是在末尾添加文本框,而不是在它应该在的地方,即段落之间。这个问题在 doc 和 pdf 文件中都有。这意味着 POI 和 PDFBox 这两个库都出现了同样的问题。

读取 pdf 文件的代码是:

void pdf(字符串文件)抛出 IOException { //初始化文件 文件 myFile = 新文件(文件); PDDocument pdDoc = null; 尝试 { //加载PDF pdDoc = PDDocument.load(myFile); //创建提取器 PDFTextStripper pdf = new PDFTextStripper(); //提取文本 输出 = pdf.getText(pdDoc); } 最后 { 如果(pdDoc!= null) //关闭文档 pdDoc.close(); } }

doc文件的代码是:

无效文档(字符串文件)抛出 FileNotFoundException,IOException { 文件 myFile = null; WordExtractor 提取器 = null ; //初始化文件 我的文件 = 新文件(文件); //创建文件输入流 FileInputStream fis=new FileInputStream(myFile.getAbsolutePath()); //打开文档 HWPFDocument 文档=新 HWPFDocument(fis); //创建提取器 extractor = new WordExtractor(document); //从文档中获取文本 输出 = extractor.getText(); }

【问题讨论】:

  • 您可能会发现文本框被锚定到一个段落并且您无意中移动/丢失了锚点。如果您可以让 iText 为您提供有关文本框锚点的信息,那么也许您可以保留或重置它。
  • 您是否有理由直接使用底层库?使用 Apache Tika 可能会简单得多,它会包装库并生成一致的文本

标签: java pdf apache-poi doc pdfbox


【解决方案1】:

对于 PDFBox,请执行以下操作: pdf.setSortByPosition(true);

【讨论】:

    【解决方案2】:

    试试下面的pdf代码。以类似的方式,您也可以尝试使用 doc。

    void extractPdfTexts(String file) {
        File myFile = new File(file);
        String output;
        try (PDDocument pdDocument = PDDocument.load(myFile)) {
            PDFTextStripper pdfTextStripper = new PDFTextStripper();
            pdfTextStripper.setSortByPosition(true);
            output = pdfTextStripper.getText(pdDocument);
            System.out.println(output);
        } catch (InvalidPasswordException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 与原始代码的相关区别是 setSortByPosition(true) 调用,并且该调用已在 impeto 的回答中指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2014-07-11
    相关资源
    最近更新 更多