工作需求,需要给pdf添加印章和动态文字,参考博主https://zhuanlan.zhihu.com/p/120895710  进行操作,中途遇见的问题记录一下,最终还是成功完成工程。

1.maven引用外部包

文中使用的工具Free Spire.PDF for Java通过maven没法下载,所以通过下载jar的方式,然后引用到项目。在IDE中开发调试没有任何问题,但是打包的时候,包报错,提示是包找不到。猜测引用外部包在打包的时候应做一些其他操作。

参考博文:https://blog.csdn.net/pltuyuhong/article/details/50954017   里面提到3种方式,经试验,只有第三种有效。如下:

 



mvn install:install-file -Dfile=cloud.jar -DgroupId=com.hope.cloud -DartifactId=cloud -Dversion=1.0 -Dpackaging=jar


<dependency>
<groupId>com.hope.cloud</groupId>
<artifactId>cloud</artifactId>
<version>1.0</version>
</dependency>


 

 

2.linux安装中文字体

因为动态文字包含中文,所以需要在linux系统安装中文字体。参考博文:https://www.cnblogs.com/helios-fz/p/13706157.html   

  • yum -y install fontconfig
  • 在/usr/shared/fonts目录下新建一个目录chinese
  • Win10 C盘下的Windows/Fonts里面的字体拷贝需要到chinese目录
  • chmod -R 755 /usr/share/fonts/chinese
  • yum -y install ttmkfdir
  • ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir #我系统没有这个文件,没有执行也成功了
  • vi /etc/fonts/fonts.conf

Java 添加PDF图章(印章)——图片图章、动态图章_中文字体

  • fc-cache
  • fc-list看一下字体列表

使用java代码查看系统支持哪些字体



public static void main(String[] args) {
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); //返回本地 GraphicsEnvironment 。
String [] forName = e.getAvailableFontFamilyNames(); //返回包含在此所有字体系列名称的数组, GraphicsEnvironment本地化为默认的语言环境,如返回 Locale.getDefault() 。
for (int i = 0; i < forName.length; i++) //逐行输出
System.out.println(forName[i]);
}


保存文件名为Test2.java。执行javac Test2.java 会生成Test2.class 。然后执行java Test2.class,会提示类找不到,其实应该用java Test2

 3.遇见的坑

最开始代码是docker运行的,每次执行到 PdfTrueTypeFont font1 = new PdfTrueTypeFont(new java.awt.Font("SimSun", java.awt.Font.PLAIN ,15), true);   就报错,说不认识这个字体,一直在怀疑是上面步骤的字体安装是否有问题,在这里折腾了很久。后面改成不用docker,直接系统运行java程序,里面成功。猜测可能是系统里面的字体和docker是隔绝的。