[英]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>" /> <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>" /> <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>" /> <xsl:value-of select="<vaules>" />
</fo:block>
<fo:block>
<xsl:value-of select="<vaules>" />
</fo:block>
<fo:block>
<xsl:value-of select="<vaules>" /> <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>" /> <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>" /> <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.