Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PDF技术 -Java实现Html转PDF文件

PDF技术 -Java实现Html转PDF文件

作者头像
用户1518699
发布于 2022-05-09 07:28:39
发布于 2022-05-09 07:28:39
13.1K00
代码可运行
举报
文章被收录于专栏:nice_每一天nice_每一天
运行总次数:0
代码可运行

各实现对比表

Windows平台进行测试:

基于IText

基于FlyingSaucer

基于WKHtmlToPdf

基于pd4ml

跨平台性

跨平台

跨平台

跨平台

跨平台

是否安装软件

需安装WKHtmlToPdf

是否收费

免费

免费

免费

收费

转换Html

效率

速度快

未测

速度慢。相比URL来说,效率较慢。能忽略一些html语法或资源是否存在问题。

速度快。部分CSS样式不支持。

效果

存在样式失真问题。 对html语法有一定要求

存在样式失真问题。对html语法有较高要求。

失真情况较小 大部分网页能按Chome浏览器显示的页面转

部分CSS样式有问题。

转换URL

效率

未测

未测

效率不是特别高

未测

效果

未测

未测

部分网页由于其限制,或将出现html网页不完整。

未测

优点

不需安装软件、转换速度快

不需安装软件、转换速度快

生成PDF质量高

不需要安装软件、转换速度快

缺点

对html标签严格,少一个结束标签就会报错; 服务器需要安装字体

对html标签严格,少一个结束标签就会报错; 服务器需要安装字体

需要安装软件、时间效率不高

对部分CSS样式不支持。

评价

综合:使用WKHtmlToPdf效果(样式)最好。但速度较慢(对于文件来说)。其余均有大大小小的失真问题。

分页

图片

表格

链接

中文

特殊字符

整体样式

速度

IText

支持

支持

支持

支持

支持

支持

失真问题

FlyingSaucer

未知

未知

未知

未知

未知

未知

未知

WKHtmlToPdf

支持

支持

支持

支持

支持

支持

很好

pd4ml

支持

支持

支持

支持

支持

支持

失真问题

html网页完整转换为pdf,所有的方案均有不足。

itext有时并不能满足需求,不能兼容html的样式,且从html页面导出的图片到pdf中也并不好处理。

Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),且对html的格式也是十分的严格,如果用一种模版的话用Flying Sauser技术倒是不错的选择,但对于不规则的html导出pdf就并不是那么的适用。

PD4ML实现html2pdf,速度快,纠错能力强可以过滤不规则的html标记,支持多种中文字体,支持css

WKHtmlToPdf效果最好,但转换速度慢。

1. wkhtmltopdf(速度慢、需要安装软件)

wkhtmltopdf是一个用webkit网页渲染引擎开发的用来将html转成 pdf的工具,可跟多种脚本语言进行集成来转换文档,有windows、linux等平台版本。官网地址 http://wkhtmltopdf.org/

技术特点:

Wkhtmltopdf可直接把浏览器中浏览的网页转换成一个pdf,他是一个把html页面转换成pdf的软件(需要安装在服务器上)。使用时可通过java代码调用cmd指令完成网页转换为pdf的功能。

功能测试:

直接在cmd里输入测试指令,可查看处理进度。

原理:

使用wkhtmltopdf工具对url或html进行转换

使用命令:

Wkhtmltopdf  https:baidu.com  /usr/local/temp/baidu.pdf

安装

下载地址:https://wkhtmltopdf.org/downloads.html

wkhtmltopdf安装方法

1.解压wkhtmltox.tar到某个文件夹$DIR

2.设置环境变量

vim /etc/profile

在最后一行加 export PATH=DIR/wkhtmltox/bin:PATH 保存退出、

source /etc/profile

3.运行 wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory这个错,请运行 apt-get/yum install libXrender*

运行 wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory这个错,请运行apt-get/yum install libfontconfig*

运行 wkhtmltopdf 报wkhtmltopdf: error while loading shared libraries: libXext.so.6: cannot open shared object file: No such file or directory这个错,请运行 apt-get/yum install libXext*

运行 wkhtmltopdf

