zoukankan      html  css  js  c++  java
  • 【电子签章】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大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    初学三种神经网络(前馈,竞争,递归联想存储网络)
    链表操作,空间复杂度要求为O(1)
    单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)
    Floyd算法小结
    排序算法Java实现(基数排序)
    排序算法Java实现(归并排序)
    排序算法Java实现(堆排序)
    排序算法Java实现(选择排序)
    排序算法Java实现(快速排序)
    排序算法Java实现(冒泡排序)
  • 原文地址:https://www.cnblogs.com/demodashi/p/8512781.html
Copyright © 2011-2022 走看看