PDF 中未显示字形
Glyph not shown in 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>
我还能做些什么?这对我来说是新的,并且已经在 Whosebug 中看到了一些类似的线程,但其中 none 确实有帮助。
编辑:快速更新,也许根本没有使用 xconf?因为我已经从那里删除了所有内容并且没有任何变化,因为我正在尝试添加 FreeSerif 但是 none 发生了..
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 文件?也许如果我使用它,就足够了...?
好的,我明白了。
这是我的 fop.xconf 文件被忽略了,我的意思是,我在创建 pdf 时使用了默认值。所以要修复它只需编辑以下文件:
fop.xconf
...
<fonts>
<auto-detect/>
</fonts>
...
file.xsl
<fo:root font-family="Arial">
<!-- rest of document -->
</fo:root
FopFactoryWithUserAgentAndTransformerFactoryService.java
//get the fop.xconf file to be read by the app
final URL uri = getClass()
.getClassLoader()
.getResource("/pdf/fopfactorybasedir/fop.xconf");
try{
if(uri != null){
fopFactory = FopFactory.newInstance(new File(uri.getFile()));
foUserAgent = fopFactory.newFOUserAgent();
transformerFactory = TransformerFactory.newInstance();
}
}catch (SAXException | IOException e)
{
e.printStackTrace();
}
有了这个我就注入了 xconf 文件!所以请记住,始终检查应用程序是否正在读取 xconf 文件!
在基于特定系统的信息创建 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>
我还能做些什么?这对我来说是新的,并且已经在 Whosebug 中看到了一些类似的线程,但其中 none 确实有帮助。
编辑:快速更新,也许根本没有使用 xconf?因为我已经从那里删除了所有内容并且没有任何变化,因为我正在尝试添加 FreeSerif 但是 none 发生了..
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 文件?也许如果我使用它,就足够了...?
好的,我明白了。 这是我的 fop.xconf 文件被忽略了,我的意思是,我在创建 pdf 时使用了默认值。所以要修复它只需编辑以下文件:
fop.xconf
...
<fonts>
<auto-detect/>
</fonts>
...
file.xsl
<fo:root font-family="Arial">
<!-- rest of document -->
</fo:root
FopFactoryWithUserAgentAndTransformerFactoryService.java
//get the fop.xconf file to be read by the app
final URL uri = getClass()
.getClassLoader()
.getResource("/pdf/fopfactorybasedir/fop.xconf");
try{
if(uri != null){
fopFactory = FopFactory.newInstance(new File(uri.getFile()));
foUserAgent = fopFactory.newFOUserAgent();
transformerFactory = TransformerFactory.newInstance();
}
}catch (SAXException | IOException e)
{
e.printStackTrace();
}
有了这个我就注入了 xconf 文件!所以请记住,始终检查应用程序是否正在读取 xconf 文件!