Java使用IText根据pdf模板创建pdf文件

1.导包

 <dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
 </dependency>
 <dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itext-asian</artifactId>
     <version>5.2.0</version>
 </dependency>
 <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

2.绘制pdf模板
在这里插入图片描述
3.示例代码

/**
 * 读取pdf模板填充生成pdf文件并转为字节数组
 * @return
 */
public byte[] createPdf() {
	//获取源数据(一般从数据库查询,此处通过构造数据简化处理)
	List<Plan> plans = this.getPlans();
       final int size = plans.size();
       //临时文件
       final String outputFilePath = "D:/" + System.currentTimeMillis() + ".pdf";
       OutputStream os = null;
       PdfStamper ps = null;
       PdfReader reader = null;
       PdfReader reader2 = null;
       Document document = null;
       ByteArrayOutputStream byteArrayOutputStream = null;
       PdfCopy pdfNew = null;
       try {
           //读入pdf表单
           reader = new PdfReader(this.getClass().getResourceAsStream("/template/test.pdf"));
           //根据表单生成一个新的pdf
           os = Files.newOutputStream(new File(outputFilePath).toPath());
           ps = new PdfStamper(reader, os);
           //获取pdf表
           AcroFields form = ps.getAcroFields();
           form.setField("contractNo", "HT2024042501");//合同号
           form.setField("paymentDate", "2022-12-01");//放款日期
           form.setField("expiredDate", "2023-12-01");//到期日期
           ps.setFormFlattening(true);
           List<AcroFields.FieldPosition> table = form.getFieldPositions("table");
           Rectangle rect = table.get(0).position;
           PdfPTable pTable = new PdfPTable(8);
           BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
           Font fontZH = new Font(bfChinese, 10f, 0);
           pTable.getDefaultCell().setHorizontalAlignment(1);
           pTable.setWidthPercentage(100.0f);
           float totalWidth = rect.getRight() - rect.getLeft() - 1;
           //计算表格宽度
           float[] columnWidth = {(float) (totalWidth * 0.05), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.15), (float) (totalWidth * 0.13), (float) (totalWidth * 0.13), (float) (totalWidth * 0.09)};
           pTable.setTotalWidth(columnWidth);
           pTable.setLockedWidth(true);
           for (Plan plan : plans) {
               Integer periodNo = plan.getPeriodNo();
               int border = (periodNo % 12 == 0 || periodNo == size) ? Rectangle.BOTTOM : Rectangle.NO_BORDER;
               pTable.addCell(generateCell(String.valueOf(periodNo), border, fontZH));
               pTable.addCell(generateCell(plan.getMatchDate(), border, fontZH));
               pTable.addCell(generateCell(plan.getRepayOriginal(), border, fontZH));
               pTable.addCell(generateCell(plan.getPenalty(), border, fontZH));
               pTable.addCell(generateCell(plan.getRepayAmount(), border, fontZH));
               pTable.addCell(generateCell(plan.getRestOriginal(), border, fontZH));
               pTable.addCell(generateCell(plan.getRepayDate(), border, fontZH));
               pTable.addCell(generateCell(plan.getRepayStatus(), border, fontZH));
           }
           pTable.setKeepTogether(true);
           pTable.setSplitLate(false);
           pTable.setSplitRows(true);
           //计算需要分页的总页数
           int totalpage = size % 12 == 0 ? size / 12 : size / 12 + 1;
           if (totalpage == 1) {
               //获table页面
               PdfContentByte under = ps.getOverContent(1);
               //添加table
               pTable.writeSelectedRows(0, -1, rect.getLeft(), rect.getTop(), under);
           } else {
               for (int i = 1; i <= totalpage; i++) {
                   PdfContentByte under = ps.getOverContent(i);
                   if (i == 1) {
                       pTable.writeSelectedRows(0, 12, rect.getLeft(), rect.getTop(), under);
                   } else {
                       pTable.writeSelectedRows((i - 1) * 12, i * 12, rect.getLeft(), rect.getTop(), under);
                   }
               }
           }
           ps.close();
           reader2 = new PdfReader(outputFilePath);
           document = new Document(reader2.getPageSizeWithRotation(1));
           byteArrayOutputStream = new ByteArrayOutputStream();
           pdfNew = new PdfCopy(document, byteArrayOutputStream);
           document.open();
           PdfImportedPage page;
           for (int i = 1; i <= totalpage; i++) {
               page = pdfNew.getImportedPage(reader2, i);
               pdfNew.addPage(page);
           }
           document.close();
           os.close();
           pdfNew.close();
           reader.close();
           reader2.close();
           FileUtils.delete(new File(outputFilePath));
           return byteArrayOutputStream.toByteArray();
       } catch (Exception e) {
       	e.printStackTrace();
       } finally {
           try {
               if (ps != null) {
                   ps.close();
               }
               if (reader != null) {
                   reader.close();
               }
               if (os != null) {
                   os.close();
               }
               if (document != null) {
                   document.close();
               }
               if (pdfNew != null) {
                   pdfNew.close();
               }
               if (reader2 != null) {
                   reader2.close();
               }
               if (byteArrayOutputStream != null) {
                   byteArrayOutputStream.close();
               }
           } catch (Exception e) {
           	e.printStackTrace();
           }
       }
	return null;
}

