当前位置: 首页 > 知识库问答 >
问题:

使用Apache POI和Apache PDFBox读取文档、pdf文件时的文本框位置错误

张星洲
2023-03-14

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

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

似乎是在结尾处而不是应该在的地方(即段落之间)添加文本框。这个问题在doc和pdf文件的情况下都存在。这意味着库、POI和PDFBox都存在相同的问题。

读取pdf文件的代码是:


    void pdf(String file) throws IOException {
        //Initialise file
        File myFile = new File(file);
        PDDocument pdDoc = null;
        try {
            //Load PDF
            pdDoc = PDDocument.load(myFile);
            //Create extractor
            PDFTextStripper pdf = new PDFTextStripper();
            //Extract text
            output = pdf.getText(pdDoc);
        }
        finally {
            if(pdDoc != null)
                //Close document
                pdDoc.close();
        }
    }

单据档案编码为:


    void doc(String file) throws FileNotFoundException, IOException {
        File myFile = null;
        WordExtractor extractor = null ;
        //initialise file
        myFile = new File(file);
        //create file input stream
        FileInputStream fis=new FileInputStream(myFile.getAbsolutePath());
        //open document
        HWPFDocument document=new HWPFDocument(fis);
        //create extractor
        extractor = new WordExtractor(document);
        //get text from document
        output = extractor.getText();
    }

共有1个答案

慕容光启
2023-03-14

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

 类似资料:
  • 背景 我一直在开发一个程序,它可以获取一个pdf,突出显示一些单词(通过pdfbox标记注释)并保存新的pdf。 为此,我扩展了PDFTextStripper类,以覆盖writeString()方法并获取每个单词(框)的TextPositions,这样我就可以准确地知道文本在PDF文档中的坐标位置(TextPosition对象为我提供每个单词框的坐标)。然后,在此基础上,我画了一个矩形,突出显示我

  • 问题内容: 我有一个zip存档,其中包含一堆纯文本文件。我想解析每个文本文件的数据。到目前为止,这是我写的内容: 我需要一个RandomAccessFile来做到这一点吗?我在拥有ZipInputStream的地方迷路了。 问题答案: 不,您不需要。首先获取此zip文件条目的数据: 然后将其包装为(从二进制解码为文本)和a (一次读取一行): 然后像往常一样从中读取行。像往常一样将所有适当的位包装

  • 问题内容: 我如何阅读像android app中的文本文件: 所以我可以返回一个字符串,如: 我想到的是(伪代码): 问题答案: 试试这个

  • 问题内容: 我在使用BufferedReader时遇到问题 我想打印一个文本文件的6行: 现在,从每次调用readLine()方法可以收集到的信息开始,它都会自动前进到下一行。 所以我不能使用条件br.readLine()!= null,因为它已经将其前进了一行,并且我得到了输出: 我使用什么条件来检查文本字段中是否还有新行。 提前致谢! 问题答案: 这就是问题: 您有两次调用-第一个 仅 检查是

  • 问题内容: 我需要在终端中传递一个文本文件,然后从中读取数据,我该怎么办? 如何从终端进入路径,如何在另一侧阅读? 问题答案: 您将要使用数组访问命令行参数以获取文件名,并使用FileSystem模块(fs)来读取文件。例如: 为了稍微分解一下,通常长度为2,第零个为“节点”解释器,第一个为节点当前正在运行的脚本,其后的项目在命令行中传递。从argv中提取文件名后,就可以使用文件系统函数读取文件并

  • 我想打印一个文本文件的6行: 现在,根据我每次调用readLine()方法时所收集到的信息,它会自动前进到下一行。 所以我不能使用条件br.readline()!=null,因为它已经提前了一行,我得到的输出是: 我使用什么条件来检查文本字段中是否还有新行。 提前道谢!