Генерация PDF с использованием fop и XSL при наличии URL-адресов в XSLT - PullRequest
0 голосов
/ 04 апреля 2019

Создание PDF с использованием fop и XSL при наличии URL-адресов в XSLT

Я создаю PDF с использованием FOP 2.0 и XSLT.Здесь я получаю XSL из веб-адреса.Мой один XSL-URL включает и импортирует другие URL-адреса XSL.Если это один XSL, я мог бы создавать PDF.Если у меня есть несколько URL-адресов в одном XSLT в Интернете.FOP не может автоматически подключаться к другим URL-адресам [Пример использования XSLTS]


xsl: таблица стилей 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"/>

Это способ включения XSL в один XSL.В этом случае мой FOP не перенаправляет на эти xsls и не может генерировать PDF

ОШИБКА:

SystemId Unknown;Линия № 3;Колонна № 34;Исключение ввода-вывода с файлом таблицы стилей: header.xsl SystemId Unknown;Линия № 4;Колонна № 34;Исключение ввода-вывода с файлом таблицы стилей: footer.xsl SystemId Unknown;Линия № 5;Колонна № 36;Исключение ввода-вывода с файлом таблицы стилей: mainbody.xsl SystemId Unknown;Линия № 6;Колонна № 41;Исключение ввода-вывода с файлом таблицы стилей: secondbody.xsl SystemId Unknown;Линия № 10;Колонна № 38;org.xml.sax.SAXException: ошибка ElemTemplateElement: макет javax.xml.transform.TransformerException: ошибка ElemTemplateElement: макет 13: 58: 27.326 [http-nio-auto-1-exec-2] DEBUG org.apache.fop.fo.FOTreeBuilder - Построение дерева объектов форматирования. SystemId Unknown;Линия № 10;Колонна № 38;Не удалось найти шаблон с именем: layout

Код для генератора PDF:

открытый класс PdfGenerator {

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 Ответ

0 голосов
/ 10 апреля 2019

Просто замените

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

на

StreamSource xsltStreamSource = new StreamSource(xslPath);

, и процессор XSLT должен иметь возможность разрешать любые относительные операции импорта или включения.

Или вам потребуетсяявно установите системный идентификатор на вашем xsltStreamSource.Но единственная строка, которую я предложил, должна отлично справляться с работой.

...