Java读取pdf模板,并动态生成pdf文件,如动态生成准考证、学位证书等
Java讀取pdf模板,并動態生成pdf文件,如動態生成準考證
? 前幾天遇到了一個生成準考證的需求,并提供用戶下載,然后百度了一圈還是覺得使用itextpdf這個框架好用點。但是還需要找到一個能創建pdf表單的工具來生成pdf模板??梢允褂肁dobe Acrobat進行創建,但是我自己電腦上剛好有一個軟件可以制作就沒有去下載了😆
? 下面只是用到了itextpdf一部分的功能,如果還有其他字體格式、樣式的需求可以參考他的官方網址Overview (iText 5.5.13 API) (itextpdf.com)
1. 模板制作
我是用的是一款pj軟件PDFelement,當初下它是用來轉換pdf到word,沒想到也可以制作pdf表單😀
可能有點看不清楚框框里寫的啥,就是寫的后端實體類中屬性的名稱,dddd最好一一對應嘛
2. 效果展示
還可以吧,此準考證模板地址:https://download.csdn.net/download/SleepNot_Need/87576794
3. 導入依賴
在pom.xml里導入下面兩個依賴就行了
<!--pdf--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><!-- 這個主要用來設置樣式什么的 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>4. 數據填充
public class PdfTest {public static void main(String[] args) {// 模板地址String tempPath = "D:\\test\\ticketPdfTemplate.pdf";// 生成pdf后的保存地址String outTempPath = "D:\\test\\ticketPdf.pdf";File old = new File(outTempPath);if (old.exists()){old.delete();}PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper pdfStamper;try {// 查詢準考證數據ScpStudentAdmissionTicket ticket = this.baseMapper.selectById(id);// 讀取pdf模板reader = new PdfReader(tempPath);// 將填充完成后的pdf輸出到指定位置out = new FileOutputStream(outTempPath);bos = new ByteArrayOutputStream();pdfStamper = new PdfStamper(reader, bos);// 獲取到表單集合AcroFields acroFields = pdfStamper.getAcroFields();// 加載字體BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 設置寫入字體acroFields.addSubstitutionFont(font);// 設置文本信息acroFields.setField("activityName", ticket.getActivityName());acroFields.setField("studentName", ticket.getStudentName());acroFields.setField("admissionNumber", ticket.getAdmissionNumber());acroFields.setField("idCard", ticket.getIdCard());acroFields.setField("examination", ticket.getExamination());LocalDateTime examBeginTime = ticket.getExamBeginTime();LocalDateTime examEndTime = ticket.getExamEndTime();String time = examBeginTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 "))+ examBeginTime.format(DateTimeFormatter.ofPattern("HH:mm"))+ " - "+ examEndTime.format(DateTimeFormatter.ofPattern("HH:mm"));acroFields.setField("examinationTime", time);// 設置圖片String url = ticket.getUrl();// 根據地址讀取需要放入pdf中的圖片Image image = Image.getInstance(url);// 設置圖片在哪一頁PdfContentByte overContent = pdfStamper.getOverContent(acroFields.getFieldPositions("image").get(0).page);// 獲取模板中圖片域的大小Rectangle signRect = acroFields.getFieldPositions("image").get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 圖片等比縮放image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());// 圖片位置image.setAbsolutePosition(x, y);// 在該頁加入圖片overContent.addImage(image);// 如果為false那么生成的PDF文件還能編輯,一定要設為truepdfStamper.setFormFlattening(true);pdfStamper.close();Document doc = new Document();PdfCopy copy= new PdfCopy(doc, out);doc.open();PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importedPage);doc.close();} catch (IOException | DocumentException e) {e.printStackTrace();}} }這里貼出來查詢出來的準考證數據
{
“idCard”:“110101199003075939”,
“examEndTime”:“2021-01-01 09:00:00”,
“examBeginTime”:“2021-01-01 01:00:00”,
“examination”:“清華大學”,
“id”:“1428543333891039233”,
“activityName”:“物理競賽”,
“admissionNumber”:“20210102”,
“studentName”:“學生姓名”,
“url”:“http://localhost/image/20210818/89fca5330db5bd2c6141d9b69973f062.png”
}
總結
以上是生活随笔為你收集整理的Java读取pdf模板,并动态生成pdf文件,如动态生成准考证、学位证书等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关键词优化如何优化(网站seo关键词布局
- 下一篇: 部署智能合约到公链