文章目录

  • URL如何转换成pdf?
  • 方案一: IText方式
      • 【相关依赖】
      • 【代码实现】
    • 方案二: FlyingSaucerf方式
      • 依赖:
      • 代码实现:
      • 测试用例:

URL如何转换成pdf?

IText FlyingSaucer WKHtmlToPdf pd4ml
跨平台性 跨平台 跨平台 跨平台 跨平台
是否安装软件 需安装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); //LinuxfontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //windowsrenderer.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.Testpublic 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的功能 ~

常见错误:

URL如何转换成pdf?相关推荐

  1. 如何把html转换pdf,怎么把html转换成pdf

    1.怎么将html格式文件转成pdf 1这个方法是我认为最简单.高效的,只要安装了360浏览器.火狐浏览器或谷歌浏览器就可以轻松实现.下面笔者以360浏览器为例,我们只要在浏览器的右上角点击" ...

  2. 在 Linux 中把一个网页转换成 PDF的技巧介绍

    你如何在 Linux 中把一个网页转换成 PDF?你可以选择使用每个 Linux 发行版上的网页浏览器(GUI),或者使用终端将网页变成 PDF 文件. 在这里,我将提到这两种方法来帮助你完成工作. ...

  3. 廖雪峰python教程书-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  4. 廖雪峰python教程pdf-爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  5. python爬虫教程书-Python 爬虫:把廖雪峰教程转换成 PDF 电子书

    声明:本文仅供学习参考,切忌用于其它用途,爬的过程中注意控制请求速度,以免给服务器带来过多的压力 写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来 ...

  6. python爬虫教程pdf-Python 爬虫:把廖雪峰教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天尝试写一个爬虫,将廖雪峰老师的 ...

  7. nodejs+html转换pdf,Nodejs 中将html转换成pdf文件

    Nodejs 中将html转换成pdf文件,Nodejs Convert html into pdf 1. 下载phantomjs.exe,将该文件放在根目录 2. 编写pdf.js文件(在githu ...

  8. 网页html转为pdf,html页面转换成PDF文件

    html页面转换成PDF文件 发布时间:2020-06-14 05:24:50 来源:51CTO 阅读:523 作者:robinmars package pdftest; import java.io ...

  9. ASP.Net中实现上传过程中将文本文件转换成PDF的方法

    iTextSharp是一个常用的PDF库,我们可以使用它来创建.修改PDF文件或对PDF文件进行一些其他额外的操作.本文讲述了如何在上传过程中将文本文件转换成PDF的方法. 基本工作 在开始之前,我们 ...

最新文章

  1. web-view 跳转小程序页面 网页跳转小程序
  2. envoy实现_微服务之服务治理:Envoy 全局 gRPC 限速服务 lyft/ratelimit 详解
  3. 数字图像处理6:配准与掩膜
  4. 在SaaS领域,单纯的免费策略根本行不通!
  5. stm32串口通信(初学者对于串口通信的理解)
  6. 详解CockroachDB事务处理系统
  7. Bootstrap 响应式布局辅助类
  8. mysql 匹配所有记录_如何记录mysql中所有的查询
  9. php打出等边三角形,CSS 如何进行单一div的正多边形变换
  10. pytorch加载自己的图像数据集
  11. openssl error while loading serial number
  12. TB6612驱动电机
  13. erdas2015几何校正模块在哪_什么是几何校正和正射校正还有怎样用erdas做几何校正...
  14. windows共享时出现“指定网络名不再可用”解决办法
  15. 虚拟DOM和真实DOM
  16. AI 如何识别西瓜和冬瓜?
  17. 生物冰箱智能锁有哪些功能
  18. phpredis中文手册《redis中文手册》php版
  19. 【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】
  20. linux中给普通用户添加root用户权限

热门文章

  1. 利用python实现身份证号验证系统
  2. 老司机人手必备xxlive 仅供学习交流 勿传播以及商业用途
  3. 工作分配问题【回溯算法】
  4. 软考中级软件设计师--8.信息安全
  5. IAR 使用中遇到的问题
  6. 个人计算机的基本配置显卡,计算机最基本配置之一显卡bios是怎样设置的?
  7. VC,CString,UTF8与GBK互转
  8. STM32 Proteus仿真GP2Y101红外测距温度湿度DHT11内部RTC-0010
  9. BZOJ4808 马
  10. “对DllRegisterServer的调用失败,错误代码为0×80070005 ”