zoukankan      html  css  js  c++  java
  • 利用itext将html转为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) {
        }
    
    }
    

      

  • 相关阅读:
    微信退款回调
    laravel5.5 自定义验证规则——手机验证RULE
    laravel5.5 延时队列的使用
    laravel 使用EasyWechat 3分钟完成微信支付(以APP支付为例)
    第三章预习
    预习2
    预习原码补码
    C语言ll作业01
    C语言寒假大作战04
    C语言寒假大作战03
  • 原文地址:https://www.cnblogs.com/bert227/p/9724254.html
Copyright © 2011-2022 走看看