功能需求是下载漫画图片,制作pdf,遇到无法识别的图片,图片类型为 webp,Java本身是不支持的,需要借助第三依赖兼容处理。此问题跟 itext 版本没有关系。
依赖
implementation "com.itextpdf:io:8.0.0"
implementation "com.itextpdf:forms:8.0.0"
implementation "com.itextpdf:kernel:8.0.0"
implementation "com.itextpdf:layout:8.0.0"
问题复现
public static void main(String[] args) throws Exception {
OutputStream outputStream = new FileOutputStream("sample.pdf");
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
URL url = new URL("https://w3wx1.godamanga.online/scomic/quanqiuguiyishidai-heibaichayuanzhuqixiaoguai/0/114-azu7/10.jpg");
Document document = new Document(pdfDocument);
ImageData imageData = ImageDataFactory.create(url);
Image image = new Image(imageData);
document.add(image);
document.close();
}
报错信息如下
Exception in thread "main" com.itextpdf.io.exceptions.IOException: Image format cannot be recognized.
at com.itextpdf.io.image.ImageDataFactory.createImageInstance(ImageDataFactory.java:478)
at com.itextpdf.io.image.ImageDataFactory.create(ImageDataFactory.java:68)
at com.itextpdf.io.image.ImageDataFactory.create(ImageDataFactory.java:77)
at io.arukas.ImgPdfSample.main(ImgPdfSample.java:41)
解决方案
implementation 'com.twelvemonkeys.imageio:imageio-webp:3.9.4'
public static void main(String[] args) throws Exception {
OutputStream outputStream = new FileOutputStream("sample.pdf");
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
URL url = new URL("https://w3wx1.godamanga.online/scomic/quanqiuguiyishidai-heibaichayuanzhuqixiaoguai/0/114-azu7/10.jpg");
Document document = new Document(pdfDocument);
document.setMargins(0, 0, 0, 0);
ImageData imageData;
try {
imageData = ImageDataFactory.create(url);
} catch (Exception e) {
BufferedImage read = ImageIO.read(url);
ByteArrayOutputStream baStream = new ByteArrayOutputStream();
ImageIO.write(read, "jpg", baStream);
imageData = ImageDataFactory.create(baStream.toByteArray());
}
Image image = new Image(imageData);
pdfDocument.setDefaultPageSize(new PageSize(image.getImageWidth(), image.getImageHeight()));
document.add(image);
document.close();
}