【问题标题】:Putting SVG in PDF with FOP works on Local Machine but not on Server使用 FOP 将 SVG 放入 PDF 可在本地计算机上工作,但不能在服务器上工作
【发布时间】:2019-07-12 16:41:00
【问题描述】:

在本地机器上一切正常,当我尝试在服务器上运行它时出现此错误,它生成正常,但不包含 SVG 徽标。

2019-07-12 09:09:01,956 [ERROR] [main] [LoggingEventListener] 图片不可用。 URI:(流内对象)。原因:org.apache.xmlgraphics.image.loader.ImageException:不支持文件格式。没有为 null 找到 ImagePreloader(没有可用的上下文信息) org.apache.xmlgraphics.image.loader.ImageException:不支持文件格式。没有为 null 找到 ImagePreloader 在 org.apache.xmlgraphics.image.loader.ImageManager.preloadImage(ImageManager.java:181) 在 org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingDocument(AbstractIFPainter.java:317) 在 org.apache.fop.render.pdf.PDFPainter.drawImage(PDFPainter.java:286)

这是它的包含方式

<fo:block margin-right="1.5cm" text-align="right">
         <fo:instream-foreign-object>
              #include("Logo.vm")
         </fo:instream-foreign-object>
</fo:block>

这是 SVG 包含文件 sn-p Logo.vm:

<svg
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:cc="http://creativecommons.org/ns#"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
        xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
        version="1.0"
        id="Ebene_1"
        x="0px"
        y="0px"
        viewBox="0 0 175 40"
        enable-background="new 0 0 115 40"
        xml:space="preserve"
        inkscape:version="0.48.4 r9939"
        width="146"
        height="38"
        sodipodi:docname="DL_115x40.svg"><metadata
     id="metadata3067"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
        rdf:resource="http://purl.org/d/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
        id="defs3065" /><sodipodi:namedview
        pagecolor="#ffffff"
        bordercolor="#666666"
        borderopacity="1"
        objecttolerance="10"
        gridtolerance="10"
        guidetolerance="10"
        inkscape:pageopacity="0"
        inkscape:pageshadow="2"
        inkscape:window-width="492"
        inkscape:window-height="309"
        id="namedview3063"
        showgrid="false"
        inkscape:zoom="2.7826087"
        inkscape:cx="57.5"
        inkscape:cy="20"
        inkscape:window-x="0"
        inkscape:window-y="25"
        inkscape:window-maximized="0"
        inkscape:current-layer="Ebene_1" />
    <path class="st0" d="M122.9 34.2c0 .8-.6 1.3-1 .... *MORE AND MORE NUMBERS COMMING*

【问题讨论】:

  • SVG 本身是在 instream-foreign-object 内部还是外部图形?
  • 它是 #include("shipLogoMW.vm")
  • 而且这个网址也可以从服务器访问,所以没问题:purl.org/d/dcmitype/StillImage
  • 可能是 mimetype 问题?我不知道 #include("shipLogoMW.vm") 是什么意思,但我认为它会获取 SVG 文件并将其放入标签中。可能是因为文件名为 .vm 而不是 .svg 服务器没有返回正确的 mimetype?
  • 我们也试过这个,但没有奏效。此外,我们尝试将其作为外部图形包含在内,但这里也是同样的问题。奇怪的是,我们在另一台生产服务器上有类似的代码,它在那里运行。也许这是某种pom问题,我不确定。蜡染已加载。同样对于 Batik,有人提到使用 -Djava.awt.headless=true 运行 JAVA,但这也没有什么不同。

标签: apache-fop


【解决方案1】:

对我来说,这个问题是在使用 Amazon Corretto JDK 时发生的。 Java Corretto 有一些导致字体问题的错误,请参阅 Github 上的问题:Broken Font support (Fontconfig) in AWS-Lambda (java11)Generic Linux distro requires Fontconfig for font support (java8)

实际上为我们解决了这个问题的是在操作系统上安装包fontconfig(我们正在运行 Ubuntu 虚拟服务器,所以没问题):

sudo apt-get install fontconfig

在那之后 SVG 渲染就OK了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多