2013-08-12 5 views
15

Я хотел конвертировать PDF-документ в изображение. Я использовал Ghost4j.Преобразование PDF-файла в изображение

Проблема: Ghost4J нуждается gsdll32.dll файла во время выполнения, и я не хотите использовать файл DLL.

Вопрос 1: есть ли способ, в ghost4j конвертировать изображение без DLL?

Вопрос 2: Я нашел решение в API PDFBox. org.apache.pdfbox.pdmodel.PDPagep have method convertToImage() `, который преобразует PDF-страницу в формат изображения.

PDDocument doc = PDDocument.load(new File("/document.pdf")); 
List<PDPage>pages = doc.getDocumentCatalog().getAllPages(); 
PDPage page = pages.get(0); 
BufferedImage image =page.convertToImage(); 
File outputfile = new File("/image.png"); 
ImageIO.write(image, "png", outputfile); 
doc.close(); 

У меня есть только текст в документе PDF. и у меня есть это исключение, когда я запускаю этот код:

Aug 12, 2013 6:00:24 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: BDC 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.getawtFont(PDTrueTypeFont.java:481) 
    at org.apache.pdfbox.pdmodel.font.PDSimpleFont.drawString(PDSimpleFont.java:109) 
    at org.apache.pdfbox.pdfviewer.PageDrawer.processTextPosition(PageDrawer.java:235) 
    at org.apache.pdfbox.util.PDFStreamEngine.processEncodedText(PDFStreamEngine.java:496) 
    at org.apache.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.java:62) 
    at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:554) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:268) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:235) 
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:215) 
    at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:125) 
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:781) 
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:712) 
    at ge.eid.esignature.adessa.pades.sign.PDFtoImage.main(PDFtoImage.java:25) 
Caused by: java.lang.IllegalArgumentException 
    at java.nio.Buffer.position(Buffer.java:216) 
    at sun.font.TrueTypeFont.lookupName(TrueTypeFont.java:1153) 
    at sun.font.TrueTypeFont.getPostscriptName(TrueTypeFont.java:1205) 
    at java.awt.Font.getPSName(Font.java:1156) 
    at org.apache.pdfbox.pdmodel.font.FontManager.loadFonts(FontManager.java:101) 
    at org.apache.pdfbox.pdmodel.font.FontManager.<clinit>(FontManager.java:53) 
    ... 13 more 

ответ

25

Вы можете легко конвертировать 04-Request-Headers.pdf файлы в формат изображения.

Конвертировать все pdf-страницы в формат изображения в Java с помощью PDF Box.

Баночка требуется pdfbox-1.8.3.jar

или Maven зависимость

<dependency> 
    <groupId>org.apache.pdfbox</groupId> 
    <artifactId>pdfbox</artifactId> 
    <version>1.8.3</version> 
</dependency> 

Вот решение:

package com.pdf.pdfbox.examples; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.util.List; 

import javax.imageio.ImageIO; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 

@SuppressWarnings("unchecked") 
public class ConvertPDFPagesToImages { 
    public static void main(String[] args) { 
     try { 
     String sourceDir = "C:/Documents/04-Request-Headers.pdf"; // Pdf files are read from this folder 
     String destinationDir = "C:/Documents/Converted_PdfFiles_to_Image/"; // converted images from pdf document are saved here 

     File sourceFile = new File(sourceDir); 
     File destinationFile = new File(destinationDir); 
     if (!destinationFile.exists()) { 
      destinationFile.mkdir(); 
      System.out.println("Folder Created -> "+ destinationFile.getAbsolutePath()); 
     } 
     if (sourceFile.exists()) { 
      System.out.println("Images copied to Folder: "+ destinationFile.getName());    
      PDDocument document = PDDocument.load(sourceDir); 
      List<PDPage> list = document.getDocumentCatalog().getAllPages(); 
      System.out.println("Total files to be converted -> "+ list.size()); 

      String fileName = sourceFile.getName().replace(".pdf", "");    
      int pageNumber = 1; 
      for (PDPage page : list) { 
       BufferedImage image = page.convertToImage(); 
       File outputfile = new File(destinationDir + fileName +"_"+ pageNumber +".png"); 
       System.out.println("Image Created -> "+ outputfile.getName()); 
       ImageIO.write(image, "png", outputfile); 
       pageNumber++; 
      } 
      document.close(); 
      System.out.println("Converted Images are saved at -> "+ destinationFile.getAbsolutePath()); 
     } else { 
      System.err.println(sourceFile.getName() +" File not exists"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

Возможные превращения изображения в формат jpg, jpeg, png, bmp, gif.

Примечание: Я упомянул преимущественно используемые форматы изображений.

ImageIO.write(image , "jpg", new File(destinationDir +fileName+"_"+pageNumber+".jpg")); 
ImageIO.write(image , "jpeg", new File(destinationDir +fileName+"_"+pageNumber+".jpeg")); 
ImageIO.write(image , "png", new File(destinationDir +fileName+"_"+pageNumber+".png")); 
ImageIO.write(image , "bmp", new File(destinationDir +fileName+"_"+pageNumber+".bmp")); 
ImageIO.write(image , "gif", new File(destinationDir +fileName+"_"+pageNumber+".gif")); 

Консоль вывода:

Images copied to Folder: Converted_PdfFiles_to_Image 
Total files to be converted -> 13 
Aug 06, 2014 1:35:49 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_1.png 
Aug 06, 2014 1:35:50 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_2.png 
Aug 06, 2014 1:35:51 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_3.png 
Aug 06, 2014 1:35:51 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_4.png 
Aug 06, 2014 1:35:52 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_5.png 
Aug 06, 2014 1:35:52 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_6.png 
Aug 06, 2014 1:35:53 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_7.png 
Aug 06, 2014 1:35:53 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_8.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_9.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_10.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_11.png 
Aug 06, 2014 1:35:55 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_12.png 
Aug 06, 2014 1:35:55 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_13.png 
Converted Images are saved at -> C:\Documents\Converted_PdfFiles_to_Image 
+1

Я получаю эту ошибку 26 мая 2015 г. 11:43:31 org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: неподдерживаемая/отключенная операция: BDC 26 мая 2015 г. 11:43: 31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: неподдерживаемый/disab led: EMC Я использую pdfbox 1.8.9 jar –

+0

Это немного отличается для последней версии PDFbox. Используйте класс PDFRendered. –

+0

pdf, который имеет как текстовое, так и графическое содержимое. Я видел, что после получения окончательного изображения (входного файла pdf) текстовые данные опускаются, отображается только часть изображения (например, фоновое изображение и т. Д.). Любая помощь в этом отношении приветствуется. – yeppe

4

Путь к PDFBox - хороший способ избежать нативных привязок. Попробуйте использовать PDFImageWriter из PDFBox, я сделал то же самое с ним в нескольких строках, и он отлично работал. Вам необходимо извлечь PDFDocument и использовать с ним автора.

PDFImageWriter.write(doc, "png", null, , Integer.MAX_VALUE, "picture"); 

Для всех страниц.

PDFImageWriter.write(doc, "png", null, 0, 0, "picture"); 

См: PDFImageWriter Javadoc

+1

у него такое же исключение! :( – grep

+0

является 'PDFImageWriter' более надежно, чем' ImageIO'? Я бы предпочел использовать 'ImageIO', поскольку он кажется более простым ... если это не так надежно – mmcrae

+0

По моему опыту, это НЕ записывает никаких изображений из PDF, можете ли вы подтвердите? Т.е. у меня есть изображение в моем PDF-файле, и оно не отображается в PNG – mmcrae

3

Возможно, у вас есть попытаться преобразовать поврежденный файл PDF. У меня такие же ошибки, когда файл PDF содержит потоки JPXEncoded.

+0

Несколько парсеров PDF теперь имеют jbig2-декодеры, которые должны иметь возможность обрабатывать это –

6

Вы можете попробовать использовать NonSequentialParser, чтобы избежать ошибок с некоторыми PDF-файлов (с возрастающими обновлениями):

PDDocument DOC = PDDocument.loadNonSeq (новый файл ("/ Document.pdf"));

+0

Большое спасибо, это было полезно для меня –

0
try {   
       PDDocument document = PDDocument.load(PdfInfo.getPDFWAY()); 
       if (document.isEncrypted()) { 
        document.decrypt(PdfInfo.getPASSWORD()); 
       } 
       if ("bilevel".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_BINARY); 
       } else if ("indexed".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_INDEXED); 
       } else if ("gray".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_GRAY); 
       } else if ("rgb".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_INT_RGB); 
       } else if ("rgba".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_INT_ARGB); 
       } else { 
        System.exit(2); 
       } 
       PDFImageWriter imageWriter = new PDFImageWriter(); 
       boolean success = imageWriter.writeImage(document, PdfInfo.getIMAGE_FORMAT(),PdfInfo.getPASSWORD(), 
         PdfInfo.getSTART_PAGE(),PdfInfo.getEND_PAGE(),PdfInfo.getOUTPUT_PREFIX(),PdfInfo.getIMAGETYPE(),PdfInfo.getRESOLUTION()); 
       if (!success) { 
        System.exit(1); 
       } 
       document.close(); 

     } catch (IOException | CryptographyException | InvalidPasswordException ex) { 
      Logger.getLogger(PdfToImae.class.getName()).log(Level.SEVERE, null, ex); 
     } 
public class PdfInfo { 
    private static String PDFWAY;  
    private static String OUTPUT_PREFIX; 
    private static String PASSWORD; 
    private static int START_PAGE=1; 
    private static int END_PAGE=Integer.MAX_VALUE; 
    private static String IMAGE_FORMAT="jpg"; 
    private static String COLOR="rgb"; 
    private static int RESOLUTION=256; 
    private static int IMAGETYPE=24; 
    private static String filename; 
    private static String filePath=""; 
} 
0

Для ошибки:

org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: unsupported/disabled operation

Вам необходимо включить fontbox-1.7.1 банку в пути к классам, кроме Apache pdfbox jar, который исправит вашу проблему, поскольку PDFBox внутренне использует fontbox-1.7.1

+0

INFO: неподдерживаемая/отключенная операция INFO безвредна и может быть проигнорирована. И никто не должен использовать 1.7.1. Текущая версия 2.0.8. –