2010-11-18 7 views
9

Dies ist meine erste Frage hier, ich hoffe, ich mache es richtig. Sorry für mein schlechtes Englisch im Voraus :)FOP: Wie man relativen Pfad des Bildes src spezifiziert?

Ich benutze JSF 2.0 (Eclipse IDE) und ich versuche, einige PDF-Dateien mit Apache FOP 1.0 zu generieren.

Ich konnte einfache PDF-Dateien mit Anweisungen auf Apache Fop site erstellen, aber ich kann kein Bild aus meinem Anwendungsordner einfügen. Meine Ordnerstruktur ist wie folgt aus: In meiner Anwendung WebContent i (unter anderem) haben pdf_transform/xslt/transformFile.xsl und pdf_transform/xslt/logo.jpg

In transformFile.xsl ich habe

<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block> 

aber wenn ich 'showPDF' Button in meinem Servlet clik, i PDF-Datei ohne Bild zu erhalten (alles andere ist es), und diese Nachrichten in der Konsole:

SCHWEREN: Die Quelle, die fr zurückgegeben wurde om URI-Auflösung enthielt keine InputStream für URI: logo.jpg 18. November, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Bild nicht gefunden. URI: logo.jpg. (Kein Kontext info verfügbar)

Ich habe versucht, 'logo.jpg' anstelle von url ('logo.jpg') zu verwenden, an verschiedenen Orten innerhalb WebContent Ordner setzen Bild und mit verschiedenen Navigation (“./ logo .jpg ") aber es hat nicht funktioniert.

Es funktioniert gut, wenn ich absoluten Pfad (zum Beispiel "d: /fop/images/logo.jpg") einstellen, aber ich muss in meiner Anwendung wieder auftauchen.

Während der Suche fand ich, dass dies zu fopFactory.setURResolver() und/oder userAgent.setBaseURL() verwandt ist. Versuchte etwas damit, aber es gelang nicht.

Ich bin neu in JSF und FOP, und diese Bildsituation hat mich schon eine ganze Weile gestört. Kann mir jemand dabei helfen oder mich zumindest zu einem Tutorial über "Wie konfiguriere ich FOP für die relative Pfadnutzung?"

EDIT: Ich möchte keine absoluten Pfade und App sollte unabhängig von ihrem Standort auf dem Computer arbeiten (zu veröffentlichen). Meine Suche sagt mir, es hat etwas mit der Konfiguration von FOP zu tun, aber ich weiß nicht, wie es geht :)

Vielen Dank im Voraus.

P.S. Dies ist die Methode PDF aufgerufen wird angezeigt:

public void printExchangeRateList(ActionEvent event) { 

    BufferedOutputStream output = null; 

    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 

    String path = externalContext.getRealPath("/"); 


    try { 

     response.reset(); 
     response.setHeader("Content-Type", "application/pdf"); 
     output = new BufferedOutputStream(response.getOutputStream(), 10240); 

     File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl"); 

     FopFactory fopFactory = FopFactory.newInstance(); 
     FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 

     try { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); 

      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile)); 

      Source src = new DOMSource(makeXML()); // my method 
      Result res = new SAXResult(fop.getDefaultHandler()); 

      transformer.transform(src, res); 


     } finally { 
      if (output != null) output.close(); 
      /*try { 
       out.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
     } 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
    } 

    facesContext.responseComplete(); 
} 

Antwort

2

Wenn Sie den Zugriff auf die Bilder auf der Web-URL haben, können Sie das auch verwenden, wenn die Erstellung von Berichten, dh http://localhost/images/logo.jpg.

Aber während ich noch Bilder lokal auf dem Web-Server hatte, eingeschlossen ich den Pfad zur Anwendung in der XML-Datei und verwenden es wie folgt aus:

<xsl:variable name="base_path" select="base-path"/> 
<xsl:variable name="logo" select="companies/company/logo"/> 
<fo:external-graphic src="url({$base_path}{logo})"/> 

Wenn die XML-Struktur so etwas wie das sein könne:

<?xml version="1.0" encoding="UTF-8"?> 
<base-path>/path/to/app/</base-path> 
<companies> 
    <company> 
    <logo>images/company1.jpg</logo> 
    </company> 
    <company> 
    <logo>images/company2.jpg</logo> 
    </company> 
</companies> 
+0

Vielen Dank für Ihre Antwort. Aber das ist nicht was ich suche. Wenn Sie xml erstellen, muss die Zeichenfolge "/ Pfad/zu/app /" etwa so aussehen wie "C: \ Eclipse \ workspace \ myProject \ .. etc" (wenn Sie es richtig machen). Ich mache diese Anwendung zu veröffentlichen und alle XML-Daten und Bilder im Zugriff müssen Referenz innerhalb Anwendungsumfang sein (sorry, habe das nicht explizit in meiner Frage geschrieben, ich werde es jetzt bearbeiten). – Nikola

10

ich fand eine Lösung für mein Problem. Ich dachte, ich hätte es versucht, aber anscheinend habe ich damals einen kleinen Fehler gemacht. Wie auch immer, mit dem folgenden Code

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ExternalContext externalContext = facesContext.getExternalContext(); 
String basePath = externalContext.getRealPath("/"); 

FopFactory fopFactory = FopFactory.newInstance(); 
fopFactory.setBaseURL(basePath); 
FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
foUserAgent.setBaseURL(fopFactory.getBaseURL()); 

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); // for some output 

Sie Ihre Bilder zugreifen können (und andere Ressourcen) von Ihrer XSLT-Datei aus Ihrer Anwendung WebContent Ordnern beginnend relativen Pfad. In meinem Fall, ich logo.jpg wie diese

<fo:external-graphic src="url('pdf_transform/xslt/logo.jpg')"/> 

nahm mir Zeit, um dies herauszufinden zugreifen kann, bekomme ich es nicht, warum keine Beispiele mit solch grundlegenden Sache auf dem Netz (oder i nicht finden können, sie :)

0

ich hatte das gleiche Problem und versucht, diese Lösung:

FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    Request request = RequestCycle.get().getRequest(); 
    //sort of a hack to find the path to the files that are in /img folder. 
    String baseUrl = request.getUrl().getProtocol()+"://"+request.getUrl().getHost()+":"+request.getUrl().getPort(); 
    foUserAgent.setBaseURL(baseUrl); 

Dann auf XSL ich verwendet:

<fo:external-graphic src="/img/image.png" /> 

bis t Wenn dies funktioniert, sollten Sie in der Lage sein, das Bild auf dem Protokoll zu sehen: // link: port/img/image.png

Verwandte Themen