如何使用fo:external-graphic在pdf文件中生成图像来给出图像的相对路径?

时间:2013-12-13 09:24:23

标签: java xslt pdf xsl-fo

<fo:flow flow-name="xsl-region-body">
        <fo:block>
                    <fo:external-graphic width="85pt" height="35pt"  src="url(D:\WebSphere\AppServer\installedApps\ISLVPHP01G0\gcb_retail_appl2.ear\fcat27Web.war\images\eng\<image-name>.gif)"/>
                 </fo:block>

... ....

OutputStream        l_op_stream     =   null;
        byte    []          l_byte          =   null;
        InputStream         l_in_stream     =   null;

p_response.setHeader ("Cache-Control", "max-age=0"); //HttpServletResponse  p_response object 
        p_response.setHeader ("Cache-Control", "no-cache, no-store, must-revalidate");
        p_response.setHeader ("Pragma", "no-cache");
        p_response.setDateHeader("Expires", 0);
p_response.setHeader (
                "Content-Disposition", "attachment; filename=\"" 
                     +  p_attchFname + "\"" 
            ); 

.... ....

FOProcessor l_processor =   new FOProcessor();
ByteArrayOutputStream   l_bos_temp      =   null;
                        l_processor.setOutputFormat (
                            FOProcessor.FORMAT_PDF
                        );
                        l_processor.setData (
                            new ByteArrayInputStream (
                                p_data.response.getBytes(xslEncoding)
                            )
                        );
                        l_processor.setTemplate (
                            l_in_stream
                        );

                        l_bos_temp  =   new ByteArrayOutputStream ();
                        l_processor.setOutput (l_bos_temp); //set output file           
                        l_processor.generate ();

我正在使用XSLT / XSL-FO作为我的应用程序的UI部分。我有一个.xsl文件,其中包含图像的绝对路径,以显示徽标徽标,如<fo:external-graphic>中的代码所示。我想用图像的相对路径替换绝对路径。

我已在上面显示了java中的UI代码和服务器端代码。

我想在标签中的'src'标签中给出相对路径而不是绝对路径。

请建议我这样做。

1 个答案:

答案 0 :(得分:0)

我不熟悉您的特定FO处理器,但通常您可以通过实施自定义URIResolver来实现此目的。例如,使用Apache FOP:

FOUserAgent fop = FopFactory.newInstance().newFOUserAgent();
fop.setURIResolver(new MyURIResolver());

MyURIResolver类似于:

public class MyURIResolver implements URIResolver {
    public Source resolve(String href, String base) throws TransformerException {
        InputStream is;
        //TODO get InputStream from file system, database, etc. based on href
        return new StreamSource(is);
    }
}

无论您在url() src属性fo:external-graphic中传递给URIResolver,无论是相对还是绝对,都会通过href参数传递给{{1}} ,允许您按照自己的意愿解决问题。