/* * PDF/A-1 のための透過スタンプ: * 既存の PDF/A-1 文書に PDF/A-1 標準を維持したまま透過スタンプを適用します。 * * 既存のPDF/A-1文書からすべてのページをインポートして、ページ上にスタンプを * 配置します。 * スタンプは、ビットマップで構成されたパターン色で塗りつぶします。 * ビットマップは、透過率を構成するためにマスクとして使用されます。 * 透過は、PDF/ A-1では許可されていないため、この処理が必要とされています。 * パターンの色による透過は、PDF/A-1に準拠しており、PDF/A-1文書標準に沿って、 * PDF/A-1の文書上に透明のスタンプを適用するためにそれを使用します。 * * この処理は、PDF/ A-1にのみ必要であることに注意してください。 * PDF/ A-2では透過が許可されています。 * * もしAcrobat(または、一定のズームレベルだけで見える)で透明なスタンプが見えなけ * れば、AcrobatXに次のように設定してください。 * [編集] メニューから [環境設定] を選択します。画面左のリストから [ページ表示] を * 選択します。[レンダリング] セクションの [2D グラフィックスアクセラレーションを * 使用] からチェックをはずし、[画像のスムージング]にチェックを入れます。 * * PDFlib 9.0.2において、begin_pattern() は非推奨のため、新しい関数 begin_pattern_ext() * に置き換えが必要です。注意してください。 * PDFlib 9.0.2 以上のバージョンを使う時は、警告を取り除くために、begin_pattern()を * begin_pattern_ext() に置き換えて呼び出してください * * 必要な製品: PDFlib+PDI/PPS 9 * 必要なデータ: PDF 文書 */ package com.pdflib.cookbook.pdflib.pdfa; import com.pdflib.pdflib; import com.pdflib.PDFlibException; public class transparent_stamp_for_pdfa1 { public static void main (String argv[]) { /* 必要に応じてデータファイルがあるフォルダのパスを指定する */ String searchpath = "../input"; String outfile = "transparent_stamp_for_pdfa1.pdf"; String title = "Transparent Stamp for PDF/A-1"; pdflib p = null; String pdffile = "PLOP-datasheet-PDFA-1b.pdf"; int indoc, pageno, endpage, page, font, pattern; double w; double ret; String res; int image; int exitcode = 0; /* ハーフトーンビットマップのためのデータ */ int data[][] = { { 0x00, 0x00, /* 30% */ 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, { 0x00, 0x00, /* 20% */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}; int ht = 1; /* インデックスを設定 */ try { final int SCALING_FACTOR = 16; p = new pdflib(); p.set_option("searchpath={" + searchpath + "}"); /* load_font() 等でエラーが起きた場合、-1を返す */ p.set_option("errorpolicy=return"); if (p.begin_document(outfile, "pdfa=PDF/A-1b:2005") == -1) throw new Exception("Error: " + p.get_errmsg()); p.set_info("Creator", "PDFlib Cookbook"); p.set_info("Title", title); /* * 既存PDF文書を開く。パターンを定義する前に出力インテントを設定する * 必要があるため、パターンを作成する前に、この処理を行う。 */ indoc = p.open_pdi_document(pdffile, ""); if (indoc == -1) throw new Exception("Error: " + p.get_errmsg()); endpage = (int) p.pcos_get_number(indoc, "length:pages"); /* 既存文書から出力インテントを取得し、それを出力文書にコピーする */ res = p.pcos_get_string(indoc, "type:/Root/OutputIntents"); if (res.equals("array")) { ret = p.process_pdi(indoc, -1, "action=copyoutputintent"); if (ret == -1) throw new Exception("Error: " + p.get_errmsg()); } else { /* 既存文書に出力インテントがない場合は、グレースケールビットマップを * 使用できるよう "sRGB"を設定する */ p.load_iccprofile("sRGB", "usage=outputintent"); } /* * 画像マスクに基づいて、ビットマップパターンを定義する。画面上で滑らかに * 見えるよう、画像を縮小する。 */ byte[] bitmap = new byte[data[ht].length]; for (int j = 0; j < data[ht].length; j++) bitmap[j] = (byte) data[ht][j]; p.create_pvf("/pvf/image/bitmap", bitmap, ""); image = p.load_image("raw", "/pvf/image/bitmap", "bpc=1 components=1 height=16 width=16 invert mask"); if (image == -1) throw new Exception("Error: " + p.get_errmsg()); w = (double) 16 / SCALING_FACTOR; pattern = p.begin_pattern_ext(w, w, ""); p.fit_image(image, 0, 0, "scale=" + (double) 1 / SCALING_FACTOR); p.end_pattern(); p.close_image(image); /* 既存PDF文書数分ループする */ for (pageno = 1; pageno <= endpage; pageno++) { page = p.open_pdi_page(indoc, pageno, ""); if (page == -1) throw new Exception("Error: " + p.get_errmsg()); /* ページサイズは fit_pdi_page() で調整される */ p.begin_page_ext(0, 0, "width=a4.width height=a4.height"); /* 既存PDFページを出力PDFページ上に配置し、サイズを調整する */ p.fit_pdi_page(page, 0, 0, "adjustpage"); /* スタンプで使用するフォントをロードする */ font = p.load_font("NotoSerif-Regular", "unicode", "embedding"); if (font == -1) throw new Exception("Error: " + p.get_errmsg()); /* パターンカラーで塗りつぶされたスタンプを配置する */ p.setcolor("fill", "pattern", pattern, 0, 0, 0); p.fit_textline("PUBLISHED", 20, 20, "font=" + font + " fontsize=1 boxsize={550 800} stamp=ll2ur"); p.close_pdi_page(page); p.end_page_ext(""); } p.end_document(""); } catch (PDFlibException e) { System.err.println("PDFlib exception occurred:"); System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() + ": " + e.get_errmsg()); exitcode = 1; } catch (Exception e) { System.err.println(e); exitcode = 1; } finally { if (p != null) { p.delete(); } System.exit(exitcode); } } }