gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:21:29 25 4
gpt4 key购买 nike

从几乎所有用日语编写的 pdf 文件中,我使用 Apache Tika(1.7) 和 Apache PDFBox(1.8.8) 获得了正确的文本。现在我遇到了一个 pdf 文件的问题,由于业务原因我无法将其上传到这里。

问题

某个段落中的所有日语字符都变为“?”,但在其他段落中,日语字符是正确的。无论如何,ASCII 字符都是正确的。

PDF 文件

PDF 文档中的所有日语字符在我的 Windows7 桌面上的 Adob​​e Acrobat 中似乎都是正确的。从 Adob​​e Acrobat 属性对话框中,PDF 文档有几种日语字体信息。我不知道谁/如何制作这个文件。

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

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

成立

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

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

最佳答案

我通过将文本转换为图像来解决 pdfbox 中的字体问题(中文、日文、韩文和任何其他字体),如下所示

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);
}
}

关于java - PDFBox 输出问号而不是一些日语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29203976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com