2016-09-06 20 views
2

私は、Graphics.EasyRender haskellパッケージを使用してPDFファイルをレンダリングしています。私もしようとした すべてが通常のASCII文字で結構ですが、私は、たとえばöäüßまたはEEなどのようなフランス語の文字ハウツは、haskellで特殊文字をエンコードするPDF EasyRenderパッケージ?

let document = newpage_defer $ do 
    textbox align_left (Font Helvetica 12) (Color_Gray 0) 10 100 100 100 0 myStr 

myStr :: String 
myStr = "test text ä" 

のようなドイツ語のウムラウトを使用したときに出力が

test text ˆ⁄ 

でエンコードの問題を取得しますエンコードUTF8、しかし、それは悪くなる:私もEasyRenderパッケージからpostcript出力を生成しようとしますが、私はそこ肝炎試験として

test text ˆ´⁄ 

同じ問題。

PDFは私の主な関心事です。どのようにしてこれらのUmlautをターゲットPDFで使用するのですか?

答えて

1

各PDFフォントには独自のエンコーディングがあり、通常はPDFファイルにエンコーディング情報が埋め込まれています。 easyrenderにはフォントは埋め込まれていませんが、廃止予定の標準PDFフォントが使用されています。

AFAIU、HelvericaStandardEncoding(詳細はPDF参照)を使用しており、ä文字は含まれていません。だから私はeasyrenderと非ASCII文字をすることはできないと思います。

(それはMacRomanEncodingまたはWinAnsiEncodingを使用し、また場合256306)を確認し、(8進数)バイトの文字列を描画しようとする341するには、それは文字Æを表している必要があります。

追加:UTF8の文字äは、303244の2つのバイトとしてrepresentedです。 StandardEncodingでは、それらはˆとなり、最初の出力に表示されます。どちらが´から来るか分からないのは2番目のものです。

1

二つの問題があります。

  1. Helveticaのような標準的なフォントが128〜255で「ショー」の文字のことができるようにするために再エンコードが。
  2. ポストスクリプト文字列に128-255の文字を表す。

最初は別の参照がhttp://apps.jcns.fz-juelich.de/doku/sc/ps-latin

秒easyrenderライブラリと欠乏であるPostscript Language Referenceのセクション5.9.1、ページ349で覆われています。文字Ä(ウムラウト付きの大文字A)を表す1つの方法は、8進数 を経由して\304です。これは、ポストスクリプトにあなたが持っている必要がありますファイルです。

(\304) show 

しかし、ライブラリのソースコードを見て、機能ps_escapeは128〜255で文字の8進数のエスケープコードを生成することができません。一緒にこれら二つのアイデアを置く

import System.IO 
... 

main = do 
    let doc = newpage_defer $ do 
    ... 
    let output = render_string Format_PDF doc 
    hSetEncoding stdout latin1 
    putStr output 

この問題を解決するための別の方法はLatin1のエンコーディングで生成されたポストスクリプトを放出することである

import Graphics.EasyRender 
import System.IO 

reencode_fonts = " /Helvetica findfont dup length dict begin { 1 index /FID ne {def} {pop pop} ifelse } forall /Encoding ISOLatin1Encoding def currentdict end /Helvetica exch definefont pop" 

my_custom = custom { ps_defs = reencode_fonts } 

document = newpage_defer $ do 
    textbox align_left (Font Helvetica 12) (Color_Gray 0) 10 100 100 100 0 myStr 
    endpage 500 500 

myStr :: String 
myStr = "test text ä" 

out = render_custom_string Format_PS my_custom document 

main = do 
    hSetEncoding stdout latin1 
    putStr out 
関連する問題