itext_根据模板导出pdf(文字表格图片)

飞廉灬少将      2022-02-14     584

关键词:

1、引入jar包

		<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.4.3</version>
        </dependency>

2、新建word文档,创建模板,将文件另存为pdf,并用Adobe Acrobat DC打开

3、在需要插入数据的空白处,右击,点击【文本域】,将文本域拖放到你想要的位置,更改域名称为你传入的变量名。

4、模板(编辑好后的模板)

5、保存模板,将模板放到项目中

pdf生成,代码如下

public static void creatPdf(Map<String, Object> map, String filePath) 
        try 
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            FileOutputStream out = new FileOutputStream(filePath);// 输出流
            // 读取pdf模板
//            PdfReader reader = new PdfReader(TemplateToWord.class.getResource("/com/cn/business/templates/report.pdf"));
            PdfReader reader = new PdfReader(String.valueOf(map.get("tempPath")));
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            PdfStamper stamper = new PdfStamper(reader, bos);
            stamper.setFormFlattening(true);
            AcroFields form = stamper.getAcroFields();
            // 文字类的内容处理
            Map<String, String> datemap = (Map<String, String>) map.get("dataMap");
            form.addSubstitutionFont(bf);
            for (String key : datemap.keySet()) 
                String value = datemap.get(key);
                form.setField(key, value);
            
            // 图片类的内容处理
            Map<String, String> imgmap = (Map<String, String>) map.get("imgMap");
            for (String key : imgmap.keySet()) 
                String value = imgmap.get(key);
                String imgpath = value;
                int pageNo = form.getFieldPositions(key).get(0).page;
                Rectangle signRect = form.getFieldPositions(key).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                // 根据路径读取图片
                Image image = Image.getInstance(imgpath);
                // 获取图片页面
                PdfContentByte under = stamper.getOverContent(pageNo);
                // 图片大小自适应
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            
            // 表格类
            Map<String, List<List<String>>> listMap = (Map<String, List<List<String>>>) map.get("tableList");
            for (String key : listMap.keySet()) 
                List<List<String>> lists = listMap.get(key);
                int pageNo = form.getFieldPositions(key).get(0).page;
                PdfContentByte pcb = stamper.getOverContent(pageNo);
                Rectangle signRect = form.getFieldPositions(key).get(0).position;
                //表格位置
                int column = lists.get(0).size();
                int row = lists.size();
                PdfPTable table = new PdfPTable(column);
                float tatalWidth = signRect.getRight() - signRect.getLeft() - 1;
                int size = lists.get(0).size();
                float width[] = new float[size];
                for (int i = 0; i < size; i++) 
                    if (i == 0) 
                        width[i] = 60f;
                     else 
                        width[i] = (tatalWidth - 60) / (size - 1);
                    
                
                table.setTotalWidth(width);
                table.setLockedWidth(true);
                table.setKeepTogether(true);
                table.setSplitLate(false);
                table.setSplitRows(true);
                Font FontProve = new Font(bf, 10, 0);
                //表格数据填写
                for (int i = 0; i < row; i++) 
                    List<String> list = lists.get(i);
                    for (int j = 0; j < column; j++) 
                        Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve);
                        PdfPCell cell = new PdfPCell(paragraph);
                        cell.setBorderWidth(1);
                        cell.setVerticalAlignment(Element.ALIGN_CENTER);
                        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                        cell.setLeading(0, (float) 1.4);
                        table.addCell(cell);
                    
                
                table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb);
            
            stamper.setFormFlattening(true);        // 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            stamper.close();
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            int pageNum = reader.getNumberOfPages();
            for (int i = 1; i <= pageNum; i++) 
                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                copy.addPage(importPage);
            
            doc.close();
         catch (IOException e) 
            System.out.println(e);
         catch (DocumentException e) 
            System.out.println(e);
        

    

6、测试方法

public static void main(String[] args) 
        // 模板路径
        String tempPath = "D:\\admin\\test.pdf";

        //文字类
        Map<String, String> dataMap = new HashMap<String, String>();
        DateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String title = "测试文字内容" + "(" + format.format(new Date()) + ")";
        dataMap.put("title", title);		// dataMap中的key要和模板中的域名对应

        //图片
        String imgPath = "C:\\Users\\Admin\\Pictures\\豚鼠图片.jpg";
        Map<String, String> imgMap = new HashMap<String, String>();
        imgMap.put("picture", imgPath);		// imgMap中的key要和模板中的域名对应

        //表格 一行数据是一个list
        List<String> list = new ArrayList<String>();
        list.add("日期");
        list.add("金额");

        List<String> list2 = new ArrayList<String>();
        list2.add("2021-08-27");
        list2.add("100000");

        List<List<String>> List = new ArrayList<List<String>>();
        List.add(list);
        List.add(list2);

        Map<String, List<List<String>>> listMap = new HashMap<String, List<List<String>>>();
        listMap.put("table", List);		// 这里的listMap中key要和模板中的域名对应

        Map<String, Object> o = new HashMap<String, Object>();
        o.put("tempPath", tempPath);
        o.put("dataMap", dataMap);
        o.put("imgMap", imgMap);
        o.put("tableList", listMap);

        String outPutPath = "D:\\admin\\test1.pdf";
        creatPdf(o, outPutPath);
    

