10

Grailsエクスポートプラグイン(基本的にはFlying Saucer)を使用して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に変更すると、umlaut文字は正しくレンダリングされますが、キリル文字は疑問符としてレンダリングされます。

umlaut文字とキリル文字の両方を適切にレンダリングするためにどのフォントを使用できるかについてのアイデアはありますか?それとも私のCSSがどういうわけか間違っているのでしょうか?ヒントをいただければ幸いです。

Upd 1:私はcss( http://fontface.codeandmore.com/ によって生成された)も試しました:

@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';
}

http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> で説明したように、-Dfile.encoding=UTF-8を使用してgrailsを実行しようとしていたことも追加しました。 instalation-td2297840.htmlですが、何も役に立ちません。キリル文字はまったく表示されません。問題となる可能性のある他のアイデアはありますか?

*ところで: * PDFをzipとしてパッケージ化し、次のような応答でブラウザに送り返しています。

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

どういうわけかzip中にエンコードすることを検討する必要がありますか????

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

2 に答える 2

15

Javaコード内でユニコード文字(キリル文字またはチェコ語)を「有効」にし、さらにリソース(CALIBRI.TTF)に真のタイプのフォントを提供することができました。

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 セクションに font-family 'Calibri' を追加しました。

...
<style type="text/css">
    span { font-size: 11pt; font-family: Calibri; }
...
于 2016-03-09T15:43:14.183 に答える
9

何らかの理由で、face-kit-generator によって生成された次の css および .ttf ファイルで動作し始めました。

@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;
}

奇妙なことに、フォントを「フォント」などのフォルダーに入れると、フォントは見つかりますが、文字はレンダリングされません。

于 2012-10-13T15:20:00.717 に答える