分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

利用itext将html转为pdf

发布时间:2023-09-06 02:16责任编辑:彭小芳关键词:pdf

亲测代码没有问题,需要注意细节已经标注;需要jar包:iText-2.0.8.jar;core-renderer-R8.jar;

core-renderer-R8.jar下载地址:http://central.maven.org/maven2/org/xhtmlrenderer/core-renderer/R8/core-renderer-R8.jar

iText-2.0.8.jar下载地址:http://central.maven.org/maven2/com/lowagie/itext/2.0.8/itext-2.0.8.jar

import com.lowagie.text.pdf.BaseFont;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class HtmlToPDF { ???public static void main(String[] args) throws Exception { ???????htmlToPdf("C://Users//Administrator//Desktop//20181001.pdf","C://Users//Administrator//Desktop//xse//newFile.html"); ???} ???/** ????* 把URL转换为PDF ????* @param outputFile ????* ???????????, 示例:/data/fs/inspector/BJ20150522001.pdf ????* @param url ????* ???????????,示例:http :xxxx ????* @return ????* @throws Exception ????*/ ???public static void htmlToPdf(String outputFile, String url)throws Exception { ???????try{ ???????????OutputStream os = new FileOutputStream(outputFile); ???????????ITextRenderer renderer = new ITextRenderer(); ???????????// 如果携带图片则加上以下代码,将图片标签转换为Itext自己的图片对象 ???????????renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory()); ???????????renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0); ???????????//String fontPath = HtmlToPDF.class.getClassLoader().getResource("").toString().replaceAll("file:/", "C:\\Users\\Administrator\\Downloads\\simsunttc\\") + "simsun.ttc"; ???????????// 解决中文支持问题 ?字体必须名称必须和前台页面的大小写一直(simsun 区分大小写) ???????????String fontPath="C:\\Users\\Administrator\\Downloads\\simsunttc\\simsun.ttc"; ???????????ITextFontResolver fontResolver = renderer.getFontResolver(); ???????????fontResolver.addFont(fontPath, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); ???????????url=new File(url).toURI().toURL().toString(); ???????????renderer.setDocument(url); ???????????//解决图片相对路径问题,window 上必须用file:/; 后面路径只写到img标签中src的上级目录 ???????????renderer.getSharedContext().setBaseURL("file:/C:/Users/Administrator/Desktop/xse/"); ???????????renderer.layout(); ???????????renderer.createPDF(os); ???????????os.flush(); ???????????os.close(); ???????}catch(Exception e ){ ???????????e.printStackTrace(); ???????} ???}}

  

import com.lowagie.text.BadElementException;import com.lowagie.text.Image;import com.lowagie.text.pdf.codec.Base64;import org.w3c.dom.Element;import org.xhtmlrenderer.extend.FSImage;import org.xhtmlrenderer.extend.ReplacedElement;import org.xhtmlrenderer.extend.ReplacedElementFactory;import org.xhtmlrenderer.extend.UserAgentCallback;import org.xhtmlrenderer.layout.LayoutContext;import org.xhtmlrenderer.pdf.ITextFSImage;import org.xhtmlrenderer.pdf.ITextImageElement;import org.xhtmlrenderer.render.BlockBox;import org.xhtmlrenderer.simple.extend.FormSubmissionListener;import java.io.IOException;/** *  * 图片base64支持,把图片转换为itext自己的图片对象 *  * @author Administrator *  * *   */public class Base64ImgReplacedElementFactory implements ReplacedElementFactory { ???/** ????*  * 实现createReplacedElement 替换html中的Img标签 ????*  *  ????*  * @param c 上下文 ????*  * @param box 盒子 ????*  * @param uac 回调 ????*  * @param cssWidth css宽 ????*  * @param cssHeight css高 ????*  * @return ReplacedElement ????*   ????*/ ???public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,int cssWidth, int cssHeight) { ???????Element e = box.getElement(); ???????if (e == null) { ???????????return null; ???????} ???????String nodeName = e.getNodeName(); ???????// 找到img标签 ???????if (nodeName.equals("img")) { ???????????String attribute = e.getAttribute("src"); ???????????FSImage fsImage; ???????????try { ???????????????// 生成itext图像 ???????????????fsImage = buildImage(attribute, uac); ???????????} catch (BadElementException e1) { ???????????????fsImage = null; ???????????} catch (IOException e1) { ???????????????fsImage = null; ???????????} ???????????if (fsImage != null) { ???????????????// 对图像进行缩放 ???????????????if (cssWidth != -1 || cssHeight != -1) { ???????????????????fsImage.scale(cssWidth, cssHeight); ???????????????} ???????????????return new ITextImageElement(fsImage); ???????????} ???????} ???????return null; ???} ???/** ????*  * 编解码base64并生成itext图像     ????*   ????*/ ???protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException, ???????????BadElementException { ???????FSImage fiImg = null; ???????if (srcAttr.toLowerCase().startsWith("data:image/")) { ???????????String base64Code = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(), srcAttr.length()); ???????????// 解码 ???????????byte[] decodedBytes = Base64.decode(base64Code); ???????????fiImg = new ITextFSImage(Image.getInstance(decodedBytes)); ???????} else { ???????????fiImg = uac.getImageResource(srcAttr).getImage(); ???????} ???????return fiImg; ???} ???public void reset() { ???} ???@Override ???public void remove(Element arg0) { ???} ???@Override ???public void setFormSubmissionListener(FormSubmissionListener arg0) { ???}}

  

利用itext将html转为pdf

原文地址:https://www.cnblogs.com/bert227/p/9724254.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved