Java 動態生成 PDF 文件


每片文章前來首小詩:

    今日夕陽伴薄霧,印着雪牆笑開顏。我心仿佛出窗前,浮在半腰望西天。  --泥沙磚瓦漿木匠

需求:

項目里面有需要java動態生成 PDF 文件,提供下載。今天我找了下有關了,系統得學習了解下。

開源的 iText 庫使得 PDF 的創建變得輕松易行。下面介紹下  

方案:

-----------------------

 iText V5.X.X 版

-----------------------

第一步學習:

了解下:

  • com.itextpdf.text.Document 是用於生成 PDF 文檔的主要類。
  • com.itextpdf.text.pdf.PdfWriter 是一個 PDF 編寫器。
  • 下面羅列下常用:
  • com.itextpdf.text.Paragraph:此類表示一個縮進的段落。
  • com.itextpdf.text.Chapter:此類表示 PDF 文檔中的一章。使用 Paragraph 作為標題、int 作為章節編號來創建該類。
  • com.itextpdf.text.Font:此類包含一種字體的所有規范,比如字體集、字號、樣式和顏色。各種字體都在此類中聲明為靜態常量。
  • com.itextpdf.text.List:此類表示一個列表,反過來,該列表又包含許多 ListItems
  • com.itextpdf.text.pdf.PDFPTable:這是一個表格,可放在一個絕對位置上,也可作為類 Table 添加到文檔中。
  • com.itextpdf.text.Anchor:一個 Anchor 可能是一個引用,或是一個引用的目標。

這里我用的是這兩個包,我分享下。

鏈接: http://pan.baidu.com/s/1koKaq 密碼:q2vy

清單1. 實例化文檔對象
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

第 一個參數是頁面大小。接下來的幾個參數分別是左邊距、右邊距、上邊距和下邊距。此文檔的類型還未定義。它依賴於您創建的編寫器類型。對於我們的樣例,我們 選擇 com.itextpdf.text.pdf.PdfWriter。其他編寫器包括 HtmlWriter、RtfWriter、XmlWriter 等。它們的名稱說明了它們的實際用途。

清單2. 創建 PdfWriter 對象
PdfWriter writer = PdfWriter.getInstance(document, \

new FileOutputStream("C:\\Test.pdf"));

document.open();

 

第一個參數是文檔對象的引用,第二個參數是輸出將寫入的文件的絕對名稱。接下來,我們打開文檔開始編寫。

現 在,我們將在文檔的第一頁上添加一些文本。任何文本都借助 com.itextpdf.text.Paragraph 來進行添加。您可使用您的文本以及字體、顏色、字號等默認設置創建一個默認段落。否則,您可提供自己的字體。 在本文中,我們還將討論 PDF 文檔的定位符(鏈接)。在此 PDF 中,我們使用 backToTop 作為鏈接。當單擊 backToTop 鏈接時,它會將您帶到文檔的第一頁。您需要將該文本設置為第一頁的定位目標。讓我們看看如何將定位目標和字體設置到所添加的段落中。

 
清單3. 創建段落對象
Anchor anchorTarget = new Anchor("ccccccccccccccccc");
      anchorTarget.setName("bbbbbbbbbbbbbbbb");
      Paragraph paragraph1 = new Paragraph();

      paragraph1.setSpacingBefore(50);

      paragraph1.add(anchorTarget);
      document.add(paragraph1);

document.add(new Paragraph("aaaaaaaaaaaaaaaaaaaaaa", 

FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,    new CMYKColor(0, 255, 0, 0))));

 顯示了清單 3 中的代碼的樣例輸出。要關閉文檔,將 document.close(); 添加到清單 3 中的代碼末尾。

 

這就是一個簡單的pdf 生成了。

第二步學習:

細心的同學們,詳細可以看幫助文檔。

鏈接: http://pan.baidu.com/s/15n2BX 密碼:kary

第三步學習:

再細心的同學,會問“干嘛用 aaaaaa bbbbbb cccccc”。中文呢?

這時候我們,需要解決。用幫助jar。我上面給你們分享了。

下面給個案例(超級簡單)。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;

public class makePDF {

    /**
     * @param args
     * @throws DocumentException
     * @throws FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException,
            DocumentException {
        // TODO Auto-generated method stub
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);// 是用於生成
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream("D:\\pdftest.pdf"));
        document.open();
        Paragraph par = new PDFParagraph("你好");// 此類表示段落。
        par.add("這是我們第一個pdftext。");
        document.add(par);
        document.close();
    }

}

class PDFParagraph extends Paragraph {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public PDFParagraph(String content) {
        super(content, getChineseFont());
    }

    private static final Font getChineseFont() {
        
        Font FontChinese = null;
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            FontChinese = new Font(bfChinese, 12, Font.NORMAL);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
        return FontChinese;
    }
}

下面仔細解釋下:

 Paragraph par = new PDFParagraph("你好");// 此類表示一個縮進的段落。
-->調用方法:
PDFParagraph(String content)
-->
super(content, getChineseFont());//實現父類,成功創造出我們需要的 段落。
-->
getChineseFont()//中文幫助jar幫我們解決,中文顯示。

總結:
  iText是一個非常著名的能夠快速產生PDF文件的Java類庫。支持文本,表格,圖形的操作,可以方便的跟 Servlet 進行結合。
快去使用下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM