【问题标题】:Determine whether a PDF page contains text or is purely picture判断一个PDF页面是包含文字还是纯图片
【发布时间】:2013-05-10 08:30:31
【问题描述】:

如何判断一个PDF页面是包含文字还是纯图片,使用Java?

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

是否可以从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));  
        }

【问题讨论】:

  • 这似乎很复杂。也许你在这里需要赏金
  • 谢谢阿德尔先生,希望如此:)

标签: java parsing itext pdfbox


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    如果您可以使用涵盖最常见情况并偶尔丢失特殊 PDF 的临时解决方案,那么您已经有了一个很好的第一个解决方法。

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

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

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

    使用所有这些元素,您已经可以在很长的时间内实现您的需求,但请注意,总会有一些奇特的 PDF 文件会逃脱您的所有检查。

    【讨论】:

    • 非常感谢@Bruno Lowagie 先生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2014-11-02
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多