pdfbox生成的PDF文件正常,转图片中文乱码(Windows上生成没问题,Linux中会乱码),Windows相关字体也都放到Linux上去了,还是乱码!
Windows上生成有警告提示缺失相关字体,但是不乱码
Using fallback LiberationSans for CID-keyed font AdobeKaitiStd-Regular
Using fallback LiberationSans for CID-keyed font STSong-Light
解决 PDFBox 生成 PDF 文件中文乱码问题的方法:
确保您使用的字体支持中文。您可以在生成 PDF 时使用支持中文的字体,例如中文字体 "SimSun"。
在将 PDF 转换为图像时使用正确的字体。您可以使用 PDFBox 的 PDFRenderer 类将 PDF 转换为图像,并使用支持中文的字体,例如 "SimSun"。
如果您仍然遇到问题,请尝试使用其他的 PDF 库,例如 iText 或 Apache FOP。
该回答引用ChatGPT
_请参考下面的解决方案,如果有帮助,还请点击 “采纳” _
首先,请确保使用的字体在 Linux 系统中已经安装,并且已经配置到系统字体目录中,并在 PDFBox 代码中加载字体。其次,如果在 Windows 系统上生成的 PDF 仍然出现乱码,请尝试使用其他字体,并确保该字体在 Linux 系统中安装并可用。最后,请检查是否存在字体编码问题,尝试在代码中设置不同的字体编码方式,以解决乱码问题。
该问题可能是由于没有正确安装相应的字体或者因为字体配置错误导致的。
在Linux上解决该问题的方法有以下几种:
1安装相应的字体:在Windows上生成的PDF文件缺少相关字体,可以在Linux上安装相应的字体。
2设置字体路径:如果已经安装了字体,则可以设置字体路径,以便搜索到相应的字体。
3使用字体映射:如果字体映射未正确配置,可以使用字体映射工具,将缺少的字体映射到其他字体上。
在进行上述操作前,请先确保已经安装了相应的字体包和图形处理工具,例如:fontconfig和freetype。
如果生成的PDF文件中文乱码,则可能是因为PDFBox没有正确加载字体。您可以通过以下步骤解决该问题:
确保您使用的字体是支持中文的字体。
将字体文件复制到您的Java项目中。
在代码中使用PDFBox API加载字体,例如PDType0Font.load()。
在生成PDF文件时使用加载的字体,例如contentStream.setFont()。
在转换成图片时使用支持中文的图片处理工具,例如Java的BufferedImage。
Using fallback LiberationSans for CID-keyed font AdobeKaitiStd-Regular
Using fallback LiberationSans for CID-keyed font STSong-Light
这个提示是说当前环境缺少CID-keyed font AdobeKaitiStd-Regular字体和CID-keyed font STSong-Light字体,pdfbox使用LiberationSans字体进行替换。
这两个字体可以用AdobeKaitiStd-Regular.otf和SimSun.ttf两个字体文件。
找字体文件可以在自己的电脑上找,可以在这个C:\Windows\Fonts找到,或者用everything工具查找,没有的话可以在网上找。
PDFBox在Linux环境中生成PDF文件时会出现中文乱码,这可能是由于没有安装字体导致的。您需要在Linux系统上安装所有在PDF上使用的字体,以便PDFBox正确解码该PDF文件。另外,您可以检查PDF文档源代码来查看它是否使用的全部都是有效的字体标记。如果没有指定有效的字体,您可以手动添加字体,这将对解决中文乱码有所帮助
在linux环境下使用icepdf或pdfbox将pdf转化成图片是出现中文乱码,是因为linux环境下没有这个字体造成的。所有要从根源解决问题,就是在生成pdf的时候就给它指定系统存在的字体,这样pdf转化成图片就没问题了。
pdfbox生成pdf时候默认用的字体为"STSong-Light",但是STSong-Light字体在全网搜索有点坑,都没找到,如果pdf不转换成图片的时候则没问题,如果业务需要,将pdf转化成图片时候,在Windows环境下没问题,放到linux就乱码,通过网上的资料发现,可以引用系统的字体。这样生成的图片就没问题,下面介绍下引用系统的字体的方法(前提是系统存在这些字体,linux下装字体请自行百度,这里不再累述)
修改itextpdf字体代码如下:
public Font chineseFont(int size) throws Exception {
// 设置中文
//BaseFont b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //默认的字体调用
//获取系统字体的路径
String prefixFont = "";
String os = System.getProperties().getProperty("os.name");//获取系统类型
if (os.startsWith("win") || os.startsWith("Win")) {//win下获取字体的路径
prefixFont = "C:\\Windows\\Fonts" + File.separator + "STSONG.TTF";
} else {
prefixFont = "/usr/share/fonts" + File.separator + "STSONG.TTF"; {//linux下获取字体的路径,注意该目录下如果没有需额外安装,如我用的是STSONG字体
}
logger.info("获取到的系统的字体路径为:"+prefixFont);
BaseFont b = null;
try {
b = BaseFont.createFont(prefixFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
logger.info("使用系统的宋体字体生成pdf!");
} catch (Exception e) {
//如果发生异常执行默认的字体
b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
logger.info("没有获取系统的STSONG字体,使用pdf默认体字生成pdf!");
}
return new Font(b, size, Font.NORMAL, BaseColor.BLACK);
}
你可以使用pdfbox的PDFRenderer类来渲染pdf,并使用一个ImageWriter来保存图像,例如ImageIO.write。你也可以使用AWT的Graphics2D类来渲染文本,以确保你的文字是完全正确的。此外,可以使用“自动字体传播”API来解决中文字体的问题,或者,如果有可用的中文字体,可以在RenderContext对象中设置它们来强制使用它们渲染文本。