首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDFBox输出问号而不是一些日语字符

PDFBox输出问号而不是一些日语字符
EN

Stack Overflow用户
提问于 2015-03-23 05:49:48
回答 1查看 1.5K关注 0票数 3

从几乎所有用日语编写的pdf文件中,我得到了Apache (1.7)和Apache PDFBox(1.8.8)的正确文本。现在,我有一个问题,与pdf文件,我不能上传到这里,因为业务原因。

问题

一个段落中的所有日语字符都变成"?",而在其他段落中,日语字符是正确的。无论如何,ASCII字符都是正确的。

PDF文件

在我的Windows7桌面上的Acrobat中,PDF文档中的所有日语字符似乎都是正确的。在Acrobat属性对话框中,PDF文档有几个日文字体信息。我不知道是谁[怎么做的]这份文件。

  • Mincho类型:TrueType(CID) <-几个
  • HeiseiMin-W3类型:类型1(CID)编码:UniJIS-UCS2-HW-H实际字体:KozMinPr6N-常规实际字体类型:1型(CID)
  • MSMincho类型:TrueType编码:UniJIS-UCS2-H实际字体:MS明朝实际字体类型:TrueType

PDF转换器:Acrobat Distiller 7.0(Windows) PDF版本:1.6(Acrobat7.x)

铸型

"?"s是在PDFStreamEngine (第492行)中由PDType0Font中的查找失败(第202行)造成的。在这种情况下,cmap的cmapName (属于PDFont类)是"UniJIS-UCS2-HW-H“。仔细查看CMap实现,isInCodeSpaceRanges方法在应该为true时返回true。最后,由于char2CIDMappings没有条目,而range.map在CMap(第174行)中失败,lookupCID失败。参数char[]的值为48、-120、48、-118、.似乎对我来说Unicode中的代码点是正确的..。

有什么解决办法吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-05-11 11:56:16

我通过将文本转换成这样的图像来解决pdfbox中的字体问题(中文、日文、韩文等)。

代码语言:javascript
复制
void writeLine(String text, int x, int y, int width, int height,
           Font font, Color color, PDPageContentStream contentStream, PDDocument document) throws IOException {

    try (
    ByteArrayOutputStream baos = new ByteArrayOutputStream()
    ) {
    int scale = 2;
    BufferedImage img = new BufferedImage(width * scale, height * scale, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
    g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
    g2d.setFont(font);
    g2d.setColor(color);
    g2d.scale(scale,scale);
    g2d.drawString(text, 0, g2d.getFontMetrics().getAscent());
    g2d.dispose();

    ImageIO.write(img, "png", baos);
    baos.flush();
    baos.close();

    contentStream.drawImage(PDImageXObject.createFromByteArray(
        document,baos.toByteArray(), ""), x, y, width, height);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29203976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档