Apache FOP не может найти внешнее изображение по URI в fatJar - PullRequest
2 голосов
/ 01 марта 2020

Я пытаюсь сгенерировать PDF с Apache FOP 2.2 и у меня возникли проблемы. Я использую полный 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, но когда я создаю толстый Jar с плагином shadowJar Gradle, у меня появляется
SEVERE: Image not found. URI: file:///Users/mac/Desktop/image.png. (No context info available)

Почему я не могу использовать URI внутри fatJar и как я могу это исправить ?

UPD

Я обнаружил, что моя проблема связана с ImagePreloader. исключение

org.apache.xmlgraphics.image.loader.ImageException: The file format is not supported. No ImagePreloader found for file:///Users/mac/Desktop/image.png

Но это только внутри банки! Как это может быть?

1 Ответ

1 голос
/ 04 марта 2020

Наконец я обнаружил, что проблема была в зависимостях.
По какой-то причине xmlgraphics-commons не может разрешить ImagePreloader, если он загружен как транзитивная зависимость fop.
Решением было просто изменить скрипт 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'
    }
...