从几乎所有用日语编写的pdf文件中,我得到了Apache (1.7)和Apache PDFBox(1.8.8)的正确文本。现在,我有一个问题,与pdf文件,我不能上传到这里,因为业务原因。
问题
一个段落中的所有日语字符都变成"?",而在其他段落中,日语字符是正确的。无论如何,ASCII字符都是正确的。
PDF文件
在我的Windows7桌面上的Acrobat中,PDF文档中的所有日语字符似乎都是正确的。在Acrobat属性对话框中,PDF文档有几个日文字体信息。我不知道是谁[怎么做的]这份文件。
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中的代码点是正确的..。
有什么解决办法吗?谢谢。
发布于 2018-05-11 11:56:16
我通过将文本转换成这样的图像来解决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);
}
}https://stackoverflow.com/questions/29203976
复制相似问题