Медленная трансформация Apache FOP после саксонского XSLT-преобразования - PullRequest
0 голосов
/ 25 декабря 2018

В приложении Java я использую Saxon HE (9.9) для преобразования XML-FO.После этого я использую Apache FOP (2.3) для создания PDF-файла.Преобразование FOP является медленным по сравнению со временем выполнения в конце обоих преобразований (приблизительно 12 с против 2 с только для части FOP).

// XML->FO                                                                                                
Processor proc = new Processor(false);                                          

ExtensionFunction highlightingImage = new OverlayImage();                       
proc.registerExtensionFunction(highlightingImage);                              
ExtensionFunction mergeImage = new PlanForLandRegisterMainPageImage();          
proc.registerExtensionFunction(mergeImage);                                     
ExtensionFunction rolImage = new RestrictionOnLandownershipImage();             
proc.registerExtensionFunction(rolImage);                                       
ExtensionFunction fixImage = new FixImage();                                    
proc.registerExtensionFunction(fixImage);                                       
ExtensionFunction decodeUrl = new URLDecoder();                                 
proc.registerExtensionFunction(decodeUrl);                                      

XsltCompiler comp = proc.newXsltCompiler();                                     
XsltExecutable exp = comp.compile(new StreamSource(new File(xsltFileName)));          
XdmNode source = proc.newDocumentBuilder().build(new StreamSource(new File(xmlFileName)));          
Serializer outFo = proc.newSerializer(foFile);                                  
XsltTransformer trans = exp.load();                                             
trans.setInitialContextNode(source);                                            
trans.setDestination(outFo);                                                    
trans.transform();                                                              

// FO->PDF                                                                      
FopFactory fopFactory = FopFactory.newInstance(fopxconfFile);                   
OutputStream outPdf = new BufferedOutputStream(new FileOutputStream(pdfFile));           
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outPdf);                    
TransformerFactory factory = TransformerFactory.newInstance();                  
Transformer transformer =  factory.newTransformer();                            
Source src = new StreamSource(foFile);                                          
Result res = new SAXResult(fop.getDefaultHandler());                            
transformer.transform(src, res);        

До сих пор я почти уверен, что это не зависит от некоторых проблем обработки файлов с созданным FO-файлом.Преобразование FO даже медленное, если я преобразую совершенно другой файл FO, чем тот, что был создан с помощью Saxon.Даже вывод в консоли отличается, когда не выполняется преобразование XML-FO:

        Dec 25, 2018 1:54:47 AM org.apache.fop.apps.FOUserAgent processEvent
        INFO: Rendered page #1.
        Dec 25, 2018 1:54:47 AM org.apache.fop.apps.FOUserAgent processEvent
        INFO: Rendered page #2.

Этот вывод не будет печататься в консоли при выполнении преобразования XML-FO до.

Есть ли что-то в шаге преобразования XML-FO, которое должно быть закрыто?

В чем причина такого поведения?

1 Ответ

0 голосов
/ 25 декабря 2018

Я думаю, что если вы используете собственный API Saxon для настройки Processor и ваших функций расширения, но затем хотите передать результат преобразования XSL-FO непосредственно в процессор Apache FOP, вы можете напрямую настроить SAXDestination:

XsltTransformer trans = exp.load();                                                
trans.setInitialContextNode(source);                                                


FopFactory fopFactory = FopFactory.newInstance(fopxconfFile);                       

OutputStream outPdf = new BufferedOutputStream(new FileOutputStream(pdfFile));              
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outPdf);                        


trans.setDestination(new SAXDestination(fop.getDefaultHandler()));                  
trans.transform();                                                                  

outPdf.close();   

см. http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop/examples/embedding/java/embedding/ExampleXML2PDF.java?view=markup вместе с саксонскими http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltTransformer.html#setDestination-net.sf.saxon.s9api.Destination-.

...