最近一个需求, 要在后端直接使用代码直接生成 pdf 文档, 由于使用的 apache 的工具包, 该工具包无法直接解析中文字体, 需要导入外部 中文插件包, 相关代码如下:
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDFont fontFile = PDType0Font.load(document, new File("/usr/share/fonts/sourcehansans.ttf"));
PDPageContentStream contentStream = new PDPageContentStream(document, page);
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> </dependency>
最开始我使用的是容器所在的宿主机的文件目录: /opt/fonts/sourcehansans.ttf, 代码如下,
但是出现了 java.io.FileNotFoundException
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDFont fontFile = PDType0Font.load(document, new File("/opt/fonts/sourcehansans.ttf"));
PDPageContentStream contentStream = new PDPageContentStream(document, page);
因为我忽略一个问题, 就是 :
在Docker中,容器和宿主机是隔离的,这意味着容器默认无法直接访问宿主机的文件系统。如果Java项目需要读取宿主机上的文件信息,不能直接从容器内部引用宿主机的文件路径,因为容器中不会有对应的文件和路径。要解决这个问题, 有一个最方便的方法:
就是在 DockerFile 中, 使用 COPY 命令, 在每次构建镜像的时候, 把宿主机的文件打入 docker 镜像里面, 代码如下:
这样构建镜像后, 容器的 /usr/share/fonts/sourcehansans.ttf 目录下就有该文件, pdf 工具包就可以读取到
其实也可以使用在 docker-comopose.yml 文件里, 使用 数据卷 挂载的方式, 标签如下, 详情可以参看其他大佬的博客
volumes:
- /opt/data/***/***:/var/lib/***/***