yum install xorg-x11-fonts-75dpi.noarch

yum install xorg-x11-fonts-Type1.noarch

yum install icu.x86_64

yum install libjpeg

yum install libpng

优点:

支持中文、图片、CSS等

缺点:

有时对于html文件的转化可能比较慢,对于url的转化速度较快。存在失真情况

具体实现:

Java调用命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class HtmlToPdf {
 2  
 3     // wkhtmltopdf在系统中的路径
 4     private static String toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_WINDOW;
 5  
 6     /**
 7      * html转pdf
 8      *
 9      * @param srcPath
10      *            html路径,可以是硬盘上的路径,也可以是网络路径
11      * @param destPath
12      *            pdf保存路径
13      * @return 转换成功返回true
14      */
15     public static boolean convert(String srcPath, String destPath) {
16         File file = new File(destPath);
17         File parent = file.getParentFile();
18         // 如果pdf保存路径不存在,则创建路径
19         if (!parent.exists()) {
20             parent.mkdirs();
21         }
22         StringBuilder cmd = new StringBuilder();
23         if (System.getProperty("os.name").indexOf("Windows") == -1) {
24             // 非windows 系统
25             toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_LINUX;
26         }
27         cmd.append(toPdfTool);
28         cmd.append(" ");
29         cmd.append(" \"");
30         cmd.append(srcPath);
31         cmd.append("\" ");
32         cmd.append(" ");
33         cmd.append(destPath);
34  
35         System.out.println(cmd.toString());
36         boolean result = true;
37         try {
38             Process proc = Runtime.getRuntime().exec(cmd.toString());
39             HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
40             HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
41             error.start();
42             output.start();
43             proc.waitFor();
44         } catch (Exception e) {
45             result = false;
46             e.printStackTrace();
47         }
48  
49         return result;
50     }
51  
52     public static void main(String[] args) {
53 //        HtmlToPdf.convert("http://www.baidu.com", "F:/pdf/baidu.pdf");
54         String filename = "JAVA将图片转换成pdf文件-CSDN博客";
55         HtmlToPdf.convert("F:/pdf/"+filename+".html", "F:/pdf/"+filename+".pdf");
56 //        HtmlToPdf.convert("http://api.gyingyuan.com/", "F:/pdf/"+ UUID.randomUUID().toString()+".pdf");
57 //        HtmlToPdf.convert("https://www.aliyun.com/jiaocheng/285649.html", "F:/pdf/baidu.pdf");
58     }
59 }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class HtmlToPdfInterceptor extends Thread {
 2     private InputStream is;
 3  
 4     public HtmlToPdfInterceptor(InputStream is){
 5         this.is = is;
 6     }
 7  
 8     @Override
 9     public void run(){
10         try{
11             InputStreamReader isr = new InputStreamReader(is, "utf-8");
12             BufferedReader br = new BufferedReader(isr);
13             String line = null;
14             while ((line = br.readLine()) != null) {
15                 System.out.println(line.toString()); //输出内容
16             }
17         }catch (IOException e){
18             e.printStackTrace();
19         }
20     }
21 }

效果:

URL转换

对于url转会遇到一些网站限制的问题。

https://blog.csdn.net/m0_38138387/article/details/79314260

如果转为html则效率较慢,但能很大程度比较完美地转换

文件转换:速度较慢,失真情况比较小

68.225s

2. PhantomJS(样式有问题,需要安装软件)

PhantomJS是一个基于webkit内核的无头浏览器,即没有UI界面,即它是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。它提供javaScript API接口,即通过编写JS程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。它同时提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。官网地址http://phantomjs.org/

PhantomJS可做网页分析,功能很多,本次仅调用网页的截图功能。在cmd中的测试如下:

URL转

测试效果并没有wkhtmltopdf好。

html2pdf.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var page = require('webpage').create();
 2 var system = require('system');
 3  
 4 读取命令行参数,也就是js文件路径。
 5 if (system.args.length === 1) {
 6   console.log('Usage: loadspeed.js <some URL>');
 7 //这行代码很重要。凡是结束必须调用。否则phantomjs不会停止
 8   phantom.exit();
 9 }
