首页 > 编程知识 正文

html怎么转pdf,HTML转换PDF

时间:2023-05-04 01:26:34 阅读:44460 作者:2517

将html页面导出为pdf本来就很简单,直接在浏览器中打印。 (Mac快捷键为p; Windows快捷键为ctrl p ),可以将页面另存为pdf文件,但对始终将页面导出为pdf的用户不友好。 合格程序员的标准之一是猪熟练使用编写的软件。 否则,你就是猪。 我们研究了几种html导出pdf的实现方法,在此记录并共享要点。

要调查的优势缺点将中文特殊字符链接到分页图像表,以样式导出样例注释jsPDF1,然后在客户端运行整个过程。 调用(不需要服务器参与)很简单。 生成的pdf是图像形式。 此外,内容失真支持不支持iText1。 功能几乎可以实现。 灵活性高) 2、生成的pdf质量高) 1、对html标签要求严格; 格,结束标签少一个就报告错误; 2、后端实现复杂,需要在服务器上安装字体3、图像呈现复杂(尚未解决)的支持支持支持支持支持wkhtmltopdf1、调用方法简单) 2、生成pdf质量高1、服务器需要安装wkhtmltopdf环境2、需要从网站生成pdf,通过拦截器对有权限的页面提供处理辅助辅助辅助辅助。 上述三种以调查为重点的三种方式,以下简要介绍。

另一方面,html2canvas jsPDF方式的原理是利用html2canvas遍历页面中的dom节点,呈现canvas image,用jsPDF将canvas image转换为pdf,最后转换的pdf中的

代码示例

html :

buttonid=' exporttopdf ' pdf/button divid=' export _ content '其中是要导出到pdf的内容/divJavaScript(jspdf和html2canascript

script src=' js/js pdf.debug.js '/scriptsrc=' js/html2canvas.js '/script script type=' text/JavaScript down pdf.onclick=function ((html2canvas ) document.getelementbyid (export _ content ),) { dpi: 172,/} //1页面的pdf显示html页面生成的canvas的高度; var page height=内容宽度/592.28 * 841.89; 未生成//pdf的html页面高度var leftHeight=contentHeight; //pdf页面偏移var位置=0; //html页面生成的canvas pdf中的图像宽度(a4纸张大小(595.28,841.89 ) ) var imgWidth=595.28; var imgheight=592.28 /内容宽度*内容高度; var pagedata=canvas.todataurl (' image/JPEG ',1.0 ); var pdf=new jsPDF ('、' pt '、' a4 ' ); 如果html页面的实际高度和生成pdf的页面高度(841.89 ) /内容未超出pdf的一个页面上显示的范围,则为if(leftheightpageheight ) pdf.addimage ) pdf

} else { while (leftHeight > 0) { pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight) leftHeight -= pageHeight; position -= 841.89; //避免添加空白页 if (leftHeight > 0) { pdf.addPage(); } } } pdf.save('content.pdf'); }, //背景设为白色(默认为黑色) background: "#fff" }) }</script>

这种方法的优点是所有的过程都由js在客户端完成,不需要依赖服务器。
目前发现的两个比较明显的缺点:
1、生成的pdf质量不高,失真比较严重(不过在github上这个方法可以适当提高下生成pdf的清晰度https://github.com/niklasvh/html2canvas/pull/1087);
2、在分页处如果有图片的话,不会自动识别隔页处理(甚至一行文字也能给你上下一分为二),而是无情地把图片一分为二,满满的违和感~如下图:

github上有一篇文章说明比较详细,还有具体的demo:https://github.com/linwalker/render-html-to-pdf


二、iText

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

代码样例
pom依赖:

<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实现:

ITextRenderer renderer = new ITextRenderer();ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("/Users/hehe/share/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);OutputStream os = new FileOutputStream("/Users/hehe/Desktop/iTextPDF.pdf");String htmlstr = HttpHandler.sendGet("http://localhost:10086/test/iTextPDF.html");//HttpHandler.sendGet只是单纯获得指定网页的html字符串内容renderer.setDocumentFromString(htmlstr);renderer.layout();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来大量爬取网络中的页面的话,还是放弃吧,毕竟网上很多页面都是不标准的~


三、wkhtmltopdf

wkhtmltopdf是一个可以把html转为pdf的插件,有windows、linux等平台的版本,最大的特点就是使用简单,语言无关性。
1、下载:官网下载 https://wkhtmltopdf.org/downloads.html
2、执行:该插件是“绿色版”,无需编译安装,下载解压后,在drdmj目录下有wkhtmltoimage和wkhtmltopdf两个文件,生成pdf可以直接运行wkhtmltopdf(也可以把drdmj目录配置到环境变量),执行wkhtmltopdf -V查看是否可以执行。
执行的时候可能会报错wkhtmltopdf: error while loading shared libraries: libXrender.so.1 或者 ./wkhtmltopdf: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory 具体解决方法可参考https://www.svennd.be/wkhtmltopdf-error-while-loading-shared-libraries-libxrender-so-1/

如果执行完打印出wkhtmltopdf的版本号,则说明OK了,下面来一个打印html页面的例子试试看,就把本页面转化成pdf吧:

wkhtmltopdf --disable-smart-shrinking https://blog.csdn.net/huyuyang6688/article/details/79710704 myBlog.pdf

执行完之后,就会在当前目录生成一个pdf(当然生成pdf的目录可以指定),--disable-smart-shrinking 这个参数是关闭缩放,如果不加的话,生成的pdf内容会特别“瘦”,不造为啥这个命令在mac环境下不是很有效,不敢在linux环境生成的PDF是正常的。具体更详细的用法可以参考如下文章:
1、HTML 转 PDF 之 wkhtmltopdf 工具简介
2、HTML 转 PDF 之 wkhtmltopdf 工具精讲
3、wkhtmltopdf参数详解
4、解决wkhtmltopdf支持中文和缩放问题:wkhtmltopdf折腾记

与之类似的还有一个叫Phantomjs的插件,效果差不多,还没深入研究。

**注意:**以上是小编在调研过程中的一些记录,分享给大家作参考,希望对您有所帮助,如果有其他疑问,欢迎交流沟通。【 转载请注明出处——想人陪的猫咪《html页面导出为pdf(jsPDF、iText、wkhtmltopdf)》】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。