2012-01-02 3 views
21

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

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

Кода я пытаюсь: -

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

} 

Благодаря

+0

У меня была проблема, когда тест код: «UnsupportedOper» –

+0

ли вы нашли ответ, как декодировать JBIG2 изображения? – MyTitle

+0

ссылка на PDF недействительна –

ответ

0

формата PDF состоит из JBIG2 закодированных изображений. Я не уверен, поддерживает ли pdfBox.

+0

могу ли я использовать библиотеку jbig2-imageio: http://code.google.com/p/jbig2-imageio/wiki/Usage с этим приложением? Будет ли добавление его в приложение в качестве библиотеки jar или classpath? –

+0

@PradyutBhattacharya Вы нашли решение, как декодировать изображения JBIG2 с помощью 'jbig2-imageio'? спасибо – MyTitle

2

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

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

Это работает для меня.

3

Вы можете использовать функцию PDPage.convertToImage(), которая может конвертировать PDF-страницу в BufferedImage. Затем вы можете использовать BufferedImage для создания изображения.

Используйте следующую ссылку для более подробно:

  • Все PDF realated классы PDFBox вы можете получить в Apache PDFBox 1.8.3 API
  • Here вы можете увидеть PDPage соответствующую документацию.

И не забудьте найти функцию PDPage.convertToImage() в классе PDPage.

+0

как это связано с вопросом .... –

0

Вместо вызова

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

Ниже 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(); 
    } 
} 

}

+0

есть способ отсортировать это или убедиться, что это делается серийно? – Ian

+0

@Ian вы хотите получить изображения в последовательном порядке. – pudaykiran

+0

Да, я просто сделал вид в списке, и это сработало. – Ian

7

Для PDFBox 2.0.1, ответ pudaykiran должен быть слегка изменен, так как некоторые интерфейсы были изменены.

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

Отлично! Работает на меня. Но в моем cese с добавлением зависимости jai-imageio-jpeg2000 для преобразования изображений jpeg2000. –

11

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

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; 
} 
Смежные вопросы