java使用itext把含图片的html转为pdf

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