10

如何使用Java确定PDF页面是包含文本还是纯图片?

我搜索了许多论坛和网站,但我还没有找到答案。

是否可以从 PDF 中提取文本,以了解页面是图片格式还是文本格式?

PdfReader reader = new PdfReader(INPUTFILE);  
        PrintWriter out = new PrintWriter(new FileOutputStream(OUTPUTFILE));              
        for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
         // here I want to test the structure of the page !!!! if it's possible                         
         out.println(PdfTextExtractor.getTextFromPage(reader, i));  
        }
4

2 回答 2

8

没有防水的方法可以做你想做的事。

文本可以在 PDF 文件中以不同的方式出现。例如:可以使用图形状态操作符而不是使用文本状态来绘制所有字形。(如果这听起来像中文,我很抱歉,但我可以向你保证它是正确的 PDF 语言。)

如果一个涵盖最常见情况并偶尔错过异国 PDF 的临时解决方案对您来说是可以的,那么您已经有了一个很好的第一个解决方法。

在您的代码中,您遍历所有页面,并询问 iText 页面上是否有任何文本。这已经是一个很好的迹象。

在内部,您的代码正在使用该RenderListener接口。iText 解析页面内容并触发特定RenderListener实现中的方法。这是一个自定义实现的实现:MyTextRenderListenerParsingHelloWorld示例中使用了此自定义实现。

还有一种renderImage()方法(例如参见MyImageListener)。如果触发了这个方法,你就100%确定页面中还有一个Image,你可以使用ImageRenderInfo对象来获取图片的位置、宽度和高度(即:如果你知道如何解释方法Matrix返回getImageCTM())。

使用所有这些元素,您已经可以在很长的时间内实现您所需要的,但请注意,总会有异国情调的 PDF 可以逃脱您的所有检查。

于 2013-05-15T17:28:56.647 回答
0

使用 PDFBox 2.x 你可以试试这个:

    private boolean hasText(PDDocument doc) throws IOException {
        PDFTextStripper stripper = new PDFTextStripper();
        return stripper.getText(doc).trim().length() != 0;
    }

不幸的是,它首先扫描整个文件并且不会在第一个文本块处停止。但是,如果需要,您可以接收整个文本。

于 2020-03-03T15:26:46.303 回答