2010-11-18 24 views
9

Đây là câu hỏi đầu tiên của tôi ở đây, tôi hy vọng tôi đang làm đúng. Xin lỗi vì tiếng Anh xấu của tôi trước :)FOP: cách chỉ định đường dẫn tương đối của src hình ảnh?

Tôi đang sử dụng JSF 2.0 (IDE Eclipse) và tôi đang cố tạo một số tệp PDF bằng Apache FOP 1.0.

Tôi có thể tạo tệp PDF đơn giản bằng cách sử dụng hướng dẫn trên Apache Fop site, nhưng tôi không thể chèn bất kỳ hình ảnh nào từ thư mục ứng dụng của mình. cấu trúc thư mục của tôi là như thế này: Trong WebContent ứng dụng của tôi tôi có (trong số những người khác) pdf_transform/XSLT/transformFile.xsl, và pdf_transform/XSLT/logo.jpg

Trong transformFile.xsl tôi có

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

nhưng khi tôi clik nút 'showPDF' trong servlet của tôi, tôi nhận được tập tin PDF mà không cần hình ảnh (mọi thứ khác là có), và thông điệp này trong giao diện điều khiển:

NGHIÊM TRỌNG: The Source đã được trả lại fr độ phân giải URI om không chứa InputStream cho URI: logo.jpg Ngày 18 tháng 11, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE: Không tìm thấy hình ảnh. URI: logo.jpg. (Không có thông tin bối cảnh sẵn)

Tôi cố gắng để sử dụng 'logo.jpg' thay vì url ('logo.jpg'), đưa hình ảnh trên những nơi khác nhau bên trong thư mục WebContent và sử dụng chuyển hướng khác nhau (" ./ Logo .jpg ") nhưng nó không hoạt động.

Nó hoạt động tốt nếu tôi đặt đường dẫn tuyệt đối (ví dụ "d: /fop/images/logo.jpg") nhưng tôi cần resurces whitin ứng dụng của tôi.

Trong khi tìm kiếm, tôi thấy rằng điều này liên quan đến fopFactory.setURIResolver() và/hoặc userAgent.setBaseURL(). Đã thử một cái gì đó với điều đó, nhưng didnt thành công.

Tôi mới dùng cả JSF và FOP, và tình huống hình ảnh này đã làm phiền tôi khá lâu. Ai đó có thể giúp tôi với điều này, hoặc ít nhất là hướng dẫn tôi đến một số hướng dẫn về "làm thế nào để cấu hình FOP cho việc sử dụng đường dẫn tương đối"?

EDIT: Tôi không muốn bất kỳ đường dẫn tuyệt đối và ứng dụng nào hoạt động độc lập với vị trí của nó trên máy tính (để có thể xuất bản). Tìm kiếm của tôi cho tôi biết nó có liên quan đến việc cấu hình FOP, nhưng tôi không biết cách làm như thế :)

Xin cảm ơn trước.

P.S. Đây là phương pháp được gọi là để hiển thị 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(); 
} 

Trả lời

2

Nếu bạn có quyền truy cập vào địa chỉ web cho hình ảnh bạn có thể sử dụng như là tốt khi tạo báo cáo, tức là http://localhost/images/logo.jpg.

Nhưng trong khi tôi vẫn có hình ảnh cục bộ trên các máy chủ web, tôi bao gồm đường dẫn đến ứng dụng trong file XML và sử dụng nó như thế này:

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

Trong trường hợp cấu trúc XML có thể là một cái gì đó như thế này:

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

Cảm ơn câu trả lời của bạn. Nhưng đó không phải những gì tôi đang tìm kiếm. Khi bạn tạo xml, chuỗi "/ path/to/app /" phải giống như "C: \ Eclipse \ workspace \ myProject \ .. etc" (nếu im làm đúng). Im làm cho ứng dụng này có thể xuất bản và tất cả dữ liệu xml và hình ảnh truy cập im phải được tham chiếu đến phạm vi ứng dụng whitin (xin lỗi, không viết rõ ràng trong câu hỏi của tôi, tôi sẽ chỉnh sửa nó ngay bây giờ). – Nikola

10

tôi đã tìm ra giải pháp cho vấn đề của mình. Tôi nghĩ rằng tôi đã cố gắng đó, nhưng có vẻ như tôi đã thực hiện một số sai lầm nhỏ trở lại sau đó. Dù sao, với đoạn mã sau

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 

bạn có thể truy cập vào hình ảnh của bạn (và các nguồn lực khác) từ tập tin XSLT của bạn sử dụng đường dẫn tương đối bắt đầu từ thư mục WebContent ứng dụng của bạn. Trong trường hợp của tôi, tôi có thể truy cập logo.jpg như thế này

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

Hãy để tôi tìm ra điều này, tôi không hiểu tại sao không có ví dụ nào với điều cơ bản trên mạng (hoặc tôi không thể tìm thấy chúng :)

0

tôi đã cùng một vấn đề và cố gắng giải pháp này:

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

Sau đó, trên XSL tôi đã sử dụng:

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

Để t nếu điều này đang hoạt động, bạn sẽ có thể xem hình ảnh trên giao thức: // link: port/img/image.png