PDF内で使用されているフォントを表示する

どうもです。
あることを,自分が知っていて,相手が知らないという状況になったとき,
その人がどう反応するかで,結構その人がわかるかも〜,と
いつになくまじめなことを考えていた whitypig です。
あと逆の場合もそうだね。

フォントの置換と文字色の変更

とりあえずできた。満足もしている。
各ページごとに,フォントのキーが変わっているみたい。
あと色の指定も色々な方法があった。

ソースコードは,殴り書き過ぎて汚いので,公開するのは悪と判断しました(笑)
だもんで,修正しつつ公開するかも。
とりあえず,まずは,フォントを表示するのだけ。
フォント変更するためには,置換したいフォントのキーを知る必要があるので。
実行するとこんなんが表示される。
PDF のリファレンスをやろうとしたら,NoSuchElementException で落ちた。
なぜかわからんかった。

% java ReplaceFont 22h_06.pdf 
====================page1====================
(TT10, MS-Mincho)
(TT4, MS-Gothic)
(TT6, ArialMT)
(TT2, MS-PMincho)
(TT8, MS-PGothic)
====================page2====================
(TT10, MS-Mincho)
(TT4, MS-Gothic)
(TT6, ArialMT)
(TT2, MS-PMincho)
(TT12, HeiseiKakuGothic-W5)
(TT8, MS-PGothic)

ソース

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
import org.apache.pdfbox.pdmodel.font.PDFontDescriptorDictionary;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;

/**
 * Describe class ReplaceFont here.
 *
 *
 * Created: Sun Jan 10 04:38:55 2010
 *
 * @author whitypig
 * @version 1.0
 */
public final class ReplaceFont {

  /**
   * Creates a new <code>ReplaceFont</code> instance.
   *
   */
  private ReplaceFont() {

  }

  /**
   * Describe <code>main</code> method here.
   *
   * @param args a <code>String</code> value
   */
  public static void main(final String[] args) {
    try {
      ReplaceFont app = new ReplaceFont();
      if (args.length == 1) {
        app.listFont(args[0]);
      }
      else {
        System.err.println("Usage: java ReplaceFont <PDF file>");
        System.exit(1);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * PDFファイル内で使用されいてるフォントを,
   * 各ページについて,(キー, フォント名) の形式で表示する。
   */
  private void listFont(String pdffile) throws IOException {
    PDDocument doc = null;
    try {
      doc = PDDocument.load(pdffile);
      List pages = doc.getDocumentCatalog().getAllPages();
      for (int i = 0, size = pages.size(); i < size; i++) {
        System.out.println("====================page" + (i + 1) + "====================");
        PDPage page = (PDPage)pages.get(i);
        PDResources resources = page.getResources();
        Map fontMap = resources.getFonts();
        Set keySet = fontMap.keySet();
        Iterator it = keySet.iterator();
        while (it.hasNext()) {
          String key = (String)it.next();
          PDFont font = (PDFont)fontMap.get(key);
          System.out.println("(" + key + ", " + font.getBaseFont().toString() + ")");
        }
      }
    }
    finally {
      if (doc != null) {
        doc.close();
      }
    }
  }

}