使用pdfbox从PDF中提取图像
我尝试使用pdfbox从PDF中提取图像。 这里的例子pdf
但即时通讯只有空白图像。
代码即时尝试: –
public static void main(String[] args) { PDFImageExtract obj = new PDFImageExtract(); try { obj.read_pdf(); } catch (IOException ex) { System.out.println("" + ex); } } void read_pdf() throws IOException { PDDocument document = null; try { document = PDDocument.load("C:\\Users\\Pradyut\\Documents\\MCS-034.pdf"); } catch (IOException ex) { System.out.println("" + ex); } List pages = document.getDocumentCatalog().getAllPages(); Iterator iter = pages.iterator(); int i =1; String name = null; while (iter.hasNext()) { PDPage page = (PDPage) iter.next(); PDResources resources = page.getResources(); Map pageImages = resources.getImages(); if (pageImages != null) { Iterator imageIter = pageImages.keySet().iterator(); while (imageIter.hasNext()) { String key = (String) imageIter.next(); PDXObjectImage image = (PDXObjectImage) pageImages.get(key); image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i); i ++; } } } }
谢谢
下面的GetImagesFromPDF
java类获取04-Request-Headers.pdf文件中的所有图像,并将这些文件保存到目标文件夹PDFCopy中 。
import java.io.File; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; @SuppressWarnings({ "unchecked", "rawtypes", "deprecation" }) public class GetImagesFromPDF { public static void main(String[] args) { try { String sourceDir = "C:/PDFCopy/04-Request-Headers.pdf";// Paste pdf files in PDFCopy folder to read String destinationDir = "C:/PDFCopy/"; File oldFile = new File(sourceDir); if (oldFile.exists()) { PDDocument document = PDDocument.load(sourceDir); List<PDPage> list = document.getDocumentCatalog().getAllPages(); String fileName = oldFile.getName().replace(".pdf", "_cover"); int totalImages = 1; for (PDPage page : list) { PDResources pdResources = page.getResources(); Map pageImages = pdResources.getImages(); if (pageImages != null) { Iterator imageIter = pageImages.keySet().iterator(); while (imageIter.hasNext()) { String key = (String) imageIter.next(); PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key); pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages); totalImages++; } } } } else { System.err.println("File not exists"); } } catch (Exception e) { e.printStackTrace(); } }
}
这里是使用PDFBox 2.0.1的代码,它将得到PDF中所有图像的列表。 这与其他代码不同,它将recursion通过文档而不是尝试从顶层获取图像。
public List<RenderedImage> getImagesFromPDF(PDDocument document) throws IOException { List<RenderedImage> images = new ArrayList<>(); for (PDPage page : document.getPages()) { images.addAll(getImagesFromResources(page.getResources())); } return images; } private List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException { List<RenderedImage> images = new ArrayList<>(); for (COSName xObjectName : resources.getXObjectNames()) { PDXObject xObject = resources.getXObject(xObjectName); if (xObject instanceof PDFormXObject) { images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources())); } else if (xObject instanceof PDImageXObject) { images.add(((PDImageXObject) xObject).getImage()); } } return images; }
对于PDFBox 2.0.1,pudaykiran的答案必须稍微修改,因为一些API已被更改。
public static void testPDFBoxExtractImages() throws Exception { PDDocument document = PDDocument.load(new File("D:/Temp/Test.pdf")); 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("D:/Temp/" + System.nanoTime() + ".png"); ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)o).getImage(), "png", file); } } } }
您可以使用PDPage.convertToImage()
函数将PDF页面转换为BufferedImage。 接下来,您可以使用BufferedImage创build一个图像。
使用以下参考进一步的细节:
- PDFBox中的所有PDF相关类都可以在Apache PDFBox 1.8.3 API中获得
- 在这里你可以看到PDPage相关的文档。
并且不要忘记在PDPage类中寻找PDPage.convertToImage()
函数。
只需将.jpeg
添加到path的末尾即可:
image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i + ".jpeg");
这对我行得通。
PDF由JBIG2编码的图像组成。 我不确定pdfBox是否支持这些。
而不是打电话
image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i);
您可以使用ImageIO.write()
静态方法以任何您需要的格式写出RGB图像。 这里我使用了PNG:
File outputFile = new File( "C:\\Users\\Pradyut\\Documents\\image" + i + ".png"); ImageIO.write( image.getRGBImage(), "png", outputFile);