2010-11-18 19 views
9

To jest moje pierwsze pytanie tutaj, mam nadzieję, że robię to dobrze. Przepraszam za mój zły język angielski z góry :)FOP: jak określić względną ścieżkę obrazu src?

Używam JSF 2.0 (Eclipse IDE) i próbuję wygenerować kilka plików PDF przy użyciu Apache FOP 1.0.

byłem w stanie dokonać prostych plików PDF za pomocą instrukcji na Apache Fop site, ale nie mogę wstawić dowolny obraz z mojego folderu aplikacji. Moja struktura folderów jest tak: w mojej aplikacji WebContent mam (wśród innego) pdf_transform/XSLT/transformFile.xsl i pdf_transform/XSLT/logo.jpg

W transformFile.xsl mam

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

ale kiedy clik przycisk „showPDF” w moim serwletu, i uzyskać plik PDF bez obrazu (wszystko jest tam), a to komunikaty w konsoli:

ciężkie: źródła, które zostało zwrócone fr om rozdzielczości URI nie zawierają InputStream dla URI: logo.jpg 18 Listopad, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent ciężkie: Image not found. URI: logo.jpg. (Brak informacji kontekst dostępny)

Próbowałem użyć „logo.jpg” zamiast url („logo.jpg”), umieszczenie obrazu w różnych miejscach wewnątrz folderu WebContent i przy użyciu różnych nawigacji (”./ logo .jpg "), ale nie działało.

Działa dobrze, jeśli ustawiam ścieżkę bezwzględną (na przykład "d: /fop/images/logo.jpg"), ale muszę zmaterializować odrobinę mojej aplikacji.

Podczas wyszukiwania znalazłem, że jest to związane z fopFactory.setURIResolver() i/lub userAgent.setBaseURL(). Próbowałem czegoś z tym, ale się nie udało.

Jestem nowym zarówno JSF i FOP, a sytuacja ta grafika została przeszkadza mi sporo czasu. Czy ktoś może mi w tym pomóc, a przynajmniej skieruje mnie do samouczka na temat "jak skonfigurować FOP do względnego wykorzystania ścieżki"?

EDYCJA: Nie chcę żadnych bezwzględnych ścieżek i aplikacja powinna działać niezależnie od jej lokalizacji na komputerze (do publikacji). Moje poszukiwania mówi mi, że to ma coś wspólnego z konfiguracją FOP, ale nie wiem jak to zrobić :)

Z góry dzięki.

P.S. Jest to metoda, która nazywa się wyświetlić PDF:

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(); 
} 

Odpowiedz

2

Jeśli masz dostęp do adresu URL strony internetowej dla zdjęć, które można wykorzystać również podczas generowania raportów, czyli http://localhost/images/logo.jpg.

Ale gdy miałem jeszcze obrazy lokalnie na serwerze WWW, mam włączone ścieżkę do aplikacji w pliku XML i stosować go tak:

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

Jeżeli struktura XML może być coś takiego:

<?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

Dziękuję za odpowiedź. Ale tego nie szukam. Kiedy tworzysz xml, ciąg "/ path/to/app /" musi wyglądać jak "C: \ Eclipse \ workspace \ myProject \ .. etc" (jeśli mam prawo). Uczyniam, że ta aplikacja będzie dostępna do publikacji, a wszystkie dane i obrazy xml uzyskujące dostęp będą musiały odnosić się do zakresu zastosowania whitin (przepraszam, nie napisałem tego wyraźnie w moim pytaniu, będę teraz edytować). – Nikola

10

znalazłem rozwiązanie mojego problemu. Myślałem, że próbowałem, ale wydaje mi się, że wtedy popełniłem mały błąd. W każdym razie, z następującego kodu

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 

można uzyskać dostęp do obrazów (i innych zasobów) z pliku XSLT przy użyciu ścieżki względnej wychodząc z folderu WebContent danej aplikacji. W moim przypadku, można uzyskać dostęp logo.jpg jak ten

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

Zajęło mi trochę czasu, aby zorientować się w tym, że nie rozumiem, dlaczego żaden z przykładów takiej podstawowej rzeczy w sieci (lub nie mogę znaleźć im :)

0

miałem ten sam problem i próbowałem tego rozwiązania:

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); 

Następnie na XSL użyłem:

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

do t est jeśli to działa, powinieneś być w stanie zobaczyć obraz na protokole: // link: port/img/image.png

Powiązane problemy