/* Antenna House PDF Tool API V8.0 .NET Interface sample program 概要:しおり情報の取得 Copyright 2013-2025 Antenna House, Inc. */ using System; using PdfTkNet; namespace GetOutline { class Program { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("usage: GetOutline.exe in-pdf-file 取得方法\n"); Console.WriteLine("取得方法\n0 : しおりのツリー 1 : しおりの詳細\n"); return; } bool showDetail = false; String kind = args[1]; switch (kind) { case "0": break; case "1": showDetail = true; break; default: Console.WriteLine("usage: GetOutline.exe in-pdf-file 取得方法\n"); Console.WriteLine("取得方法\n0 : しおりのツリー 1 : しおりの詳細\n"); return; } try { using (PtlParamInput inputFile = new PtlParamInput(args[0])) using (PtlPDFDocument doc = new PtlPDFDocument()) { //PDFファイルをロードします。 doc.load(inputFile); if (!doc.hasOutlines()) { Console.WriteLine("アウトラインを持っていない!"); return; } //ルートアウトラインの取得 using (PtlOutline rootOutline = doc.getRootOutline()) { if (rootOutline.hasChild()) { //子アウトラインを持つかどうかの取得(true: 子アウトラインを持たない false: 子アウトラインを持つ) using (PtlOutline outline = rootOutline.getFirstChild()) { readOutline(outline, 0, showDetail); } } } } } catch (PtlException pex) { Console.WriteLine(pex.getErrorCode() + " : " + pex.getErrorMessageJP()); pex.Dispose(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("-- 完了 --"); } } static void readOutline(PtlOutline item, int indent, bool showDetail) { if (showDetail) { Console.WriteLine("Title = " + item.getTitle()); Console.WriteLine("Indent = " + indent); if (item.isOpen()) { Console.WriteLine("PDF表示時の子アウトラインをオープンする"); } else { Console.WriteLine("PDF表示時の子アウトラインをオープンしない"); } PtlOutline.ITEM_FLAG flags = item.getFlags(); if ((flags & PtlOutline.ITEM_FLAG.FLAG_BOLD) == PtlOutline.ITEM_FLAG.FLAG_BOLD) Console.WriteLine("FLAG_BOLD on" ); else Console.WriteLine("FLAG_BOLD off" ); if ((flags & PtlOutline.ITEM_FLAG.FLAG_ITALIC) == PtlOutline.ITEM_FLAG.FLAG_ITALIC) Console.WriteLine("FLAG_ITALIC on" ); else Console.WriteLine("FLAG_ITALIC off" ); using (PtlColorDeviceRGB color = item.getColor()) { int rr = (int)(color.getR() * 255); int gg = (int)(color.getG() * 255); int bb = (int)(color.getB() * 255); Console.WriteLine("Color = RGB({0},{1},{2})", rr, gg, bb); } using (PtlAction act = item.getAction()) { showAction(act); } } else { String indentString = ""; for(int i=0; i < indent; ++i) { indentString += " "; } if (showDetail == false) { Console.Write(indentString); } Console.WriteLine(item.getTitle()); } if (item.hasChild()) { using (PtlOutline firstItem = item.getFirstChild()) { int indentChild = indent; indentChild++; readOutline(firstItem, indentChild, showDetail); } } if (item.hasNextSibling()) { using (PtlOutline nextItem = item.getNextSibling()) { readOutline(nextItem, indent, showDetail); } } } static void showAction(PtlAction action) { switch (action.getType()) { case PtlAction.ACTION_TYPE.TYPE_NONE: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_NONE + " : アクションなし"); break; } case PtlAction.ACTION_TYPE.TYPE_GOTO: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_GOTO + " : GoToアクション"); PtlActionGoTo act = (PtlActionGoTo)action; //宛先ページの取得(ページ番号は0ベース) using (PtlDest dest = act.getDest()) { showDest(dest); } break; } case PtlAction.ACTION_TYPE.TYPE_GOTO_R: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_GOTO_R + " : GoToRアクション"); PtlActionGoToR act = (PtlActionGoToR)action; //ファイル間移動用PDFファイル名を取得 getFileName() Console.WriteLine("FileName : " + act.getFileName()); //新ウィンドウフラグを取得 if (act.getNewWindowFlag()) { Console.WriteLine("NewWindowFlag : true: 新ウィンドウでオープンする"); } else { Console.WriteLine("NewWindowFlag : false: しない"); } //宛先ページの取得(ページ番号は0ベース) using (PtlDest dest = act.getDest()) { showDest(dest); } break; } case PtlAction.ACTION_TYPE.TYPE_LAUNCH: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_LAUNCH + " : Launchアクション"); PtlActionLaunch act = (PtlActionLaunch)action; //起動ファイル名を取得 Console.WriteLine("FileName : " + act.getFileName()); //新ウィンドウフラグを取得 if (act.getNewWindowFlag()) { Console.WriteLine("NewWindowFlag : true: 新ウィンドウでオープンする"); } else { Console.WriteLine("NewWindowFlag : false: しない"); } break; } case PtlAction.ACTION_TYPE.TYPE_URI: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_URI + " : URIアクション"); PtlActionURI act = (PtlActionURI)action; //URIを取得 Console.WriteLine("URI : " + act.getURI()); break; } case PtlAction.ACTION_TYPE.TYPE_UNKNOWN: { Console.WriteLine("Action : " + PtlAction.ACTION_TYPE.TYPE_UNKNOWN + " : 未対応アクション"); break; } } } static void showDest(PtlDest dest) { switch (dest.getType()) { case PtlDest.DEST_TYPE.TYPE_NONE: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_NONE + " : 宛先なし"); break; case PtlDest.DEST_TYPE.TYPE_XYZ: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_XYZ + " : XYZ型"); break; case PtlDest.DEST_TYPE.TYPE_FIT: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT + " : Fit型(全体表示)"); break; case PtlDest.DEST_TYPE.TYPE_FIT_H: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_H + " : FitH型(幅に合わせる)"); break; case PtlDest.DEST_TYPE.TYPE_FIT_V: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_V + " : FitV型(高さに合わせる)"); break; case PtlDest.DEST_TYPE.TYPE_FIT_R: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_R + " : FitR型"); break; case PtlDest.DEST_TYPE.TYPE_FIT_B: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_B + " : FitB型"); break; case PtlDest.DEST_TYPE.TYPE_FIT_BH: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_BH + " : FitBH型(描画領域の幅に合わせる)"); break; case PtlDest.DEST_TYPE.TYPE_FIT_BV: Console.WriteLine("Dest : " + PtlDest.DEST_TYPE.TYPE_FIT_BV + " : FitBV型"); break; } //宛先ページの取得 Console.WriteLine("宛先ページ(PageNumber) : " + dest.getPageNumber() + " ページ目"); } } }