10 page.settings.loadImages = true;  //加载图片
11 page.settings.resourceTimeout = 30000;//超过10秒放弃加载
12 //截图设置,
13 //page.viewportSize = {
14 //  width: 1000,
15 //  height: 3000
16 //};
17 var address = system.args[1];
18 page.open(address, function(status) {
19     
20     function checkReadyState() {//等待加载完成将页面生成pdf
21         setTimeout(function () {
22             var readyState = page.evaluate(function () {
23                 return document.readyState;
24             });
25  
26             if ("complete" === readyState) {
27                 
28                 page.paperSize = { width:'297mm',height:'500mm',orientation: 'portrait',border: '1cm' };
29                 var timestamp = Date.parse(new Date());
30                 var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000);
31                 var outpathstr = "E:/POMFiles/HTPDF/"+pdfname+".pdf";
32                 page.render(outpathstr);
33                 //page.render("c://test.png");
34                 //console.log就是传输回去的内容。
35                 console.log("生成成功");
36                 console.log("$"+outpathstr+"$");
37                 phantom.exit(); 
38                 
39             } else {
40                 checkReadyState();
41             }
42         },1000);
43     }
44     checkReadyState();
45 });

PhantomJS对bootstap的样式支持较好。对css3的新特性如圆形图片样式支持行不好。部分页面样式会失效。对于echart图表展示,也可直接导出

3. IText(技术老旧,对样式不支持)

iText是一个第三方报表java插件,可以在后端利用java随意生成、转化pdf文件,提供了很多api,比较灵活

IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。

原理:

使用IText将HTML文件转化为PDF文件

优点:

速度快,支持中文(要求HTML使用unicode编码)、开源

缺点:

纠错能力差,

对CSS样式支持不是很好。

失真情况可能比较大

具体实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
    <artifactId>com.lowagie.text</artifactId>
    <version>2.1.7</version>
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf</artifactId>
    <version>9.0.8</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.4.2</version>
</dependency>

Java代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 ITextRenderer renderer = new ITextRenderer();
2 ITextFontResolver fontResolver = renderer.getFontResolver();
3 fontResolver.addFont("/Users/hehe/share/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
4 OutputStream os = new FileOutputStream("/Users/hehe/Desktop/iTextPDF.pdf");
5 String htmlstr = HttpHandler.sendGet("http://localhost:10086/test/iTextPDF.html");//HttpHandler.sendGet只是单纯获得指定网页的html字符串内容
6 renderer.setDocumentFromString(htmlstr);
7 renderer.layout();
8 renderer.createPDF(os);

以上只是简单利用html字符串来生成pdf,需要注意的是:  1、如果页面中有中文,服务器端需要下载字体库simsun.ttc,在后台进行引用,同时在页面的样式中加入对应字体的定义,如:body{font-family: SimSun;},否则中文无法渲染(中文处渲染出来的效果是空白);  2、页面中如果有图片,如果图片引用是绝对路径或者base64则不用考虑,如果是相对路径,需要在后台用renderer.getSharedContext().setBaseURL("图片绝对路径目录");来指定图片路径,否则图片无法渲染。  3、要转化的页面必须是标准的XHTML页面,有一处不符合规范就会报错,小编再试的时候就经常报诸如org.xml.sax.SAXParseException;lineNumber: 24; columnNumber: 6;元素类型 "span" 必须由匹配的结束标记 "</span> 终止"之类的错误,所以如果要用iText来大量爬取网络中的页面的话,还是放弃吧,毕竟网上很多页面都是不标准的~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class HtmlToPdfUtils {
 2     /*** 默认中文字体   */
 3     private static final String FONT = "C:\\Windows\\Fonts\\simhei.ttf";
 4     public static void htmlToPdf(String sourcePath,String tagetPath) throws IOException {
 5         htmlToPdf(sourcePath,tagetPath,FONT);
 6     }
 7     public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath) throws IOException {
 8         htmlToPdf(sourcePath,tagetPath,fontPath,PageSize.TABLOID);
 9     }
10     public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath,PageSize pageSize) throws IOException {
11         // 默认source路径下装载有css、image、以及html等文件的文件夹
12         htmlToPdf(sourcePath,tagetPath,fontPath,pageSize,FileUtils.GetFilePath(sourcePath));
13     }
14     public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath,PageSize pageSize,String baseuri) throws IOException {
15         PdfWriter writer = new PdfWriter(tagetPath);
16         PdfDocument pdf = new PdfDocument(writer);
17  
18         pdf.setTagged();
19         // 设置pdf页面大小
20         pdf.setDefaultPageSize(pageSize); 
21         ConverterProperties properties = new ConverterProperties();
22         FontProvider fontProvider = new DefaultFontProvider();
23         // 字体
24         FontProgram fontProgram = FontProgramFactory.createFont(fontPath);
25         fontProvider.addFont(fontProgram);
26         properties.setFontProvider(fontProvider); 
27         //properties.setBaseUri(html);
28         properties.setBaseUri(baseuri); 
29         MediaDeviceDescription mediaDeviceDescription = new MediaDeviceDescription(MediaType.SCREEN);
30         mediaDeviceDescription.setWidth(pageSize.getWidth());
31         properties.setMediaDeviceDescription(mediaDeviceDescription); 
32         // 转化
33         convertToPdf(sourcePath,pdf, properties);
34     }
35  
36     private static void convertToPdf(String sourcePath,PdfDocument pdf,ConverterProperties properties ) throws IOException {
37         InputStream inputStream = new FileInputStream(sourcePath);
38         // 转化
39 //        HtmlConverter.convertToPdf(new FileInputStream(sourcePath), pdf, properties);
40         HtmlConverter.convertToPdf(inputStream, pdf, properties);
41         inputStream.close();
42     }
43     public static void main(String[] args) throws IOException {
44         htmlToPdf("F:\\pdf\\1.html","F:\\pdf\\est-04.pdf");
45     }
46 }

效果:

Converting HTML to PDF _ iText Developers.html

消耗时间:3660

CSS样式丢失:

JAVA 将图片转换成pdf文件 - CSDN博客.html

消耗时间:7609

样式同样丢失问题

itext html转pdf布局问题_百度搜索.html

消耗时间:5485

4. Flying Sauser(技术老旧,对样式不支持)

Flying Sauser实现html2pdf,纠错能力差,支持中文、支持简单的页面和样式,开源

对html代码要求很严格。极易出现中文乱码问题

优点:

支持多种中文字体(部分样式不能识别),开源

缺点:

纠错能力差,对CSS支持不是很好。当页面内容较长时,处理时间慢

具体实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class Html2Pdf {
 2     /**
 3      * HTML代码转PDF文档
 4      *
 5      * @param content 待转换的HTML代码
 6      * @param storagePath 保存为PDF文件的路径
 7      */
 8     public static void parsePdf(String content, String storagePath) {
 9         FileOutputStream os = null;
10         try {
11             File file = new File(storagePath);
12             if(!file.exists()) {
13                 file.createNewFile();
14             }
15             os = new FileOutputStream(file);
16  
17             ITextRenderer renderer = new ITextRenderer();
18 //解决中文支持问题
19 //            ITextFontResolver resolver = renderer.getFontResolver();
20 //            resolver.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
21 //            resolver.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
22             renderer.setDocumentFromString(content);
23 // 解决图片的相对路径问题,图片路径必须以file开头
24 // renderer.getSharedContext().setBaseURL("file:/");
25             renderer.layout();
26             renderer.createPDF(os);
27  
28         } catch (DocumentException e) {
29             e.printStackTrace();
30         } catch (IOException e) {
31             e.printStackTrace();
32         }finally {
33             if(null != os) {
34                 try {
35                     os.close();
36                 } catch (IOException e) {
37                     e.printStackTrace();
38                 }
39             }
40         }
41     }
42  
43     /**
44      * 对Html要求特别严格
45      * @param args
46      * @throws IOException
47      */
48     public static void main(String[] args) throws IOException {
49         String htmlFilePath = "";
50         htmlFilePath = "F:/pdf/IText实现对PDF文档属性的基本设置 - 半亩池光 - 博客园.html";
51         StringBuilder content = new StringBuilder();
52         BufferedInputStream in;
53         byte[] bys = new byte[1024];
54         int len;
55         in = new BufferedInputStream(new FileInputStream(htmlFilePath));
56         while ((len = in.read(bys)) != -1) {
57             content.append(new String(bys, 0, len));
58         }
59         String html = closeHTML(content.toString());
60         html = html.replace(" "," ");
61  
62         parsePdf(html,"F:/pdf/wahaha.pdf");
63  
64     }
65  
66     public static String closeHTML(String str){
67         List arrTags = new ArrayList();
68         arrTags.add("br");
69         arrTags.add("hr");
70         arrTags.add("link");
71         arrTags.add("meta");
72         arrTags.add("img");
73         arrTags.add("input");
74         for(int i=0;i<arrTags.size();i++){
75             for(int j=0;j<str.length();){
76                 int tagStart = str.indexOf("<"+arrTags.get(i),j);
77                 if(tagStart>=0){
78                     int tagEnd = str.indexOf(">",tagStart);
79                     j = tagEnd;
80                     String preCloseTag = str.substring(tagEnd-1,tagEnd);
81                     if(!"/".equals(preCloseTag)){
82                         String preStr = str.substring(0,tagEnd);
83                         String afterStr = str.substring(tagEnd);
84                         str = preStr + "/" + afterStr;
85                     }
86                 }else{
87                     break;
88                 }
89             }
90         }
91         return str;
92     }
93  
94 }

5. PD4ML(样式有问题)

PD4ML是纯Java的类库,使用HTML、CSS作为页面布局和内容定义格式来生成PDF文档的强大工具,可以简化最终用户生成PDF的工作。参考网站:http://www.pd4ml.com

优点:

支持中文、对html代码不严格、速度较快

支持的HTML标签、CSS属性较全,转换失真比较小,可以使用HTML+CSS实现精确的布局控制。

对网页文件标签、CSS语法错误的容错性比较好。

对不用额外的控制,就支持图片的转化输出。

缺点:

存在样式失真问题,CSS支持较不好。

不开源,最新的demo版本,下载测试以后,发现不支持中文转换。必须购买商业版本才可以。(这里很坑,测试乱码问题通不过,后面发现是本来就不支持)。

破解后的一些旧版本可以解决乱码问题,但是支持的css样式没有新版本的全。

具体实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 public class HtmlToPDFUtil {
 2     public static void main(String[] args) throws Exception {
 3         //HtmlToPDFUtil htmlToPDFUtil = new HtmlToPDFUtil();
 4         HtmlToPDFUtil.generatePDF_2(new File("F:\\pdf/demo_ch_pd4ml.pdf"),
 5                 "F:\\pdf/flying saucer 使用中的一些问题 (java导出pdf) - 真的勇士,敢于直面这扯淡的人生 - ITeye博客.htm");
 6  
 7         //File pdfFile = new File("D:/Test/test3.pdf");
 8 //        String pdfPath = "D:/Test1/mmt";
 9 //
10 //        File file = new File(pdfPath);
11 //        if (!file.exists()) {
12 //            file.mkdirs();
13 //        }
14 //        String pdfName = "aa.pdf";
15 //        File pdfFile = new File(pdfPath+File.separator+pdfName);
16 //        StringBuffer html = new StringBuffer();
17 //        html.append("<html>")
18 //                .append("<head>")
19 //                .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
20 //                .append("</head>").append("<body>")
21 //                //.append("<font face='KaiTi_GB2312'>")
22 //                .append("<font face='KaiTi'>")
23 //                .append("<font color='red' size=22>显示中文aaaaaaaaaa</font>")
24 //                .append("</font>").append("</body></html>");
25 //        StringReader strReader = new StringReader(html.toString());
26 //        HtmlToPDFUtil.generatePDF_1(pdfFile, strReader);
27  
28     }
29  
30     // 手动构造HTML代码
31     public static void generatePDF_1(File outputPDFFile, StringReader strReader)
32             throws Exception {
33         FileOutputStream fos = new FileOutputStream(outputPDFFile);
34         PD4ML pd4ml = new PD4ML();
35         pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
36         pd4ml.setHtmlWidth(950);
37         pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
38         pd4ml.useTTF("java:fonts", true);        
39         //pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");
40         pd4ml.setDefaultTTFs("KaiTi", "KaiTi", "KaiTi");
41         pd4ml.enableDebugInfo();
42         pd4ml.render(strReader, fos);
43     }
44  
45     // HTML代码来自于HTML文件
46     public static void generatePDF_2(File outputPDFFile, String inputHTMLFileName)
47             throws Exception {
48         FileOutputStream fos = new FileOutputStream(outputPDFFile);
49         PD4ML pd4ml = new PD4ML();
50         pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
51         pd4ml.setHtmlWidth(950);
52         pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
53  
54         pd4ml.useTTF("java:fonts", true);
55         pd4ml.setDefaultTTFs("KaiTi", "KaiTi", "KaiTi");
56         pd4ml.enableDebugInfo();
57         pd4ml.render("file:" + inputHTMLFileName, fos);
58     }
59  
60 }

pd4browser和pd4fonts是生成的

  1. 乱码解决方案:
  2. https://blog.csdn.net/u014769730/article/details/54375836

测试结果:

对CSS有一定的要求

部分Html能支持:

6. Sferyx:(样式有问题)

官网:https://www.sferyx.com/pdfgenerator/html-to-pdf-java.htm

支持URL、支持文件。支持中文,对html文件几乎无要求。样式不佳,中文字体支持不佳。

具体实现

引入Java包:PDFGenerator.jar

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1         PDFGenerator pdfGenerator=new PDFGenerator();
2         pdfGenerator.setMarginsForStandardPageFormat (10,10,10,10);
3 //        pdfGenerator.setCharset ("utf-8");
4         pdfGenerator.setCharset("ISO-10646-UCS-2");
5 //        pdfGenerator.generatePDFFromURL ("https://blog.csdn.net/gisboygogogo/article/details/77601308",
6         pdfGenerator.generatePDFFromURL ("F:\\pdf\\1.html",
7                 "F:\\pdf/pdfgenerator-test1.pdf",
8                 "A4", "Portrait");

样式问题:

7. jPDFWriter(样式有问题、对html文件支持不好)

具体实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 //        URL url = new URL("https://www.baidu.com/");
2 //        PageFormat pf = new PageFormat();
3 //        PDFDocument pdfDoc = PDFDocument.loadHTML (url, pf, true);
4 //        pdfDoc.saveDocument ("F:\\pdf\\output.pdf");
5         File f1 = new File ("F:\\pdf\\1.html");
6         PDFDocument pdfDoc = PDFDocument.loadHTML(f1.toURI().toURL(), new PageFormat (), false);
7         pdfDoc.saveDocument ("F:\\pdf\\output.pdf");

效果:

并不是很好,虽然支持中文

其他未知方案。。。。。。。。。。

在线转换方案:

仅支持URL,但能很好地转换,效果较好,速度较快。但收费,且为第三方服务,或有信息安全性问题。

如果不考虑html文件安全性的话,可以考虑。

以转CSDN及百度搜索网页为测试例。

1. restpack

官网:https://restpack.io/   

能很好保持样式,且支持中文,速度快。价格相比较优惠。

使用实例:

https://www.cnblogs.com/IT-study/p/13738157.html

2. pdfshift

官网:https://pdfshift.io

能很好保持样式,且支持中文,速度快。价格相比较优惠。

测试效果:

实现方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 String encoding = Base64.getEncoder().encodeToString("YOUR_API_KEY:".getBytes());
 2 HttpPost httppost = new HttpPost("https://api.pdfshift.io/v2/convert/");
 3 httppost.setHeader("Authorization", "Basic " + encoding);
 4 httppost.setHeader("Content-type", "application/json");
 5  
 6 HttpEntity postingString = new StringEntity("{\"source\":\"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=PhantomJS%20html%E8%BD%ACpdf&oq=PhantomJS&rsv_pq=c942451400041f65&rsv_t=3566cYExdLkZv6pJRhDXeda3WgHs37R3GASuPvnEGrOmBl9Lur2EMGyfdF8&rqlang=cn&rsv_enter=1&rsv_sug3=15&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&inputT=6104&rsv_sug4=6105\",\"landscape\":false,\"use_print\":false}");
 7 httppost.setEntity(postingString);
 8  
 9 CloseableHttpClient client = HttpClients.createDefault();
10 try (CloseableHttpResponse response = client.execute(httppost)) {
11     HttpEntity entity = response.getEntity();
12     // Use the entity
13 }

3.其他(不考虑的方案)

1. pdfmyurl(网站反应慢)

官网:http://pdfmyurl.com/  

转化效率极低,速度极其慢

2. pdflayer(不支持中文)

官网:https://pdflayer.com/

不支持中文。虽然能很好保持样式。

个人总结:

到现在未知并为找到完美的方案。各种方案都有缺点,但是在线转换的方案转化效率以及对CSS等支持程度比较好。也不知道他们这些内部是如何实现的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
URL如何转换成pdf?
1.WKHtmlToPdf因为转换速度慢、需要安装软件的缺点被暂时排除在外;pd4ml因为是收费的,并且同样存在一些常见的样式失真问题,直接排除;
猫头虎
2024/04/08
3390
URL如何转换成pdf?
java实现HTML转PDF
windows 自带有这个文件 。但是linux 要自己去下载了 如果需要可以联系博主 (千万不要把windows s上的这个文件直接copy 到linux 系统上去哦)
斯文的程序
2019/11/07
15.5K4
java实现HTML转PDF
html页面导出为pdf(jsPDF、iText、wkhtmltopdf)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/79710704
DannyHoo
2018/09/13
6.9K0
html页面导出为pdf(jsPDF、iText、wkhtmltopdf)
java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果,
大道七哥
2019/09/10
5.2K1
java调用wkhtmltopdf生成pdf文件,美观,省事
Java后端:html转pdf实战笔记
htmltopdf 是一款基于wkhtmltopdf技术的html转pdf文档java类库,支持html转pdf和url转pdf。
小明互联网技术分享社区
2023/11/09
5.1K6
Java后端:html转pdf实战笔记
HTML转PDF字体的坑,搞了半天
itext提供可HTML转PDF的工具包,但是在中文字体时也许会遇到意想不到的问题。特别宋体对应的粗体。
BUG弄潮儿
2020/06/19
7.1K0
HTML转PDF字体的坑,搞了半天
教你两招,轻松搞定html页面导出为pdf文件
Hi,大家好,我是麦洛,最近项目中遇到了将html页面导出为pdf文件,现在将相关内容分享出来,希望帮到有需要的伙伴
麦洛
2021/05/24
3.4K0
教你两招,轻松搞定html页面导出为pdf文件
Java Html转pdf实战
年尾手头没啥事,干起了打杂工作,最近帮忙解决后端项目里一个html批量转pdf速度慢的问题,项目里用到的转换工具是 wkhtmltopdf ,这货转单个html还好,批量转速度就慢了。几经摸索(各种baidu、google......)各种测试后,终于找到个性能不错的工具 —— phantomjs
Zachary46
2018/12/27
9.5K1
.Net Core 导出Html到PDF
  最近由于项目的需求问题,涉及到了在.Net Core中导出PDF的一个问题,最后选择方式是后端拼接到Html页面然后再通过Html导出到PDF。中间也尝试了许多的NuGet包、但是并不如意,可用并且好用的的比较少。下面将最近最几天尝试的使用方法分享给大家。
