java - 使用 itextpdf 将 .pptx 转换为 .pdf。汉字字符定位错误

标签 java unicode fonts itext apache-poi

我在将服务器上的 .pptx 幻灯片转换为 .pdf 文档时遇到问题。我将 itextpdf 5.5.10 和 apache poi 3.15 用于 .pptx 文件。如果文本中包含汉字,则所有字符的定位都不好。在我的本地机器(Windows 7)上我没有问题。这是我机器上的样子

enter image description here

这是它在服务器上的样子(CentOS Linux 版本 7.4.1708(核心版),安装了 ubuntu 字体系列) enter image description here

这是我用来进行转换的 (java) 代码:

PdfContentByte canvas = writer.getDirectContent();
UnicodeFontMapper mapper = new UnicodeFontMapper();
    for (XSLFSlide slide : ppt.getSlides()) {
        PdfTemplate template = canvas.createTemplate(width, height);
        Graphics2D g2d = new PdfGraphics2D(template, width, height, mapper);
        // default rendering options
        DrawFactory.getInstance(g2d).fixFonts(g2d);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        //Draw slide
        slide.draw(g2d);
        canvas.addTemplate(template, 0, 0);
        g2d.dispose();
        document.newPage();
    }

UnicodeFontMapper 类:

public class UnicodeFontMapper extends DefaultFontMapper {

@Override
public BaseFont awtToPdf(Font font) {
    //using own fonts
    String fontFamily = "ArialUni";
    registerFontFamily(fontFamily);
    int style = com.itextpdf.text.Font.NORMAL;
    if (font.isBold()) {
        if (font.isItalic()) {
            style = com.itextpdf.text.Font.BOLDITALIC;
        } else {
            style = com.itextpdf.text.Font.BOLD;
        }
    }
    com.itextpdf.text.Font pdfFont = FontFactory.getFont(fontFamily, BaseFont.IDENTITY_H, true, font.getSize(), style);
    return pdfFont.getBaseFont();
}

我使用 ArialUni.ttf 字体。据我所知,我的服务器上丢失了一些东西,但我无法弄清楚到底是什么。

最佳答案

Arial unicode 并非在所有系统上都存在。 这会导致 iText 无法呈现您在该字体中指定的字符。 (类似地,如果字体不包含字形)。

可选地,如果您使用的是 OpenJDK,您可能想要查看 graphics2D 的工作原理。也许您在 Windows 上使用 Oracle 版本的 JDK,在 CentOS 上使用 OpenJDK。尽管 JDK 的两个版本应该以相同的方式工作,但在某些方面可能存在细微差别,例如 Graphics2D

您可以通过运行 java -version

轻松检查您使用的 JDK 版本

关于java - 使用 itextpdf 将 .pptx 转换为 .pdf。汉字字符定位错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940505/

相关文章:

bash - shell 脚本 (macOS) : print escaped Unicode character from a plist string

php - 使用 ImageMagick 指定字体系列的字体

swift - SwiftUI 中文本的自定义字体大小

java - 如何在Java中删除字符串中Unicode杂项符号的Unicode十进制值

Java GUI布局问题

delphi - 如何使用Delphi XE的TEncoding将西里尔文或ShiftJis文本保存到文件?

php - 用两种不同的颜色设置 WordPress 页面的标题

java - 运行时错误-程序终止

java - java是否将字符串定义为空终止?

java - 您将如何检查 Java 中的 char 是否可键入?