извлекать изображения из pdf с помощью pdfbox

Я пытаюсь извлечь изображения из pdf, используя pdfbox. Пример pdf здесь

Но я получаю только пустые изображения.

Код im пытается: –

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

благодаря

Вот код с использованием PDFBox 2.0.1, который получит список всех изображений из PDF. Это отличается от другого кода тем, что он рекурсирует через документ вместо того, чтобы пытаться получить изображения с верхнего уровня.

 public List getImagesFromPDF(PDDocument document) throws IOException { List images = new ArrayList<>(); for (PDPage page : document.getPages()) { images.addAll(getImagesFromResources(page.getResources())); } return images; } private List getImagesFromResources(PDResources resources) throws IOException { List 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; } 

GetImagesFromPDF class java classа GetImagesFromPDF получает все изображения в файле 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 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 ответ 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 для создания изображения.

Для получения дополнительной информации используйте следующую ссылку:

  • Все classы, реализованные в PDF, в PDFBox, вы можете получить в API Apache PDFBox 1.8.3
  • Здесь вы можете увидеть документацию, связанную с PDPage.

И не забудьте найти PDPage.convertToImage() в classе PDPage.

Просто добавьте .jpeg в конец вашего пути:

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

Использование Emacs для рекурсивного поиска и замены в текстовых файлах, которые еще не открыты

Регулярное выражение для соответствия строке, которая не содержит слова?

Параметр TCP SO_LINGER (ноль) – когда требуется

Передача строк из C # в C ++ DLL и обратно – минимальный пример

Доступ к обработчику streamов пользовательского интерфейса из службы

Почему #ifndef и #define используются в файлах заголовков C ++?

Как найти переменные документа в MS Word без использования макроса

Microsoft Word – боковые заголовки

IntelliJ и JSP / JSTL не могут разрешить taglib для JSTL в tomcat7

Петля с нулевым временем выполнения

Как я могу объединить два массива в Java?

Сильно типизированная динамическая сортировка Linq

Получение соединения с базой данных в чистой настройке JPA

Студия Android добавляет внешний проект для сборки.gradle

Открыть / сохранить диалог файла занимает много времени, чтобы открыть его в Windows

Давайте будем гением компьютера.