
PDFに付与された各注釈の種類を判別し、その種類特有の情報を取得します。
PDFに付与されたテキスト注釈、ラバースタンプ注釈、ファイル添付注釈、リンク注釈のそれぞれについて、特有の情報を取得できます。特有の情報とは、アイコンタイプ、アイコンにつけられた名前、ハイライトモード、リンクの宛先、アクション、添付ファイルの名前、添付ファイルなどです。
本サンプルプログラムでは、各ページに含まれる注釈について種別を判別し、それら特有の情報を表示します。ファイル添付注釈がある場合、添付されたファイルを書き出すことができます。
ハイライトモードとは、注釈のアクティブ領域内でマウスボタンが押されるか、押し続けられるときに用いる視覚効果のことです。
| HIGHLIGHTING_MODE_INVERT | 注釈矩形を反転 |
| HIGHLIGHTING_MODE_NONE | ハイライトなし |
| HIGHLIGHTING_MODE_OUTLINE | 注釈の境界線を反転 |
| HIGHLIGHTING_MODE_PUSH | ページの下に押し込まれたかのように注釈を表示 |
package cookbook;
import jp.co.antenna.ptl.*;
public class DistinctAnnotsAndGetInfo {
// そのクラスのusageを表示する関数
private static void printUsage(){
System.out.println("usage: java DistinctAnnotsAndGetInfo in-pdf-file" +
" [out-attach-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("ページコンテナが空\n");
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)) {
distinctAnnot(annot, outpathAttach);
}
}
}
}
}
}
}
...【AppendAnnotStampDefault.javaと同じ処理のため省略
・エラーメッセージ処理と出力】...
}
public static void distinctAnnot(PtlAnnot annot, String outpathAttach)
throws PtlException, Exception, Error {
PtlAnnot.ANNOT_TYPE annotType = annot.getType();
System.out.println("注釈のタイプを判別し、" +
"必要に応じてそのタイプ特有の情報を表示します。 :");
switch (annotType) {
case TYPE_TEXT:
showAnnotText(annot);
break;
case TYPE_LINK:
showAnnotLink(annot);
break;
case TYPE_STAMP:
showAnnotStamp(annot);
break;
case TYPE_FILE_ATTACHMENT:
showAnnotFileAttachment(annot, outpathAttach);
break;
default:
System.out.println("その他の注釈のタイプです。" +
"注釈のタイプ名と注釈全般の情報を表示します。");
showAnnotOther(annot);
break;
}
}
public static void showAnnotText(PtlAnnot annot)
throws PtlException, Exception, Error {
System.out.println("ANNOT_TYPE = Text ");
PtlAnnotText annotText = (PtlAnnotText)annot;
showAnnotCommon(annotText);
PtlAnnotText.ICON_TYPE iconType = annotText.getIconType();
switch (iconType) {
case ICON_COMMENT:
System.out.println("ICON_TYPE = COMMENT" );
break;
case ICON_HELP:
System.out.println("ICON_TYPE = HELP" );
break;
case ICON_INSERT:
System.out.println("ICON_TYPE = INSERT" );
break;
case ICON_KEY:
System.out.println("ICON_TYPE = KEY" );
break;
case ICON_NEWPARAGRAPH:
System.out.println("ICON_TYPE = NEWPARAGRAPH" );
break;
case ICON_NOTE:
System.out.println("ICON_TYPE = NOTE" );
break;
case ICON_PARAGRAPH:
System.out.println("ICON_TYPE = PARAGRAPH" );
break;
case ICON_CUSTOM:
System.out.println("ICON_TYPE = CUSTOM" );
break;
case ICON_UNKNOWN:
System.out.println("ICON_TYPE = UNKNOWN" );
break;
}
System.out.println("ICON_NAME = \ "" + annotText.getIconName() + "\ "" );
showAnnotMarkup(annotText);
}
public static void showAnnotLink(PtlAnnot annot)
throws PtlException, Exception, Error {
System.out.println("ANNOT_TYPE = Link ");
PtlAnnotLink annotLink = (PtlAnnotLink)annot;
showAnnotCommon(annotLink);
PtlAnnotLink.HIGHLIGHTING_MODE highlight = annotLink.getHighlightMode();
switch (highlight) {
case HIGHLIGHTING_MODE_NONE:
System.out.println("HIGHLIGHTING_MODE = NONE" );
break;
case HIGHLIGHTING_MODE_INVERT:
System.out.println("HIGHLIGHTING_MODE = INVERT" );
break;
case HIGHLIGHTING_MODE_OUTLINE:
System.out.println("HIGHLIGHTING_MODE = OUTLINE" );
break;
case HIGHLIGHTING_MODE_PUSH:
System.out.println("HIGHLIGHTING_MODE = PUSH" );
break;
}
try (PtlDest dest = annotLink.getDest()) {
showDest(dest);
}
try (PtlAction act = annotLink.getAction()) {
showAction(act);
}
}
public static void showAnnotStamp(PtlAnnot annot)
throws PtlException, Exception, Error {
System.out.println("ANNOT_TYPE = Stamp");
PtlAnnotStamp annotStamp = (PtlAnnotStamp)annot;
showAnnotCommon(annotStamp);
PtlAnnotStamp.ICON_TYPE iconType = annotStamp.getIconType();
switch (iconType) {
case ICON_APPROVED:
System.out.println("ICON_TYPE = APPROVED" );
break;
case ICON_AS_IS:
System.out.println("ICON_TYPE = AS_IS" );
break;
case ICON_CONFIDENTIAL:
System.out.println("ICON_TYPE = CONFIDENTIAL" );
break;
case ICON_DEPARTMENTAL:
System.out.println("ICON_TYPE = DEPARTMENTAL" );
break;
case ICON_DRAFT:
System.out.println("ICON_TYPE = DRAFT" );
break;
case ICON_EXPERIMENTAL:
System.out.println("ICON_TYPE = EXPERIMENTAL" );
break;
case ICON_EXPIRED:
System.out.println("ICON_TYPE = EXPIRED" );
break;
case ICON_FINAL:
System.out.println("ICON_TYPE = FINAL" );
break;
case ICON_FOR_COMMENT:
System.out.println("ICON_TYPE = FOR_COMMENT" );
break;
case ICON_FOR_PUBLIC_RELEASE:
System.out.println("ICON_TYPE = FOR_PUBLIC_RELEASE" );
break;
case ICON_NOT_APPROVED:
System.out.println("ICON_TYPE = NOT_APPROVED" );
break;
case ICON_NOT_FOR_PUBLIC_RELEASE:
System.out.println("ICON_TYPE = NOT_FOR_PUBLIC_RELEASE" );
break;
case ICON_SOLD:
System.out.println("ICON_TYPE = SOLD" );
break;
case ICON_TOP_SECRET:
System.out.println("ICON_TYPE = TOP_SECRET" );
break;
case ICON_SB_APPROVED:
System.out.println("ICON_TYPE = SB_APPROVED" );
break;
case ICON_SB_COMPLETED:
System.out.println("ICON_TYPE = SB_COMPLETED" );
break;
case ICON_SB_CONFIDENTIAL:
System.out.println("ICON_TYPE = SB_CONFIDENTIAL" );
break;
case ICON_SB_DRAFT:
System.out.println("ICON_TYPE = SB_DRAFT" );
break;
case ICON_SB_FINAL:
System.out.println("ICON_TYPE = SB_FINAL" );
break;
case ICON_SB_FOR_COMMENT:
System.out.println("ICON_TYPE = SB_FOR_COMMENT" );
break;
case ICON_SB_FOR_PUBLIC_RELEASE:
System.out.println("ICON_TYPE = SB_FOR_PUBLIC_RELEASE" );
break;
case ICON_SB_INFORMATIONONLY:
System.out.println("ICON_TYPE = SB_INFORMATIONONLY" );
break;
case ICON_SB_NOT_APPROVED:
System.out.println("ICON_TYPE = SB_NOT_APPROVED" );
break;
case ICON_SB_NOT_FOR_PUBLIC_RELEASE:
System.out.println("ICON_TYPE = SB_NOT_FOR_PUBLIC_RELEASE" );
break;
case ICON_SB_PRELIMINARYRESULTS:
System.out.println("ICON_TYPE = SB_PRELIMINARYRESULTS" );
break;
case ICON_SB_VOID:
System.out.println("ICON_TYPE = SB_VOID" );
break;
case ICON_CUSTOM:
System.out.println("ICON_TYPE = CUSTOM" );
break;
case ICON_UNKNOWN:
System.out.println("ICON_TYPE = UNKNOWN" );
break;
}
System.out.println("ICON_NAME = \ "" + annotStamp.getIconName() + "\ "" );
showAnnotMarkup(annotStamp);
}
public static void showAnnotFileAttachment(PtlAnnot annot, String outpathAttach)
throws PtlException, Exception, Error {
System.out.println("ANNOT_TYPE = File Attachment");
PtlAnnotFileAttachment annotFileAttachment = (PtlAnnotFileAttachment)annot;
showAnnotCommon(annotFileAttachment);
PtlAnnotFileAttachment.ICON_TYPE iconType = annotFileAttachment.getIconType();
switch (iconType) {
case ICON_GRAPH:
System.out.println("ICON_TYPE = GRAPH" );
break;
case ICON_PAPERCLIP:
System.out.println("ICON_TYPE = PAPERCLIP" );
break;
case ICON_PUSHPIN:
System.out.println("ICON_TYPE = PUSHPIN" );
break;
case ICON_TAG:
System.out.println("ICON_TYPE = TAG" );
break;
case ICON_CUSTOM:
System.out.println("ICON_TYPE = CUSTOM" );
break;
case ICON_UNKNOWN:
System.out.println("ICON_TYPE = UNKNOWN" );
break;
}
System.out.println("ICON_NAME = \ "" + annotFileAttachment.getIconName() + "\ "" );
System.out.println("FILE_NAME = \ "" + annotFileAttachment.getFileName() + "\ "" );
if (!outpathAttach.isEmpty()) {
try (PtlParamOutput outputAttach = new PtlParamOutput(outpathAttach)) {
annotFileAttachment.writeFile(outputAttach);
}
}
showAnnotMarkup(annotFileAttachment);
}
public static void showAnnotOther(PtlAnnot annot)
throws PtlException, Exception, Error {
PtlAnnot.ANNOT_TYPE annotType = annot.getType();
switch (annotType) {
case TYPE_FREE_TEXT:
System.out.println("ANNOT_TYPE = FreeText" );
break;
case TYPE_LINE:
System.out.println("ANNOT_TYPE = Line" );
break;
case TYPE_SQUARE:
System.out.println("ANNOT_TYPE = Square" );
break;
case TYPE_CIRCLE:
System.out.println("ANNOT_TYPE = Circle" );
break;
case TYPE_POLYGON:
System.out.println("ANNOT_TYPE = Polygon" );
break;
case TYPE_POLYLINE:
System.out.println("ANNOT_TYPE = Polyline" );
break;
case TYPE_HIGHLIGHT:
System.out.println("ANNOT_TYPE = Highlight" );
break;
case TYPE_UNDERLINE:
System.out.println("ANNOT_TYPE = Underline" );
break;
case TYPE_SQUIGGLY:
System.out.println("ANNOT_TYPE = Squiggly" );
break;
case TYPE_STRIKEOUT:
System.out.println("ANNOT_TYPE = Strikeout" );
break;
case TYPE_CARET:
System.out.println("ANNOT_TYPE = Caret" );
break;
case TYPE_INK:
System.out.println("ANNOT_TYPE = Ink" );
break;
case TYPE_SOUND:
System.out.println("ANNOT_TYPE = Sound" );
break;
case TYPE_MOVIE:
System.out.println("ANNOT_TYPE = Movie" );
break;
case TYPE_WIDGET:
System.out.println("ANNOT_TYPE = Widget" );
break;
case TYPE_SCREEN:
System.out.println("ANNOT_TYPE = Screen" );
break;
case TYPE_PRINTER_MARK:
System.out.println("ANNOT_TYPE = PrinterMark" );
break;
case TYPE_TRAP_NETWORK:
System.out.println("ANNOT_TYPE = TrapNetwork" );
break;
case TYPE_WATERMARK:
System.out.println("ANNOT_TYPE = Watermark" );
break;
case TYPE_3D:
System.out.println("ANNOT_TYPE = 3D" );
break;
case TYPE_REDACT:
System.out.println("ANNOT_TYPE = Redact" );
break;
case TYPE_PROJECTION:
System.out.println("ANNOT_TYPE = Projection" );
break;
case TYPE_RICHMEDIA:
System.out.println("ANNOT_TYPE = Richmedia" );
break;
default:
System.out.println("ANNOT_TYPE = Unknown" );
break;
}
showAnnotCommon(annot);
if (annot.isMarkup()) {
showAnnotMarkup(annot);
}
}
public static void showPopup(PtlAnnot annot)
throws PtlException, Exception, Error {
...【ShowAnnotMarkupInfo.javaと同じ処理のため省略
・ポップアップ注釈が固有に持つ情報を表示する。】...
}
/**
* 注釈全般に共通する情報を表示する。
* 共通する情報とは、矩形座標、注釈の内容、注釈フラグ、色、内部色、
* 境界線スタイル、境界線幅です。
* @param annot 読み取る注釈
* @throws PtlException PDF Tool APIにより発生した例外
* @throws Exception その他の例外
* @throws Error その他のエラー
*/
public static void showAnnotCommon(PtlAnnot annot)
throws PtlException, Exception, Error {
...【ShowAnnotCommonInfo.javaと同じ処理のため省略
・全ての注釈にあてはまる項目の情報を表示する】...
}
public static void showAnnotMarkup(PtlAnnot annot)
throws PtlException, Exception, Error {
...【ShowAnnotMarkupInfo.javaと同じ処理のため省略
・マークアップ注釈が固有に持つ情報を表示する。】...
}
public static void showColor(PtlColor color)
throws PtlException, Exception, Error {
...【ShowAnnotCommonInfo.javaと同じ処理のため省略
・PtlColorに含まれるカラータイプを判別し、その内容を表示する。】...
}
}
public static void showAction(PtlAction act) throws PtlException, Exception, Error {
PtlAction.ACTION_TYPE actType = act.getType();
switch (actType) {
case TYPE_GOTO:
System.out.println("ACTION_TYPE = GOTO" );
PtlActionGoTo actGoTo = (PtlActionGoTo)act;
try (PtlDest destGoTo = actGoTo.getDest()) {
showDest(destGoTo);
}
break;
case TYPE_GOTO_R:
System.out.println("ACTION_TYPE = GOTOR" );
PtlActionGoToR actGoToR = (PtlActionGoToR)act;
try (PtlDest destGoToR = actGoToR.getDest()) {
showDest(destGoToR);
}
String fileName1 = actGoToR.getFileName();
System.out.printf("GOTOR FILENAME = %s\n", fileName1);
if (actGoToR.getNewWindowFlag())
System.out.println("GOTOR NewWindowFlag on" );
else
System.out.println("GOTOR NewWindowFlag off" );
break;
case TYPE_LAUNCH:
System.out.println("ACTION_TYPE = LAUNCH" );
PtlActionLaunch actLaunch = (PtlActionLaunch)act;
String fileName2 = actLaunch.getFileName();
System.out.printf("LAUNCH FILENAME = %s\n", fileName2);
if (actLaunch.getNewWindowFlag())
System.out.println("LAUNCH NewWindowFlag on" );
else
System.out.println("LAUNCH NewWindowFlag off" );
break;
case TYPE_URI:
System.out.println("ACTION_TYPE = URI" );
PtlActionURI actURI = (PtlActionURI)act;
String uri = actURI.getURI();
System.out.printf("URI = %s\n", uri);
break;
case TYPE_UNKNOWN:
System.out.println("ACTION_TYPE = UNKNOWN" );
break;
}
}
public static void showDest(PtlDest dest) throws PtlException, Exception, Error {
PtlDest.DEST_TYPE destType = dest.getType();
switch (destType) {
case TYPE_NONE:
System.out.println("DEST_TYPE = NONE" );
break;
case TYPE_XYZ:
System.out.println("DEST_TYPE = XYZ" );
break;
case TYPE_FIT:
System.out.println("DEST_TYPE = FIT" );
break;
case TYPE_FIT_H:
System.out.println("DEST_TYPE = FITH" );
break;
case TYPE_FIT_V:
System.out.println("DEST_TYPE = FITV" );
break;
case TYPE_FIT_R:
System.out.println("DEST_TYPE = FITR" );
break;
case TYPE_FIT_B:
System.out.println("DEST_TYPE = FITB" );
break;
case TYPE_FIT_BH:
System.out.println("DEST_TYPE = FITBH" );
break;
case TYPE_FIT_BV:
System.out.println("DEST_TYPE = FITBV" );
break;
}
System.out.printf("DEST_PAGE : %d\n", dest.getPageNumber());
if (dest.isLeftNull())
System.out.println("DEST_LEFT = null" );
else
System.out.printf("DEST_LEFT : %f\n", dest.getLeft());
if (dest.isBottomNull())
System.out.println("DEST_BOTTOM = null" );
else
System.out.printf("DEST_BOTTOM : %f\n", dest.getBottom());
if (dest.isRightNull())
System.out.println("DEST_RIGHT = null" );
else
System.out.printf("DEST_RIGHT : %f\n", dest.getRight());
if (dest.isTopNull())
System.out.println("DEST_TOP = null" );
else
System.out.printf("DEST_TOP : %f\n", dest.getTop());
if (dest.isZoomNull())
System.out.println("DEST_ZOOM = null" );
else
System.out.printf("DEST_ZOOM : %f\n", dest.getZoom());
}
}
DistinctAnnotsAndGetInfo.java
C:\samples>java cookbook.DistinctAnnotsAndGetInfo usage: java DistinctAnnotsAndGetInfo in-pdf-file [out-attach-file] C:\samples>java cookbook.DistinctAnnotsAndGetInfo annots.pdf ページ1 注釈数 : 10 index num : 0の注釈情報を表示します 注釈のタイプを判別し、必要に応じてそのタイプ特有の情報を表示します。 : その他の注釈のタイプです。注釈のタイプ名と注釈全般の情報を表示します。 ANNOT_TYPE = FreeText Rcet = 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 COLOR_TYPE = RGB(0.000000,0.000000,0.000000) COLOR_TYPE = None BORDER_STYLE = SOLID BORDER_WIDTH = NONE MarkUpTitle = "koba" MarkUpSubj = "タイプライターテキスト" MarkUpDate : 2019/8/1 15:48:40 MarkUpCA : 1.000000 … 2番目以降省略 …