利用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) {
    }

}

  

猜你喜欢

转载自www.cnblogs.com/bert227/p/9724254.html