【发布时间】:2021-10-02 04:07:15
【问题描述】:
在将 XSLT 转换为 PDF 时,我遇到了特殊“外来”字符的问题。这是我在 C# 中的代码:
XDocument xmlDoc = XDocument.Load("myXml.xml");
XDocument xslt = XDocument.Load("myXSL.xsl");
XsltArgumentList args = new XsltArgumentList();
string str = XmlLinqXsltExtensions.Transform(xmlDoc, xslt, args);
File.WriteAllText("foStr.xml",str);
XslFOPdfOptions xslFoPdfOptions = new XslFOPdfOptions();
xslFoPdfOptions.EnablePrinting = true;
FONetXslFOPdfRenderer foNetXslFoPdfRenderer = new FONetXslFOPdfRenderer(XDocument.Load(("foStr.xml"), xslFoPdfOptions);
byte[] bytes = foNetXslFoPdfRenderer.RenderPdfBytes();
outputStream.Write(bytes, 0, bytes.Length); // bytes contain the PDF
“myXml.xml”采用 UTF-8 格式。它包含一些特殊字符,如“ć”和其他:
样式表“myXSL.xsl”确实包含编码信息:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
中间“foStr.xml”的输出是正确的:
“foStr.xml”编码也是UTF-8。
尽管如此,在 PDF 中,我在输出中得到了替换字符 #:
#ebi-Ili# #nn#
问题:
知道如何让 FONetXslFOPdfRenderer 生成正确的字符吗?
nuget 包的版本:
- PdfTemplating.XslFO.Common: 2.1.0
- PdfTemplating.XslFO.Xslt: 2.0.0
【问题讨论】:
-
代码
string str = XmlLinqXsltExtensions.Transform(xmlDoc, xslt, args);到底是做什么的?字符串str是否带有在开头声明的编码的 XML 声明?File.WriteAllText("foStr.xml",str);是否确保使用声明的编码写入文件? -
我们真的需要看看你的方法
XmlLinqXsltExtensions.Transform的代码。我的猜测是字符串返回的编码与File.WriteAllText方法使用的默认UTF-8 编码之间存在不匹配。这样XDocument.Load(("foStr.xml")就无法正确解码字符。 -
字符串“str”包含生成 PDF 所需的 fo 数据。它的开头也有编码标记:
-
XmlLinqXsltExtensions 是 NuGet 包 PdfTemplating.XslFO.Xslt 的一部分。
-
所以它看起来更像是那个 PDF 渲染器的字体设置问题。不知道那个包是怎么做的,看看你是否可以找到一些选项来确保它使用可以呈现非 ASCII 字符的字体。