使用 itextPDF 将 HTML 转换为 PDF 时的图像问题

Issue with images when converting HTML to PDF using itextPDF

提问人:hitesh 提问时间:9/20/2023 更新时间:9/20/2023 访问量:64

问:

我正在使用 itextPDF 将 html 转换为 pdf,一切按预期工作,但对于转换为 pdf 后的其中一个 GIF 图像,仅显示图像的骨架。这是一个静态的GIF图像,没有动画,只是一个具有透明背景和中心图像的图像。当我通过其他具有透明背景的GIF图像运行代码时,可以按预期工作。我正在使用以下代码将 HTML 转换为 PDF。我附上了该问题的示例图像。示例图像

    PdfWriter writer = new PdfWriter(inMemoryStream);
    PdfDocument pdf = new PdfDocument(writer);
    PdfMerger merger = new PdfMerger(pdf);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfDocument temp = new PdfDocument(new PdfWriter(baos));
    HtmlConverter.convertToPdf(test, temp, converterProperties);
    temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
    merger.merge(temp, 1, temp.getNumberOfPages());
    temp.close();
    pdf.close();
    inMemoryStream.close();
java html pdf itext 文件转换

评论

0赞 hitesh 9/20/2023
由于隐私问题,无法共享图像,但是当使用其他html到pdf转换工具(如openpdf)时,此问题无法解决。我想知道其他工具在将 html 转换为 pdf 时如何处理此类图像。

答:

-1赞 Teketsel Beyene 9/20/2023 #1
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfMerger;
import com.itextpdf.kernel.pdf.PdfWriter;

    

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class HtmlToPdfConverter {

    public static void main(String[] args) {
        // Replace "test" with your HTML content as a String
        String htmlContent = "<html><body><p>Your HTML content here</p></body></html>";

        try {
            ByteArrayOutputStream inMemoryStream = new ByteArrayOutputStream();
            PdfWriter writer = new PdfWriter(inMemoryStream);
            PdfDocument pdf = new PdfDocument(writer);
            PdfMerger merger = new PdfMerger(pdf);
            ConverterProperties converterProperties = new ConverterProperties();

            // Add your custom properties if needed
            // converterProperties.set...

            // Convert HTML to PDF
            InputStream htmlInputStream = new ByteArrayInputStream(htmlContent.getBytes());
            HtmlConverter.convertToPdf(htmlInputStream, pdf, converterProperties);

            // Close the PDF and perform further operations
            pdf.close();

            // Now you can work with the generated PDF in 'inMemoryStream'
            // ...

            inMemoryStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论

0赞 mkl 9/20/2023
问题是关于html中特定位图图像的问题。您的 html 片段根本不包含任何图像。那么,您的答案中是否建议不使用图像?
0赞 Community 9/21/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 K J 9/20/2023 #2

如果您了解 PDF 如何处理透明度,这应该不是问题。

enter image description here

无论图像是 TIFF、PNG 还是具有透明度的 GIF,它们都以与 2 张图像类似的方式存储。一个是不透明的 DeviceRGB,另一个是 Alpha 通道,作为黑色的“SoftMask”,我们可以在左列中看到一张图像,在右栏中提到 2 张图像,以及 2 张图像(RGB 覆盖在 SoftMask 上)在中央 PDF 视图中。

这里的问题是图像生成不好,因为SoftMask没有很好地绘制enter image description here

它应该看起来像这样(遮罩)以在 HTML 或 PDF 中强加,并相应地处理脚影。
enter image description here

关于 PDF 的一个有趣的点是,我们被告知您不能导入“透明”JPG,但也许您现在可以看到此 PDF 如何具有透明度的 JPEG,因此比 GIF(41,679 字节)或 PNG 变体更小(21,674 字节)。并且在分辨率、颜色或色域上看起来并不差。enter image description here

评论

0赞 hitesh 9/20/2023
谢谢你解释它现在确实有意义。但是,有没有一种方法可以解决此问题,就像某些库对此类图像所做的那样?