c# - 在中文服务器上生成 PDF 期间的中文本地化会导致打印块
问题描述
我们有一个 ASP.Net MVC 应用程序,我们将其本地化为多种语言。所有语言都直接在 UI 上呈现,包括中文。使用 ExpertPDF 生成 pdf 时,只要充当服务器的操作系统不是中文的,中文 PDF 就可以了(我们尝试过英语、法语、荷兰语、波兰语、西班牙语、德语)。但是,在将操作系统本地化(winsystemlocale)更改为 zh-CN 后,PDF 生成会以某种方式中断。但是,只有 PDF 生成中断,UI 渲染得很好。
当我们使用 ExpertPDF 处理生成的 PDF 的实际内容时,我们没有做任何特别的事情,我们实际上只是传递了现有屏幕的 html 并进行了一些布局更改。
我们一直在为这个挠头。任何帮助表示赞赏。谢谢你。
编辑 在下载损坏的 pdf 和正确的 pdf 后,我们发现嵌入的字体会根据 winsystemlocale 发生变化。当winsystemlocale在zh-CN时,库似乎找不到SimSun字体。
进一步的调查还表明,由于某种原因,一旦 winsystemlocale 位于 zh-CN 中,.NET 就无法再为 PDF 提供正确的后备字体。我们知道 SimSun 字体的显示名称发生了变化,但仍可以使用相同的文本进行初始化。
这是我们用来生成 PDF 的代码
docTitle = string.IsNullOrEmpty(docTitle) ? "DXT Document" : docTitle;
byte[] pdfBytes = null;
PdfConverter converter = CreateConverter();
converter.PdfDocumentInfo.Title = docTitle;
HtmlToPdfArea header = new HtmlToPdfArea(headerHtml, baseURL);
HtmlToPdfArea footer = new HtmlToPdfArea(footerHtml, baseURL);
header.AddPadding = true;
footer.AddPadding = true;
header.FitHeight = true;
header.FitWidth = true;
footer.FitHeight = true;
footer.FitWidth = true;
converter.PdfHeaderOptions.AddHtmlToPdfArea(header);
converter.PdfFooterOptions.AddHtmlToPdfArea(footer);
converter.PdfDocumentOptions.PdfPageOrientation = isLandscape ? PDFPageOrientation.Landscape : PDFPageOrientation.Portrait;
converter.PdfDocumentOptions.FitWidth = true;
converter.PdfDocumentOptions.EmbedFonts = true;
converter.PageWidth = virtualViewWidth;
converter.PdfHeaderOptions.HeaderHeight = headerHeight;
var translated = LocalizationService.GetTranslation<Resources.Apheresis.ProcedureRecords>("Of");
converter.PdfFooterOptions.TextArea = new TextArea(pageNumberXPos, pageNumberYPos, $"&p; {translated} &P;",
new System.Drawing.Font(new System.Drawing.FontFamily("Arial"), 8, System.Drawing.GraphicsUnit.Point));
Document doc = converter.GetPdfDocumentObjectFromHtmlString(contentHtml, baseURL);
doc.OpenAction.Action = new ExpertPdf.HtmlToPdf.PdfDocument.PdfActionJavaScript("print();");
pdfBytes = doc.Save();
解决方案
推荐阅读
- python - 基于 if 语句建立 websocket_client 连接
- pine-script - 强制策略仅在蜡烛收盘时进入交易
- javascript - 以对象作为观察者的观察者模式
- java - 如何获取文本文件值的平均值并将其输出到 JTextArea
- matlab - 在 Matlab 的 Mex 文件 (Fortran) 中初始化稀疏矩阵,并稍后在计算例程中设置它们的属性 (ir, jc, pr)
- python - 熊猫多重条件并获取数据框
- excel - 谷歌表格 - 建立一个到单元格的静态链接
- android - 如何以编程方式将一行添加到 Android 中的 /system/build.prop 文件中?
- django - 在 DRF 中使用 rest-pandas 创建 xlsx 文件
- python - 从具有重复键的多个列表创建字典