【电子签章】HTML格式合同转化成PDF文件

代码地址如下:
http://www.demodashi.com/demo/12476.html

一、主要思路

  • 通过itextpdf 生成想要的pdf 文件
  • 通过itextpdf 中 XMLWorkerHelper 组件将html 转化成 pdf 文件
  • 针对中文字符使用itext-asian进行中文字符处理

二、程序实现

1.添加程序依赖

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

2.使用itextpdf生成pdf

 	/**
     * 绘制一个PDF文件
     * @param target    生成地址
     */
    public static void draw(String target) throws IOException, DocumentException {
        Document document = new Document(PageSize.B5,20,20,30,20);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(target));
        document.open();

        // 设置文档属性
        document.addAuthor("Geek");
        document.addCreationDate();
        document.addCreator("http://www.demodashi.com/");
        document.addTitle("Geek Pdf Demo");
        document.addSubject("PDF生成的Demo");

        // 设置中文字体和字体样式
        BaseFont chineseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font font = new Font(chineseFont, 10, Font.NORMAL);
        Font font1 = new Font(chineseFont, 8, Font.NORMAL);

        // 设置编号
        Paragraph paragraph = new Paragraph("编号:A08485743-1", font1);
        paragraph.setAlignment(Element.ALIGN_RIGHT);
        document.add(paragraph);

        // 创建表格
        PdfPTable pdfTable = new PdfPTable(2);
        float[] widths = {0.06f, 0.06f};
        pdfTable.setWidths(widths);
        //设置表格占PDF文档100%宽度
        pdfTable.setWidthPercentage(100);
        //水平方向表格控件居中
        pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_CENTER);

        PdfPCell Cell = new PdfPCell();
        Cell.setColspan(2);
        Cell.setPhrase(new Paragraph("支付宝还款电子回单", font));
        Cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        Cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        pdfTable.addCell(Cell);

        PdfPCell Cell1 = new PdfPCell();
        Cell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        Cell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);

        Cell1.setPhrase(new Paragraph("支付宝还款电子回单", font));
        pdfTable.addCell(Cell1);
        Cell1.setPhrase(new Paragraph("11", font));
        pdfTable.addCell(Cell1);

        document.add(pdfTable);
        document.close();
        writer.close();
    }

这里只是一个简单的小例子,复杂的结构,还需要了解下itextpdf的组件.
顺便提一句,在这种情况下也可以尝试pdfbox组件试一下

效果图如下:

3.将html文件模板转化成pdf

   在实际应用中,大部分的合同同时html格式的,但是在一些系统中,需要对合同的法律效力进行认证。这时就会用到电子签章,目前国内的签章系统大多是对PDF文件进行签章。所以很多公司就会使用HTML转PDF的格式。转换的工具很多,但是的确不怎么好用。

现在给大家推荐这种方式,也是我们线上使用的方式,效果很不错。

public static void draw(String src,String target)throws IOException, DocumentException{
        Document document = new Document(PageSize.B5,20,20,30,20);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(target));
        document.open();
        XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(src), null, Charset.forName("UTF-8"),new ChineseFontProvider(6));
        document.close();
    }

itextpdf是老外们做的插件,所以对中文不是特别友好,好在推出了中文包,但是需要稍作修改


/**
 * @Description: 中文处理
 * @File: ChineseFontProvider
 * @author: Geek
 * @date 2018/1/25 上午11:25
 */
public class ChineseFontProvider extends XMLWorkerFontProvider {


    private int fontSize;

    public ChineseFontProvider(){
        this.fontSize = 0;
    }

    public ChineseFontProvider(int fontSize){
        this.fontSize = fontSize;
    }
    @Override
    public Font getFont(final String fontname, final String encoding,
                        final boolean embedded, final float size, final int style,
                        final BaseColor color) {
        BaseFont bf = null;
        try {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",  BaseFont.NOT_EMBEDDED);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Font font = null;
        if (fontSize != 0){
            font = new Font(bf, fontSize, style, color);
        } else {
            font = new Font(bf, size, style, color);
        }
        font.setColor(color);
        return font;
    }

    public int getFontSize() {
        return fontSize;
    }

    public void setFontSize(int fontSize) {
        this.fontSize = fontSize;
    }
}


效果图如下:

三、程序目录结构


【电子签章】HTML格式合同转化成PDF文件

代码地址如下:
http://www.demodashi.com/demo/12476.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

posted on 2018-03-06 10:12  demo例子集  阅读(974)  评论(0编辑  收藏  举报

导航