Html模板生成pdf文件

论坛 期权论坛 期权     
疯狂的脑细胞   2019-6-30 05:33   2438   0
[h2]1、准备jar包[/h2]itextpdf-5.5.13.jar、itext-asian-5.2.0.jar、xmlworker-5.5.13.jar
其中itextpdf-5.5.13.jar为pdf文件包,itext-asian-5.2.0.jar为语言包,若不引进该jar包会中文乱码,xmlworker-5.5.13.jar为html文件转换包

jar包链接: https://pan.baidu.com/s/1-S_oVsckHevYRGcAWDYkMg 提取码: bkxd 复制这段内容后打开百度网盘手机App,操作更方便哦
[h2][/h2][h2]2、准备html文件[/h2]生成pdf文件对于模板html文件要求较高,html文件中所有标签必须成对出现,如等,同时html文件头部需替换成

,否则会造成pdf文件生成失败。

若只有Word模板文件,可以通过相关网站转成html文件再进行上述处理。
Word在线转html传送门:http://www.docpe.com/word/word-to-html.aspx

[h2]3、Html转pdf[/h2]Html2Pdf工具类转换pdf
package test.pdf;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;

publicclass Html2Pdf {

   @SuppressWarnings("resource")
   publicstaticvoid main(String[] args) {
      // html模板文件路径
      String htmlUrl = "D:/测试文件/pdf/contract.html";
      
      Document document = null;
      PdfWriter pdfWriter = null;
      try {
        document = new Document(PageSize.LETTER);
        // 创建pdf输出流
        pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("D:\\测试文件\\pdf\\testpdf20190629.pdf"));
        // 打开pdf文件
        document.open();
        
        // 设置文件创建人、作者等等信息,可按照要求设置
        document.addAuthor("test");
        document.addCreator("test");
        document.addSubject("test");
        document.addCreationDate();
        document.addTitle("XHTML toPDF");

        // 读取html模板内容
        InputStream in = new FileInputStream(htmlUrl);
        InputStreamReader isr = new InputStreamReader(in, "utf-8");
        BufferedReader brd = new BufferedReader(isr);
        StringBuffer sbf = new StringBuffer();
        String line = "";
        while ((line = brd.readLine()) != null) {
           sbf.append(line);
        }
        String htmlTemplete = sbf.toString();

        // 转换占位符
        htmlTemplete = htmlTemplete.replaceAll("ownerName", "html转pdf测试");
        
        // 准备将html文件转换为pdf,AsianFontProvider为字体设置类,设置中文字体,否则中文无法展示
        XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
        worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(htmlTemplete.getBytes("UTF-8")),Charset.forName("utf8"),new AsianFontProvider());
        
        // 添加图片信息,可设置绝对位置以及图片的缩略大小,此处添加图片是另起一页进行添加,暂时无法添加到html文件的固定位置,若有相关需要可以看下篇文章,利用pdf模板生成pdf文件
        Image image = Image.getInstance("D:\\测试文件\\pic\\timg.jpg");
        image.setAbsolutePosition(10, 60);
        image.scalePercent(30);
        document.add(image);

        // 关闭文件
        document.close();
        System.out.println("Done");
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        if (document != null)
           // 如果不关闭则会生成空的破损的pdf
           document.close();
      }
   }
}

AsianFontProvider类,用于语言转换
package test.pdf;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

publicclass AsianFontProvider extends XMLWorkerFontProvider{
   public Font getFont(final String fontname, final String encoding,
            finalbooleanembedded, finalfloatsize, finalintstyle,
            final BaseColor color) {
        BaseFont bf = null;
        try {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Font font = new Font(bf, size, style, color);
        font.setColor(color);
        returnfont;
    }
}

[h2]总结[/h2]优点:
1、  可以在html中灵活设置模板文件的字体大小、间距、字体颜色等等html支持的样式标签
2、  修改模板文件方便快捷,若需修改或添加相关内容,只需要做迭代增加即可,无需重新设置原先的模板内容,这点比pdf模板生成pdf好的多,下篇具体讲
3、  一般生成pdf文件功能中,前端已经有相关html文件,无需自己编写html(但还是要注意html文件格式规范)。
4、  好吧,暂时还没想到


缺点
1、  该方法对html文件格式规范较高,格式错误无法转换pdf
2、  如果pdf中有图片需要替换,那这部分功能比较难实现,html模板方法中,图片现在暂时只能添加到pdf文件新页中。查过了资料,有一种方法是先通过html生成一个临时的pdf文件,然后对临时的pdf文件进行IO流读取操作,再进行图片具体位置的替换处理。个人觉得这个操作有点难受,会多生成一个临时pdf文件,占用服务器空间,而且读写操作频繁,可能会出现未知的其它问题,不推荐使用


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP