【发布时间】:2018-04-07 00:29:43
【问题描述】:
在我的服务器上将 .pptx 幻灯片转换为 .pdf 文档时遇到问题。我将 itextpdf 5.5.10 和 apache poi 3.15 用于 .pptx 文件。如果文本中包含汉字,则所有字符的定位都不好。在我的本地机器(Windows 7)上我没有问题。这是我机器上的样子
这就是它在服务器上的样子(安装了 ubuntu 字体系列的 CentOS Linux 版本 7.4.1708 (Core))
这是我用来进行转换的 (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 字体。据我了解,我的服务器上缺少一些东西,但我无法弄清楚到底是什么。
【问题讨论】:
标签: java unicode fonts itext apache-poi