pages java image pdf pdfbox

java - pages - extraer imágenes desde pdf usando pdfbox



split pdf java (7)

Aquí está el código usando PDFBox 2.0.1 que obtendrá una lista de todas las imágenes del PDF. Esto es diferente al otro código en el sentido de que recurrirá a través del documento en lugar de tratar de obtener las imágenes desde el nivel superior.

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

Estoy intentando extraer imágenes de un pdf usando pdfbox. El pdf de ejemplo here

Pero estoy obteniendo imágenes en blanco solamente.

El código lo estoy intentando: -

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

Gracias


El PDF consiste en imágenes codificadas JBIG2. No estoy seguro si pdfBox los admite.


En lugar de llamar

image.write2file("C://Users//Pradyut//Documents//image" + i);

Puede usar el método estático ImageIO.write() para escribir la imagen RGB en el formato que necesite. Aquí he usado PNG:

File outputFile = new File( "C://Users//Pradyut//Documents//image" + i + ".png"); ImageIO.write( image.getRGBImage(), "png", outputFile);


La siguiente clase java GetImagesFromPDF obtiene todas las imágenes en el archivo 04-Request-Headers.pdf y guarda esos archivos en la carpeta de destino 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(); } }

}


Para PDFBox 2.0.1, la respuesta de pudaykiran debe modificarse ligeramente ya que algunas API se han modificado.

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


Puede usar la función PDPage.convertToImage() que puede convertir la página PDF en una Imagen Buffered. Luego puede usar la Imagen Buffered para crear una Imagen.

Use la siguiente referencia para más detalles:

  • Todas las clases PDF realated en PDFBox se pueden obtener en Apache PDFBox 1.8.3 API
  • Here puede ver la documentación relacionada con PDPage.

Y no olvide buscar la función PDPage.convertToImage() en la clase PDPage.


Simplemente agregue .jpeg al final de su ruta:

image.write2file("C://Users//Pradyut//Documents//image" + i + ".jpeg");

Funciona para mi.