《電子技術應用》
您所在的位置:首頁 > 嵌入式技术 > 设计应用 > 利用iText包实现Java报表打印
利用iText包实现Java报表打印
来源:微型机与应用2012年第18期
丁振凡1,王小明1,吴小元1,邓建明2,周 斌2
(1.华东交通大学,江西 南昌330013;2.南昌铁路局,江西 南昌330001)
摘要: 结合报表制作的两种情形介绍了iText的应用方法。一种是由程序对象动态产生整个报表文件的内容,另一种是在已存在的PDF报表文档中填写数据域以完成报表。给出了Java实现报表打印的控制方法。
Abstract:
Key words :

摘  要: 結合報表制作的兩種情形介紹了iText的應用方法。一種是由程序對象動態產生整個報表文件的內容,另一種是在已存在的PDF報表文檔中填寫數據域以完成報表。給出了Java實現報表打印的控制方法。
關鍵詞: Java報表iText包;動態報表;填充型報表;報表打印

    在信息系統應用中,報表處理一直起著比較重要的作用。Java報表制作中最常使用的是iText組件,它是一種生成PDF報表的Java組件。本文討論兩種形式的PDF報表處理,一種是通過程序對象生成整個PDF報表文檔,另一種是利用制作好的含報表的PDF文檔模板,通過在模板填寫數據實現數據報表。
1 通過編程繪制實現報表的生成
    對于內容動態變化的表格,適合使用程序繪制辦法進行生成處理。這類表格中數據項和數據均是動態存在的。
1.1 使用iText編程生成含報表的PDF文檔的步驟[1]
    (1)建立Document對象。Document是PDF文件所有元素的容器。
    Document document = new Document();
    (2)建立一個與Document對象關聯的書寫器(Writer)。通過書寫器(Writer)對象可以將具體文檔存盤成需要的格式,PDFWriter可以將文檔保存為PDF文件。
    PDFWriter.getInstance(document, new FileOutputStream
("my.PDF"));
    (3)打開文檔。如:document.open();
    (4)向文檔中添加內容。所有向文檔添加的內容都是以對象為單位的,iText中用文本塊(Chunk)、短語(Phrase)和段落(Paragraph)處理文本。
    document.add(new Paragraph("Hello World"));
//添加一個段落
    值得注意的是文本中漢字的顯示,默認的iText字體設置不支持中文字體,需要下載遠東字體包iTextAsian.jar,否則不能往PDF文檔中輸出中文字體[2]。
    (5)關閉文檔。如:document.close();
1.2 表格繪制
    要在PDF文件中創建表格,iText提供了兩個類——Table和PdfPTable。Table類用來實現簡單表格,PdfPTable類則用來實現比較復雜的表格。本文主要討論PdfPTable類的應用。
    (1)創建PdfPTable對象
    創建PdfPTable對象只需要指定列數,不用指定行數。通常生成的表格默認以80%的比例顯示在頁面上。例如定義3列的表格,每列的寬度分別為15%、25%和60%,語句如下:
    float[] widths = {15f, 25f, 60f};
    PdfPTable table = new PdfPTable(widths);
    用setWidthPercentage(float widthPercentage)方法可設置表格的按百分比的寬度。而用setTotalWidth則可設置表格按像素計算的寬度。如果表格的內容超過了300 px,表格的寬度會自動加長。用setLockedWidth(true)方法可鎖定表格寬度。通過表格對象的系列方法可設置表格的邊界以及對齊、填充方式。
    (2)添加單元格
    表格創建完成以后,可通過addCell(Object object)方法插入單元格元素(PdfPCell)。其中,Object對象可以是PdfPCell、String、Phrase、Image,也可以是PdfPTable對象本身,即在表格中嵌套一個表格。通過單元格的方法可設定單元格的列跨度、邊框粗細、對齊方式、填充間隙等。
    (3)合并單元格
    為了實現某些特殊的表格形式,需要合并單元格。PdfPCell類提供了setColspan(int colspan)方法用于合并橫向單元格,參數colspan為合并的單元格數。但要合并縱向單元格需要使用嵌套表格的方法。將某個子表加入單元格,且安排單元格所占列數為子表中列數,則其行跨度也就是子表中的行數。
    由于實際編程時,經常出現各類結構的嵌套情形,可以將產生某種結構的表格模塊進行封裝,編制成方法,通過傳遞方法參數完成表格特定模塊的繪制。
    例如,可以將生成一個整齊行列表格的代碼編寫成方法。方法返回表格,填充的數據通過二維對象數組傳遞。代碼如下:
public static PdfPTable creatSubTable(Object x[][]){
    PdfPTable t= new PdfPTable(x[0].length);
    t.getDefaultCell ().setHorizontalAlignment (Element.ALIGN_
CENTER);
    for (int k=0;k<x.length;k++) {
        for (int j=0;j<x[0].length;j++)
            t.addCell(new Phrase(x[k][j].toString(),
FontChinese));
    }   
    return t;
}
    以下代碼調用上述方法,繪制圖1表格中黑框內部分:
    PdfPTable t2= new PdfPTable(3);
    String x1[][]={ {"+601k","10","合格"},{"-601k",
"11","合格"},{"+601k-601k","12","合格"}};
    PdfPCell m=new PdfPCell(creatSubTable(x1));
//將創建的子表放入單元格
    m.setColspan(3);  //單元格占用外層表格的3欄
    t2.addCell(m);

