2012-10-10 12 views
8

Grailsエクスポートプラグイン(基本的にはフライングソーサー)を使用してPDFを生成しています。私のGSPページはUTF-8ページです(または少なくともプロパティはUTF-8であることを示していますが、GSPページの先頭には<?xml version="1.0" encoding="UTF-8"?>というディレクティブがあります)。最初に生成されたPDFにウムラウト文字「ööüõ」が正しく含まれていましたが、キリル文字はPDFにはありませんでした(レンダリングされていません)。次に、ドキュメントに記載されているように、以下を追加してCSSファイルを変更しました。フライングソーサーフォント(ユニコード文字用)

@font-face { 
    src: url(ARIALUNI.TTF); 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: UTF-8; 
} 
body { 
     font-family: "Arial Unicode MS", Arial, sans-serif; 
} 

ArialUni.ttfもサーバーにデプロイされています。しかし今、ウムラウト文字とキリル文字の両方をボックスとしてレンダリングしています。 -fs-pdf-encodingプロパティ値をIdentity-Hに変更すると、ウムラウト文字が正しく描画されますが、キリル文字は疑問符としてレンダリングされます。

ウムラウトとキリル文字の両方を正しく表示するためにどのようなフォントを使用することができますか?または私のCSSは何とか間違っているかもしれませんか?どんなヒントも大歓迎です。

UPD 1: 私も(http://fontface.codeandmore.com/によって生成された)、CSS、次の試してみました:私は<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> を追加しました

@font-face { 
    font-family: 'ArialUnicodeMS'; 
    src: url('arialuni.ttf'); 
    src: url('arialuni.eot?#iefix') format('embedded-opentype'), 
     url('arialuni.woff') format('woff'), 
     url('arialuni.ttf') format('truetype'), 
     url('arialuni.svg#arialuni') format('svg'); 
    font-weight: normal; 
    font-style: normal; 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: UTF-8; 
} 

body { 
    font-family:'ArialUnicodeMS'; 
} 

私はまたの-Dfile.encoding =とGrailsのを実行しようとしていましたUTF-8は、ここで言及したように:http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.htmlですが、何も役立ちません。キリル文字はまったく表示されません。何が問題なのでしょうか?

* ところで:私はジッパーとしての私のPDFをパッケージ化し、そのような応答には、ブラウザに戻ってそれを送信しています*

response.setHeader "Content-disposition", "attachment; filename=test.zip" 
response.setHeader "Content-Encoding", "UTF-8" 
response.contentType = 'application/zip' 
response.outputStream << zip 
response.outputStream.flush() 
response.outputStream.close() 

は私がビュンながら何とかエンコーディングを検討する必要がありますか????、これは私がそのように実行します。

それは顔キット・ジェネレータによって生成された次のCSSとの.ttfファイル、で作業を開始したいくつかの理由
public static byte[] zipBytes(Map<String, ByteArrayOutputStream> fileNameToByteContentMap) throws IOException { 
     ByteArrayOutputStream zipBaos = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(zipBaos); 
     fileNameToByteContentMap.eachWithIndex {String fileName, ByteArrayOutputStream baos, i -> 
      byte[] content = baos.buf 
      ZipEntry entry = new ZipEntry(fileName) 
      entry.setSize(content.length) 
      zos.putNextEntry(entry) 
      zos.write(content) 
      zos.closeEntry() 
     } 
     zos.close() 
     return zipBaos.toByteArray(); 
    } 
+0

import org.w3c.dom.Document; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.text.pdf.BaseFont; ... ITextRenderer renderer = new ITextRenderer(); URL fontResourceURL = getClass().getResource("fonts/CALIBRI.TTF"); //System.out.println("font-path:"+fontResourceURL.getPath()); /* HERE comes my solution: */ renderer.getFontResolver().addFont(fontResourceURL.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); renderer.setDocument(doc, null); renderer.layout(); baos = new ByteArrayOutputStream(); renderer.createPDF(baos); baos.flush(); result = baos.toByteArray(); ... 

は、最後に私は私の文書のCSSのセクションにフォントファミリ 'Calibri' を追加しましたか? –

+0

あなたはHTMLのコンテンツタイプを意味しますか? –

答えて

6

@font-face { 
    src: url('arialuni.ttf'); 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: Identity-H; 
} 

body { 
    font-family: Arial Unicode MS, Lucida Sans Unicode, Arial, verdana, arial, helvetica, sans-serif; 
    font-size: 8.8pt; 
} 

奇妙なことは、フォントをいくつかのフォルダに入れた場合、「フォント」と言うと、フォントが見つかりますが、文字はレンダリングされないということです。

+3

-fs-pdf-font-encoding:Identity-H; がキーです。それはフライングソーサーにUnicodeフォントであり、特定のコードページ – jaygooby

+0

に制限されているフォントではなく、私が 'src:url( '$ {baseUrl} /assets/ARIALUNI.TTF')で使用したフォルダにフォントを置くフォントではないことを伝えます。 'grailsLinkGenerator.serverBaseURL'のモデルでbaseUrlが渡されます – fego

8

私はJavaコード内でユニコード文字(キリル文字またはチェコ語)を有効にし、さらに自分のリソース(CALIBRI.TTF)に真のタイプのフォントを提供することができました。あなたのコンテンツタイプは同様にUTF-8として定義されている場合

... 
<style type="text/css"> 
    span { font-size: 11pt; font-family: Calibri; } 
... 
+1

私はこの解決策を使用する際に問題がありました。私は 'URL fontResourceURL = getClass()。getResource("/font/CALIBRI.TTF ");'(フォントリソースパスの最初のスラッシュに注意してください)と 'fontResolver。addFont(fontResourceURL.toString()、BaseFont.IDENTITY_H、BaseFont.EMBEDDED); '(getPathの代わりにtoStringメソッドに注意) –

関連する問題