iText输出缺少Unicode字符

时间:2015-12-01 21:47:16

标签: java pdf unicode fonts itext

我正在使用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嵌入字体,但这不起作用(我认为没有必要,因为我使用非常常见的字体)。

问候,安迪

0 个答案:

没有答案