Java读取pdf模板,并动态生成pdf文件,如动态生成准考证
Java讀取pdf模板,并動(dòng)態(tài)生成pdf文件,如動(dòng)態(tài)生成準(zhǔn)考證
? 前幾天遇到了一個(gè)生成準(zhǔn)考證的需求,并提供用戶下載,然后百度了一圈還是覺(jué)得使用itextpdf這個(gè)框架好用點(diǎn)。但是還需要找到一個(gè)能創(chuàng)建pdf表單的工具來(lái)生成pdf模板。可以使用Adobe Acrobat進(jìn)行創(chuàng)建,但是我自己電腦上剛好有一個(gè)軟件可以制作就沒(méi)有去下載了😆
? 下面只是用到了itextpdf一部分的功能,如果還有其他字體格式、樣式的需求可以參考他的官方網(wǎng)址Overview (iText 5.5.13 API) (itextpdf.com)
1. 模板制作
我是用的是一款pj軟件PDFelement,當(dāng)初下它是用來(lái)轉(zhuǎn)換pdf到word,沒(méi)想到也可以制作pdf表單😀
可能有點(diǎn)看不清楚框框里寫(xiě)的啥,就是寫(xiě)的后端實(shí)體類(lèi)中屬性的名稱(chēng),dddd最好一一對(duì)應(yīng)嘛
2. 效果展示
還可以吧
3. 導(dǎo)入依賴
在pom.xml里導(dǎo)入下面兩個(gè)依賴就行了
<!--pdf--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><!-- 這個(gè)主要用來(lái)設(shè)置樣式什么的 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>4. 數(shù)據(jù)填充
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 {// 查詢準(zhǔn)考證數(shù)據(jù)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);// 設(shè)置寫(xiě)入字體acroFields.addSubstitutionFont(font);// 設(shè)置文本信息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);// 設(shè)置圖片String url = ticket.getUrl();// 根據(jù)地址讀取需要放入pdf中的圖片Image image = Image.getInstance(url);// 設(shè)置圖片在哪一頁(yè)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);// 在該頁(yè)加入圖片overContent.addImage(image);// 如果為false那么生成的PDF文件還能編輯,一定要設(shè)為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();}} }這里貼出來(lái)查詢出來(lái)的準(zhǔn)考證數(shù)據(jù)
{
"idCard":“110101199003075939”,
"examEndTime":“2021-01-01 09:00:00”,
"examBeginTime":“2021-01-01 01:00:00”,
"examination":“清華大學(xué)”,
"id":“1428543333891039233”,
"activityName":“物理競(jìng)賽”,
"admissionNumber":“20210102”,
"studentName":“學(xué)生姓名”,
"url":"http://localhost/image/20210818/89fca5330db5bd2c6141d9b69973f062.png"
}
總結(jié)
以上是生活随笔為你收集整理的Java读取pdf模板,并动态生成pdf文件,如动态生成准考证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sap清账使用反记账_SAPFI反记账功
- 下一篇: 五子棋人机对弈