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かと。