pdfbox конвертирует pdf в байт изображения []

Можно ли с помощью pdfbox преобразовать PDF (или байт PDF []) в байт изображения []? Я просмотрел несколько примеров в Интернете, и единственные, которые я могу найти, описывают, как либо напрямую записать преобразованный файл в файловую систему, либо преобразовать его в объект Java AWT.

Я бы предпочел не брать на себя затраты ввода-вывода для записи файла изображения в файловую систему, чтения в байт [], а затем его удаления.

Так что я могу:

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

А также это:

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

Я не понимаю, как преобразовать BufferedImage в byte []. Я знаю, что это преобразуется в выходной поток файла в imageWriter.writeImage (), но я не понимаю, как работает API.


person user2100746    schedule 22.02.2013    source источник


Ответы (2)


Вы можете использовать ImageIO.write для записи в OutputStream. Чтобы получить byte [], используйте ByteArrayOutputStream, затем вызовите для него toByteArray ().

person aditsu quit because SE is EVIL    schedule 22.02.2013
comment
Спасибо. Это работает как задумано. Если бы у меня было достаточно репутации, я бы проголосовал за вас, но это мой первый пост в StackOverflow. - person user2100746; 23.02.2013
comment
любой может пометить ответ как принятый на свои вопросы, это основная предпосылка SO. В противном случае ответчики будут скрывать от вас информацию. #payitforward - person angryITguy; 02.12.2013
comment
как это использовать PDfBox? (или нет?) Можете ли вы дать фрагмент кода, например - person Don Cheadle; 18.02.2015
comment
@mmcrae код в вопросе уже использует pdfbox, это просто недостающая часть - person aditsu quit because SE is EVIL; 18.02.2015
comment
@aditsu У меня возникли проблемы с ImageIO.write, не включающим изображения из исходного PDF-файла PDFBox в изображение, теряющее QR-код. Шаблон ColorSpace не обеспечивает нештрихованный цвет - person Don Cheadle; 18.02.2015
comment
@mmcrae, похоже, проблема с pdfbox. Ничего общего с этим вопросом. Для достижения наилучших результатов я использую mupdf. - person aditsu quit because SE is EVIL; 18.02.2015

Добавить зависимость от maven:

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

И конвертируем PDF в изображение:

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

РЕДАКТИРОВАТЬ:

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;
}
person BeeNoisy    schedule 27.12.2016
comment
OP попросил, чтобы pdfbox отображал pdf непосредственно в byte [], а не в файл. Ваш ответ, с другой стороны, показывает только другой способ его рендеринга в файл. - person mkl; 27.12.2016
comment
Замените FileOutputStream на ByteArrayOutputStream - person BeeNoisy; 27.12.2016
comment
"ByteArrayOutputStream out = new ByteArrayOutputStream(pngFileName)" - ByteArrayOutputStream имеет только два конструктора, один без параметров и один с параметром int. Таким образом, ваш вызов с использованием параметра String не будет даже компилироваться, если вы не имеете в виду ByteArrayOutputStream, отличный от того, который указан в java.io. - person mkl; 29.12.2016