首页 > 解决方案 > 在中文服务器上生成 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();

这是屏幕 在此处输入图像描述

这是生成的PDF 在此处输入图像描述

标签: c#asp.net-mvcpdfpdf-generation

解决方案


推荐阅读