3.1.1 しおり情報の取得

images/GetOutlineInfo-top.png

狙い・効果

しおり情報を取得し、結果を標準出力に表示します。

処理の概要

既存PDF文書のしおりの情報を取得して画面に出力します。「取得方法」パラメータを数値で指定することで、出力形式としてしおりの項目をツリー状にレイアウトする形式としおりのアクションまで含む詳細を表示する形式を選択できます。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import java.io.*;
import jp.co.antenna.ptl.*;

public class GetOutlineInfo {
    // そのクラスのusageを表示する関数
    public static void printUsage(){
        System.out.println("usage: java GetOutline in-pdf-file 取得方法\n");
        System.out.println("取得方法\n0 : 1ツリー   1 : 詳細");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 2)
        {
            printUsage(); // usageメッセージの表示
            return;
        }

        // コマンドライン引数の処理
        boolean showDetail;
        try
        {
            showDetail = readBoolArgs(args[1], "取得方法は0か1で指定してください。");
        }
        catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
            printUsage(); // usageメッセージの表示
            return;
        }

        // しおり情報の取得
        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            // PDFファイルをロード
            doc.load(inputFile);

            if (!doc.hasOutlines()) {
                System.out.println("このPDFにしおり情報はありません。");
                return;
            }

            try (PtlOutline rootOutline = doc.getRootOutline()) {
                if (rootOutline.hasChild()) {
                    try (PtlOutline outline = rootOutline.getFirstChild()) {
                        readOutline(outline, 0, showDetail);
                    }
                }
            }
        }
        ...【GetEncryptInfo.javaと同じ処理のため省略
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...

    }

    static void readOutline(PtlOutline item, int indent, boolean showDetail)
        throws PtlException, Exception, Error
    {
        if (showDetail) {
            System.out.println("Title = " + item.getTitle());
            System.out.println("Indent = " + indent);
            if (item.isOpen())
            {
                System.out.println("PDF表示時の子アウトラインをオープンする");
            }
            else
            {
                System.out.println("PDF表示時の子アウトラインをオープンしない");
            }
            int flags = item.getFlags();
            if ((flags & PtlOutline.FLAG_BOLD) == PtlOutline.FLAG_BOLD)
                System.out.println("FLAG_BOLD on" );
            else
                System.out.println("FLAG_BOLD off" );
            if ((flags & PtlOutline.FLAG_ITALIC) == PtlOutline.FLAG_ITALIC)
                System.out.println("FLAG_ITALIC on" );
            else
                System.out.println("FLAG_ITALIC off" );
            try (PtlColorDeviceRGB color = item.getColor()) {
                int rr = (int)(color.getR() * 255);
                int gg = (int)(color.getG() * 255);
                int bb = (int)(color.getB() * 255);
                System.out.printf("Color = RGB(%d,%d,%d)\n", rr, gg, bb);
            }
            try (PtlAction act = item.getAction()) {
                showAction(act);
            }
        } else {
            String indentString = "";
            for(int i=0; i<indent; ++i) {
                indentString += "  ";
            }
            if (showDetail == false) {
                System.out.print(indentString);
            }
            System.out.println(item.getTitle());
        }

        if (item.hasChild()) {
            try (PtlOutline firstItem = item.getFirstChild()) {
                int indentChild = indent + 1;
                readOutline(firstItem, indentChild, showDetail);
            }
        }
        if (item.hasNextSibling()) {
            try (PtlOutline nextItem = item.getNextSibling()) {
                readOutline(nextItem, indent, showDetail);
            }
        }
    }

    public static void showAction(PtlAction action)
        throws PtlException, Exception, Error
    {
        switch (action.getType())
        {
        case TYPE_NONE:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_NONE +
                                   " : アクションなし");
                break;
            }
        case TYPE_GOTO:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_GOTO +
                                   " : GoToアクション");
                PtlActionGoTo act = (PtlActionGoTo)action;
                // 宛先の取得
                try (PtlDest dest = act.getDest())
                {
                    showDest(dest);
                }
                break;
            }
        case TYPE_GOTO_R:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_GOTO_R +
                                   " : GoToRアクション");
                PtlActionGoToR act = (PtlActionGoToR)action;
                // ファイル間移動用PDFファイル名を取得 getFileName()
                System.out.println("  FileName = " + act.getFileName());
                // 新ウィンドウフラグを取得
                if (act.getNewWindowFlag())
                {
                    System.out.println("  NewWindowFlag = true: 新ウィンドウでオープンする");
                }
                else
                {
                    System.out.println("  NewWindowFlag = false: しない");
                }
                // 宛先の取得
                try (PtlDest dest = act.getDest())
                {
                    showDest(dest);
                }
                break;
            }
        case TYPE_LAUNCH:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_LAUNCH +
                                   " : Launchアクション");
                PtlActionLaunch act = (PtlActionLaunch)action;
                // 起動ファイル名を取得
                System.out.println("  FileName = " + act.getFileName());
                // 新ウィンドウフラグを取得
                if (act.getNewWindowFlag())
                {
                    System.out.println("  NewWindowFlag = true: 新ウィンドウでオープンする");
                }
                else
                {
                    System.out.println("  NewWindowFlag = false: しない");
                }
                break;
            }
        case TYPE_URI:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_URI +
                                   " : URIアクション");
                PtlActionURI act = (PtlActionURI)action;
                // URIを取得
                System.out.println("  URI = " + act.getURI());
                break;
            }
        case TYPE_UNKNOWN:
            {
                System.out.println("Action = " + PtlAction.ACTION_TYPE.TYPE_UNKNOWN +
                                   " : 未対応アクション");
                break;
            }
        }
    }

    public static void showDest(PtlDest dest) throws PtlException, Exception, Error
    {
        switch (dest.getType())
        {
        case TYPE_NONE:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_NONE + " : 宛先なし");
            break;
        case TYPE_XYZ:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_XYZ + " : XYZ型");
            break;
        case TYPE_FIT:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT + " : Fit型(全体表示)");
            break;
        case TYPE_FIT_H:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_H +
                               " : FitH型(幅に合わせる)");
            break;
        case TYPE_FIT_V:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_V +
                               " : FitV型(高さに合わせる)");
            break;
        case TYPE_FIT_R:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_R + " : FitR型");
            break;
        case TYPE_FIT_B:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_B + " : FitB型");
            break;
        case TYPE_FIT_BH:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_BH +
                               " : FitBH型(描画領域の幅に合わせる)");
            break;
        case TYPE_FIT_BV:
            System.out.println("Dest = " + PtlDest.DEST_TYPE.TYPE_FIT_BV + " : FitBV型");
            break;
        }
        // 宛先ページの取得
        System.out.println("宛先ページ(PageNumber) : " + (dest.getPageNumber()) + " ページ目");
    }
        ...【readBoolArgs()の処理はWaterMarkSetPageRange.javaと共通のため省略。
             ・0 または1 を入力されたargs により、true またはfalse を返すメソッド。
             ・argsが0か1でなかった場合に出力されるエラーメッセージを指定する。】...
}

プログラムファイル名

GetOutlineInfo.java

入出力操作の例

images/GetOutlineInfo.png

(1) 次はツリー形式の出力例(tree.txtの内容)です。

はじめに
目次
第1章 タグ付きPDFとはなにか
  1.1 文書の構造
  1.2 タグ付きPDFでできること
第2章 タグ付きPDFの仕組
  2.1 マークされた内容
  2.2 論理構造を構築する仕組
    2.2.1 構造要素辞書
    2.2.2 タグツリー
    2.2.3 タグツリーとコンテントの対応

…中略…

第4章 タグ付きPDFの制作
  4.1 簡単なタグ付きPDFの作成(ルートタグ作成)
  4.2 簡単なタグ付きPDFの作成(フラットなツリー)
    4.2.1 見出し1と第1階層のタグ設定
    4.2.2 画像のタグ付け
    4.2.3 表のタグ付け
    4.2.4 ヘッダーとフッターのタグ付け
  4.3 簡単なタグ付きPDFの作成(深いツリー)
  4.4 自動タグ付け
第5章 画像の代替テキスト
第6章 タグ付きPDFを利用するPDFプロファイル仕様
参考資料
-- 完了 --

(2) 次は詳細形式の出力例(detail.txtの内容)です。

Title = はじめに
Indent = 0
PDF表示時の子アウトラインをオープンする
FLAG_BOLD off
FLAG_ITALIC off
Color = RGB(0,0,0)
Action = TYPE_GOTO : GoToアクション
Dest = TYPE_XYZ : XYZ型
宛先ページ(PageNumber) : 2 ページ目
Title = 目次
Indent = 0
PDF表示時の子アウトラインをオープンする
FLAG_BOLD off
FLAG_ITALIC off
Color = RGB(0,0,0)
Action = TYPE_GOTO : GoToアクション
Dest = TYPE_XYZ : XYZ型
宛先ページ(PageNumber) : 3 ページ目

…中略…

Title = 第6章 タグ付きPDFを利用するPDFプロファイル仕様
Indent = 0
PDF表示時の子アウトラインをオープンする
FLAG_BOLD off
FLAG_ITALIC off
Color = RGB(0,0,0)
Action = TYPE_GOTO : GoToアクション
Dest = TYPE_XYZ : XYZ型
宛先ページ(PageNumber) : 40 ページ目
Title = 参考資料
Indent = 0
PDF表示時の子アウトラインをオープンする
FLAG_BOLD off
FLAG_ITALIC off
Color = RGB(0,0,0)
Action = TYPE_GOTO : GoToアクション
Dest = TYPE_XYZ : XYZ型
宛先ページ(PageNumber) : 42 ページ目
-- 完了 --