2015-06-07 139 views
2

我正在使用PDFBox从我的pdf(仅包含jpg)中提取图像。PDFBox:从pdf中提取图像到输入流

由于我将这些图像保存在我的数据库中,我想直接将每个图像转换为输入流对象,而不将文件临时放置在我的文件系统中。然而,我面临着困难。我认为这是因为使用了image.getPDFStream().createInputStream()做,因为我在下面的例子一样:

while (imageIter.hasNext()) { 
    String key = (String) imageIter.next(); 
    PDXObjectImage image = (PDXObjectImage) images.get(key); 

    FileOutputStream output = new FileOutputStream(new File(
      "C:\\Users\\Anton\\Documents\\lol\\test.jpg")); 
    InputStream is = image.getPDStream().createInputStream(); //this gives me a corrupt file 
    byte[] buffer = new byte[1024]; 
    while (is.read(buffer) > 0) { 
     output.write(buffer); 
    } 
} 

但是这个工程:

while (iter.hasNext()) { 
    PDPage page = (PDPage) iter.next(); 
    PDResources resources = page.getResources(); 
    Map<String, PDXObject> images = resources.getXObjects(); 
     if (images != null) { 
      Iterator<?> imageIter = images.keySet().iterator(); 
      while (imageIter.hasNext()) { 
      String key = (String) imageIter.next(); 
      PDXObjectImage image = (PDXObjectImage) images.get(key); 
      image.write2file(new File("C:\\Users\\Anton\\Documents\\lol\\test.jpg")); //this works however 
     } 
    } 
} 

任何想法如何,我可以将每个PDXObjectImage(或任何其他对象我可以)到输入流?

回答

3

在PDFBox的1.8,最简单的方法是使用write2OutputStream(),所以你的第一个代码块现在应该是这样的:

while (imageIter.hasNext()) { 
    String key = (String) imageIter.next(); 
    PDXObjectImage image = (PDXObjectImage) images.get(key); 

    FileOutputStream output = new FileOutputStream(new File(
      "C:\\Users\\Anton\\Documents\\lol\\test.jpg")); 
    image.write2OutputStream(output); 
} 

先进的解决方案,只要你真的确定你只有该显示正常,即JPEG文件没有异常的色彩空间:

while (imageIter.hasNext()) { 
    String key = (String) imageIter.next(); 
    PDXObjectImage image = (PDXObjectImage) images.get(key); 

    FileOutputStream output = new FileOutputStream(new File(
      "C:\\Users\\Anton\\Documents\\lol\\test.jpg")); 
    InputStream is = image.getPDStream().getPartiallyFilteredStream(DCT_FILTERS); 
    byte[] buffer = new byte[1024]; 
    while (is.read(buffer) > 0) { 
     output.write(buffer); 
    } 
} 

第二溶液中移除所有的过滤器除DCT(= JPEG)滤波器。一些较旧的PDF具有多个过滤器,例如ascii85和DCT。

现在,即使您使用JPEG创建图像,您也不知道您的PDF创建软件的功能。找出它是什么类型的形象,一种方法是检查它是什么类(使用的instanceof):

- PDPixelMap => PNG 
- PDJpeg => JPEG 
- PDCcitt => TIF 

另一种方法是使用image.getSuffix()。

+0

谢谢配合它的工作!你认为可以在pdf中检索图像的数据类型(例如png或jpeg)吗? – user3125591

+0

@ user3125591完成了,我把它写入我的答案。 –

+0

谢谢你的帮助! – user3125591

1

如果您正在使用PDFBox的2.0.0或以上

PDDocument document = PDDocument.load(new File("filePath")); //filePath is the path to your .pdf 
PDFRenderer pdfRenderer = new PDFRenderer(document); 

for(int i=0; i<document.getPages().getCount(); i++){ 
    BufferedImage bim = pdfRenderer.renderImage(i, 1.0f, ImageType.RGB); //Get bufferedImage for page "i" with scale 1 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    ImageIO.write(bim, "jpg", os); 
    InputStream is = new ByteArrayInputStream(os.toByteArray()); 
    //Do whatever you need with the inputstream 
} 
document.close() 
+0

请删除您的答案 - 用户要求提供一种从PDF中提取图像的方式,而不是如何将整个PDF页面转换为图像(您所做的)。 –

+0

这个答案对任何使用PDFBox 2.0.0或以上版本的人来说都是正确的。 – dbaq