2013-02-22 21 views
8

Korzystając z pdfbox, czy możliwe jest przekonwertowanie pliku PDF (lub bajtu PDF []) na bajt []? Przeglądałem kilka przykładów w Internecie i jedyne, co mogę znaleźć, opisują, jak albo bezpośrednio zapisać przekonwertowany plik do systemu plików, albo przekonwertować go do obiektu AWT środowiska Java.pdfbox przekonwertować pdf na bajt obrazu []

Wolę nie zlecać IO zapisywania pliku obrazu do systemu plików, wczytać do bajtu [], a następnie go usunąć.

Więc może to zrobić:

String destinationImageFormat = "jpg"; 
boolean success = false; 
InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf"); 
PDDocument pdf = PDDocument.load(is, true); 

int resolution = 256; 
String password = ""; 
String outputPrefix = "myImageFile"; 

PDFImageWriter imageWriter = new PDFImageWriter();  

success = imageWriter.writeImage(pdf, 
        destinationImageFormat, 
        password, 
        1, 
        2, 
        outputPrefix, 
        BufferedImage.TYPE_INT_RGB, 
        resolution); 

Jak również to:

InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf"); 

PDDocument pdf = PDDocument.load(is, true); 
List<PDPage> pages = pdf.getDocumentCatalog().getAllPages(); 

for (PDPage page : pages) 
{ 
    BufferedImage image = page.convertToImage(); 
} 

Gdzie nie jestem jasno na to, jak tranform z BufferedImage do byte []. Wiem, że jest to przekształcone w strumień wyjściowy pliku w imageWriter.writeImage(), ale nie jestem pewien, jak działa interfejs API.

Odpowiedz

11

Możesz użyć ImageIO.write, aby napisać do OutputStream. Aby uzyskać bajt [], użyj obiektu ByteArrayOutputStream, a następnie wywołaj metodęByteArray().

+1

Dzięki. Działa to zgodnie z przeznaczeniem. Gdybym miał dość reputacji, zagłosowałbym na ciebie, ale to jest mój pierwszy wpis do StackOverflow. – user2100746

+0

Nie ma za co; powinieneś być w stanie oznaczyć go jako zaakceptowany. – aditsu

+0

@ user2100746 powinieneś oznaczyć odpowiedź jako zaakceptowaną :) – Genjuro

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

Dodaj maven zależność:

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> 
    <dependency> 
     <groupId>org.apache.pdfbox</groupId> 
     <artifactId>pdfbox</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

, a CONVER PDF do obrazu:

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.rendering.PDFRenderer; 
import javax.imageio.ImageIO; 

private List<String> savePDF(String filePath) throws IOException { 
    List<String> result = Lists.newArrayList(); 

    File file = new File(filePath); 

    PDDocument doc = PDDocument.load(file); 
    PDFRenderer renderer = new PDFRenderer(doc); 

    int pageSize = doc.getNumberOfPages(); 
    for (int i = 0; i < pageSize; i++) { 
     String pngFileName = file.getPath() + "." + (i + 1) + ".png"; 

     FileOutputStream out = new FileOutputStream(pngFileName); 
     ImageIO.write(renderer.renderImageWithDPI(i, 96), "png", out); 
     out.close(); 

     result.add(pngFileName); 
    } 
    doc.close(); 
    return result; 
} 

EDIT:

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.rendering.PDFRenderer; 
import javax.imageio.ImageIO; 

private List<String> savePDF(String filePath) throws IOException { 
    List<String> result = Lists.newArrayList(); 

    File file = new File(filePath); 

    PDDocument doc = PDDocument.load(file); 
    PDFRenderer renderer = new PDFRenderer(doc); 

    int pageSize = doc.getNumberOfPages(); 
    for (int i = 0; i < pageSize; i++) { 
     String pngFileName = file.getPath() + "." + (i + 1) + ".png"; 

     ByteArrayOutputStream out = new ByteArrayOutputStream(pngFileName); 
     ImageIO.write(renderer.renderImageWithDPI(i, 96), "png", out); 

     out.toByteArray(); // here you can get a byte array 

     out.close(); 

     result.add(pngFileName); 
    } 
    doc.close(); 
    return result; 
} 
+0

OP poprosił o sposób, aby pdfbox uczynił pdf bezpośrednio plikiem 'byte []', a nie plikiem. Twoja odpowiedź z drugiej strony pokazuje tylko inny sposób, w jaki jest renderowany do pliku. – mkl

+0

Zamień FileOutputStream na ByteArrayOutputStream – BeeNoisy

+0

'" ByteArrayOutputStream out = new ByteArrayOutputStream (pngFileName) "' - 'ByteArrayOutputStream' ma tylko dwa konstruktory, jeden bez parametrów i jeden z parametrem' int'. Zatem twoje wywołanie za pomocą parametru 'String' nie będzie nawet kompilować, chyba że masz na myśli inny' ByteArrayOutputStream' niż ten w 'java.io'. – mkl