当前位置: 首页 > 知识库问答 >
问题:

在XSLT中包含URL时使用fop和XSL生成PDF

许俊贤
2023-03-14

xsl:stylesheet xmlns:xsl=“http://www.w3.org/1999/xsl/transform”\

xmlns:fo=“http://www.w3.org/1999/xsl/format”version=“1.0”>

<xsl:include href="abc.xsl"/> 

<xsl:include href="xyz.xsl"/>

<xsl:include href="wgh.xsl"/>

这就是它在一个XSLs中包含XSLs的方式。在这种情况下,我的FOP没有重定向到那些XSL,因此无法生成PDF

错误:

private static final Logger LOG=LoggerFactory.getLogger(PdfGenerator.class);

public List<OutputStream>  generatePdfs(List<Content> xmlList, int reqestListSize,String xslPath)

{try{

    List<OutputStream> pdfOutputStreams= new ArrayList();   

    for(int p = 0; p <reqestListSize; p++) {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        String jaxbType = "com.abc.model"; // model package
        JAXBContext context = JAXBContext.newInstance(jaxbType);  
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);
        marshaller.marshal(xmlList.get(p),bos);
        ByteArrayInputStream inStream = new ByteArrayInputStream(bos.toByteArray());                
        StreamSource xmlSource = new StreamSource(inStream);                
        // create an instance of fop factory
        FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
        // a user agent is needed for transformation
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        ByteArrayOutputStream tempOutputStream = new ByteArrayOutputStream();
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, tempOutputStream);
        pdfOutputStreams.add(p, tempOutputStream);      
        // Setup XSLT
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        URL url = new URL(xslPath);
        InputStream xslFile = url.openStream();  (   **http://home.www.test.com/abc_web/xsl/test.xsl**  ( Using an url to get XSLT. faild loading due to XSL :include) )
        StreamSource xsltStreamSource = new StreamSource(xslFile);
        Transformer transformer = transformerFactory.newTransformer(xsltStreamSource);  
        Result res = new SAXResult(fop.getDefaultHandler());    
        // Start XSLT transformation and FOP processing
        // That's where the XML is first transformed to XSL-FO and then 
        // PDF is created      
        transformer.transform(xmlSource, res);
    }
    return pdfOutputStreams;

    }catch(Exception ex) {
        LOG.error("Error", ex);
        return new ArrayList();
    }

共有1个答案

邵阳
2023-03-14

简单替换

URL url = new URL(xslPath);
InputStream xslFile = url.openStream();
StreamSource xsltStreamSource = new StreamSource(xslFile);

StreamSource xsltStreamSource = new StreamSource(xslPath);

并且XSLT处理器应该能够解析任何相关的导入或包含。

 类似资料:
  • 我正在尝试使用Apache FOP在Oracle 11g数据库中生成PDF文档。我已经使用loadjava工具将以下JAR文件中的类安装到我的模式中: < Li > commons-logging-1 . 0 . 4 . jar < li>commons-io-1.3.1.jar < Li > Avalon-framework-4 . 2 . 0 . jar < li>xml-apis-ext-1

  • 我正在使用FOP生成pdf,我想在pdf中包含每个页面的边框。我正在使用XSLT 2.0。 是否有任何方法或任何属性或任何标记为XSL中的每个页面创建边框?

  • 我想在我的标签上使用属性 这是我的xml的一个例子:

  • 我正在使用cmake来构建我的C++项目。 我在src文件夹中有我的cmakelist.txt和main.cpp。

  • 我们正在使用 Saxon HE/Apache FOP (XSLT 2.0) 将 XML 转换为 PDF。我想调整一些图像的大小以适应页面。我理解使用内容高度和内容宽度“缩小以适应”或“缩放以适应”属性,但图像的高度和宽度在 XML 中不可用。 我需要一种方法来访问 XSLT 中的图像文件尺寸。 以下是如何在XML中描述图形: 以前他们使用的是xalan扩展(对于v1.0 XSLT,我们正在升级到v

  • 我想包括以下内容: 在此中,每个 我试过这个: 但是,我得到了这个错误: