PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PDFlib TET サンプル集(クックブック)

本サンプルプログラムは、PDF テキスト抽出ライブラリーの実装である TET の基本的な機能を実際のプログラムで紹介したものです。

本サイトでダウンロードした TET は、一部機能の制限を除き、評価版として無償でお使いいただけます。

テキストの抽出

PDFlib TET で、 PDF文書からテキストを抽出するサンプルプログラムです。

TETを使用したテキストの抽出手順とソースコードについては、 Q & A 「PDF 内のリンクテキストを抽出する方法」で、処理手順やソースコードをご紹介しておりますのでご覧ください。


import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

import com.pdflib.TETException;
import com.pdflib.TET;

/**
 * テキストの抽出
 * <p>
 * 必要な製品 : TET 4
 * <p>
 * 必要なデータ: PDF 文書
 * 
 * @version $Id: text_extractor.java,v 1.2 2008/11/20 08:06:40 stm Exp $
 */
public class text_extractor {
    /**
     * グローバルオプションリスト 
     */
    static final String GLOBAL_OPTLIST = "searchpath={../resource/cmap "
            + "../resource/glyphlist ../input}";

    /**
     * 文書のオプションリスト
     */
    static final String DOC_OPTLIST = "";

    /**
     * ページのオプションリスト
     */
    static final String PAGE_OPTLIST = "granularity=page";

    /**
     * テキストのまとまり毎に区切り文字を挿入する。「granularity=word」を指定し、
     * スペース文字が必要な場合に役に立つ
     */
    static final String SEPARATOR = "\n";

    /**
     * INMEMORYに"true"を設定した場合、ファイル全体をメモリ内へ読み込んで処理する
     * (tet.open_document()のオプションで使用)
     */
    static final boolean INMEMORY = false;

    /**
     * System.out に送られるエンコーディング。
     * 例えば、コマンドウィンドウでデフォルトエンコーディングと異なる文字コードを
     * 指定することができる
     */
    private static final String OUTPUT_ENCODING = System
            .getProperty("file.encoding");

    /**
     * 取得したエンコーディング(OUTPUT_ENCODING)を元に System.outより出力
     */
    private static PrintStream out;

    public static void main(String argv[]) throws UnsupportedEncodingException {
        System.out.println("Using output encoding \"" + OUTPUT_ENCODING + "\"");
        out = new PrintStream(System.out, true, OUTPUT_ENCODING);

        TET tet = null;

        try {
            if (argv.length != 1) {
                throw new Exception("usage: text_extractor <filename>");
            }

            tet = new TET();
            tet.set_option(GLOBAL_OPTLIST);

            int doc = tet.open_document(argv[0], DOC_OPTLIST);
            if (doc == -1) {
                throw new Exception("Error " + tet.get_errnum() + "in "
                        + tet.get_apiname() + "(): " + tet.get_errmsg());
            }

            /* PDF文書のページ数を取得する */
            int n_pages = (int) tet.pcos_get_number(doc, "length:pages");

            /* PDF文書のページ分ループする */
            for (int pageno = 1; pageno <= n_pages; ++pageno) {
                String text;
                int page = tet.open_page(doc, pageno, PAGE_OPTLIST);

                if (page < 0) {
                    print_tet_error(tet, pageno);
                    continue; /* 次のページへ */
                }

                /*
                 * テキストを取得する; これは" granularity=page" を指定している場合は
                 * 必要のない処理であり、他の取得単位の場合必要となる。
                 */
                while ((text = tet.get_text(page)) != null) {
                    /* loop over all characters */
                    while (tet.get_char_info(page) != -1) {
                        /*
                         * 以下に、フォント名を取り出す方法を示す。
                         * 位置情報が必要な場合はx,y座標より取り出すことができる。
                         * fontname変数は使用しておらす、警告を避けるためコメントアウト
                         * している
                         */
                        /* String fontname = */
                        tet.pcos_get_string(doc, "fonts[" + tet.fontid
                                + "]/name");
                    }

                    /* 取得したテキストを出力する */
                    out.print(text);

                    /* 抽出したテキストのまとまりの間に区切り文字を挿入する */
                    out.print(SEPARATOR);
                }

                if (tet.get_errnum() != 0) {
                    print_tet_error(tet, pageno);
                }

                tet.close_page(page);
            }

            tet.close_document(doc);
        }
        catch (TETException e) {
            System.err.println("TET exception occurred in extractor sample:");
            System.err.println("[" + e.get_errnum() + "] " + e.get_apiname()
                    + ": " + e.get_errmsg());
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }
        finally {
            if (tet != null) {
                tet.delete();
            }
        }
    }

    /**
     * エラーの出力 
     * 
     * @param tet
     *            TET オブジェクト
     * @param pageno
     *            エラーとなったページ番号
     */
    private static void print_tet_error(TET tet, int pageno) {
        System.err.println("Error " + tet.get_errnum() + " in  "
                + tet.get_apiname() + "() on page " + pageno + ": "
                + tet.get_errmsg());
    }
}
(May 6, 2010 - Apr 9, 2015)