zoukankan      html  css  js  c++  java
  • java 工具PDF使用——itextpdf

    最近做一个项目需求,客户说要求将数据导出数据做纸质存档,我一听一个头两个大,不知道该怎么做。经过一番交流要求将用户信息,填入指定表格,然后转pdf文件打印出纸质材料。我简单应付了下,然后就开始了百度了。看了很多很多,都只是说了下怎么用java答应pdf文件,但是他说的模板表格,都是啥玩意!为此记录下我完成这个需求的经历。

    ​ 首先使用adobe acrobat来制作表单,这是工具教程连接,创建一个类似于英语完考试形填空的文章;然后通过pdf的工具itextpdf(这里使用的语言是java);最后我就直接上代码了!

    maven依赖如下:

    <!-- pdf文件依赖包 -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.2.0</version>
            </dependency>
    <!-- pdf字体依赖包 -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>
    

    java代码如下:

    public static void main(String[] args) throws IOException, DocumentException {
            mergePdf();
        }
    
        /**
         * 向pdf中写入一个简单的段落
         * @throws FileNotFoundException
         * @throws DocumentException
         */
        public static void  createPdf() throws FileNotFoundException, DocumentException {
            /**
             * 创建文档
             */
            Document doc = new Document();
            /**
             * 将文档与输出流关联起来
             */
            PdfWriter.getInstance(doc, new FileOutputStream("demo.pdf"));
            /**
             * 打开输入流
             */
            doc.open();
            /**
             * 设置字体,这里字体是获取itext-asian 包中的
             * 也有其他的方法,例如BaseFont.createFont()来获取
             */
            com.itextpdf.text.Font kai = FontFactory.getFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED ,7.5f);
            /**
             * 向文档中输入一个段落
             */
            doc.add(new Paragraph(new Chunk("demoshibushiniaaaa",kai)));
            /**
             * 关闭输入流
             */
            doc.close();
        }
    
        /**
         * 合并多个pdf文件,这里是将上个例子中的pdf文件进行复制合并
         * @throws DocumentException
         * @throws IOException
         */
        public static void mergePdf() throws DocumentException, IOException {
            Document doc = new Document();
            PdfCopy pdfCopy = new PdfCopy(doc,new FileOutputStream("demo2.pdf"));
    
            doc.open();
            for (int i = 0; i < 3; i++) {
                doc.newPage();
                PdfReader pdfReader = new PdfReader("demo.pdf");
                PdfImportedPage importedPage = pdfCopy.getImportedPage(pdfReader, 1);
                pdfCopy.addPage(importedPage);
            }
            doc.close();
        }
    
        /**
         * 表单编辑
         */
        public static void editPdf() throws IOException, DocumentException {
            Document doc = new Document();
            PdfCopy pdfCopy = new PdfCopy(doc,new FileOutputStream("demo2.pdf"));
    
            doc.open();
            for (int i = 0; i < 3; i++) {
                PdfReader pdfReader = new PdfReader("temp.pdf");
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                PdfStamper pdfStamper = new PdfStamper(pdfReader, bos);
    
                BaseFont kai = BaseFont.createFont("simsun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                /**
                 * 获取表单对象
                 */
                AcroFields form = pdfStamper.getAcroFields();
                form.addSubstitutionFont(kai);
                Map<String, AcroFields.Item> fields = form.getFields();
                for (Map.Entry<String, AcroFields.Item> entry : fields.entrySet()) {
                    String key = entry.getKey();
    //                AcroFields.Item value = entry.getValue();
                    String fieldValue = "demo text";
    
                    List<AcroFields.FieldPosition> fieldPositions = form.getFieldPositions(key);
                    if (fieldPositions != null && fieldPositions.size() != 0){
                        /**
                         * 默认文字大小
                         */
                        float fontSize = 14;
                        /**
                         * 获取表单框
                         */
                        Rectangle position = fieldPositions.get(0).position;
                        /**
                         * 获取表单宽度
                         */
                        float borderBoxWidth = position.getWidth();
                        /**
                         * 获取内容文本宽度
                         */
                        float textWidth = kai.getWidthPoint(fieldValue, fontSize);
                        while (textWidth > borderBoxWidth){
                            fontSize --;
                            textWidth = kai.getWidthPoint(fieldValue,fontSize);
                        }
                        /**
                         * 设置字段大小
                         */
                        form.setFieldProperty(key,"textsize",fontSize,null);
                        /**
                         * 设置文字
                         */
                        form.setField(key,fieldValue);
                    }
                }
            }
            doc.close();
        }
    

    谢谢观看,如有不足请指正!

  • 相关阅读:
    CentOS6.5升级内核到3.10.28的记录
    redis集群搭建,手把手教学
    zookeeper集群搭建,这一篇就够了
    Caused by: java.sql.SQLException: Column 'show_type' not found
    zkEnv.sh: Syntax error: "(" unexpected (expecting "fi")记录一下解决方法。。。
    http分层
    浏览器
    less
    333
    CSS 解决方案
  • 原文地址:https://www.cnblogs.com/theStone/p/15765052.html
Copyright © 2011-2022 走看看