gpt4 book ai didi

java - 无法从 PDFA1-a 格式文档中提取图像

转载 作者:行者123 更新时间:2023-12-02 05:05:53 25 4
gpt4 key购买 nike

我正在使用以下代码从 PDFA1-a 格式的 pdf 中提取图像,但我无法获取图像。

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;
}
}
}

我可以使用上面的代码提取普通 PDF 的图像,但无法提取 PDFA1-a 格式的 pdf。似乎是下面这行

PDResources pdResources = page.findResources(); 

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

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

BufferedImage bufferedImage = page.convertToImage();
File outputfile = new File(destinationDir+"image1.JPEG");
ImageIO.write(bufferedImage, "JPEG", outputfile);

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

目前我正在使用 PDFBox 来执行此操作。我已经花了 2 天在 google 上进行搜索,但仍然没有找到任何代码或文档来执行此操作。

如何在java中做到这一点?

是否可以在不提取图像的情况下获取 DPI 或 pdf 是彩色还是黑白??

最佳答案

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

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

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 插件添加到您的类路径中,如前所述 here 。如果不这样做,您将在 1.8.8 中收到此消息,除非您禁用日志记录:

ERROR [main] org.apache.pdfbox.filter.JBIG2Filter:69 - Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.

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

三个奖励提示:

3) 如果您自己创建了此图像,例如在复印机上,了解如何在不使用JBIG2压缩的情况下获取PDF图像,它是somewhat risky .

4) 不要使用 pdResources.getImages(),getImages 调用已被弃用。相反,使用 getXObjects(),然后检查迭代时获得的类型。

 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) 使用 foreach 循环。

如果还不是很明显的话:这与 PDF/A 无关:-)

6)我忘了你还问过如何查看它是否是黑白图像,这是我在评论中提到的一些简单代码(未优化):

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);

关于java - 无法从 PDFA1-a 格式文档中提取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com