2013-08-12 3 views
15

PDF 문서를 이미지로 변환하고 싶습니다. Ghost4j를 사용하고있었습니다.PDF 파일을 이미지로 변환

문제 : Ghost4J 런타임에 gsdll32.dll을 파일을 필요로하고 내가 하지가 DLL 파일을 사용 하시겠습니까.

질문 1 : dhost가없는 이미지를 변환하는 ghost4j에는 어떤 방법이 있습니까?

질문 2 : 나는 PDFBox API의 해결책을 발견. 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 상자를 사용하여 자바에서 이미지 형식으로 모든 PDF 페이지. jpg, jpeg, png, bmp, gif 포맷으로 이미지

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

가능한 전환 :

항아리

pdfbox-1.8.3.jar 또는 받는다는 의존성 여기

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

을 요구하는 솔루션이다.

: 나는 주로 사용되는 이미지 포맷을 언급했다.

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

콘솔 출력 :

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

당신은 아파치에서 떨어져 클래스 경로에 fontbox-1.7.1 단지를 포함해야합니다 오류에 대한

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

이 오류가 발생했습니다 2015 년 5 월 26 일 11:43:31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator 정보 : 지원되지 않거나 비활성화 된 작업 : BDC 2015 년 5 월 26 일 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를 사용하는 것이 네이티브 바인딩을 피하는 좋은 방법입니다. PDFBox에서 PDFImageWriter를 사용해 봅니다. 몇 줄에서 똑같이했는데 완벽하게 작동했습니다. PDFDocument를 추출하여 함께 사용해야합니다.

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

모든 페이지.

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

참조 : PDFImageWriter Javadoc

+1

동일한 예외가 있습니다! : – grep

+0

'ImageIO'보다 더 안정적으로'PDFImageWriter'입니까?'ImageIO'를 사용하는 것이 더 간단 할 것 같습니다. 믿을만하지 않다면 ... – mmcrae

+0

내 경험에 의하면, PDF에서 어떤 이미지도 쓰지 않습니다. 확인해 보겠습니다. 즉, PDF에 이미지가 있고 PNG에 나타나지 않습니다. – mmcrae

3

아마 당신이 손상된 PDF 파일을 변환 할 수 있습니다. PDF 파일에 JPXEncoded 스트림이 포함되어있을 때와 같은 오류가 발생했습니다.

+0

여러 PDF 파서에 이제 jbig2 디코더가 있습니다. –

6

당신은 (증분 업데이트) 일부 PDF 파일로 오류를 방지하기 위해 에게 NonSequentialParser를 사용하려고 할 수 있습니다

PDDocument의 문서 = 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

PDFbox 내부적으로 fontbox-1.7.1을 사용하여 문제를 해결할 pdfbox jar

+0

"INFO : 지원되지 않거나 비활성화 된 작업"INFO는 무해하며 무시할 수 있습니다. 그리고 아무도 1.7.1을 사용해서는 안됩니다. 현재 버전은 2.0.8입니다. –