7、效果图

8、结语

itext的功能不单单只有这些,当然,这些也是比较常用的,另外还有合并PDF文件,以及生成带水印或背景的PDF,如果有需要,我也可以贴出来

原创不易,如果对你有帮助,一键三连吧

itext_根据模板导出pdf(文字表格图片)(代码片段)

1、引入jar包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version&... 查看详情

javaitext根据模板生成pdf(包括图片和表格)

1、导入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。2、新建word文档,创建模板,将文件另存为pdf,并用AdobeAcrobatDC打开编辑,点击右侧【准备表单】后点击【开始】3、在需要插入数据的空白处,右击,点击【文本域】,... 查看详情

java利用itext导出pdf

...用itext比较多广泛。导出pdf可以使用两种方式,一是可以根据已有的pdf模板,进行生成文档。二是直接用代码生成pdf一、使用模板生成pdf1、添加依赖<dependency> <groupId>com.itextpdf</groupId> &l 查看详情

poi根据模板导出word文件,以及word转pdf,pdf转图片再插入pdf中(防止pdf被修改)(代码片段)

@目录POI根据模板导出word文件word转PDFPDF转图片再插入PDF中(防止PDF被修改)POI根据模板导出word文件一、制作word模版,$xxxx是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据。????... 查看详情

使用itext搜索和替换pdf

我需要根据一些用户输入生成PDF。输出PDF有一些图像,表格和文本。我认为Itext对于以编程方式生成此报告不是用户友好的。由于我需要生成的报告非常复杂,我想知道是否可以创建模板PDF然后加载->搜索->替换我想要的字符... 查看详情

flying-saucer+itext+freemarker实现pdf的导出,支持中文css以及图片

...     项目中有个需求,需要将合同内容导出成pdf。上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限控制,并且还... 查看详情

使用 iText 7 将 HTML 模板转换为 PDF:如何移动跨页打印的表格

】使用iText7将HTML模板转换为PDF:如何移动跨页打印的表格【英文标题】:ConvertHTMLTemplatetoPDFusingiText7:howtomoveatablethatprintsacrosspages【发布时间】:2021-07-2200:20:57【问题描述】:我正在开发一个asp.netmvc项目,并且我正在使用一个html... 查看详情

itext+freemarker实现pdf的导出,支持中文css以及图片,页眉页脚,页眉添加图片

   本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉图片     原来是决定采用wkhtmlToPdf将html页面转... 查看详情

python使用fpdf生成发票格式的pdf文件包含:文字图片logo表格条形码等;(代码片段)

python使用fpdf生成发票格式的pdf文件包含:文字、图片logo、表格、条形码等;pipinstallfpdf #python使用fpdf生成发票格式的pdf文件包含:文字、图片logo、表格、条形码等;#-*-coding:iso-8859-1-*-from__future__importwith_statementimportsys,osfromfpd... 查看详情

java利用itext实现导出pdf文件(代码片段)

因为工作中要用到,导出不同的PDF,所以学习了Itext我两天创建的PDF如下所示,主要是简单的表格类的  1、引包<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version> 查看详情

java模板导出pdf

...模板随意调,生成出来的图片不会超过范围。而且不需要根据坐标去算,程序里面自动计算的。    支持多页模板,即使 查看详情

java根据模板html动态生成pdf

...:https://segmentfault.com/a/1190000009160184 一、需求说明:根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。二、解决方案:iText+FreeMarker+JFreeChart生成可动态配置的PDF文档iText有很强大的PDF处理能力,... 查看详情

java根据模板动态生成pdf(代码片段)

一、需求说明:根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。二、解决方案:iText+FreeMarker+JFreeChart生成可动态配置的PDF文档iText有很强大的PDF处理能力,但是样式和排版不好控制,直接写PDF文... 查看详情

java根据模板导出pdf详细教程

...fight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word成功了;但是导出pdf相对麻烦了一点。两天的研究测试java导出PDF,终于成功了,期间走了不少弯路,今分享出来,欢迎大家... 查看详情

html导出pdf的四种方式

将html页面导出为pdf文件并打印,可以直接在windows下使用Ctrl+P,苹果下?+P。如果需要用代码实现,可以考虑jsPDF、iText、wkhtmltopdf等方式。以下是三种方式代码对比:方式优点缺点分页图片表格链接中文特殊字符、样式导出样例备... 查看详情

pdf格式在itext7中为空

...问题描述】:我用LibreOffice创建了一个pdf表单。我将表格导出为pdf。我选中了“创建pdf表单”选项并选择了FDF(或PDF)提交格式。.现在我尝试检索字段表单。我正在使用itext7。这是我正在使用的代码:PdfDocumentdocument=newPdfDocument(n... 查看详情

java根据模板文件导出pdf

原文:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护... 查看详情

word+freemarker+itext+flyingsaucer通过模板生成pdf注意事项

参考技术A1、通过将word另存为html中要注意a、flying不能识别用tab来代表的空格。b、生成的table应该删除widh属性,保留style里面的width定义。c、在表格内的中文如果过长,将表格撑开,需要添加以下内容,这个时候就要保留table的wi... 查看详情