1首先你要先將你的pdf模板做好,可以採用Adobe Acrobat Dc 這個工具,不過這個工具是需要破譯的,博主也沒有,所以下了一個下來,用的是30天的試用期,反正也不常用。
2.先將你的word素材,另存爲pdf模式的,然後保存到一個你熟悉的地方。
3.將你剛剛保存的pdf打開,打開的方式是右鍵點擊“打開方式爲”:Adobe Acrobat Dc這個工具打開。
4將pdf打開後,點擊右邊的“準備表單”,如下圖:
5.重點來囉! 當你點擊準備表單後,自動生成表單後,纔會出現如圖所示的TI字圖形,點擊這個圖形就能生成模板填充域了,注意,不點擊準備表單是不會出現這個圖形的喲。這也是我走了好多冤枉路才摸索出來的。圖片如下:
6.接下來就點擊“TI”圖形,在你所想要填充內容的地方生成模板域,操作方式是:鼠標點擊T圖形後,直接在你所想填充的位置拖動鼠標,生成一個長度寬度大小容納的下你的內容的形狀,
7 然後在文字域的框框中修改你的域名,域名就是你後面要填充內容的key值,比如說在姓名的域名框中可以寫:name
8. 等所有域名框做好後,版式內容位置調整好後,模板就算正式做好了,然後點擊左上方的文件,進行另存爲,存到一個你熟悉的位置進行保存模板。
9.然後可以將你的模板,copy到你的代碼中去,一般保存在你的resources路徑下面。然後就開始正式編碼了。
- 首先,要使用itext,先導入其相關聯的jar包,如下:
<!--項目要使用iText,必須引入jar包。才能使用,maven依賴如下:-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!--輸出中文,還要引入下面itext-asian.jar包:-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--設置pdf文件密碼,還要引入下面bcprov-jdk15on.jar包:-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.55</version>
</dependency>
11. 將我們剛剛生成的pd模板轉成pdf 並且將內容填充進去:
/**
* 將參數保存並且導出新的pdf
* @param o : 需要保存的參數
* @param url :pdf模板路徑
* @return
*/
private Map<String, String> pdfout(Map<String,Object> o,String url) {
// 模板路徑
String templatePath = url;
//生成的新文件pdf的路徑(這裏的路徑是博主自己的測試路徑,你們要寫自己的。)
String newPDFPath = "D:\\模板\\test.pdf";
//pdf閱讀器
PdfReader reader;
//文件輸出流
FileOutputStream out;
//字節數組輸出流在內存中創建一個字節數組緩衝區,所有發送到輸出流的數據保存在該字節數組緩衝區中。
ByteArrayOutputStream bos;
// 使用pdfstamper修改現有文檔
PdfStamper stamper;
try {
//輸出流
out = new FileOutputStream(newPDFPath);
//讀取pdf模板
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
Map<String,String> datemap = (Map<String,String>)o.get("datemap");
for(String key : datemap.keySet()){
String value = datemap.get(key);
form.setField(key,value);
}
//true代表生成的PDF文件不可編輯,false可編輯
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
//循環是處理成品只顯示一頁的問題
PdfImportedPage importPage = null;
for (int i=1;i<=reader.getNumberOfPages();i++){
importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
copy.addPage(importPage);
}
doc.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
- 在你指定的位置生成一個新的pdf
public class PdfDemo {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
// 1.新建document對象
Document document = new Document();
// 2.建立一個書寫器(Writer)與document對象關聯,通過書寫器(Writer)可以將文檔寫入到磁盤中。
// 創建 PdfWriter 對象 第一個參數是對文檔對象的引用,第二個參數是文件的實際名稱,在該名稱中還會給出其輸出路徑。//D:\work\悅美消分
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/work/data/test.pdf"));
// 3.打開文檔
document.open();
// 4.添加一個內容段落
document.add(new Paragraph("Hello World!"));
// 5.關閉文檔
document.close();
}
13.讀取/修改已有的PDF文件
public static void main(String[] args) throws DocumentException, IOException {
//創建一個pdf讀入流 讀取pdf文件
PdfReader pdfReader = new PdfReader("D:/work/data/test.pdf");
//修改器 根據一個pdfreader創建一個pdfStamper.用來生成新的pdf.
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("D:/work/data/test02.pdf"));
Image image = Image.getInstance("D:/work/data/test02.png");
//設置圖片的寬和高
image.scaleAbsolute(250, 250);
//設置圖片在文檔中所在位置的寬和高
image.setAbsolutePosition(250, 250);
for(int i=1; i<= pdfReader.getNumberOfPages(); i++)
{
PdfContentByte content = pdfStamper.getUnderContent(i);
content.addImage(image);
}
pdfStamper.close();
}