首页 > 解决方案 > PDF 中未显示字形

问题描述

在基于特定系统的信息创建 PDF 文档时,使用 fop,我无法显示特殊字符,显示“#”而不是字符,并在创建 pdf 时给我这个警告。

12:49:18,637 WARN  [org.apache.fop.apps.FOUserAgent] (default task-3) Glyph "?" (0x11f, gbreve) not available in font "Helvetica".
12:49:18,640 WARN  [org.apache.fop.apps.FOUserAgent] (default task-3) Glyph "?" (0x15e, Scedilla) not available in font "Helvetica".
12:49:19,041 INFO  [org.apache.fop.apps.FOUserAgent] (default task-3) Rendered page #1.
12:49:19,203 WARN  [org.apache.fop.apps.FOUserAgent] (default task-3) Glyph "?" (0x11f, gbreve) not available in font "Helvetica-Bold".
12:49:19,206 WARN  [org.apache.fop.apps.FOUserAgent] (default task-3) Glyph "?" (0x15e, Scedilla) not available in font "Helvetica-Bold".

我已经在 .xsl 中更改了字体系列,但没有任何进展,现在它是这样的,我认为这使用了 fop.xconf,它包含所有字体和类型。

 <!-- Helvetica -->
        <font>
          <afp-font name="Helvetica" type="raster" codepage="T1V10500" encoding="Cp500">
....
</font>

和.xsl:

<fo:block-container absolute-position="absolute" left="25mm" top="42mm" width="160mm" height="100mm"
                                        background-color="rgb(178,178,178)">
                        <fo:block color="white" font-size="29pt">
                            <fo:inline font-weight="bold">PDF</fo:inline> Report <xsl:value-of select="year"/>
                        </fo:block>
                        <fo:block color="white" font-size="16pt" margin-top="3mm">
                            <xsl:value-of select="name"/>
                        </fo:block>
                        <fo:block color="white" font-size="16pt">
                            <xsl:value-of select="address"/>
                        </fo:block>
                    </fo:block-container>

我还能做什么?这对我来说是新的,并且已经在 Stackoverflow 中看到了一些类似的线程,但它们都没有真正帮助。

编辑:快速更新,也许根本没有使用 xconf?因为我已经从那里删除了所有内容并且没有任何变化,因为我正在尝试添加 FreeSerif 但没有发生..

标签: apache-fop

解决方案


lfurini,我看到了你的旧答案,我被困在第 2 步,因为我没有那个 'conf' 目录。我在一个 Java 程序上使用它,我在 src/main/resources/pdf/fopfactorybasedir 里面得到它我有一个文件夹来显示我的 pdf 和 fop.xconf 文件中的图像(我在任何地方都找不到在代码中..这就是为什么我说根本没有使用..)这是我的代码..

FopFactoryWithUserAgentAndTransformerFactoryService

@ApplicationScoped
        public class FopFactoryWithUserAgentAndTransformerFactoryService {
            private static final Logger LOG = 
    LoggerFactory.getLogger(FopFactoryWithUserAgentAndTransformerFactoryService.class);
            private static final String ROOT_PATH = "/pdf/fopfactorybasedir/";
            private final FopFactory fopFactory;
            private final FOUserAgent foUserAgent;
            private final TransformerFactory transformerFactory;

            public FopFactoryWithUserAgentAndTransformerFactoryService() throws URISyntaxException {
                final URI uri = FopFactoryWithUserAgentAndTransformerFactoryService.class.getResource(ROOT_PATH).toURI();
                LOG.info("fopBaseUri={}", uri);
                fopFactory = FopFactory.newInstance(uri);
                foUserAgent = fopFactory.newFOUserAgent();
                transformerFactory = TransformerFactory.newInstance();
            }

            public FopFactory getFopFactory() {
                return fopFactory;
            }
        public Fop newFop(final String outputFormat, final OutputStream out) throws FOPException {
                return fopFactory.newFop(outputFormat, foUserAgent, out);
            }
            ...

PDF工厂:

@ApplicationScoped
public class PdfFactory {

@Inject
private FopFactoryWithUserAgentAndTransformerFactoryService fopFactoryEtAl;

public PdfFactory() {

}

public PdfFactory(final FopFactoryWithUserAgentAndTransformerFactoryService fopFactoryEtAl) {
    this.fopFactoryEtAl = fopFactoryEtAl;
}
public ByteArrayDto generatePdfFromModelObject(final Object model, final String xslFileName)
....

问题是,我如何使用我的 fop.xconf 文件?也许如果我使用它,就足够了......?


推荐阅读