本文所要用到的工具或jar主要有: Acrobat 8 這個主要用來制作PDF模板、eclipse這個看你喜歡咯(你用其他也行) 、
itext.jar、
還有為了解決中文的輸出問題,需要多下載一個名為iTextAsian.jar的JAR包。這個包里面定義了與中文輸出相關的一些文件。
好了,需要做的就是這些了,簡單的PDF生成這里就不再作介紹了,本文主要講解如何使用PDF模板。
我們先來看看制作出來的效果:
上圖表格上及表格中的數據是動態添加進去的,頁數為兩頁(為節約版面現只顯示一頁)
兩頁都是用的同一模板的,
1、 模板的制作:
我主要使用的是Acrobat8.0,上面所用到的模板是由 周工作報告 模板修改而來的,如果想學習如何新建一個新的模板,大家可以參照下這里吧!
http://lxy19791111.javaeye.com/blog/102848
2、 取得每個表單域的名字
模板制作好后,要插入數據首先就要知道需要插在模板中位置,
-
- FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");
-
- String TemplatePDF ="c:/test/PdfTemplate.pdf";
- PdfReader reader = new PdfReader(TemplatePDF);
- PdfStamper stamp = new PdfStamper(reader,fos);
- AcroFields form = stamp.getAcroFields();
- for (Iterator it = form.getFields().keySet().iterator(); it
- .hasNext();) {
- System.out.println(it.next());
- }
//需要生成后的PDF
FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");
//PDF模板路徑
String TemplatePDF ="c:/test/PdfTemplate.pdf";
PdfReader reader = new PdfReader(TemplatePDF);
PdfStamper stamp = new PdfStamper(reader,fos);
AcroFields form = stamp.getAcroFields();
for (Iterator it = form.getFields().keySet().iterator(); it
.hasNext();) {
System.out.println(it.next());
}
這個是打印后的部分結果:
我們只取后面那個命名就行,如"星期四[3]"
當然,模板是你自己定義,文本域的命名你當然知道了,這里只是作個簡單介紹而已。
3、下面是插入數據及PDF合并的代碼:
- package com.golden.info.test;
-
- import java.io.ByteArrayOutputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Date;
-
- import com.lowagie.text.Document;
- import com.lowagie.text.DocumentException;
- import com.lowagie.text.pdf.AcroFields;
- import com.lowagie.text.pdf.PdfCopy;
- import com.lowagie.text.pdf.PdfImportedPage;
- import com.lowagie.text.pdf.PdfReader;
- import com.lowagie.text.pdf.PdfStamper;
- public class TestPdfTemplate {
- public static void main(String[] args) {
- try {
- int count = 8;
- int pageCount = 4;
- int index = 1;
- int page = 0;
-
- if (count >= pageCount && count % pageCount == 0) {
- page = count / pageCount;
- } else {
- page = count / pageCount + 1;
- }
- String TemplatePDF = "c:/test/PdfTemplate.pdf";
- FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");
-
- ByteArrayOutputStream baos[] = new ByteArrayOutputStream[page];
-
- for (int item = 0; item < page; item++) {
- baos[item] = new ByteArrayOutputStream();
- PdfReader reader = new PdfReader(TemplatePDF);
- PdfStamper stamp = new PdfStamper(reader, baos[item]);
- AcroFields form = stamp.getAcroFields();
- form.setField("DepartmnetNmae", "藍飛");
- form.setField("qq", "252462807");
- form.setField("pageNumber", "第" + (item + 1) + "頁,共" + page
- + "頁");
- if (count % pageCount != 0 && item == page - 1) {
- System.out.println("====pageCount+" + pageCount + "=====");
- pageCount = count % pageCount;
- }
-
- for (int j = 0; j < pageCount; j++) {
- form.setField("ProjectTask[" + j + "]", index + "");
- form.setField("星期一[" + j + "]", "星期一[" + index + "]");
- form.setField("星期二[" + j + "]", "星期二[" + index + "]");
- form.setField("星期三[" + j + "]", "星期三[" + index + "]");
- form.setField("星期四[" + j + "]", "星期四[" + index + "]");
- form.setField("星期五[" + j + "]", "星期五[" + index + "]");
- form.setField("星期六[" + j + "]", "星期六[" + index + "]");
- form.setField("星期日[" + j + "]", "星期日[" + index + "]");
- form.setField("意見[" + j + "]", "同意[" + j + "]");
- index++;
- }
- stamp.setFormFlattening(true);
- stamp.close();
- }
- Document doc = new Document();
- PdfCopy pdfCopy = new PdfCopy(doc, fos);
- doc.open();
- PdfImportedPage impPage = null;
-
- for (int i = 0; i < page; i++) {
- impPage = pdfCopy.getImportedPage(new PdfReader(baos[i]
- .toByteArray()), 1);
- pdfCopy.addPage(impPage);
- }
- doc.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (DocumentException e) {
- e.printStackTrace();
- }
-
- }
- }
package com.golden.info.test;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
public class TestPdfTemplate {
public static void main(String[] args) {
try {
int count = 8;// 總記錄數
int pageCount = 4;// 每頁記錄數
int index = 1; // 表格序號
int page = 0;// 總共頁數
/** 主要控制總共的頁數*/
if (count >= pageCount && count % pageCount == 0) {
page = count / pageCount;
} else {
page = count / pageCount + 1;
}
String TemplatePDF = "c:/test/PdfTemplate.pdf";//設置模板路徑
FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");//需要生成PDF
ByteArrayOutputStream baos[] = new ByteArrayOutputStream[page];//用于存儲每頁生成PDF流
/** 向PDF模板中插入數據 */
for (int item = 0; item < page; item++) {
baos[item] = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(TemplatePDF);
PdfStamper stamp = new PdfStamper(reader, baos[item]);
AcroFields form = stamp.getAcroFields();
form.setField("DepartmnetNmae", "藍飛");//插入的數據都為字符類型
form.setField("qq", "252462807");
form.setField("pageNumber", "第" + (item + 1) + "頁,共" + page
+ "頁");
if (count % pageCount != 0 && item == page - 1) {
System.out.println("====pageCount+" + pageCount + "=====");
pageCount = count % pageCount;
}
/**因為PDF中的表格其實是眾多的文本域組成,就是一個數組,所以把它循環出來就可以了*/
for (int j = 0; j < pageCount; j++) {
form.setField("ProjectTask[" + j + "]", index + "");
form.setField("星期一[" + j + "]", "星期一[" + index + "]");
form.setField("星期二[" + j + "]", "星期二[" + index + "]");
form.setField("星期三[" + j + "]", "星期三[" + index + "]");
form.setField("星期四[" + j + "]", "星期四[" + index + "]");
form.setField("星期五[" + j + "]", "星期五[" + index + "]");
form.setField("星期六[" + j + "]", "星期六[" + index + "]");
form.setField("星期日[" + j + "]", "星期日[" + index + "]");
form.setField("意見[" + j + "]", "同意[" + j + "]");
index++;
}
stamp.setFormFlattening(true); // 千萬不漏了這句啊, */
stamp.close();
}
Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc, fos);
doc.open();
PdfImportedPage impPage = null;
/**取出之前保存的每頁內容*/
for (int i = 0; i < page; i++) {
impPage = pdfCopy.getImportedPage(new PdfReader(baos[i]
.toByteArray()), 1);
pdfCopy.addPage(impPage);
}
doc.close();//當文件拷貝 記得關閉doc
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
至于,生于PDF后,想打印出來,只要調用以下代碼就行了
-
- try{
- Executable ex = new Executable();
- ex.openDocument("c:/test/Pdf.pdf");
- ex.printDocument("c:/test/Pdf.pdf");
- }catch(IOException e){
- e.printStackTrace();
- }
try{
Executable ex = new Executable();
ex.openDocument("c:/test/Pdf.pdf");
ex.printDocument("c:/test/Pdf.pdf");
}catch(IOException e){
e.printStackTrace();
}
到這里,運用上面的那些代碼,就完成了PDF模板輸出報表.
(PDF模板、代碼跟運行結果在附件里)
有錯誤之處請指正.
也希望這篇文章可以幫到您.