用的是 openjdk 1.8,使用 apache batik 写了个 svg 转 png 的功能,结果放到 centos 服务器运行报错,调查是因为没有安装 fontconfig ,虽然安装 fontconfig 就能解决,但是想要自动化部署,而且要兼容很多系统( centos ,欧拉,红帽...,还得区分 x86 和 arm),所以自动化脚本那边不想安装 fontconfig ,之后又研究了下泪痣 libfontconfig.so 的形式,但是内置后 sun.font.FontConfigManager.getFontConfig 方法一直返回为空,还是报错,所以在这里咨询各位大神,有什么解决方案能够绕开安装 fontconfig 来正常运行 batik

我描述的有点问题,其实就是产品有个一键安装脚本,内部讨论了下不同意在脚本那层安装 fontconfig ,因为用户的安装环境基本不联网,所以要准备的安装包就太多了

还有一点,没有用 docker 这种先进系统

再加一个前提,我是做不是给某一个客户做的定制产品,而是通用 to B 的产品,需要考虑各个客户之间环境和条件的差异,其实退而求其次,我完全可以在文档加一句让现场实施同事或者客户自行安装就完事了,但是还是想追求下有没有更方便的办法(实在没有就算了)还有就是我这个是因为环境没有 fontconfig 而导致的 java 的报错,不是缺字体哈

如果是 docker ,可以将字体打包到镜像,如果是裸机,可以写脚本,安装字体

说得好像安装 fontconfig 这个包不能做到自动化部署里去似的

你想像的自动化部署是什么,只包括用脚本或者其它系统把你的打包好的业务软件拷过去这一件事,不包括对目标环境的配置?

自动化部署不是也需要基础镜像吗 把 fontconfig 直接安装到基础镜像就可以了

我描述的有点问题,其实就是产品有个一键安装脚本,内部讨论了下不同意在脚本那层安装,因为基本安装环境不联网,所以要准备的安装包就太多了

离线 rpm 包 可以啊

内核版本够的话,可以用 nerdctl ,一步解压就装好容器环境。

又想马儿跑又想马儿不吃草。不联网的环境就不能装包了吗?那客户当初按安装操作系统的介质总还在的吧,fontconfig 这么基础的东西你说的这几个发行版的安装盘里应该都有的。如果确定一定要离线安装,方案一是没必要把发行版这种东西也放到一键安装里去,这事可以让客户自己先解决好(别笑,没必要太舔客户,我(甲方)就遇到过供应商的文档里的 requirement 一张明确写了要预装哪些包)。方案二是把你们要兼容的几个发行版的 fontconfig 及其直接依赖先准备好,现场环境里没装的就从你们介质装,“要兼容很多系统”是你们自己贪心的商务策略,那就要付出相应的劳动代价。NO SILVER BULLET, NO SILVER BULLET, NO SILVER BULLET 。

怀疑是客户服务器压根没有装 X ,所以 fontconfig 之类的 X 环境的基础都没有,不止缺少这单个包的

上周刚遇到个类似的问题。业务是数据根据模板导出 pdf ,用到了字体,本地开发试着没问题,打成 jar 包后运行字体总是返回空,最终发现打包时二进制会破坏字体文件,大概是这样原因,然后在 pom 里添加 nonFilteredFileExtensions 解决的

要准备至少 4-5 个系统的 rpm ,还有 x86 和 arm 两种架构,还得准备 fontconfig 依赖的 rpm ,甚至依赖的依赖

字体打包到 java 项目里面

(⊙o⊙)还有这么难搞的吗,上次出问题我直接打包一个字体注册到虚拟机就完事了

要不你先在一台机器上试试,装了 fontconfig 以后能不能解决说不定,依然解决不了呢?我的意思是,客户的环境有时候是很坑的,他们从嘴里说的话不一定靠谱,要亲自调研过才能确定。不然你们又做了无用功

安装 fontconfig 是肯定解决的,而且卸载了 fontconfig 就会报原来的错

用 js 在浏览器实现呢? svg 到 png

没有浏览器的,用来生成图片放入 word 文档的

哈,也可以打包个 headless chrome 进去, 如: stackoverflow.com/questions/63871708/convert-a-svg-to-a-png-jpeg-without-using-canvas-in-a-serverless-function

或者这个: www.npmjs.com/package/convert-svg-to-png用 java 的话确实没有 nodejs 方便

to B 其实非常建议用 docker 做部署,把部署的复杂度统一搞到开发阶段处理掉,通过租赁云服务器的方式测试各种不同的操作系统与硬件环境,不然客户千奇百怪的服务器环境会把你的实施工程师逼疯的

svg 转 png ,我之前写的是用 skiko(kotlin 的,java 可以用 skija)来处理,win 开发 linux 部署,只要改一下依赖的 os 就行了,但是有一个问题就是不支持 css 的样式(浏览器是支持的),要手动处理把 css 放到对应的元素里面(用 jsoup)

不用 fontconfig 的话可以在转换之前把用到的字体加载一下 // 从文件加载字体 File fontFile = new File("./font/SIMHEI.TTF"); Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontFile); // 获取全局图形环境 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); // 注册字体到全局 ge.registerFont(customFont); // 获取所有可用的字体 Font[] allFonts = ge.getAllFonts(); System.out.println("Available Fonts:"); for (Font font : allFonts) { System.out.println(font.getFontName()); }