/*
* 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);
}
}
}