2 基于PDF報表模板的報表生成
    有些表格具有固定的格式,實際工作中只是給表格填寫數據。這類表格可轉換為PDF文件格式的報表模板,通過特殊工具在文件中定義若干數據域,通過給數據域寫入數據實現對報表數據的填充處理。它具有格式靈活的特點?;趫蟊砟0宓膱蟊硖幚聿襟E如下:
    (1)利用Word制作打印報表;
    (2)利用Adobe Acrobat 7.0 Professional將Word文檔轉換為PDF格式;
    (3)利用Adobe Designer 7.0對PDF進行設計,定義數據域;
    (4)利用iText組件實現對報表數據字段的寫入。
    可利用Adobe Designer 7.0導入某個PDF文件進行設計,在任意位置添加文本域。每個文本域有一個綁定的名稱和值,在Java程序中正是通過文本域的名稱訪問文本域對象。
    圖2給出了利用Adobe Acrobat 7.0 Professional打開一個制作好的帶數據域定義的PDF文檔模板文件的瀏覽界面,出于清晰考慮,圖中特別將數據域采用高亮度顯示。

 

 

    以下給出了打開報表模板實現數據寫入的關鍵代碼:
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    ……
    PdfReader r=new PdfReader("d:\\預檢模板
(DC600V方式).pdf"); // ①
    PdfStamper s=new PdfStamper(r,new FileOutputStream
("d:\\結果.pdf")); //②
    AcroFields form=s.getAcroFields();  // ③
    String x[]=detectlog.getYjdata(date,cheNumber,code);
//讀取數據庫數據
    form.setField("日期", x[1]);  // ④
    form.setField("修規", x[2]);
    ……
    s.close();
    【說明】
    ①利用PdfReader讀取PDF文檔;通過實例化PdfReader對象來獲取pdf模板,傳入的字符串就是pdf文件所放置的路徑,可以用絕對路徑表示。
    ②取得對象后,需要用PdfStamper來編輯PdfReader對象,同時獲取一個OutputStream輸出流作為輸出對象。
    ③利用PdfStamper獲取文件中定義的AcroFields對象。
    ④用AcroFields對象的setField填寫各個字段的數據到表格中。
3 Java打印PDF報表文件
    在Web應用中要在客戶端打印PDF文檔只需要將文件送客戶瀏覽器顯示,利用瀏覽器客戶端的文件打印功能可實現打印。以下討論在Java應用程序中如何打印報表文件。
    Java實現報表打印首先要獲取打印服務對象,然后利用服務對象開始一個作業的打印。以下給出了新的JDK1.4以上版本中實現打印的具體步驟和關鍵代碼。
        // ① 構建打印請求屬性集
    PrintRequestAttributeSet pras = new HashPrintRequest-
AttributeSet();
        // ② 設置打印格式,因為未確定文件類型,
這里選擇AUTOSENSE
    DocFlavor flavor=DocFlavor.INPUT_STREAM.AUTOSENSE;
        // ③ 查找所有的可用打印服務
    PrintService printService[] = PrintServiceLookup.lookup-
PrintServices(flavor, pras);
        // ④ 定位默認的打印服務
    PrintService defaultService =
            PrintServiceLookup.lookupDefaultPrintService();
        // ⑤ 顯示打印對話框
    PrintService service = ServiceUI.printDialog(null, 200,
200, printService, defaultService, flavor, pras);
    if (service != null) {
        DocPrintJob job = service.createPrintJob(); 
 // ⑥創建打印作業
        FileInputStream fis = new FileInputStream(file);
 // 假設file為具體文件對象
        DocAttributeSet das = new HashDocAttributeSet();
        Doc doc = new SimpleDoc(fis, flavor, das);  
// ⑦ 建立打印文件格式
        job.print(doc, pras);   // ⑧ 進行文件的打印
    }
    本文介紹了利用iText實現PDF報表打印的編程處理方法。分別介紹了報表處理中的兩種典型應用。一種是由程序對象動態產生整個報表,重點介紹了利用PdfPTable等對象實現報表生成處理的技巧。另一種是在已存在的PDF報表文檔中填寫數據域完成報表,重點介紹了通過AcroFields對象實現數據域的填寫處理。最后給出了Java實現報表打印的控制方法。
參考文獻
[1] 侯金波,王德群.iText API在計量信息管理系統中的應用[J].計量與測試技術,2007,34(1):57-60.
[2] 王麗萍,秦永平.基于iText的PDF報表設計[J].電腦知識與技術,2007(8):493-494.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 国产在线视频91| 97精品国产97久久久久久免费| 国产精品视频久| 亚洲一区不卡在线| 欧美一级片久久久久久久| 精品久久国产精品| 涩涩日韩在线| 中文精品视频一区二区在线观看 | 国产mv久久久| 日本三级韩国三级久久| 欧美一区二区三区免费观看| 日韩理论片在线观看| 日韩中文字幕亚洲| 欧美大片欧美激情性色a∨久久| 久久久久久国产免费| 日韩一区二区三区在线播放| 国产精品久久久久久久天堂| 国产成人精品在线| 日韩久久在线| 欧美日韩国产第一页| 日韩在线视频免费观看| 一区不卡视频| 91成人国产在线观看| 久久九九国产视频| 日本精品中文字幕| 久久97精品久久久久久久不卡| 亚洲爆乳无码专区| 国产精品麻豆免费版 | 97干在线视频| www.xxxx精品| 久久久国产精彩视频美女艺术照福利| 日本一区视频在线观看免费| 宅男在线精品国产免费观看 | 久久国产精品网站| 不卡视频一区| 亚洲精品乱码久久久久久自慰| 久久五月天综合| 欧美激情国产精品| 久久久久亚洲精品国产| 97色在线观看免费视频| 日本精品一区二区三区高清 久久|