小世界的野孩子
2020/01/31
3K0
【工具篇】在.Net中实现HTML生成图片或PDF的几种方式
前段时间由于项目上的需求,要在.Net平台下实现把HTML内容生成图片或PDF文件的功能,特意在网上研究了几种方案,这里记录一下以备日后再次使用。当时想着找一种开发部署都比较清爽并且运行稳定的方案,但实际上两者同时满足基本不可能,只能做一个自己觉得合适的取舍,下面从两个维度(清爽指数和功能指数)逐一对比。
HOHO
2020/04/27
3.2K0
Java工具集-Html2PDF
代码示例 import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; /** * @program: simple_tools * @description: Html2PDF * @author: Mr.chen * @create: 2020-06-09 09:39 **/ public class CustomWKHtmlToPdfUtil { /**
cwl_java
2020/06/10
1.6K2
html导出pdf的四种方式
将html页面导出为pdf文件并打印,可以直接在windows下使用Ctrl + P,苹果下⌘ + P。
二十三年蝉
2018/12/05
5K0
html导出pdf的四种方式
itext7史上最全实战总结
最近有个需求需要我用Java手动写一份PDF报告,经过考察几种pdf开源代码,最终选取了itext7,此版本为7.1.11,由于发现网上关于该工具的博文比较少,特别是实战博文几乎没有,在我踩完各种坑,最终把PDF成型后,打算把经验分享出来,本文通过摘录解释来说明,内容来自本人GitHub itext-pdf
老梁
2020/06/02
7.2K1
Java 渲染 docx 文件,并生成 pdf 加水印
一顿google以后发现了 StackOverflow 上的这个回答:Converting docx into pdf in java 使用如下的 jar 包:
用户2060079
2018/10/11
3.1K0
RestPack Java实现Html转PDF文件
最近公司需要将前端一个图表统计导出为pdf。前端导出显示的pdf还是可以的,但是将会导致页面不可用与卡死状态。所以由后端寻找解决方案。
用户1518699
2020/09/28
1.7K0
java(iText)工具包生成PDF
iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合
王念博客
2019/07/25
10.4K1
python将HTML转PDF
使用python讲网页转PDF。 想学习python某个模块,但是官网并不提供PDF版本,只有在线的网页说明文档,于是想将这些网页都下载下来然后转成pdf保存。
py3study
2020/01/10
3.6K0
SpringBoot 下PDF生成使用填坑总结
解释: 1、Configuration cfg 使用了freemaker starter后,在项目启动时即会自动初始化 Configuration 对象到Spring容器中; 2、Template template = cfg.getTemplate("test.ftl","UTF-8"); 模板因cfg本身在Spring容器中,则在获取test.ftl模板是就会自动在resource/templates下寻找模板,默认:ftl 格式,可以修改 3、因为找了很多例子都是使用ITextRenderer 对象来渲染输出渲染的PDF,但ITextRenderer有一个问题是要解决中文不显示问题,必须把字体放在一个以 文件夹 路径访问的形式引入,SpringBoot打包后,经测试,无法获取打包后的FONT字体; 则,再另辟途径,又找到以Document方式,但document需要的是,没一个dom对象都必须一个个添加进去,网上很多都是new 专门的对象,比如:块 Paragraph 然后添加文字(数字)内容。 所以又搜索:是否可以往document插入html 最终找到:https://www.cnblogs.com/mvilplss/p/5646675.html
林淮川
2021/12/20
5K0
SpringBoot 下PDF生成使用填坑总结
Java实现PDF加水印功能:技术解析与实践指南
在当今数字化办公环境中,PDF文件因其跨平台兼容性和格式稳定性而被广泛应用。然而,为了保护文档的版权、标记文档状态(如“草稿”“机密”等)或增加文档的可追溯性,常常需要为PDF文件添加水印。本文将深入探讨如何使用Java语言实现PDF加水印功能,介绍多种常用的库及其使用方法,帮助开发者快速掌握这一实用技能。
全干程序员demo
2025/05/19
960
NetCore实战:基于html生成pdf文件案例讲解
WkHtmlToPdfDotNet是基于本地 wkhtmltopdf封装的.NET Core类库,主要通过webkit引擎实现html页面转换为pdf文件。并且支持在Windows、Docker、Linux、MacOSX运行。
小明互联网技术分享社区
2023/11/14
5900
NetCore实战:基于html生成pdf文件案例讲解
相关推荐
URL如何转换成pdf?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档