我正在使用 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,则元音变音字符会正确呈现,但西里尔字符会呈现为问号。
关于可以使用什么字体来正确渲染变音符号和西里尔字符的任何想法?或者可能是我的 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"/>
我还尝试使用 -Dfile.encoding=UTF-8 运行 grails,如此处所述:http: //grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with- 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()
我是否需要在压缩时以某种方式考虑编码????,我喜欢这样:
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();
}