首页 > 编程语言 >Apache pdfbox java.io.IOException: The TrueType font null does not contain a 'cmap' table

Apache pdfbox java.io.IOException: The TrueType font null does not contain a 'cmap' table

时间:2023-02-07 19:44:06浏览次数:50  
标签:font java TrueType docs PDPageContentStream PDDocument file contentStream null

尝试使用Apache pdfbox 添加中文到pdf中,发现出现The TrueType font null does not contain a 'cmap' table,主要原因是遍历pdf页数时调用PDDocument#save 导致清空fontsToSubset,所以报错。

 

 

/**
*错误代码
*/
public void addPDFEachPageFont(File file) throws IOException{
PDDocument docs = PDDocument.load(file);
Resource resource = new ClassPathResource("fonts/FZYTK.TTF");
PDFont font = PDType0Font.load(docs, resource.getInputStream());
for (int i = 0; i < docs.getNumberOfPages(); i++) {
PDPage page = docs.getPage(i);
PDPageContentStream contentStream = new PDPageContentStream(docs, page, PDPageContentStream.AppendMode.APPEND, false, true);
contentStream.beginText(); contentStream.setFont(font, 12);
contentStream.newLineAtOffset(156, 129);
contentStream.showText(context);
contentStream.endText();
contentStream.close();
docs.save(file); // 在循环中遍历,导致清空fontsToSubset出现报错
}
docs.close
}
/**
* 正确写法  
*/
public void addPDFEachPageFont(File file) throws IOException{
PDDocument docs = PDDocument.load(file);
Resource resource = new ClassPathResource("fonts/FZYTK.TTF");
PDFont font = PDType0Font.load(docs, resource.getInputStream());
for (int i = 0; i < docs.getNumberOfPages(); i++) {
PDPage page = docs.getPage(i);
PDPageContentStream contentStream = new PDPageContentStream(docs, page, PDPageContentStream.AppendMode.APPEND, false, true);
contentStream.beginText(); contentStream.setFont(font, 12);
contentStream.newLineAtOffset(156, 129);
contentStream.showText(context);
contentStream.endText();
contentStream.close();
}
docs.save(file);
docs.close
}

 

源码解析

遍历所有的字体,进行font.subset() 之后,会清空fontsToSubset。然后再保存到原先的pdf文件中。

 

 

 

 

 

 

 

 

 

其中的字体文件是windwos10 中C:\Windows\Fonts\方正舒体获取

 

标签:font,java,TrueType,docs,PDPageContentStream,PDDocument,file,contentStream,null
From: https://www.cnblogs.com/uqing/p/17099548.html

相关文章

  • java中Map判断是否为空之isEmpty()与==null的区别
    isEmpty()方法判断Map是否有内容(即new分配空间后是否put键值对),若没有内容则true,否则false==null是判断map是否为null(即是否new分配空间,和其中的键值对没关系),若没有内容......
  • Redis在java中的使用
    1.添加价包<!--Redis依赖--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>......
  • java控制结构1之if else和嵌套分支
    1.程序流程控制介绍在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。1)顺序控制2)分支控制3)循环控制2.顺序结构2.1不做......
  • java_html笔记
    颜色color字体大小 1.数值+单位 2.关键字-px-em字体(可以写多个,但不是全都生效只生效存在的如果全都不存在则使用默认字体)font-family:"abccde",......
  • Java进程CPU飙升到800%
    最近遇到springboot项目部署cup过高问题,首先环境是实现ApplicationRunner类在run中使用到了线程池;问题定位步骤:在liunx命令窗口执行:1)、首先通过top指令查看当前占用CPU......
  • Java测试框架——JUnit详解(4&5)
    JUnit是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试,也是当下主流的Java测试框架前言如果有对单元测试还不熟悉的小伙伴可以看一下我的这篇文章——​​浅......
  • java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient()Lcom/google
    引入第三方的工具类,重新启动项目就会奇奇怪怪的报错。加载不到gson类。一开始以为是没有加载到,各种引入,清理问题依然存在。直到仔细看报错信息,里面是spring的类报错,才意识......
  • Java学习实战
    目录 1.搭建springboot单体服务,集成undertow容器 2.使用AOP思想,实现数据加解密 3.搭建springcloud项目,集成Gateway网关 4.集成sentinel组件,实现限流、熔断、......
  • Java下载文件的4种方式总结
    1.以流的方式下载.publicHttpServletResponsedownload(Stringpath,HttpServletResponseresponse){try{//path是指欲下载的文件的路径。Filefile=newF......
  • java对自定义类型的两种排序方法(Arrays.sort和Collections.sort)
    前言对普通基本类型的数组或者集合sort都有相应的排序方法(从小到大),但是对于我们自定义的类型,就需要重新定义比较器,这里介绍对对象数组排序的Arrays.sort和对集合排序的Coll......