2017-03-06 52 views
1

我正在使用Apache FOP 2.1,JAXB和XSLT 1.0生成PDF。该模板有一些嵌入式SVG。 PDF呈现没有任何问题,但FO正在抛出混乱我的日志的错误。XSL-FO:“无法设置基本URL”用于嵌入式svg

设置:

XslProcessor.java

public XslProcessor(File f) { 
    try { 
     URIResolverAdapter uriResolverAdapter = new URIResolverAdapter(new UserAgentUriResolver()); 
     FopFactoryBuilder builder = new FopFactoryBuilder(URI.create("/"), uriResolverAdapter); 
     DefaultConfigurationBuilder defaultConfigurationBuilder = new DefaultConfigurationBuilder(); 
     builder.setConfiguration(defaultConfigurationBuilder.buildFromFile("config/pdf/fop.xconf")); 
     fopFactory = builder.build(); 
     transformerFactory = TransformerFactory.newInstance(); 
     transformFile = f; 
    } catch (IOException | SAXException | ConfigurationException e) { 
     throw new RuntimeException(e); 
    } 
} 

public synchronized void process(InputStream is, OutputStream os) { 
    try { 
     try(BufferedOutputStream bufferedOut = new BufferedOutputStream(os)) { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, bufferedOut); 
      Source xslt = new StreamSource(transformFile); 
      Transformer transformer = transformerFactory.newTransformer(xslt); 
      Source source = new StreamSource(is); 
      Result result = new SAXResult(fop.getDefaultHandler()); 
      transformer.transform(source, result); 
     } 
     os.flush(); 
     os.close(); 
    } catch (IOException | FOPException | TransformerException e) { 
     throw new RuntimeException(e); 
    } 
} 

UserAgentUriResolver.java

public class UserAgentUriResolver implements URIResolver { 

private static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36"; 
private static final String REFERRER = "https://www.google.com"; 

@Override 
public Source resolve(String href, String base) throws TransformerException { 
    try { 
     URL url = new URL(href); 
     URLConnection connection = url.openConnection(); 
     connection.setRequestProperty("User-Agent", USER_AGENT); 
     connection.setRequestProperty("Referrer", REFERRER); 
     return new StreamSource(connection.getInputStream()); 
    } catch (IOException e) { 
     return new StreamSource(new ByteArrayInputStream(new byte[0])); 
    } 
} 
} 

样本模板:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="page" 
             page-height="29.7cm" 
             page-width="21cm"> 
        <fo:region-body/> 
        <fo:region-after extent="1.25cm"/> 
       </fo:simple-page-master> 
       <fo:page-sequence-master master-name="all"> 
        <fo:repeatable-page-master-alternatives> 
         <fo:conditional-page-master-reference master-reference="page"/> 
        </fo:repeatable-page-master-alternatives> 
       </fo:page-sequence-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="all"> 
       <fo:static-content flow-name="xsl-region-after"> 
        <fo:block> 
         <fo:instream-foreign-object> 
          <!-- SVG here! --> 
          <svg xmlns="http://www.w3.org/2000/svg" xml:base="http://www.example.com/"> 
           <rect height="20" width="100%" fill="#ababab"></rect> 
          </svg> 
         </fo:instream-foreign-object> 
        </fo:block> 
       </fo:static-content> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:block> 
         <xsl:apply-templates/> 
        </fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 
</xsl:stylesheet> 

一旦在模板中每一个SVG ,我得到

org.apache.fop.fo.FONode:对SVG无法设置基本URL

java.lang.IllegalArgumentException异常:URI不在java.net.URI.toURL绝对 ( URI.java:1088)〜[na:1.8.0_91] at org.apache.fop.fo.extensions.svg.SVGElement.getDimension(SVGElement.java:77)〜[fop-2.1.jar:na] at org.apache.fop.fo.flow.stream.InstreamForeignObject.getIntrinsicWidth(InstreamForeignObject.java:125)[fop-2.1.jar:na] at org.apache.fop.fo.flow.stream.InstreamForeignObject.getIntrinsicWidth(InstreamForeignObject.java:125 )[fop-2.1.jar:na] at org.apache.fop.layoutmgr.in line.AbstractGraphicsLayoutManager.getInlineArea(AbstractGraphicsLayoutManager.java:60)[FOP-2.1.jar:NA] 在...

+2

不知道这是否是任何解决方案,但这是可怕的代码。您正在创建对象,然后运行测试以查看是否需要任何内容​​(好)或没有任何内容(违反标准),为什么您的测试不围绕您是否创建流内异物? –

+0

你能编辑你的问题来包含一个带有所有属性*的结果svg *的例子吗?我只是试着用FOP 2.1来处理从你的代码派生的一个fo文件,它根本没有任何警告,所以我怀疑其他属性有问题。 – lfurini

+0

可能不是(@someValue)返回false,导致像这样的结构在某些引擎中可能导致问题。不知道上面的错误,从来没有测试过它。 –

回答

0

尝试添加​​属性到<svg>元件。

​​(https://www.w3.org/TR/xmlbase/)比XSL 1.1建议书更新。这不应该的问题,因为你是<svg>元素反正被添加到非XSL和​​是SVG 1.1:https://www.w3.org/TR/SVG/struct.html#Core.attrib

FOP为什么不使用基本URI的FO文件为基础的对于SVG -uri是一个谜,所以这可能或可能无法正常工作。

+0

这对我无效。我试过'xml:base =“http://www.example.com”'和'xml:base =“/”'。我使用不正确的值吗? – nmatte