我正在使用Grails导出插件(基本上是Flying Saucer)生成PDF。我的GSP页面是UTF-8页面(或者至少属性显示它是UTF-8,另外在GSP页面的开头有一个<?xml version="1.0" encoding="UTF-8"?>
指令)。最初生成的PDF文件包含umlaut字符 "äöüõ",但Cyrillic字符在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 设置可能出了问题?非常感谢任何提示。
更新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';
}
我添加了 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
,同时也尝试了在运行 grails 时加上 -Dfile.encoding=UTF-8 参数,如此处所述:http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html,但是没有任何帮助。 其中的 Cyrillic 字符根本不显示。还有其他想法吗?
*顺便说一句:* 我正在将我的 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()
我在进行压缩时,是否需要考虑编码?我的压缩方式如下:
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();
}