工作需求,需要給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
- 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是隔絕的。