Archive

Posts Tagged ‘PDF’

FO.NET

FO.NET という .NET Framework の XSL-FO 処理系があるようです。

サンプルがあるので,まず font-family を日本語対応の TrueType フォントにしてみたらそのフォントでちゃんと表示されました。次に表示文字列を「こんにちは、世界!」に変えて実行してみると,表示がうまくいきません。フォントを変えてみても同じです。どうやら埋め込まれている文字が ANSI のみであることが原因のようです。

Wiki によれば Unicode 文字を埋め込むには PdfRendererOptions.FontTypeEmbed もしくは Subset にしてやれば良いようです。

font-family="MS Pゴシック" 試したところ両方でうまく言ったのですが, font-family="IPA Pゴシック" では Embed はフォント埋め込みに成功して日本語表示ができたのですが, Subset だと以下の例外が出ました。

ハンドルされていない例外: System.SystemException: System.ArgumentException:
Cannot locate table 'cvt'
パラメータ名: tableName
   場所 Fonet.Pdf.Gdi.Font.FontFileReader.GetTable(String tableName)
   場所 Fonet.Pdf.Gdi.Font.FontSubset.Generate(MemoryStream output)
   場所 Fonet.Render.Pdf.Fonts.Type2CIDSubsetFont.get_FontData()
   場所 Fonet.Pdf.PdfFontCreator.CreateCIDFont(String pdfFontID, Font font,
CIDFont cidFont)
   場所 Fonet.Pdf.PdfFontCreator.MakeFont(String pdfFontID, Font font)
   場所 Fonet.Render.Pdf.FontSetup.AddToResources(PdfFontCreator fontCreator,
PdfResources resources)
   場所 Fonet.Render.Pdf.PdfRenderer.StopRenderer()
   場所 Fonet.Fo.FOTreeBuilder.Parse(XmlReader reader)
   場所 Fonet.FonetDriver.FireFonetError(String message)
   場所 Fonet.Fo.FOTreeBuilder.Parse(XmlReader reader)
   場所 Fonet.FonetDriver.Render(XmlReader inputReader, Stream outputStream)
   場所 Test.Main()

フォントのことはよくわからないのですが,当該フォントにこれらのテーブルがないのがエラーの原因のようです。ちなみに font-family="IPA モナー Pゴシック" で試したところ, cvt ではなく fpgm のテーブルで "Cannot locate table" の例外が出ました。

ソースは以下です。

using Fonet;
using Fonet.Render.Pdf;

class Test
{
	static void Main()
	{
		FonetDriver driver = FonetDriver.Make();
		// サンプルに書いてあるが Renderer というプロパティは存在しない
		//driver.Renderer = RendererEngine.PDF;
		PdfRendererOptions options = new PdfRendererOptions();
		//options.FontType = FontType.Embed;
		options.FontType = FontType.Subset;
		driver.Options = options;
		driver.Render("hello.fo", "hello.pdf");
	}
}

FOP より FO.NET の方が簡単で使いやすそうなのですが, IPA フォントを使えないのが残念です。 Apache FOP だと IPA フォントでもサブセット埋め込みができるので,こちらを使うか, IPA フォントをあきらめて MS フォントを用いるかですね。もしくは何か回避方法があるのかもしれません。

プログラミング , ,

Apache FOP で日本語を含む PDF を作成する

Apache FOP (以下, FOP) はオープンソースの XSL-FO の処理系です。 XSL-FO で記述された文書を PDF やその他の形式で出力することができます。 FOP は Java で実装されています。

FOP を使うと簡単に PDF が作成できますが,日本語を用いるためにはワンステップ必要です。 FOP では容易にフォントの埋め込みが実現できます。以下の内容の設定ファイルを作成します。




	
		
			
				flate
			
			
				
			
		
	

ここでは PDF の出力しか想定していないので renderer は 1 つのみです。重要なのは fonts の部分で, auto-detect を指定することで OS にインストールされたフォントが利用できます。ちなみに OS にインストールされていないフォントを使用したい場合はフォントメトリクスの XML ファイルを作成する必要があります。

日本語を含む XSL-FO 文書を作成して適当なところで font-family 属性で適当な日本語対応フォントを指定してやれば良いです。後は FOP のコマンドラインオプションで,作成した設定ファイルを指定してやることで,日本語を含む PDF を作成することができます。

fop -c test.xconf -fo test.fo -pdf test.pdf

test.xconf は先ほど作成した設定ファイルです。先ほど述べたように指定のフォントは OS にインストールされている必要があります。

プログラミング , , ,

OpenOffice.org Draw + Sun PDF Import Extension で PDF 編集

OpenOffice.org の各アプリケーションはデフォルトで PDF エクスポートが可能です。インポートはデフォルトではできないので Sun PDF Import Extension をインストールする必要があります。ちなみに全ユーザーで拡張を共有するには次のようにします。

<OpenOffice.org のインストールフォルダ>\program\unopkg add --shared "extension file"

さて, OpenOffice.org アプリケーションの1つである Draw はベクトル画像形式の編集ソフトです。したがって Draw で PDF をインポートして編集して PDF でエクスポートすれば,実質 PDF を編集したのと同じです。もちろん単純な文字の編集などしか出来ませんが, PDF が取り込み編集できるというのは大きいです。例えば論文 PDF 中の図表を引用したいときにキャプションを日本語に直して提示するといったことも可能です。

コンピューター, メモ ,