private List<Plan> getPlans() {
	List<Plan> plans = new ArrayList<Plan>();
	for(int i=1;i<=12;i++) {
		plans.add(new Plan(i,"2023-"+String.format("%02d", i)+"-01","999","-", "999","0","2023-"+String.format("%02d", i)+"-01", "已结清"));
	}
	return plans;
}

   private PdfPCell generateCell(String value, int border, Font fontZH) {
       PdfPCell cell = new PdfPCell(new Phrase(value, fontZH));
       cell.setBorder(border);
       cell.setHorizontalAlignment(Element.ALIGN_CENTER);
       return cell;
   }
   
   public static void main(String [] args) throws FileNotFoundException, IOException {
   	//将字节流转为pdf文件放于D盘
       OutputStream fileOut = new FileOutputStream("D:/a.pdf");
       fileOut.write(new TestPdf().createPdf());
   }

4.执行结果
在这里插入图片描述
5.所用到jar包下载地址
itextpdf-5.5.10.jar

欢迎大家积极留言交流学习心得,点赞的人最美丽!

使用iText库根据模板导出PDF文件,您可以按照以下步骤进行操作: 1. 首先,您需要将iText库添加到您的Java项目中。您可以在iText的官方网站(https://itextpdf.com/)上下载并导入相应的jar文件。 2. 加载模板PDF文件。您可以使用iTextPdfReader类来加载模板文件,例如: ```java PdfReader reader = new PdfReader("template.pdf"); ``` 3. 创建一个新的PdfWriter对象,将其与输出PDF文件相关联。您可以使用iTextPdfWriter类来实现这一点,例如: ```java PdfWriter writer = new PdfWriter("output.pdf"); ``` 4. 创建一个新的PdfDocument对象,并将其与模板文件PdfWriter对象相关联。这将使您能够编辑和导出PDF文件。例如: ```java PdfDocument document = new PdfDocument(reader, writer); ``` 5. 获取特定页面的PdfPage对象,并创建一个PdfCanvas对象以在页面上绘制内容。例如: ```java PdfPage page = document.getPage(1); // 获取第一页 PdfCanvas canvas = new PdfCanvas(page); canvas.beginText(); canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD), 12); canvas.moveText(100, 700); canvas.showText("Hello, World!"); canvas.endText(); ``` 在这个示例中,我们在第一页上添加了一个文本元素。 6. 关闭文档并保存生成PDF文件。例如: ```java document.close(); ``` 这样,您就可以使用iText库根据模板导出PDF文件了。请注意,iText库还提供了许多其他功能,例如添加表格、图片等,您可以根据自己的需求进行更多的PDF编辑操作。 希望对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值