java - PDFBox 和 JPEG 2000 示例的图像类型未知

标签 java pdfbox jpeg2000

我从 fnord examples page 中获取了JPEG 2000样本.

但是,当我尝试将该图像添加到 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();

我得到了异常(exception):

Caused by: java.lang.IllegalArgumentException: Image type UNKNOWN not supported: relax.jp2 at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFileByContent(PDImageXObject.java:313)

我在 Maven 中的 PDFBox 依赖项:

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

最佳答案

来自 PDFBox 的 API documentation :

createFromFileByContent()
The following file types are supported: jpg, jpeg, tif, tiff, gif, bmp and png.

查看源代码,createFromFileByContent() 内部调用的是他们自己对已知文件类型的检查,独立于底层库,检测代码如下所示这个: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);
}

只要您假装您有 GIFBMPPNG 并且您的 ImageIO 支持>JPEG 2000,这可能有点工作(未经测试)。

关于java - PDFBox 和 JPEG 2000 示例的图像类型未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481280/

相关文章:

java - 如何向 String[][] 追加元素?

java - 房间同步 : How to ensure multiple threads are using same node?

java - 是/否与 boolean 值或 if/else?

java - 很少有人扫描条形码,但很少有人不使用 Zxing

image - 处理 150GB .jp2 图像

java - 如何将多个变量作为单个值添加到数组列表中?

java - PDFBox 2 不创建 PDF/A 文件

java - 如果更改单元格高度,则可装箱文本不会出现

c# - Windows 手机 8 : how to include image in sample photos?

python - Pathos 无法腌制由 GDAL 模块创建的 SwigPyObject