URL如何转换成pdf?

URL如何转换成pdf?

在这里插入图片描述

ITextFlyingSaucerWKHtmlToPdfpd4ml
跨平台性跨平台跨平台跨平台跨平台
是否安装软件需安装WKHtmlToPdf
是否收费免费免费免费收费
转换Html效率速度快未测速度慢。相比URL来说,效率较慢。能忽略一些html语法或资源是否存在问题。速度快。部分CSS样式不支持。
转换Html效果存在样式失真问题。对html语法有一定要求存在样式失真问题。对html语法有较高要求。失真情况较小,大部分网页能按Chome浏览器显示的页面转换部分CSS样式有问题。
转换URL效率未测未测效率不是特别高未测
转换URL效果未测未测部分网页由于其限制,或将出现html网页不完整。未测
优点不需安装软件、转换速度快不需安装软件、转换速度快生成PDF质量高不需要安装软件、转换速度快
缺点对html标签严格,少一个结束标签就会报错;服务器需要安装字体对html标签严格,少一个结束标签就会报错;服务器需要安装字体需要安装软件、时间效率不高对部分CSS样式不支持。
图片表格链接中文特殊字符整体样式速度
IText支持支持支持支持支持失真问题
FlyingSaucer未知未知未知未知未知未知
WKHtmlToPdf支持支持支持支持支持很好
pd4ml支持支持支持支持支持失真问题

对比以上各类实现:

1.WKHtmlToPdf因为转换速度慢、需要安装软件的缺点被暂时排除在外;pd4ml因为是收费的,并且同样存在一些常见的样式失真问题,直接排除;

2.剩下的就是在IText和FlyingSaucer的实现方案中做选择,对比之下,选择IText作为我们的最终实现方案

方案一: IText方式

【相关依赖】

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.13.2</version>
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.22</version>
</dependency>

【代码实现】


import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.File;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;


public final class HtmlUtil {

    private HtmlUtil() {
    }

    // 字体路径,放在资源目录下
    private static final String FONT_PATH = "classpath:simsun.ttc";

    public static void file2Pdf(File htmlFile, String pdfFile) {
        try (OutputStream os = Files.newOutputStream(Paths.get(pdfFile))) {
            String url = htmlFile.toURI().toURL().toString();
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(url);
            // 解决中文支持
            ITextFontResolver fontResolver = renderer.getFontResolver();
            // 获取字体绝对路径,ApplicationContextUtil是我自己写的类
            String fontPath = "c:/Windows/Fonts/simsun.ttc";
            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            renderer.layout();
            renderer.createPDF(os);
        } catch (Exception e) {
            // 抛出自定义异常
            e.printStackTrace();
        }
    }

    public static void html2Pdf(String html, String pdfFile) {
        String pdfDir = pdfFile;
       /* File file = new File(pdfDir);
        if (!file.exists()) {
            file.mkdirs();
        }*/
        java.io.File targetFile = new java.io.File(pdfDir);
        if (!targetFile.getParentFile().exists()) {
            targetFile.getParentFile().mkdirs(); // 创建父级文件路径
        }
        try (OutputStream os = Files.newOutputStream(Paths.get(pdfFile))) {
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocumentFromString(html);
            // 解决中文支持
            ITextFontResolver fontResolver = renderer.getFontResolver();
            // 获取字体绝对路径,ApplicationContextUtil是我自己写的类
            String fontPath = "c:/Windows/Fonts/simsun.ttc";
            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            renderer.layout();
            renderer.createPDF(os);
        } catch (Exception e) {
            // 抛出自定义异常
            e.printStackTrace();
        }
    }
}

【字体文件】

simsun.tcc

方案二: FlyingSaucerf方式

依赖:

		implementation("com.itextpdf:itextpdf:5.5.13.3")
			implementation("com.itextpdf:itext-asian:5.2.0")
	implementation("com.itextpdf.tool:xmlworker:5.5.13.3")
	implementation group: 'org.xhtmlrenderer', name: 'flying-saucer-pdf-itext5', version: '9.1.22'

代码实现:



import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class UrlToPdfUtil {

    //private static final String OUT_PUT_PDF_PATH = "/home/data/pdf/"; //pdf文件的存放路径(Linux)
    private static final String OUT_PUT_PDF_PATH = "D:\\test\\"; //pdf文件的存放路径(windows)

    /**
     * @param url            链接地址
     * @param outputFileName 转存的PDF文件名
     * @Title 网页转存为PDF文件
     */
    public static void urlToPdf(String url, String outputFileName) {
        try {
            String folder = outputFileName.substring(0, 6);
            System.out.println("folder = " + folder);
            String outputFile = OUT_PUT_PDF_PATH + folder + "\\" + outputFileName;
            java.io.File targetFile = new java.io.File(outputFile);
            if (!targetFile.getParentFile().exists()) {
                targetFile.getParentFile().mkdirs(); // 创建父级文件路径
            }
            OutputStream os = Files.newOutputStream(Paths.get(outputFile));
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(url);
            ITextFontResolver fontResolver = renderer.getFontResolver();
            //fontResolver.addFont("/usr/share/fonts/chinese/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); //Linux
            fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //windows
            renderer.layout();
            renderer.createPDF(os);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

测试用例:



import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestPDF {
    @org.junit.Test
    public void testPdf(){
        UrlToPdfUtil.urlToPdf("https://mp.weixin.qq.com/s/zFTQVmWlbqj2wgeboIexMQ", "Pdf.pdf");
        HtmlUtil.html2Pdf("https://mp.weixin.qq.com/s/zFTQVmWlbqj2wgeboIexMQ", "D:\\test\\Pdf.pdf");

    }
}

以上实现就完成了html转换成pdf的功能 ~

常见错误:

在这里插入图片描述

解决方案请参考工具类专栏文章解决URLToPDF 微信公众号文章图片不显示问题(全网唯一方案)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫头虎

一分也是爱,打赏博主成就未来!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值