iText生成PDFのキーソース分析

3539 ワード

iTextの勉強については、基本的に公式サイトの例に由来しています.これは私がeasyUI、jQueryを学ぶ方法と一致しています.
これは、良いソフトウェアを使いたいと思って、公式に提供された例とドキュメントが最高の学習資料であることを再証明しました.
相手がこのソフトを一番よく知っている人なので、デザインされたdemoはもちろん最も応用価値があります~
ここでツッコミを入れて、iTextのdemoは本当に探しにくくて、公式サイトの上で何度も繰り返して探してやっと見つけて、みんなが私と同じかどうか分からないで、ここでみんなに近道をあげます.
次に公式サイトの例を挙げて、まずどのようにPDFを生成しますか?
    /**
     *       demo       
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws DocumentException 
     * @throws IOException 
     * @throws    DocumentException 
     * @throws    IOException
     */
    public void createPdf(String filename) throws IOException, DocumentException {
        // step 1	        
        Document document = new Document();
        // step 2	            ,            
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3	    ,           
        document.open();
        // step 4	    
        BaseFont bf;
        Font font;
 
        for (int i = 0; i < 3; i++) {
            bf = BaseFont.createFont(MOVIES[i][0], MOVIES[i][1], BaseFont.NOT_EMBEDDED);
            font = new Font(bf, 12);
            document.add(new Paragraph(bf.getPostscriptFontName(), font));
            for (int j = 2; j < 5; j++)
                document.add(new Paragraph(MOVIES[i][j], font));
            document.add(Chunk.NEWLINE);
        }
 
 
        // step 5	    
        document.close();
    }

このうちDocumentは生成されたPDFドキュメントに対応していないので、PdfWriterを見てみましょう.getInstance(..)のソース:
    public static PdfWriter getInstance(final Document document, final OutputStream os)
    throws DocumentException {
        PdfDocument pdf = new PdfDocument();
        document.addDocListener(pdf);
        PdfWriter writer = new PdfWriter(pdf, os);
        pdf.addWriter(writer);
        return writer;
    }

ここでまたPdfDocumentを作成し,documentのDocListenerに追加したが,ここでは観察者モデルの応用であることは明らかである.
次に、Documentオブジェクトに対するすべての操作がDocListenerによって受信され、次のdocumentを見てみましょう.Open()この方法はどのように実現されますか.
    public void open() {
	if (!close) {
            open = true;
        }
	for (DocListener listener : listeners) {
            listener.setPageSize(pageSize);
	    listener.setMargins(marginLeft, marginRight, marginTop,
            <span style="white-space:pre">	</span>marginBottom);
            listener.open();
        }
    }

見えますか?中にはlistenerのopenメソッドもすべて呼び出されています.addとcloseの方法も似ています.
したがって,Documentオブジェクトはここで傍受されたオブジェクトを担当し,実際の操作は観察者に適用され,観察者はDocumentを継承し,出力ファイルにWriterを追加した.
PdfWriterが指定されたPdfDocumentに追加されると、Documentへの追加操作は、関連するOutputStreamに書き込まれます.
上記のように、1つのdocumentに複数を追加することができます.たとえば、次のようにします.
// creation of the document with a certain size and certain margins
 Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  try {
   // creation of the different writers
   HtmlWriter.getInstance(document , System.out);
   PdfWriter.getInstance(document , new FileOutputStream("text.pdf"));
   // we add some meta information to the document
   document.addAuthor("Bruno Lowagie"); 
   document.addSubject("This is the result of a Test."); 
   // we open the document for writing
   document.open(); 
   document.add(new Paragraph("Hello world"));
  } catch(DocumentException de) {
   System.err.println(de.getMessage());
  }
  document.close();

これによりdocumentに追加する情報は、コンソールにもtextにも現れる.pdfが当たった