确定PDF页面是包含文本还是纯图片

时间:2013-05-15 16:42:06

标签: java parsing itext pdfbox

如何使用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));  
        }

2 个答案:

答案 0 :(得分:7)

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

文本可以在PDF文件中以不同方式显示。例如:可以使用图形状态运算符而不是使用文本状态来绘制所有字形。 (对不起,如果这对你来说听起来像中文,但我可以向你保证这是正确的PDF语言。)

如果一个特殊的解决方案能够覆盖最常见的情况并偶尔错过异国情调的PDF,那么您就可以获得良好的第一个解决方法。

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

在内部,您的代码使用RenderListener界面。 iText解析页面内容并触发特定RenderListener实现中的方法。这是自定义实现的实现:MyTextRenderListener。此自定义实现在ParsingHelloWorld示例中使用。

还有renderImage()方法(例如参见MyImageListener)。如果触发此方法,则您100%确定页面中还有一个图像,并且您可以使用ImageRenderInfo对象来获取图像的位置,宽度和高度(即:如果您知道如何解释Matrix方法返回的getImageCTM()

使用所有这些元素,您已经可以很长时间地实现所需,但请注意,总会有异乎寻常的PDF会逃脱您的所有检查。

答案 1 :(得分:0)

使用PDFBox 2.x,您可以尝试以下操作:

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

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