Itext Part2

iTextによるPDF作成は結構簡単に出来た。
先日、帳票作成ソフト(某有名ソフト)を使って作成したPDFだが、
リンクが張れない・・・orz
問い合わせてみると、現在サポート外らしい・・・
どうしても、PDF内にリンクを張らないと要件を満たせないので
作成されたPDFを読み込んで、リンク部分だけiTextで追記する
ように出来ないかと思い、とりあえず四苦八苦して試したら出来た!!

レイアウトとかは全く気にしてなかったから適当になったけど、
課題が1つ潰れたので今日は満足。

下記にサンプルを載せておくことにします。

    // read PDF
    PdfReader reader = new PdfReader("test.pdf");
    // get page number
    int n = reader.getNumberOfPages();
    // get page size
    Rectangle psize = reader.getPageSize(1);
    float width = psize.height();
    float height = psize.width();
    doc = new Document(new Rectangle(height,width));

    ByteArrayOutputStream byteOut
        = new ByteArrayOutputStream();
    PdfWriter writer = PdfWriter.getInstance(doc, byteOut);
    doc.open();

    PdfContentByte cb = writer.getDirectContent();
    int i = 0;
    while (i < n) {
        doc.newPage();
        i++;
        PdfImportedPage page1
            = writer.getImportedPage(reader, i);
        cb.addTemplate(page1, 0, 0);
        cb.addTemplate(page1,width,height);
    }
    
    BaseFont bfChinese
        = BaseFont.createFont("HeiseiKakuGo-W5",
        "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
    Font fontJapan = new Font(bfChinese, 12, Font.NORMAL);
    doc.newPage();
    Anchor anc = new Anchor("次へ",fontJapan);
    Paragraph pr = new Paragraph("");
    String url
        = response.encodeURL("http://localhost/pdf/pdfsend?proc=input");
    anc.setReference(url);
    pr.add(anc);
    doc.add(pr);
    doc.close();

    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control", 
        "must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");
    // setting the content type
    response.setContentType("application/pdf");
    // the contentlength is needed for MSIE!!!
    response.setContentLength(byteOut.size());
    // write ByteArrayOutputStream to the ServletOutputStream
    OutputStream out = response.getOutputStream();
    out.write(byteOut.toByteArray());
    out.close();

一応、サーブレット経由でやってたので、responseの設定とか入ってますw
ファイル作成する場合は、


PdfWriter.getInstance(doc, new FileOutputStream("test.pdf"));

こんな感じでやればOKかと。