Java基于模板导出PDF

引入依赖

   <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

模板制作

使用PDF工具创建表单工具
这里推荐使用《Adobe Acrobat DC》

示例代码


    public  void towritepdf(HttpServletResponse response){

        // 设置响应头
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition",
                "attachment;fileName=test-demo1.pdf");
        OutputStream out = null;
        ByteArrayOutputStream bos = null;
        PdfStamper stamper = null;
        PdfReader reader = null;
        try {
            // 保存到本地
            // out = new FileOutputStream(fileName);
            // 输出到浏览器端
            out = response.getOutputStream();
            // 读取PDF模板表单
            reader = new PdfReader("F:\\HTM_WorkSpace\\doc\\xkz-test-demo1.pdf");
            // 字节数组流,用来缓存文件流
            bos = new ByteArrayOutputStream();
            // 根据模板表单生成一个新的PDF
            stamper = new PdfStamper(reader, bos);
            // 获取新生成的PDF表单
            AcroFields form = stamper.getAcroFields();
            // 给表单生成中文字体,这里采用系统字体,不设置的话,中文显示会有问题
//            BaseFont font = BaseFont.createFont("宋体", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            form.addSubstitutionFont(font);
            // 装配数据
            Map<String, String> data = new HashMap<>(15);
            // 表单变量
            data.put("conunit", "测试");
            // 遍历data,给pdf表单赋值
            if (MapUtils.isNotEmpty(data)) {
                Iterator<Map.Entry<String, String>> iterator = data.entrySet().iterator();
                while (iterator.hasNext()) {
                    Map.Entry<String, String> next = iterator.next();
                    String key = next.getKey();
                    String value = next.getValue();

                    // 默认12号字体
                    float fontSize = 12f;
                    PdfString da = form.getFieldItem(key).getMerged(0).getAsString(PdfName.DA);
                    if (da != null) {
                        Object dab[] = AcroFields.splitDAelements(da.toUnicodeString());
                        if (dab[AcroFields.DA_SIZE] != null)
                            fontSize = ((Float)dab[AcroFields.DA_SIZE]).floatValue();
                    }

                    // 文本框宽度
                    Rectangle position = form.getFieldPositions(key).get(0).position;
                    float textBoxWidth = position.getWidth();
                    // 文本框高度
                    float textBoxHeight = position.getHeight();
                    // 文本单行行高
                    float ascent = font.getFontDescriptor(font.ASCENT,fontSize);
                    // baseFont渲染后的文字宽度
                    float textWidth = font.getWidthPoint(value, fontSize);

                    // 文本框高度只够写一行,并且文字宽度大于文本框宽度,则缩小字体
                    if (textBoxHeight < ascent * 1.6) {
                        while (textWidth > textBoxWidth) {
                            fontSize--;
                            textWidth = font.getWidthPoint(value, fontSize);
                        }
                    }
                    BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                    Font font1 = new Font(bf, 12, Font.UNDERLINE);


//Font font = FontFactory.getFont(FontFactory.COURIER, 20, Font.BOLD, BaseColor.RED);

                    AcroFields s = reader.getAcroFields();

// 设置加粗只能用这种方式

                    List<AcroFields.FieldPosition> multiLinePosition = s.getFieldPositions(key);

                    int page = multiLinePosition.get(0).page;

                    Rectangle rectangle = multiLinePosition.get(0).position;

                    float left = rectangle.getLeft();

                    float right = rectangle.getRight();

                    float top = rectangle.getTop();

                    float bottom = rectangle.getBottom();

                    PdfContentByte pdfContentByte = stamper.getOverContent(page);

                    ColumnText columnText = new ColumnText(pdfContentByte);

                    Rectangle r = new Rectangle(left, bottom, right, top);

                    columnText.setSimpleColumn(r);

                    Chunk chunk = new Chunk("测试");

                    Paragraph paragraph = new Paragraph(12, chunk);

                    columnText.addText(paragraph);

                    // 设置字体,如果不设置添加的中文将无法显示

                    paragraph.setFont(font1);

                    columnText.addElement(paragraph);

                    columnText.go();
                }
            }

            // 表明该PDF不可修改
            stamper.setFormFlattening(true);
            // 关闭资源
            stamper.close();
            // 将ByteArray字节数组中的流输出到out中(即输出到浏览器)
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
            log.info("*****************************PDF导出成功*********************************");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以使用Java实现根据模板生成并导出PDF的功能。具体步骤如下: 1.使用JavaPDF库,例如iText或Apache PDFBox,读取PDF模板文件。 2.使用模板文件中的参数,填充PDF表单字段或者在PDF页面上添加文本、图片等内容。 3.将填充后的PDF文件导出到指定的路径。 下面是一个使用iText库实现根据模板导出PDF的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.FileOutputStream; import java.util.Map; public class PdfGenerator { public static void generatePdf(String templatePath, String outputPath, Map<String, String> params) throws Exception { // 读取PDF模板文件 PdfReader reader = new PdfReader(templatePath); // 创建输出流 FileOutputStream fos = new FileOutputStream(outputPath); // 创建PDF文档对象 Document document = new Document(); // 创建PDF写入器 PdfCopy copy = new PdfCopy(document, fos); // 打开文档 document.open(); // 填充PDF表单字段 PdfStamper stamper = new PdfStamper(reader, fos); for (Map.Entry<String, String> entry : params.entrySet()) { stamper.getAcroFields().setField(entry.getKey(), entry.getValue()); } stamper.setFormFlattening(true); stamper.close(); // 将填充后的PDF文件导出到指定的路径 for (int i = 1; i <= reader.getNumberOfPages(); i++) { PdfImportedPage page = copy.getImportedPage(new PdfReader(reader), i); copy.addPage(page); } document.close(); reader.close(); fos.close(); } } ``` 其中,`templatePath`为PDF模板文件的路径,`outputPath`为导出PDF文件的路径,`params`为填充PDF表单字段的参数。可以根据实际需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值