使用 Apache FOP Java 库将 FO 转换为 PDF/a [英] FO to PDF/a Conversion with Apache FOP Java Library

查看:34
本文介绍了使用 Apache FOP Java 库将 FO 转换为 PDF/a的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Apache FOP 2.1示例 文档中给出的代码.我设法将 helloworld.fo 文件转换为 PDF,但是,当我尝试将其转换为 PDF/a 文件时,出现此错误:

I'm trying to convert .fo files to PDF/a with Apache FOP 2.1 with the exemple code given in the documentation. I managed to convert the helloworld.fo file into PDF but, when I tried to convert it into PDF/a file I get this error:

org.apache.fop.pdf.PDFConformanceException:对于 PDF/A-1a,所有字体,甚至 14 种基本字体,都必须嵌入!违规字体:/Helvetica

这就是我尝试在 fop.xconf 文件中嵌入字体的原因:<代码>

That's why I tried to embedded fonts in the fop.xconf file:

  <fonts>

    <font kerning="yes" embed-url="C:/Users/thinkpad/workspace/FopConverter/Fonts/arial.ttf" name="Arial">
      <font-triplet name="Arial" style="normal" weight="700"/>
    </font>
    <font kerning="yes" embed-url="C:/Users/thinkpad/workspace/FopConverter/Fonts/arialbd.ttf" name="Arial Bold">
      <font-triplet name="Arial" style="normal" weight="bold"/>
    </font>
    <font kerning="yes" embed-url="C:/Users/thinkpad/workspace/FopConverter/Fonts/ariali.ttf" name="Arial Italique">
      <font-triplet name="Arial" style="italic" weight="700"/>
    </font>
    <font kerning="yes" embed-url="C:/Users/thinkpad/workspace/FopConverter/Fonts/arialbi.ttf" name="Helvetica Bold Italique">
      <font-triplet name="Arial" style="italic" weight="bold"/>
    </font>

    <directory>C:\Users\thinkpad\workspace\FopConverter\Fonts</directory>
    <directory>C:\Users\thinkpad\workspace\FopConverter\Fonts\ghostFonts</directory>

   <substitutions>
     <substitution>
       <from font-family="Helvetica" font-weight="700..900"/>
       <to font-family="Arial"/>
     </substitution>
   </substitutions>
   <auto-detect/>
  </fonts>

但即使这样做我仍然有同样的错误:org.apache.fop.pdf.PDFConformanceException:对于PDF/A-1a,所有字体,甚至是基本的14种字体,都必须嵌入!违规字体:/Helvetica

But even after doing so I still have the same error: org.apache.fop.pdf.PDFConformanceException: For PDF/A-1a, all fonts, even the base 14 fonts, have to be embedded! Offending font: /Helvetica

我还尝试通过在中添加 font-family="Helvetica" font-weight="normal" font-style="normal" 来修改 helloworld.fo 因为一些 论坛主题 说这样做,但它没有改变任何东西.

I also tried to modify the helloworld.fo by adding font-family="Helvetica" font-weight="normal" font-style="normal" in the <fo:root"> because some forum topic said to do so but it didn't changed anything.

请帮助我解决嵌入字体错误.感谢阅读本主题.

Please, help me in solving my embedding font error. Thank for reading this topic.

:这是整个错误消息:

FOP ExampleFO2PDF

Preparing...
Input: XSL-FO (.\xml\fo\helloworld.fo)
Output: PDF (.\out\ResultFO2PDF.pdf)

Transforming...
août 07, 2017 11:26:49 AM org.apache.fop.events.LoggingEventListener processEvent
INFOS: Rendered page #1.
org.apache.fop.pdf.PDFConformanceException: For PDF/A-1b, all fonts, even the base 14 fonts, have to be embedded! Offending font: /Helvetica
    at org.apache.fop.pdf.PDFFont.validate(PDFFont.java:170)
    at org.apache.fop.pdf.PDFFont.output(PDFFont.java:179)
    at org.apache.fop.pdf.PDFDocument.outputIndirectObject(PDFDocument.java:1053)
    at org.apache.fop.pdf.PDFDocument.streamIndirectObject(PDFDocument.java:1018)
    at org.apache.fop.pdf.PDFDocument.output(PDFDocument.java:994)
    at org.apache.fop.pdf.PDFDocument.outputTrailer(PDFDocument.java:1097)
    at org.apache.fop.render.pdf.PDFDocumentHandler.endDocument(PDFDocumentHandler.java:191)
    at org.apache.fop.render.intermediate.util.IFDocumentHandlerProxy.endDocument(IFDocumentHandlerProxy.java:187)
    at org.apache.fop.render.intermediate.IFRenderer.stopRenderer(IFRenderer.java:295)
    at org.apache.fop.area.RenderPagesModel.endDocument(RenderPagesModel.java:265)
    at org.apache.fop.area.AreaTreeHandler.endDocument(AreaTreeHandler.java:342)
    at org.apache.fop.fo.FOTreeBuilder.endDocument(FOTreeBuilder.java:170)
    at org.apache.xalan.transformer.TransformerIdentityImpl.endDocument(TransformerIdentityImpl.java:963)
    at org.apache.xerces.parsers.AbstractSAXParser.endDocument(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl.endEntity(Unknown Source)
    at org.apache.xerces.impl.XMLEntityManager.endEntity(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.skipSpaces(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$TrailingMiscDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:485)
    at ConverterFO2PDFa.convertFO2PDF(ConverterFO2PDFa.java:104)
    at ConverterFO2PDFa.main(ConverterFO2PDFa.java:154)

推荐答案

经过一些更改后,我能够使用相同的示例文件创建 PDF/A 输出:

I was able to create a PDF/A output using the same example files after a few changes:

  1. 输入 FO 文件中,我明确添加了 font-family="Helvetica"(或您最喜欢的字体系列)在它影响所有的位置正文

  1. in the input FO file, I explicitly added font-family="Helvetica" (or your favourite font family) in a position where it effected all the text

没有这个,即使 FOP 在没有设置 font-family 时默认使用 Helvetica,它显然也无法找到它的配置.

Without this, even if FOP defaults to using Helvetica when no font-family is set, it apparently is not able to find a configuration for it.

配置文件中,我将 Helvetica 字体系列映射到现有字体,例如 Arial

in the configuration file, I mapped the Helvetica font family to an existing font, for example Arial

<font kerning="yes" embed-url="/Library/Fonts/arial.ttf">
  <font-triplet name="Helvetica" style="normal" weight="normal"/>
</font>

  • Java 代码中,我将 FOP 配置为使用我的配置文件,并配置用户代理以启用可访问性

  • in the Java code, I configured FOP to use my configuration file, and the user agent to enable accessibility

    import org.apache.avalon.framework.configuration.Configuration;
    import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
    import org.apache.fop.apps.FopFactoryBuilder;
    
    ...
    DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
    Configuration cfg = cfgBuilder.buildFromFile(new File("/Users/lfurini/fop.xconf"));
    FopFactoryBuilder fopFactoryBuilder = new FopFactoryBuilder(new File(".").toURI()).setConfiguration(cfg);
    FopFactory fopFactory = fopFactoryBuilder.build();
    
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    // configure foUserAgent as desired
    foUserAgent.setAccessibility(true);
    foUserAgent.getRendererOptions().put("pdf-a-mode", "PDF/A-1b");
    ...
    

  • 这篇关于使用 Apache FOP Java 库将 FO 转换为 PDF/a的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