`
gaozzsoft
  • 浏览: 413232 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

itext实现PDF生成的两种方式-从HTML到PDF

 
阅读更多

itext实现PDF生成的两种方式-从HTML到PDF

maven依赖pom配置:

<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itext-asian</artifactId>
   <version>5.2.0</version>
</dependency>
<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itextpdf</artifactId>
   <version>5.5.10</version>
</dependency>
<dependency>
   <groupId>com.itextpdf.tool</groupId>
   <artifactId>xmlworker</artifactId>
   <version>5.5.10</version>
</dependency>

 

(一)第一种生成

 

private void doGenerateContractPdf(String contractUrl, String serverRealPath, String pdfFileName) throws Exception {
    com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.LETTER);
    try {
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(serverRealPath + pdfFileName));
        document.open();
        String responseString = HttpUtils.httpPostUrlForPdf(contractUrl);
        XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
        worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(responseString.getBytes()),
                Charset.forName("UTF-8"), new AsianFontProvider());
    } catch (Exception e) {
        logger.error("==========异常==========",e);
        throw e;
    } finally {
        document.close();
    }
}

 

(二)第二种生成 自定义Image类支持BASE64图片生成

 private void doGenerateContractPdfForBase64(String contractUrl, String serverRealPath, String pdfFileName) throws Exception {

com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.LETTER);
    try {
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(serverRealPath + pdfFileName));
        document.open();
        String responseString = HttpUtils.httpPostUrlForPdf(contractUrl);
        InputStream in = new ByteArrayInputStream(responseString.getBytes());

        com.itextpdf.tool.xml.html.TagProcessorFactory tagProcessorFactory = Tags.getHtmlTagProcessorFactory();
        tagProcessorFactory.removeProcessor(HTML.Tag.IMG);
        tagProcessorFactory.addProcessor(new ImageTagProcessor(), HTML.Tag.IMG);

        CssFilesImpl cssFiles = new CssFilesImpl();
        cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());
        StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);
        HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));
        hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(tagProcessorFactory);
        HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));
        CssResolverPipeline pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
        XMLWorker worker = new XMLWorker(pipeline, true);
        Charset charset = Charset.forName("UTF-8");
        XMLParser parser = new XMLParser(true, worker, Charset.forName("UTF-8"));
        if(charset != null) {
            parser.parse(in, charset);
        } else {
            parser.parse(in);
        }
    } catch (Exception e) {
        logger.error("==========异常==========",e);
        throw e;
    } finally {
        document.close();
    }
}

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.codec.Base64;
import com.itextpdf.tool.xml.NoCustomContextException;
import com.itextpdf.tool.xml.Tag;
import com.itextpdf.tool.xml.WorkerContext;
import com.itextpdf.tool.xml.exceptions.RuntimeWorkerException;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;

/**
 * Created by gaozz on 2017/1/17.
 */
public class ImageTagProcessor extends com.itextpdf.tool.xml.html.Image {

    /*
     * (non-Javadoc)
     *
     * @see com.itextpdf.tool.xml.TagProcessor#endElement(com.itextpdf.tool.xml.Tag, java.util.List, com.itextpdf.text.Document)
     */
@Override
public List<Element> end(final WorkerContext ctx, final Tag tag, final List<Element> currentContent) {
        final Map<String, String> attributes = tag.getAttributes();
        String src = attributes.get(HTML.Attribute.SRC);
        List<Element> elements = new ArrayList<Element>(1);
        if (null != src && src.length() > 0) {
            Image img = null;
            if (src.startsWith("data:image/")) {
                final String base64Data = src.substring(src.indexOf(",") + 1);
                try {
                    img = Image.getInstance(Base64.decode(base64Data));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                if (img != null) {
                    try {
                        final HtmlPipelineContext htmlPipelineContext = getHtmlPipelineContext(ctx);
                        elements.add(getCssAppliers().apply(new Chunk((com.itextpdf.text.Image) getCssAppliers().apply(img, tag, htmlPipelineContext), 0, 0, true), tag,
                                htmlPipelineContext));
                    } catch (NoCustomContextException e) {
                        throw new RuntimeWorkerException(e);
                    }
                }
            }

            if (img == null) {
                elements = super.end(ctx, tag, currentContent);
            }
        }
        return elements;
    }
}

字体类:
importcom.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.thinkgem.jeesite.common.config.Global;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AsianFontProvider extends XMLWorkerFontProvider {
    protected Logger logger = LoggerFactory.getLogger(AsianFontProvider.class);
    private static final String contractPdfFontLocation = Global.getConfig("contractPdfFontLocation");

    public Font getFont(final String fontname, final String encoding, final boolean embedded,
            final float size, final int style, final BaseColor color) {
        try {
            FontFactory.register(contractPdfFontLocation + "/simhei.ttf");
            Font font3 = FontFactory.getFont("simhei", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12,style);
            return font3;
        } catch (Exception e) {
            logger.error("==========获取字体出现异常==========",e);
        }
        return null;
    }
}
配置文件:contractPdfFontLocation=D:\\pdffonts
 
PS:
<!-- httpclient -->
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.2</version>
   <exclusions>
      <exclusion>
         <artifactId>commons-logging</artifactId>
         <groupId>commons-logging</groupId>
      </exclusion>
   </exclusions>
</dependency>
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpcore</artifactId>
   <version>4.4.4</version>
</dependency>
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpmime</artifactId>
   <version>4.5.2</version>
</dependency>

public static String httpPostUrlForPdf(String url) {
    // 设置HTTP请求参数
String result = null;
    CloseableHttpClient client = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(url);
    try {
        CloseableHttpResponse response = client.execute(httpGet);
        result = EntityUtils.toString(response.getEntity(), "UTF-8");
    } catch (ClientProtocolException e) {
        logger.error("http接口调用异常:url is::" + url, e);
        return null;
    } catch (IOException e) {
        logger.error("http接口调用异常:url is::" + url, e);
        return null;
    } finally {
        try {
            client.close();
        } catch (IOException e) {
            logger.error("http接口调用异常:url is::" + url, e);
        }
    }
    return result;
}

分享到:
评论

相关推荐

    html2pdf:html转换为pdf

    itext7解决中文显示问题有两种解决方式: 1 引入对应的语言包,火狐浏览器预览生成的pdf可能存在部分中文乱码问题,同时因为加载了语言包,生成的pdf更大 使用NotoSansCJKsc-Regular.otf,同时在pom中引入...

    java生成pdf(利用dom4j、freemarker生成固定模板格式的pdf文件)

    首先生成pdf有很多种方式: iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件; Apache PDFBox,生成、合并PDF文档; docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。 比较: iText开源协议为AGPL,...

    exportDoc:使用Itext API解决使用Java创建Word文档的问题

    exportDoc该demo是使用Itext实现Java生成word文档,当然,还有其他方式可以,例如:jacob,但是它局限于windows平台...因此,Itext无疑会比上述两种方式更优,它是一种生成PDF、Word报表的Java组件,专业的人做专业的事

    word转pdf方法

    word转pdf 分两步执行,首先将word转为html,再将生成的html转为pdf,对于docx文件做特殊处理,将html用jsaper进行解析,再进行转化,如果对pdf格式不做特别要求 ,系统中针对docx文件也进行了另一种方式的转化,...

    java范例开发大全(pdf&源码)

    实例138 用iText生成Word文件 205 实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    52. 使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58. 获取用户浏览器信息? 59. 获取当前绝对...

    java源码包---java 源码 大量 实例

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    jsp编程技巧集锦

    使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58. 获取用户浏览器信息?...

    JAVA上百实例源码以及开源项目源代码

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    java源码包2

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

Global site tag (gtag.js) - Google Analytics