java - Apache FOP 无法通过 fatJar 中的 URI 找到外部图像
问题描述
我正在尝试使用 Apache FOP 2.2 生成 PDF,但在使用完整 URI 时遇到了一些问题,例如
file:///Users/mac/Desktop/image.png
.
这是 myTemplate 的一部分。
<fo:block>
<fo:external-graphic content-height="scale-to-fit" content-width="46.0mm"scaling="non-uniform" src="(here I put the upper URI)"/>
</fo:block>`.
I also got fop_config.xml in resources folder than looks like
`<fop version="1.0">
<renderers>
<renderer mime="application/pdf">
<auto-detect/>
<fonts>
<---! here are my fonts --->
</fonts>
</renderer>
</renderers>
</fop>
和我的剧本
val fopFactory = FopConfParser(File("fop_config.xml"))
.fopFactoryBuilder
.build()
val foUserAgent = fopFactory.newFOUserAgent()
val outStream = BufferedOutputStream(FileOutputStream(File("my_pdf.pdf")))
outStream.use { out ->
val fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out)
val transformer = TransformerFactory.newInstance().newTransformer()
val src = StreamSource(StringReader(myTemplate))
val res = SAXResult(fop.defaultHandler)
transformer.setParameter("versionParam", "2.0")
transformer.transform(src, res)
}
我正在使用 Kotlin,但这并不重要。我通过 IDEA 渲染得很好,但是当我使用 shadowJar Gradle 插件创建胖 Jar 时,我得到了
SEVERE: Image not found. URI: file:///Users/mac/Desktop/image.png. (No context info available)
为什么我不能在 fatJar 中使用 URI 以及如何修复它?
UPD
我发现我的问题与 ImagePreloader 有关。例外
org.apache.xmlgraphics.image.loader.ImageException: The file format is not supported. No ImagePreloader found for file:///Users/mac/Desktop/image.png
但它只是在 Jar 里面!怎么可能?
解决方案
最后我发现问题出在依赖项上。
出于某种原因,如果将 ImagePreloader 作为 fop 的传递依赖项下载,则 xmlgraphics-commons 无法解析它。
解决方案只是将 Gradle 脚本从以下位置更改:
compile('org.apache.xmlgraphics:fop:2.1')
到:
compile('org.apache.xmlgraphics:xmlgraphics-commons:2.1')
compile('org.apache.xmlgraphics:fop:2.1') {
exclude group:'org.apache.xmlgraphics', module: 'xmlgraphics-commons'
}
推荐阅读
- github-actions - 复合 github 动作,自动 cd 进入动作目录?
- python - 如何在 Jupyter Notebook 中获取代码列表?
- mysql - 您可以在 MySQL 工作台中删除“sys”数据库还是必须在那里?
- reactjs - TypeError:主题未定义 - 尝试渲染 Material UI 组件时
- javascript - 登录用户只能看到他自己的内容(Angular+Firebase)
- python - 具有包含标准正态分布的 cdf 和 ppf 约束的混合整数非线性规划
- python - 如何使用 tkinter 在我的乒乓球比赛中添加分数跟踪器,为什么会出现位置类型错误?
- r - 如何用 kable 格式化位数
- powerbi - 绘制一天的平均值/每天的多个数据 - Power BI
- next.js - 如果我使用 httpOnly cookie,如何构建一个 HOC 来保护路由?