首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从PDFA1 1-格式文档中提取图像

无法从PDFA1 1-格式文档中提取图像
EN

Stack Overflow用户
提问于 2015-01-06 13:50:35
回答 1查看 1.1K关注 0票数 0

我使用以下代码从pdf中提取图像,这是PDFA1 1格式,但我无法获得图像。

代码语言:javascript
复制
List<PDPage> list = document.getDocumentCatalog().getAllPages();

String fileName = oldFile.getName().replace(".pdf", "_cover");
int totalImages = 1;
for (PDPage page : list) {

    PDResources pdResources = page.findResources();

    Map pageImages = pdResources.getImages();
    if (pageImages != null) {
        InputStream xmlInputStream = null;
        Iterator imageIter = pageImages.keySet().iterator();
        while (imageIter.hasNext()) {
            String key = (String) imageIter.next();
            PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key);

            System.out.println(convertStreamToString(xmlInputStream));
            System.out.println(pdxObjectImage.hashCode());
            System.out.println(pdxObjectImage.getColorSpace().getJavaColorSpace().isCS_sRGB());

            pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages);
            totalImages++;

            break;
        }
    }
}

我能够使用上述代码提取非正常pdfs的图像,但不能为PDFA1 1(一种格式PDFs )提取图像。似乎是下面这一行

代码语言:javascript
复制
PDResources pdResources = page.findResources(); 

我甚至没有返回图像,我甚至尝试过page.getResources(),但仍然没有得到任何图像,我甚至尝试使用itext,但它仍然没有给我任何图像。

如果我尝试使用以下代码将PDF页面转换为图像

代码语言:javascript
复制
BufferedImage bufferedImage = page.convertToImage();
File outputfile = new File(destinationDir+"image1.JPEG");
ImageIO.write(bufferedImage, "JPEG", outputfile);

这些图像似乎没有与它们相关的元数据,所以我仍然无法知道它们的dpi,或者它们是彩色的还是灰色的。

目前我正在使用PDFBox进行搜索,我已经在谷歌上搜索了2天了,但我仍然没有找到任何代码或文档。

如何在java中做到这一点??

如果不提取图像,可以得到DPI或者pdf是彩色的还是黑白的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 20:15:35

你的问题是两个问题的组合:

1)“休息”;你的文件有两个图像。第一个是透明的,灰色的,或者其他什么的,JPEG编码的,但不是你想要的。第二个是您想要的,但中断在第一个映像之后中止。所以我把你的代码段改为:

代码语言:javascript
复制
while (imageIter.hasNext())
{
     String key = (String) imageIter.next();
     PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key);
     System.out.println(totalImages);
     pdxObjectImage.write2file("C:\\SOMEPATH\\" + fileName + "_" + totalImages);
     totalImages++;

     //break;
 }

2)第二个图像(有趣的)是JBIG2编码的。要对此进行解码,您需要添加levigo插件您的类路径,正如前面提到的这里。如果不这样做,除非禁用日志记录,否则将在1.8.8中得到此消息:

代码语言:javascript
复制
ERROR [main] org.apache.pdfbox.filter.JBIG2Filter:69 - Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.

(您没有收到该错误消息,因为这是第二个被JBIG2编码的错误消息)

有三个额外的提示:

3)如果您自己创建了这个图像,例如在复印机上,找出如何获得不需要JBIG2压缩的PDF图像,它就是有点冒险

4)不要使用pdResources.getImages(),不推荐使用getImages调用。相反,使用getXObjects(),然后检查迭代时得到的信息的类型。

代码语言:javascript
复制
 Iterator imageIter = pageImages.keySet().iterator();
 while (imageIter.hasNext())
 {
     String key = (String) imageIter.next();
     Object o = pageImages.get(key);
     if (o instanceof PDXObjectImage)
     {
         PDXObjectImage pdxObjectImage = (PDXObjectImage) o;

         // do stuff
     }
 }

( 5)使用前级循环。

如果这还不是显而易见的话:这与PDF/A :-)

6)我忘了您还问过如何查看它是否是b/w映像,下面是我在注释中提到的一些简单代码(不是优化的):

代码语言:javascript
复制
BufferedImage bim = pdxObjectImage.getRGBImage();

boolean bwImage = true;

int w = bim.getWidth();
int h = bim.getHeight();
for (int y = 0; y < h; y++)
{
    for (int x = 0; x < w; x++)
    {
        Color c = new Color(bim.getRGB(x, y));
        int red = c.getRed();
        int green = c.getGreen();
        int blue = c.getBlue();
        if (red == 0 && green == 0 && blue == 0)
        {
            continue;
        }
        if (red == 255 && green == 255 && blue == 255)
        {
            continue;
        }
        bwImage = false;
        break;
    }
    if (!bwImage)
        break;
}
System.out.println(bwImage);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27800058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档