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

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

Я создаю PDF, используя FOP 2.0 и XSLT. Здесь я получаю XSL из веб-адреса. мой единственный URL-адрес XSL включает и импортирует другие 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" версия="1.0">

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

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

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

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

ОШИБКА:

Идентификатор системы неизвестен; Строка №3; Колонка №34; Было исключение ввода-вывода с файлом таблицы стилей: header.xsl Идентификатор системы неизвестен; Строка №4; Колонка №34; Было исключение ввода-вывода с файлом таблицы стилей: footer.xsl Идентификатор системы неизвестен; Строка №5; Колонка №36; Было исключение ввода-вывода с файлом таблицы стилей: mainbody.xsl Идентификатор системы неизвестен; Строка №6; Колонка №41; Было исключение ввода-вывода с файлом таблицы стилей:secondarybody.xsl Идентификатор системы неизвестен; Строка №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 — построение дерева объектов форматирования Идентификатор системы неизвестен; Строка №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)

{ пытаться {

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

Вы пишете код Java для запуска Apache FOP? Затем покажите нам соответствующий код. Также сообщает нам точные сообщения об ошибках.

Martin Honnen 05.04.2019 12:32

Обратите внимание, что FOP действительно вступает в игру для обработки результат XSLT-преобразования; до этого работает процессор XSLT.

lfurini 06.04.2019 11:00

@MartinHonnen Я добавил часть логики и ошибок, не могли бы вы изучить ее?

Supraja reddy 08.04.2019 22:52

Разве этого недостаточно, чтобы избежать проблемы, если вы напрямую используете StreamSource xsltStreamSource = new StreamSource(xslPath);?

Martin Honnen 09.04.2019 10:40

Спасибо @MartinHonnen Это работает. вы сделали мой день :)

Supraja reddy 10.04.2019 05:15

@Suprajareddy, я преобразовал предложение из комментария в ответ, чтобы вы могли принять его и отметить свой вопрос как решенный.

Martin Honnen 10.04.2019 13:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
815
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

с участием

StreamSource xsltStreamSource = new StreamSource(xslPath);

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

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

Другие вопросы по теме