Spire.PDF is a professional PDF library applied to creating, writing, editing, handling and reading PDF files without any external dependencies. Get free and professional technical support for Spire.PDF for .NET, Java, Android, C++, Python.

Thu Aug 22, 2024 6:24 am

spire.pdf for java在Linux上将html转为pdf时,qt插件占用内存过大,如何解决?

执行html转为pdf的操作后,服务器几乎卡死,监控显示内存占用满了

jdk:17
系统:alibaba cloud linux 3
插件版本:qt-5.14.2-plugins-linux-x64
服务器:8核 16G 阿里云轻量云服务器

zhj132171
 
Posts: 8
Joined: Fri Aug 02, 2024 11:33 pm

Thu Aug 22, 2024 8:19 am

你好,

感谢留言。
请提供测试文件供我们调查测试,感谢您的配合。

Sincerely,
Doris
E-iceblue support team
User avatar

Doris.Liu
 
Posts: 353
Joined: Mon Nov 07, 2022 8:10 am

Thu Aug 22, 2024 9:33 am

你好,

测试用html文件:html文件.zip

转换代码:

Code: Select all
    public static void htmlStringToPdf(String htmlString, String outputFile, Size size, boolean removeBlank) {
        if (removeBlank) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            //将HTML字符串转换为PDF
            HtmlConverter.convert(htmlString,
                    byteArrayOutputStream,
                    true,
                    5 * 60 * 1000,
                    size,
                    new PdfMargins(0),
                    LoadHtmlType.Source_Code);
            PdfDocument pdfDocument = new PdfDocument(byteArrayOutputStream.toByteArray());
            PdfPageCollection pages = pdfDocument.getPages();
            BufferedImage image;
            for (int i = 0; i < pages.getCount(); i++) {
                PdfPageBase pdfPageBase = pages.get(i);
                if (pdfPageBase.isBlank()) {
                    //删除完全空白的页面
                    pdfDocument.getPages().remove(pdfPageBase);
                } else {
                    //将页面转换为图片
                    image = pdfDocument.saveAsImage(i, PdfImageType.Bitmap);

                    //检测转换出的图片是否为空白图片
                    if (isBlankImage(image)) {
                        //删除空白图片所对应的页面
                        pdfDocument.getPages().remove(pdfPageBase);
                    }

                    image.flush();
                }
            }
            pdfDocument.saveToFile(outputFile);
            pdfDocument.dispose();
        } else {
            htmlStringToPdf(htmlString, outputFile, size);
        }
    }

    //检测图片是否为空白图片
    public static boolean isBlankImage(BufferedImage image) {

        Color pixel;
        for (int i = 0; i < image.getWidth(); i++) {
            for (int j = 0; j < image.getHeight(); j++) {
                pixel = new Color(image.getRGB(i, j));
                if (pixel.getRed() < 240 || pixel.getGreen() < 240 || pixel.getBlue() < 240) {
                    return false;
                }
            }
        }
        return true;
    }

zhj132171
 
Posts: 8
Joined: Fri Aug 02, 2024 11:33 pm

Fri Aug 23, 2024 5:16 am

你好,

有结果了吗

zhj132171
 
Posts: 8
Joined: Fri Aug 02, 2024 11:33 pm

Fri Aug 23, 2024 7:09 am

你好,

我这边测试了你提供的文件和代码,但并没有发现你所说的占用内存过大的问题。由于jar包运行时间过短,我这边是使用命令“xvfb-run java -Xloggc:gc.log -XX:+PrintGCDetails -jar Html2PdfTest.jar”打印日志的方式查看的内存。日志输出见下图,可以看见堆内存+方法区内存所耗在200M以内,属于正常消耗,并没有占用过大。我将我的jar包上传了,请解压后使用上面的命令测试,如果你的结果和我的差异很大,请提供你具体的系统版本(如:CentOS8)供我们进一步调查。如果你的测试结果和我相近,建议进一步排查一下您的项目。感谢你的协助!

https://www.e-iceblue.com/downloads/att ... _41500.zip

Sincerely,
Doris
E-iceblue support team
User avatar

Doris.Liu
 
Posts: 353
Joined: Mon Nov 07, 2022 8:10 am

Return to Spire.PDF