Czcionka Flying Saucer dla znaków Unicode
Generuję plik PDF za pomocą wtyczki eksportu Grails (w zasadzie Flying Saucer). Moja strona GSP jest stroną UTF-8 (lub przynajmniej właściwości pokazują, że jest to UTF-8, również na początku strony GSP znajduje się<?xml version="1.0" encoding="UTF-8"?>
dyrektywa). Początkowo wygenerowany plik PDF poprawnie zawierał znaki umlaut „äöüõ”, ale w pliku PDF brakowało znaków cyrylicy (w ogóle nie renderowano). Następnie zmieniłem plik css zgodnie z opisem w dokumentacji, dodając następujące:
@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 jest również wdrażany na serwerze. Ale teraz otrzymuję zarówno znaki umlaut, jak i znaki cyrylicy renderowane jako skrzynki. Jeśli zmieniam wartość właściwości -fs-pdf-encoding na Identity-H, znaki umlaut są renderowane poprawnie, ale znaki cyrylicy są renderowane jako znaki zapytania.
Jakieś pomysły na to, jakiej czcionki można użyć do poprawnego renderowania znaków umlaut i cyrylicy? A może mój CSS jest w jakiś sposób zły? Wszelkie wskazówki będą bardzo mile widziane.
Aktualizuj 1: Próbowałem także śledzić css (który został wygenerowany przezhttp://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';
}
dodałem<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
Próbowałem również uruchamiać grails z opcją -Dfile.encoding = UTF-8, jak wspomniano tutaj:http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html, ale nic nie pomaga. Cyrylicy nie są w ogóle wyświetlane. Jakieś inne pomysły, co może być problemem?
*BTW:* Pakuję mój plik PDF jako plik zip i odsyłam go do przeglądarki w odpowiedzi w następujący sposób:
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()
Czy muszę w jakiś sposób rozważyć kodowanie podczas kompresji?
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();
}