繁体   English   中英

带有Java的Apache FOP 1.1中的PDF图像

[英]image in PDF from Apache FOP 1.1 with Java

我有一个奇怪的问题。 即时通讯使用apache FOP 1.1从Java创建PDF文档。 如果我从eclipse创建此文件,则效果很好。 如果我将Programm导出为jar文件,则无法正常工作。

XSL-FO文件是:

<?xml version="1.0" encoding="ISO-8859-1"?>

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">

    <fo:root font-family="Arial">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="A4-portrait"
                page-height="29.7cm" page-width="21.0cm" margin="2cm">
                <fo:region-body region-name="xsl-region-body"
                    margin-bottom=".5in" />
                <fo:region-before region-name="xsl-region-before"
                    extent=".4in" />
                <fo:region-after region-name="xsl-region-after"
                    extent=".4in" />
            </fo:simple-page-master>

        </fo:layout-master-set>
        <fo:page-sequence master-reference="A4-portrait">

            <fo:static-content flow-name="xsl-region-before">
                <fo:block text-align="right">
                    **<fo:external-graphic width="150pt" height="150pt" content-width="150pt" content-height="150pt" src="C:/Users/user/Desktop/logo.jpg"/>**
                </fo:block>

            </fo:static-content>


            <fo:static-content flow-name="xsl-region-after">
                <fo:table table-layout="fixed" width="170mm">

                    <fo:table-column column-width="67mm" />
                    <fo:table-column column-width="67mm" />
                    <fo:table-column column-width="33mm" />
                    <fo:table-body start-indent="0mm" end-indent="0mm">


                        <fo:table-row>


                            <fo:table-cell margin-left="2mm">

                                <fo:block font-size="6pt">
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                            </fo:table-cell>

                            <fo:table-cell margin-left="2mm">

                                <fo:block font-size="6pt">
                                    Telefon:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    Fax:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    Internet:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    E-Mail:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                            </fo:table-cell>

                            <fo:table-cell margin-left="2mm">

                                <fo:block font-size="6pt">
                                    IBAN:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    BIC:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    Bank:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                                <fo:block font-size="6pt">
                                    USTNr.:
                                    <xsl:value-of select="<vaules>" />
                                </fo:block>
                            </fo:table-cell>

                        </fo:table-row>
                    </fo:table-body>
                </fo:table>
            </fo:static-content>
            <fo:flow flow-name="xsl-region-body">


                <fo:block>
                    <fo:leader />
                </fo:block>

                <fo:block>
                    <fo:leader />
                </fo:block>

                <fo:block>
                    <fo:leader />
                </fo:block>

                <fo:block>
                    <fo:leader />
                </fo:block>

                <fo:block>
                    <fo:leader />
                </fo:block>

                <fo:block font-size="8pt">
                    <xsl:value-of select="<vaules>" />
                    ,
                    <xsl:value-of select="<vaules>" />
                    ,
                    <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>


                <fo:block font-size="12pt">
                    <xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block text-align="right">
                    <xsl:value-of select="<vaules>" />,<xsl:value-of select=<vaules>" />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block text-align="right">
                    **<fo:external-graphic src="PDF/barcode.png"/>**
                </fo:block>
                <fo:block text-align="left" font-size="14pt">
                    Rechnung #<xsl:value-of select="<vaules>" />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <fo:block>
                    <fo:leader />
                </fo:block>
                <xsl:choose>
                    <xsl:when test="<vaules>">
                        <fo:block font-size="12pt">
                            Sehr geehrter
                            <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />,
                        </fo:block>
                    </xsl:when>
                    <xsl:when test="<vaules>">
                        <fo:block font-size="12pt">
                            Sehr geehrte
                            <xsl:value-of select="<vaules>" />&#8239;<xsl:value-of select="<vaules>" />,
                        </fo:block>
                    </xsl:when>
                    <xsl:otherwise>
                        <fo:block font-size="12pt">Nichts</fo:block>
                    </xsl:otherwise>
                </xsl:choose>
                <fo:block>

...更多文字。

在终端中,它给我带来以下错误:

    Sep 20, 2014 10:39:08 AM org.apache.fop.events.LoggingEventListener processEvent

**SCHWERWIEGEND: Image not available. URI: C:/Users/user/Desktop/logo.jpg. Reason:
 org.apache.xmlgraphics.image.loader.ImageException: The file format is not supp
orted. No ImagePreloader found for C:/Users/user/Desktop/logo.jpg (See position
13:134)**
org.apache.xmlgraphics.image.loader.ImageException: The file format is not suppo
rted. No ImagePreloader found for C:/Users/niko/Desktop/logo.jpg
        at org.apache.xmlgraphics.image.loader.ImageManager.preloadImage(ImageMa
nager.java:180)
        at org.apache.xmlgraphics.image.loader.cache.ImageCache.needImageInfo(Im
ageCache.java:128)
        at org.apache.xmlgraphics.image.loader.ImageManager.getImageInfo(ImageMa
nager.java:122)
        at org.apache.fop.fo.flow.ExternalGraphic.bind(ExternalGraphic.java:81)
        at org.apache.fop.fo.FObj.processNode(FObj.java:124)
        at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuil
