myboy
1
【飞嘀打车-44.75元-1个行程】高德打车电子发票.pdf (58.0 KB)
这是我的发票 pdf,使用下面的代码进行转换
public static void main(String[] args) throws Exception {
Document src = new Document("【飞嘀打车-44.75元-1个行程】高德打车电子发票.pdf");
Page srcPage = src.getPages().get_Item(1);
// 渲染成图片
Resolution resolution = new Resolution(300);
JpegDevice jpegDevice = new JpegDevice(resolution);
FileOutputStream os = new FileOutputStream("aaa.jpg");
jpegDevice.process(srcPage, os);
}
转出来的图片是这样的
aaa.jpg (129.8 KB)
我怀疑是字体缺失,我使用 adobe acrobat pro 打开 pdf 找到了对应的字体名字是:
STSong-Light-UniGB-UCS2-H
于是,我从网上下载了对应的字体文件,安装到了我的 macos 上
image.jpg (124.1 KB)
image.jpg (275.5 KB)
再次运行代码,发现还是不生效,所以希望寻求一下帮助,这个问题到底怎么解决呢
@myboy
概要
PDF 中使用的字体 STSong‑Light‑UniGB‑UCS2‑H 未随文件嵌入,Aspose.PDF 在渲染时找不到对应字形,导致生成的 JPEG 中出现方框(缺字)。
为什么会出现
- 当 PDF 未嵌入所需的中文字体时,Aspose.PDF 只能使用系统中可用的字体或显式注册的字体来替代。若系统中没有匹配的字体,渲染结果会出现方框。
- 即使已经在 macOS 上安装了相应的字体文件,如果 Aspose.PDF 没有被告知去搜索该目录,也可能找不到该字体。
接下来该怎么做
- 确认字体文件类型:确保下载的 STSong‑Light 字体是 TrueType(.ttf)或 OpenType(.otf)格式。若是 Type 1 等其他格式,Aspose.PDF 可能无法识别。
- 让 Aspose.PDF 能够访问该字体:
- 将字体文件(或包含该字体的文件夹)放在一个已知路径下。
- 在代码中使用 Aspose.PDF 提供的字体设置(如
FontSettings)或字体仓库(如 FontRepository.addFontFolder)显式注册该路径,使渲染引擎能够找到并使用该字体。
- 使用常见的中文 TrueType 字体进行验证:可以先把系统中常见的中文字体(如
SimSun.ttf、Microsoft YaHei.ttf、NotoSansCJKsc-Regular.otf)放入同一文件夹并注册,确认渲染后文字是否正常显示。如果正常,说明原始 STSong 字体文件或路径有问题。
- 检查 PDF 是否已经嵌入字体:在 Acrobat 中打开 PDF → 文件 → 属性 → 字体,查看对应字体是否标记为“已嵌入”。如果已嵌入,Aspose.PDF 通常会直接使用嵌入的字形,此时不需要额外注册系统字体。
- 确认运行环境对字体文件有读取权限:确保 Java 进程对存放字体的目录具有读取权限,否则即使路径正确也无法加载。
- 如有需要,考虑升级 Aspose.PDF 版本:新版对 CID‑Font(如 STSong)和字体替换的兼容性更好,能够更可靠地定位系统字体。
完成上述步骤后重新执行转换,生成的 JPEG 应该能够正确显示中文字符。如果仍有异常,请准备以下信息以便进一步诊断:
- 使用的 Aspose.PDF for Java 版本号。
- STSong‑Light 字体文件的完整路径和文件扩展名。
- PDF 中“字体”标签的详细列表(是否嵌入、是否为子集等)。
myboy
3
我的字体已经安装到 ~/Library/Fonts/ 目录下了,因此不需要额外指定,而且字体是 TrueType
这个字体不是嵌入的
image.png (99.2 KB)
@myboy
请确认您是否已尝试使用最新版本的API?您是否在Windows系统中进行了尝试,结果如何?
myboy
5
已经发现问题了,是字体问题,我安装的字体是 TrueType 但是 pdf 里面的是 Type 1 格式的,虽然是同一个字体,但是好像确实是用不了,但是我又找不到 Type 1 对应的字体,请问这种情况该咋整
@myboy
我们已在内部问题跟踪系统中创建了以下新工单,并将根据免费支持政策中提到的条款提供修复。
问题编号:PDFJAVA-45668
如果您需要优先支持以及直接访问我们的付费支持管理团队,可以获取付费支持服务。