【问题标题】:PDF Box generating blank images due to JBIG2 Images in itPDF Box 由于其中包含 JBIG2 图像而生成空白图像
【发布时间】:2013-12-23 20:34:27
【问题描述】:

让我先概述一下我的项目。我有一个 pdf,我需要使用 PDFBox API 将其转换为图像(一页一张图像),并使用 PDFBox API 本身将所有这些图像写入新的 pdf。基本上就是将pdf转成pdf,我们称之为PDF转码。

对于某些包含 JBIG2 图像的 pdf,convertToImage() 方法的 PDFbox 实现无声无息地失败,没有任何异常或错误,最后生成一个 PDF,但这一次,只有空白内容(白色)。我在控制台上收到的消息是:

Dec 06, 2013 5:15:42 PM org.apache.pdfbox.filter.JBIG2Filter decode
SEVERE: Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap getRGBImage
SEVERE: Something went wrong ... the pixelmap doesn't contain any data.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.util.operator.pagedrawer.Invoke process
WARNING: getRGBImage returned NULL

我需要知道如何解决这个问题?我们有类似的东西:

import org.apache.pdfbox.filter.JBIG2Filter; 

我不知道如何实现。

我正在搜索,但无济于事。有人可以建议吗?

【问题讨论】:

  • 啊,异常提示:“找不到ImageIO插件来解码JBIG2编码的数据流”; PDFBox 在渲染图像时使用 Java 标准类,它们需要外部 JBIG2 支持。
  • 那么import org.apache.pdfbox.filter.JBIG2Filter有什么用
  • JBIG2Filter 有什么用处 - 正如该类的 Javadoc 所说,它以 JBIG2Decode 过滤器为模型。 根据 @987654321 @ 第 7.4.7 节“JBIG2Decode 过滤器”:JBIG2Decode 过滤器 (PDF 1.4) 对使用 JBIG2 编码的单色(每像素 1 位)图像数据进行解码。

标签: pdf-generation pdfbox jbig2


【解决方案1】:

在 PDFBox https://issues.apache.org/jira/browse/PDFBOX-1067 中查看这张票。我认为您的问题的答案是:

  1. 确保您已为您的 Java 版本安装了 JAI 和 JAI-ImageIO 插件:可在此处获得正确的安装说明:http://docs.geoserver.org/latest/en/user/production/java.html
  2. 使用 JBIG2-imageio 插件,(较新的版本在 Apache2 许可下获得许可)https://github.com/levigo/jbig2-imageio/

【讨论】:

【解决方案2】:

我遇到了同样的问题,我通过在我的 pom.xml 中添加这个依赖来解决它:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>jbig2-imageio</artifactId>
    <version>3.0.2</version>
</dependency>

祝你好运。

【讨论】:

    【解决方案3】:

    我遇到了完全相同的问题。 我从 jbig2-imageio 我只是将它包含在我项目的应用程序库中,它开箱即用。正如亚当所说,它使用 GPL3。

    【讨论】:

      【解决方案4】:

      似乎不需要安装 JAI。 我只需要下载 levigo-jbig2-imageio-1.6.5.jar,将它放在我的依赖项 jars 的文件夹中,然后在 eclipse 中将它添加到 java 构建路径库中。 https://github.com/levigo/jbig2-imageio/

      【讨论】:

        【解决方案5】:
        import java.awt.image.BufferedImage
        import org.apache.pdfbox.cos.COSName
        
        import org.apache.pdfbox.pdmodel.PDDocument
        import org.apache.pdfbox.pdmodel.PDPage
        import org.apache.pdfbox.pdmodel.PDPageTree
        import org.apache.pdfbox.pdmodel.PDResources
        import org.apache.pdfbox.pdmodel.graphics.PDXObject
        import org.apache.pdfbox.rendering.ImageType
        import org.apache.pdfbox.rendering.PDFRenderer
        import org.apache.pdfbox.tools.imageio.ImageIOUtil
        
        
        import javax.imageio.ImageIO
        import javax.imageio.spi.IIORegistry
        import javax.imageio.spi.ImageReaderSpi
        import javax.swing.*
        import javax.swing.filechooser.FileNameExtensionFilter
        
        public class savePDFAsImage{
        
            String path = "c:/pdfImage/"
        
            //allow pdf file selection for extracting
            public static File selectPDF() {
                File file = null
                JFileChooser chooser = new JFileChooser()
                FileNameExtensionFilter filter = new FileNameExtensionFilter("PDF", "pdf")
                chooser.setFileFilter(filter)
                chooser.setMultiSelectionEnabled(false)
                int returnVal = chooser.showOpenDialog(null)
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    file = chooser.getSelectedFile()
                   println "Please wait..."
                }
                return file
            }
        
            public static void main(String[] args) {
                try {
         // help to view list of plugin registered. check by adding JBig2 plugin and JAI plugin
                    ImageIO.scanForPlugins()
                    IIORegistry reg = IIORegistry.getDefaultInstance()
                    Iterator spIt = reg.getServiceProviders(ImageReaderSpi.class, false)
                    spIt.each(){
                        println it.getProperties()
                    }
                    testPDFBoxSaveAsImage()
                    testPDFBoxExtractImagesX()
                } catch (Exception e) {
                    e.printStackTrace()
                }
            }    
        
            public static void testPDFBoxExtractImagesX() throws Exception {
                PDDocument document = PDDocument.load(selectPDF())
                PDPageTree list = document.getPages()
                for (PDPage page : list) {
                    PDResources pdResources = page.getResources()
                    for (COSName c : pdResources.getXObjectNames()) {
                        PDXObject o = pdResources.getXObject(c)
                        if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
                            File file = new File( + System.nanoTime() + ".png")
                            ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) o).getImage(), "png", file)
                        }
                    }
                }
                document.close()
                println "Extraction complete"
            }
            public static void testPDFBoxSaveAsImage() throws Exception {
                PDDocument document = PDDocument.load(selectPDF().getBytes())
                PDFRenderer pdfRenderer = new PDFRenderer(document)
                for (int page = 0; page < document.getNumberOfPages(); ++page) {
                    BufferedImage bim = pdfRenderer.renderImageWithDPI(page,300, ImageType.BINARY)
                    // suffix in filename will be used as the file format
                    OutputStream fileOutputStream = new FileOutputStream(+ System.nanoTime() + ".png")
                    boolean b = ImageIOUtil.writeImage(bim, "png",fileOutputStream,300)
                }
                document.close()
                println "Extraction complete"
            }
        }
        

        【讨论】:

        • 最好对代码 sn-p 提供一些简要说明。它可以帮助其他人更好地理解您的代码。
        • 在上面的代码 1 中。 ImageIO 块涵盖了对 JVM 支持的不同插件的测试。 2. testPDFBoxSaveAsImage() 将页面保存为单个图像。 3.testPDFBoxExtractImagesX() 将使用getxObject从PDF中提取图像。
        猜你喜欢
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多