1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | ## java使用itext把含图片的html转为pdf MAVEN 依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.2</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>core-renderer</artifactId> <version>R8</version> </dependency> 利用itext将html转为PDF 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; //图片的src要为src="data:image/jpg;base64,{图片的base64code}"这种base64格式 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) { } } |
转自:https://www.cnblogs.com/bert227/p/9724254.html