我使用以下代码从pdf中提取图像,这是PDFA1 1格式,但我无法获得图像。
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 )提取图像。似乎是下面这一行
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天了,但我仍然没有找到任何代码或文档。
如何在java中做到这一点??
如果不提取图像,可以得到DPI或者pdf是彩色的还是黑白的?
发布于 2015-01-07 20:15:35
你的问题是两个问题的组合:
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插件您的类路径,正如前面提到的这里。如果不这样做,除非禁用日志记录,否则将在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图像,它就是有点冒险。
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)使用前级循环。
如果这还不是显而易见的话:这与PDF/A :-)
6)我忘了您还问过如何查看它是否是b/w映像,下面是我在注释中提到的一些简单代码(不是优化的):
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);https://stackoverflow.com/questions/27800058
复制相似问题