der.java:280)
        at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:175)
        at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(Tra
nsformerIdentityImpl.java:1072)
        at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Sour
ce)
        at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unkn
own Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unkn
own Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent
Dispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Un
known Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf
ormerIdentityImpl.java:484)
        at pdfcreator_paket.CreatePDF.convertXML2FO(CreatePDF.java:104)
        at side_pakets.XMLParser.printRechnung(XMLParser.java:447)
        at auftrag_paket.Auftragsverwaltung.btnDruckenClick(Auftragsverwaltung.j
ava:691)
        at auftrag_paket.Auftragsverwaltung.access$3(Auftragsverwaltung.java:571
)
        at auftrag_paket.Auftragsverwaltung$8.actionPerformed(Auftragsverwaltung
.java:1197)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$400(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

Sep 20, 2014 10:39:08 AM org.apache.fop.events.LoggingEventListener processEvent

**SCHWERWIEGEND: Image not available. URI: PDF/barcode.png. Reason: org.apache.xml
graphics.image.loader.ImageException: The file format is not supported. No Image
Preloader found for PDF/barcode.png (See position 109:45)**
**org.apache.xmlgraphics.image.loader.ImageException: The file format is not suppo
rted. No ImagePreloader found for PDF/barcode.png**
        at org.apache.xmlgraphics.image.loader.ImageManager.preloadImage(ImageMa
nager.java:180)
        at org.apache.xmlgraphics.image.loader.cache.ImageCache.needImageInfo(Im
ageCache.java:128)
        at org.apache.xmlgraphics.image.loader.ImageManager.getImageInfo(ImageMa
nager.java:122)
        at org.apache.fop.fo.flow.ExternalGraphic.bind(ExternalGraphic.java:81)
        at org.apache.fop.fo.FObj.processNode(FObj.java:124)
        at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuil
der.java:280)
        at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:175)
        at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(Tra
nsformerIdentityImpl.java:1072)
        at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Sour
ce)
        at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unkn
own Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unkn
own Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContent
Dispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Un
known Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf
ormerIdentityImpl.java:484)
        at pdfcreator_paket.CreatePDF.convertXML2FO(CreatePDF.java:104)
        at side_pakets.XMLParser.printRechnung(XMLParser.java:447)
        at auftrag_paket.Auftragsverwaltung.btnDruckenClick(Auftragsverwaltung.j
ava:691)
        at auftrag_paket.Auftragsverwaltung.access$3(Auftragsverwaltung.java:571
)
        at auftrag_paket.Auftragsverwaltung$8.actionPerformed(Auftragsverwaltung
.java:1197)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$400(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

Sep 20, 2014 10:39:08 AM org.apache.fop.events.LoggingEventListener processEvent

WARNUNG: Content overflows the viewport of the fo:region-before on page 1 in blo
ck-progression direction by 126864 millipoints. (See position 11:50)
Sep 20, 2014 10:39:08 AM org.apache.fop.events.LoggingEventListener processEvent

谁能帮我?

诚挚

看起来像程序在以jar运行时正在努力解析图像文件路径。 值得记住的是,src属性指向URI而不是文件路径,并且根据其结构,直接运行而不是从可执行jar运行时,解析方式会有所不同。 我要尝试的第一件事是将文件路径更改为如下所示:

src="file:///C:/Users/user/Desktop/logo.jpg"

或这个:

src='url("file:///C:/Users/user/Desktop/logo.jpg")'

您是否可以排列文件,以便可以使用相对路径? 绝对路径可能很难维护。 您可能还需要考虑将所有XSL和图像文件包含在jar文件本身中。 有这种方法的来龙去脉的一个很好的解释在这里

我遇到了同样的问题。 对我来说,解决此问题的方法是为FopUserAgent对象设置基本路径,以便它知道图像的路径。 然后,您可以指定相对于此路径的图像。

// images are located in or in subfolders of baseDir
String baseDir = /some/path/to/includes/
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setBaseURL(baseDir);

此外,为了使其与罐子一起使用,我必须添加以下导入:

import org.apache.xmlgraphics.image.loader.ImageManager;
import org.apache.xmlgraphics.image.loader.impl.DefaultImageContext;
/* Added this line to my code to get these imports. Not using it at all */
ImageManager imageManager = new ImageManager(new DefaultImageContext());

原因显然是fop.jar的设置使用了与xmlgraphics-commons jar(用于处理图像)相同的名称。 因此,为了不让fop.jar覆盖设置xmlgraphics,我不得不使用所述导入。


不幸的是,这似乎只在我的机器上起作用。 在其他PC上测试jar会再次导致相同的错误。 也许你有更多的运气。 如果是这样,请告诉我。 (运行Debian 8,OpenJDK7,FOP 1.1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM