最近做一個項目需求,客戶說要求將數據導出數據做紙質存檔,我一聽一個頭兩個大,不知道該怎么做。經過一番交流要求將用戶信息,填入指定表格,然后轉pdf文件打印出紙質材料。我簡單應付了下,然后就開始了百度了。看了很多很多,都只是說了下怎么用java答應pdf文件,但是他說的模板表格,都是啥玩意!為此記錄下我完成這個需求的經歷。
首先使用adobe acrobat來制作表單,這是工具教程連接,創建一個類似於英語完考試形填空的文章;然后通過pdf的工具itextpdf(這里使用的語言是java);最后我就直接上代碼了!
maven依賴如下:
<!-- pdf文件依賴包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.2.0</version>
</dependency>
<!-- pdf字體依賴包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
java代碼如下:
public static void main(String[] args) throws IOException, DocumentException {
mergePdf();
}
/**
* 向pdf中寫入一個簡單的段落
* @throws FileNotFoundException
* @throws DocumentException
*/
public static void createPdf() throws FileNotFoundException, DocumentException {
/**
* 創建文檔
*/
Document doc = new Document();
/**
* 將文檔與輸出流關聯起來
*/
PdfWriter.getInstance(doc, new FileOutputStream("demo.pdf"));
/**
* 打開輸入流
*/
doc.open();
/**
* 設置字體,這里字體是獲取itext-asian 包中的
* 也有其他的方法,例如BaseFont.createFont()來獲取
*/
com.itextpdf.text.Font kai = FontFactory.getFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED ,7.5f);
/**
* 向文檔中輸入一個段落
*/
doc.add(new Paragraph(new Chunk("demoshibushiniaaaa",kai)));
/**
* 關閉輸入流
*/
doc.close();
}
/**
* 合並多個pdf文件,這里是將上個例子中的pdf文件進行復制合並
* @throws DocumentException
* @throws IOException
*/
public static void mergePdf() throws DocumentException, IOException {
Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc,new FileOutputStream("demo2.pdf"));
doc.open();
for (int i = 0; i < 3; i++) {
doc.newPage();
PdfReader pdfReader = new PdfReader("demo.pdf");
PdfImportedPage importedPage = pdfCopy.getImportedPage(pdfReader, 1);
pdfCopy.addPage(importedPage);
}
doc.close();
}
/**
* 表單編輯
*/
public static void editPdf() throws IOException, DocumentException {
Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc,new FileOutputStream("demo2.pdf"));
doc.open();
for (int i = 0; i < 3; i++) {
PdfReader pdfReader = new PdfReader("temp.pdf");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper pdfStamper = new PdfStamper(pdfReader, bos);
BaseFont kai = BaseFont.createFont("simsun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
/**
* 獲取表單對象
*/
AcroFields form = pdfStamper.getAcroFields();
form.addSubstitutionFont(kai);
Map<String, AcroFields.Item> fields = form.getFields();
for (Map.Entry<String, AcroFields.Item> entry : fields.entrySet()) {
String key = entry.getKey();
// AcroFields.Item value = entry.getValue();
String fieldValue = "demo text";
List<AcroFields.FieldPosition> fieldPositions = form.getFieldPositions(key);
if (fieldPositions != null && fieldPositions.size() != 0){
/**
* 默認文字大小
*/
float fontSize = 14;
/**
* 獲取表單框
*/
Rectangle position = fieldPositions.get(0).position;
/**
* 獲取表單寬度
*/
float borderBoxWidth = position.getWidth();
/**
* 獲取內容文本寬度
*/
float textWidth = kai.getWidthPoint(fieldValue, fontSize);
while (textWidth > borderBoxWidth){
fontSize --;
textWidth = kai.getWidthPoint(fieldValue,fontSize);
}
/**
* 設置字段大小
*/
form.setFieldProperty(key,"textsize",fontSize,null);
/**
* 設置文字
*/
form.setField(key,fieldValue);
}
}
}
doc.close();
}
謝謝觀看,如有不足請指正!