通过模板生成pdf文件(一页或多页)-java

流程

1.使用Adobe acrobat pro(pdf编辑工具)创建pdf表单模板文件。
2.Java(使用itext的jar包)获取并填充表单。

创建表单

1.使用Adobe acrobat pro打开需要作为模板的pdf文件,空的有内容的都可以,具体看自己需求吧,我这里打开的是一个空的pdf。
2.点击右上角工具-表单-编辑,进入表单编辑页面。
3.点击添加新域,有很多组件可以选择。在这里插入图片描述
4.在页面需要填充数据的地方选择相应的组件,文本域的名称就是一会需要填充的表单的键值,也就是标识。我写的例子是一个发票的pdf,用的都是文本域(这些表单的域用pdf正常打开是看不到的,只有在这个表单编辑页面才可以看到,所以现在模板看起来还是空的)。
在这里插入图片描述
5.完事保存。

填充数据

1.导包,需要用到itext包
(1)自己导入,这是我使用的jar包,0积分下载即可,itext-4.2.0
(2)pom方式,这个版本是比较新的

		<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.3</version>
        </dependency>  

2.开始代码部分

public class Main {

    public static void main(String[] args) throws IOException, DocumentException {
        //pdf模板路径
        String TemplatePDF = "src/com/company/peinvoice.pdf";
        //生成pdf路径
        String temp = "src/com/company/peinvoice_temp.pdf";
        FileOutputStream fos = new FileOutputStream (temp);
        //用于存储每页生成pdf流
        ByteArrayOutputStream baos[] = new ByteArrayOutputStream[2];

        //3页pdf所以直接循环3次,填充各个表单数据
        for (int i=0;i<2;i++){
            //获取表单
            baos[i] = new ByteArrayOutputStream();
            PdfReader reader = new PdfReader(TemplatePDF);
            PdfStamper stamp = new PdfStamper(reader,baos[i]);
            AcroFields form = stamp.getAcroFields();

            //填充表单
            form.setField("trueName", "姓名"+i);
            form.setField("year", "2020");              //开票时间
            form.setField("month", "09");
            form.setField("day", "16");
            form.setField("studyNo", "学号"+i);
            form.setField("className", "班级:"+"") ;
            for(int j=0;j<4;j++){
                form.setField("feeType"+j, "费用项"+j);
                form.setField("amount"+j, "金额"+j);
            }
            form.setField("totalAmountCh","合计人民币(大写):"+"壹万");
            form.setField("totalAmount", "4");
            form.setField("school", "xx大学");
            form.setField("jibanren", "林海帆");
            stamp.setFormFlattening(true);
            stamp.close();

        }

        //创建并打开一个pdf对象
        Document doc = new Document();
        PdfCopy pdfCopy = new PdfCopy(doc,fos);
        doc.open();

        //2页拼到一个文档里
        for (int i=0;i<2;i++){
            PdfImportedPage impage = pdfCopy.getImportedPage(new PdfReader(baos[i].toByteArray()), 1);
            pdfCopy.addPage(impage);
        }
        //关闭
        doc.close();

    }
}

3.生成文件的效果
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java PDF动态模板替换生成PDF,可以使用Apache PDFBox库。下面是大致的步骤: 1. 创建一个PDF文档对象,可以使用PDFBox中的PDDocument类。 2. 打开PDF模板文件,可以使用PDFBox中的PDFTextStripper类读取PDF模板中的文本内容。 3. 使用Java的字符串替换方法替换PDF模板中的文本占位符。 4. 使用PDFBox中的PDFont类设置字体和字号。 5. 使用PDFBox中的PDPageContentStream类将替换后的文本内容写入PDF文档。 6. 关闭PDPageContentStream和PDDocument对象,保存PDF文档。 下面是一个简单的示例代码: ``` import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.text.PDFTextStripper; public class PdfTemplateGenerator { public static void main(String[] args) { try { // 打开PDF模板文件 PDDocument document = PDDocument.load(new File("template.pdf")); PDFTextStripper pdfStripper = new PDFTextStripper(); String text = pdfStripper.getText(document); // 替换模板中的文本占位符 Map<String, String> data = new HashMap<>(); data.put("name", "John Doe"); data.put("email", "johndoe@example.com"); data.put("age", "30"); for (Map.Entry<String, String> entry : data.entrySet()) { text = text.replace("${" + entry.getKey() + "}", entry.getValue()); } // 创建PDF文档对象 PDDocument pdfDocument = new PDDocument(); PDPage page = new PDPage(); pdfDocument.addPage(page); // 设置字体和字号 PDFont font = PDType1Font.HELVETICA; int fontSize = 12; // 将替换后的文本内容写入PDF文档 PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page); contentStream.beginText(); contentStream.setFont(font, fontSize); contentStream.newLineAtOffset(100, 700); contentStream.showText(text); contentStream.endText(); contentStream.close(); // 关闭PDPageContentStream和PDDocument对象,保存PDF文档 pdfDocument.save("output.pdf"); pdfDocument.close(); document.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 需要注意的是,该示例代码只处理了一个页面的情况,如果需要处理多页PDF模板,则需要在循环中创建多个PDPage对象,并将其添加到PDDocument对象中,同时在PDPageContentStream中指定不同的坐标偏移量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值