我正在使用iText从java.awt.print.Printables中生成java的PDF。 一切正常,直到有一点:
printables通常包含各种unicode字符(正如他们所做的那样,我猜:-)),我正在使用一个复合Font,在lib / fonts / fallback中有一个额外的后备字体。在Java中,这个解决方案一切正常。
将其导出为PDF时,我已经在使用自己的FontMapper-Implementation:
public class PdfFontMapper implements FontMapper {
public BaseFont awtToPdf(Font font) {
try {
if(!font.getFamily().equalsIgnoreCase("Trebuchet MS")) {
return getBaseFontFromFile(SunFontManager.getInstance().getPlatformFontPath( true ), "ARIALUNI.ttf");
}
else {
return getBaseFontFromFile(SunFontManager.getInstance().getPlatformFontPath( true ), "Trebuchet MS.ttf");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Font pdfToAwt(BaseFont baseFont, int size) {
throw new UnsupportedOperationException();
}
private BaseFont getBaseFontFromFile(String directory, String filename)
throws Exception {
InputStream is = null;
try {
final ClassLoader cl = Thread.currentThread()
.getContextClassLoader();
is = cl.getResourceAsStream(filename);
// is = IMappingApplication.class.getResourceAsStream(directory +
// filename);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
while (true) {
int size = is.read(buf);
if (size < 0) {
break;
}
bos.write(buf, 0, size);
}
buf = bos.toByteArray();
BaseFont bf = BaseFont.createFont(filename, BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED, BaseFont.NOT_CACHED, buf, null);
return bf;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (is != null) {
is.close();
}
}
}
}
,特别感谢G.J.思腾。
但遗憾的是,我的基本字体“Trebuchet MS”中未包含的字符不会被导出 - 它们只会丢失。有趣的是,如果我只向Mapper添加一个字体,“Arial Unicode”,它的工作原理非常好。 好吧,我当然可以使用一种字体。但我希望有更好的解决方案。
顺便说一下:来自我的fallback-library的字形(Emojis)总是得到很好的渲染。但我没有得到一个解决方案,我只能在字体/后备中使用物理字体+后备字体。
有谁知道如何解决这个问题? 顺便说一句:我已经尝试使用PDF嵌入字体,但这不起作用(我认为没有必要,因为我使用非常常见的字体)。
问候,安迪