Тип изображения НЕИЗВЕСТНО с образцом PdfBox и JPEG2000 - PullRequest
0 голосов
/ 26 ноября 2018

Я взял образец Jpeg2000 со страницы примеров FNordware .

Однако, когда я пытаюсь добавить это изображение в PDF:

PDDocument document = new PDDocument();
PDImageXObject pdImage = pdImage = PDImageXObject.createFromFileByContent(
   "samples/relax.jp2", document);
PDPage page = new PDPage(new PDRectangle(pageWidth, pageHeight));
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(pdImage, matrix);
contentStream.close();

Я получаю исключение:

Причина: java.lang.IllegalArgumentException: тип изображения НЕИЗВЕСТНО не поддерживается: relax.jp2 at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFileByContent PD (.java: 313)

Зависимости pdfbox, которые у меня есть в Maven:

    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>fontbox</artifactId>
        <version>2.0.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>jempbox</artifactId>
        <version>1.8.16</version>
    </dependency>       
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>jbig2-imageio</artifactId>
        <version>3.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-jpeg2000</artifactId>
        <version>1.3.0</version>
    </dependency>

Я что-то здесь не так делаю?Или есть какая-то проблема с PdfBox и / или сэмплами, которые я использую?

Другая библиотека Apache, Tika , обнаруживает этот тип MIME файла образца как "image/jp2":

TikaConfig tika = new TikaConfig();
Metadata metadata = new Metadata();
MediaType mimetype = tika.getDetector().detect(
     TikaInputStream.get(new FileInputStream("samples/relax.jp2"), metadata);

1 Ответ

0 голосов
/ 26 ноября 2018

Из документации pdfbox: createFromFileByContent "Поддерживаются следующие типы файлов: jpg, jpeg, tif, tiff, gif, bmp и png."

В исходном коде внутри вызывается createFromFileByContent.При проверке известных типов файлов, независимо от базовых библиотек, код обнаружения выглядит следующим образом: https://jar -download.com / artifacts / org.apache.pdfbox / pdfbox / 2.0.3 / source-code / org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java

Эта проверка не распознает jpeg 2000.

На самом деле createFromFileByExtension может быть лучше:

if ("gif".equals(ext) || "bmp".equals(ext) || "png".equals(ext))
{
    BufferedImage bim = ImageIO.read(file);
    return LosslessFactory.createFromImage(doc, bim);
}

Пока вы притворяетесь, что у вас есть gif, bmp или png и ваш ImageIO поддерживает j2k, это может сработать.(не проверено)

...