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(); } } } }