PDFドキュメント中の注釈について、注釈の個数及び全ての注釈にあてはまる項目の情報を取得します。
PDF Tool APIでは、PDFドキュメントが保持している注釈の情報を以下のように扱います。まず、PDFの各ページに含まれる注釈の情報をまとめて注釈コンテナの形で取得します。その後、注釈コンテナから各注釈のクラスを取得します。どの注釈のクラスを取得するかは、注釈がPDFに格納されている順序でつけられたインデックス番号を指定することで行います。
本サンプルプログラムでは、入力PDFの全てのページ毎に含まれている注釈コンテナ及び注釈の情報を取得して表示します。それぞれの情報は以下の手順で取得します。まず、注釈コンテナからそのページに含まれる注釈の個数の情報を取得します。その後、次のリストに挙げた、全ての注釈に共通した項目の情報を取得します。
package cookbook; import jp.co.antenna.ptl.*; public class ShowAnnotCommonInfo { // そのクラスのusageを表示する関数 private static void printUsage(){ System.out.println("usage: java ShowAnnotCommonInfo in-pdf-file"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 1) { printUsage(); return; } String outpathAttach = ""; if (args.length == 2) { outpathAttach = args[1]; } try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlPDFDocument doc = new PtlPDFDocument()) { // PDFファイルをロードします。 doc.load(inputFile); try (PtlPages pages = doc.getPages()) { //ページコンテナの取得 // ページコンテナが空かどうか if (pages.isEmpty()) { System.out.println("ページコンテナが空"); return; } int numPages = pages.getCount(); for(int i=0; i<numPages; i++) { System.out.println("ページ" + (i+1)); try (PtlPage page = pages.get(i)) { // 注釈コンテナが空かどうか if (!page.hasAnnots()) { System.out.println("注釈コンテナが空"); continue; } try (PtlAnnots annots = page.getAnnots()) { // 注釈数の取得 int numAnnots = annots.getCount(); System.out.println("注釈数 : " + numAnnots); for(int j=0; j<numAnnots; j++) { System.out.println("index num : " + j + "の注釈情報を表示します"); try (PtlAnnot annot = annots.get(j)) { showAnnotCommon(annot); } } } } } } } ...【AppendAnnotStampDefault.javaと同じ処理のため省略 ・エラーメッセージ処理と出力】... } /** * 注釈全般に共通する情報を表示する。 * 共通する情報とは、矩形座標、注釈の内容、注釈フラグ、色、内部色、 * 境界線スタイル、境界線幅です。 * @param annot 読み取る注釈 * @throws PtlException PDF Tool APIにより発生した例外 * @throws Exception その他の例外 * @throws Error その他のエラー */ public static void showAnnotCommon(PtlAnnot annot) throws PtlException, Exception, Error { try (PtlRect rect = annot.getRect()) { System.out.println("Rect(Left, Bottom, Right, Top)"); System.out.printf(" = (%f,%f,%f,%f)\n" , rect.getLeft(), rect.getBottom(), rect.getRight(), rect.getTop()); } System.out.println("TextContents = \ "" + annot.getTextContents() + "\ "" ); try (PtlDate date = annot.getDate()) { int year = date.getYear(); int month = date.getMonth(); int day = date.getDay(); int hour = date.getHour(); int min = date.getMin(); int sec = date.getSec(); System.out.printf("Date : %d/%d/%d %d:%d:%d\n", year, month, day, hour, min, sec); } int flags = annot.getAnnotFlags(); if ((flags & PtlAnnot.FLAG_INVISIBLE) == PtlAnnot.FLAG_INVISIBLE) System.out.println("FLAG_INVISIBLE on" ); else System.out.println("FLAG_INVISIBLE off" ); if ((flags & PtlAnnot.FLAG_HIDDEN) == PtlAnnot.FLAG_HIDDEN) System.out.println("FLAG_HIDDEN on" ); else System.out.println("FLAG_HIDDEN off" ); if ((flags & PtlAnnot.FLAG_PRINT) == PtlAnnot.FLAG_PRINT) System.out.println("FLAG_PRINT on" ); else System.out.println("FLAG_PRINT off" ); if ((flags & PtlAnnot.FLAG_NOZOOM) == PtlAnnot.FLAG_NOZOOM) System.out.println("FLAG_NOZOOM on" ); else System.out.println("FLAG_NOZOOM off" ); if ((flags & PtlAnnot.FLAG_NOROTATE) == PtlAnnot.FLAG_NOROTATE) System.out.println("FLAG_NOROTATE on" ); else System.out.println("FLAG_NOROTATE off" ); if ((flags & PtlAnnot.FLAG_NOVIEW) == PtlAnnot.FLAG_NOVIEW) System.out.println("FLAG_NOVIEW on" ); else System.out.println("FLAG_NOVIEW off" ); if ((flags & PtlAnnot.FLAG_READONLY) == PtlAnnot.FLAG_READONLY) System.out.println("FLAG_READONLY on" ); else System.out.println("FLAG_READONLY off" ); if ((flags & PtlAnnot.FLAG_LOCKED) == PtlAnnot.FLAG_LOCKED) System.out.println("FLAG_LOCKED on" ); else System.out.println("FLAG_LOCKED off" ); if ((flags & PtlAnnot.FLAG_TOGGLE_NOVIEW) == PtlAnnot.FLAG_TOGGLE_NOVIEW) System.out.println("FLAG_TOGGLE_NOVIEW on" ); else System.out.println("FLAG_TOGGLE_NOVIEW off" ); if ((flags & PtlAnnot.FLAG_LOCKED_CONTENTS) == PtlAnnot.FLAG_LOCKED_CONTENTS) System.out.println("FLAG_LOCKED_CONTENTS on" ); else System.out.println("FLAG_LOCKED_CONTENTS off" ); try (PtlColor color = annot.getColor()) { System.out.println("show color info:"); showColor(color); } try (PtlColor colorI = annot.getInteriorColor()) { System.out.println("show interior color info:"); showColor(colorI); } PtlAnnot.BORDER_STYLE boderStyle = annot.getBorderStyle(); switch (boderStyle) { case BORDER_SOLID: System.out.println("BORDER_STYLE = SOLID" ); break; case BORDER_DASHED: System.out.println("BORDER_STYLE = DASHED" ); break; case BORDER_BEVELED: System.out.println("BORDER_STYLE = BEVELED" ); break; case BORDER_INSET: System.out.println("BORDER_STYLE = INSET" ); break; case BORDER_UNDERLINE: System.out.println("BORDER_STYLE = UNDERLINE" ); break; } PtlAnnot.BORDER_LINE_WIDTH boderWidth = annot.getBorderWidth(); switch (boderWidth) { case BORDER_WIDTH_NONE: System.out.println("BORDER_WIDTH = NONE" ); break; case BORDER_WIDTH_THIN: System.out.println("BORDER_WIDTH = THIN" ); break; case BORDER_WIDTH_MIDDLE: System.out.println("BORDER_WIDTH = MIDDLE" ); break; case BORDER_WIDTH_THICK: System.out.println("BORDER_WIDTH = THICK" ); break; } } public static void showColor(PtlColor color) throws PtlException, Exception, Error { PtlColor.COLOR_TYPE colorType = color.getType(); switch (colorType) { case TYPE_NONE: System.out.println("COLOR_TYPE = None" ); break; case TYPE_DEVICE_GRAY: PtlColorDeviceGray colorGray = (PtlColorDeviceGray)color; System.out.printf("COLOR_TYPE = GRAY(%f)\n" , colorGray.getGray()); break; case TYPE_DEVICE_RGB: PtlColorDeviceRGB colorRGB = (PtlColorDeviceRGB)color; System.out.printf("COLOR_TYPE = RGB(%f,%f,%f)\n" , colorRGB.getR(), colorRGB.getG(), colorRGB.getB()); break; case TYPE_DEVICE_CMYK: PtlColorDeviceCMYK colorCMYK = (PtlColorDeviceCMYK)color; System.out.printf("COLOR_TYPE = CMYK(%f,%f,%f,%f)\n" , colorCMYK.getC(), colorCMYK.getM(), colorCMYK.getY(), colorCMYK.getK()); break; } } }
ShowAnnotCommonInfo.java
C:\samples>java cookbook.ShowAnnotCommonInfo usage: java ShowAnnotCommonInfo in-pdf-file C:\samples>java cookbook.ShowAnnotCommonInfo blank-annots.pdf ページ1 注釈数 : 15 index num : 0の注釈情報を表示します Rect(Left, Bottom, Right, Top) = (35.236504,271.356323,73.340034,277.092468) TextContents = "フリーテキスト注釈" Date : 2019/8/1 15:48:59 FLAG_INVISIBLE off FLAG_HIDDEN off FLAG_PRINT on FLAG_NOZOOM off FLAG_NOROTATE off FLAG_NOVIEW off FLAG_READONLY off FLAG_LOCKED off FLAG_TOGGLE_NOVIEW off FLAG_LOCKED_CONTENTS off show color info: COLOR_TYPE = RGB(0.000000,0.000000,0.000000) show interior color info: COLOR_TYPE = None BORDER_STYLE = SOLID BORDER_WIDTH = NONE … 2番目以降省略 …