ITextRenderer 将html文件转为PDF

maven依赖:

        
        
            org.xhtmlrenderer
            core-renderer
            R8
        
        
            commons-codec
            commons-codec
        

转换核心代码:

    public void switchToPDF(InputStream inputStream, OutputStream out) throws IOException, DocumentException {
        //这里传入的流是html文件转换后的流文件
        //流转换成字符串
        StringBuffer out1 = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = inputStream.read(b)) != -1;) {
            out1.append(new String(b, 0, n));
        }
        String html = out1.toString();
        ITextRenderer renderer = new ITextRenderer();
   
        //System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
        // 解决base64图片支持问题
        SharedContext sharedContext = renderer.getSharedContext();
        //单独的类;
        sharedContext.setReplacedElementFactory(new B64ImgReplacedElementFactory());
        sharedContext.getTextRenderer().setSmoothingThreshold(0);
        //将HTML的内容写入对象
        renderer.setDocumentFromString(html);
        // 如果是HTML的路径用这个方法renderer.setDocument(htmlPath);
        //解决中文不显示的问题
        ITextFontResolver fontResolver = renderer.getFontResolver();
        String fontPath = ResourceUtils.getURL("classpath:templates/simsun.ttc").getPath();
        fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        //布局
        renderer.layout();
        //生成PDF
        renderer.createPDF(out);
    }

 InputStream解释:

InputStream inputStream = new FileInputStream(file);

其中涉及的工具类:

1.解决base64图片支持问题

public class B64ImgReplacedElementFactory 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图像 
     *  
     * @param srcAttr 属性 
     * @param uac 回调 
     * @return FSImage 
     * @throws IOException io异常 
     * @throws BadElementException BadElementException 
     */  
    protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,  
            BadElementException {  
        FSImage fsImage;  
        if (srcAttr.startsWith("data:image/")) {  
            String b64encoded = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(),  
                    srcAttr.length());  
            // 解码  
            byte[] decodedBytes = Base64.decode(b64encoded);  
  
            fsImage = new ITextFSImage(Image.getInstance(decodedBytes));  
        } else {  
            fsImage = uac.getImageResource(srcAttr).getImage();  
        }  
        return fsImage;  
    }  
  
    /** 
     * 实现remove 
     *  
     * @param e 元素 
     */  
    public void remove(Element e) {  
    }  
  
    /** 
     * 实现reset 
     */  
    public void reset() {  
    }  
  
    /** 
     * 实现setFormSubmissionListener 
     *  
     * @param formsubmissionlistener 监听 
     */  
    public void setFormSubmissionListener(FormSubmissionListener formsubmissionlistener) {  
    }  
}

2.解决中文不显示的问题

用到的jar包有(这三个maven依赖里面都有):

    core-renderer.jar

    itext-2.0.8.jar

    flying-saucer-pdf-itext5-9.0.6.jar

用到的字体有(字体下载可以直接百度):

    simsun.ttc

另外最重要的一定要在html模板的body上加这个样式:

 

 

参考资料:

1.解决iText2.0.8+freemark导出pdf不支持base64的解决办法

2.ITEXT转HTML为PDF遇到的问题

你可能感兴趣的:(Java)