Parsing 使用Java代码逐行[顺序]读取PDF文件,并将其转换为文本

Parsing 使用Java代码逐行[顺序]读取PDF文件,并将其转换为文本,parsing,pdf,sequential,Parsing,Pdf,Sequential,我需要按顺序解析pdf。我使用apache的pdfbox进行解析。但问题是,输出与PDF中显示的方式不同 例如: 如果PDF包含“我正在使用Apache的PDFBOX分析PDF”,则刮取的输出类似于“Apache的PDFBOX使用我正在分析的PDF”* 使用的代码: publicstaticvoid readingPageByPage(pddocumentdoc)引发IOException异常 { byte page=1;//包含数据的页面 试一试{ 如果(doc.isEncrypted()){

我需要按顺序解析pdf。我使用apache的pdfbox进行解析。但问题是,输出与PDF中显示的方式不同

例如:

如果PDF包含“我正在使用Apache的PDFBOX分析PDF”,则刮取的输出类似于“Apache的PDFBOX使用我正在分析的PDF”*

使用的代码:

publicstaticvoid readingPageByPage(pddocumentdoc)引发IOException异常
{
byte page=1;//包含数据的页面
试一试{
如果(doc.isEncrypted()){//检查密码保护的PDF。
doc.decrypt(“”;//尝试使用空字符串进行解密。
doc.setAllSecurityToBeRemoved(真);
}
PDDocumentCatalog cat=doc.getDocumentCatalog();
List pageList=cat.getAllPages();//将PDF的所有页面作为PDPage列表获取
PDFTextStripper pdfStripper=新的PDFTextStripper();
如果((pageList!=null)&&(!pageList.isEmpty()){
用于(PDPage PDPage:pageList){
pdfStripper.setStartPage(第页);
pdfStripper.setEndPage(第页);
字符串pageText=pdfStripper.getText(doc);//包含页面的内容
System.out.println(pageText);
page++;
}
}
doc.close();
}捕获(例外e){
e、 printStackTrace();
}
}

您能否提供一份PDF样本来重现该问题?虽然PDF内容确实可能包含未排序的绘图命令,但PDFBox会尝试对其进行大量排序。您可能有一个扫描过的文档,其中文本行稍微向上倾斜?您使用哪个PDFBox版本?它包含客户端数据,我无法共享。我使用了PDF BOX版本1.7.0。然后,它不是扫描的文档。在PDF中,在画布上没有特定的文本元素顺序是绝对合法的。这就是解析不充分的原因;你必须解释PDF文件。然而,如果文档以“结构化PDF”的形式出现,则可能会有一种解脱。在本例中,您可以解析结构,这更符合逻辑。为了获得文档中的某些结构,您可以尝试应用工具使其可访问(基本上符合PDF/UA)。PDF BOX版本1.7.0-请更新。@MaxWyss这就是解析不足的原因;你必须解释PDF文件目前的版本(1.8.3、1.8.4、2.0.0-SNAPSHOT)就是这样做的。这就是为什么我感到惊讶。可能在1.7.0中情况有所不同。
public static void readingPageByPage(PDDocument doc)throws IOException
    {
        byte page = 1; //page the data is contained on
        try{
            if (doc.isEncrypted()) {//To check for Password protected PDF.
                doc.decrypt("");//Trying to decrypt with a empty string.
                doc.setAllSecurityToBeRemoved(true);
            }
            PDDocumentCatalog cat = doc.getDocumentCatalog();
            List<PDPage> pageList = cat.getAllPages();//Get all pages of the PDF as PDPage list
            PDFTextStripper pdfStripper =  new PDFTextStripper();
            if((pageList != null) && (!pageList.isEmpty())){

                for (PDPage pdPage : pageList) {
                    pdfStripper.setStartPage(page);
                    pdfStripper.setEndPage(page);
                    String pageText = pdfStripper.getText(doc);//Contains the content of the page
                    System.out.println(pageText);
                    page++;
                }
            }
            doc.close();
        }   catch (Exception e){
            e.printStackTrace();
        }
    }