搜索页 2024-06-05 13:24 采纳率: 61.5%
浏览 11

Blazor Server 导出PDF

包引用:

img

问题描述:
引用iText 7包导出PDF时如何显示中文字体?有列头进行本地化翻译。

导出代码:

 public static async Task ExportToPdfAsync(IJSRuntime JS, List<Dictionary<string, object>> lsTableSource, IStringLocalizer _translator, string fileName)
 {
     try
     {
         using var ms = new MemoryStream();
         using (var writer = new PdfWriter(ms))
         {
             var pdf = new PdfDocument(writer);
             var document = new Document(pdf, PageSize.A4);

             // 添加标题
             document.Add(new iText.Layout.Element.Paragraph(fileName).SetFontSize(20));

             // 添加数据
             foreach (var row in lsTableSource)
             {
                 foreach (var keyValue in row)
                 {
                     var columnName = _translator[keyValue.Key]; // 通过 _translator 获取翻译后的列名
                     var value = keyValue.Value?.ToString() ?? "";

                     // 将数据按照指定格式添加到文档中
                     document.Add(new iText.Layout.Element.Paragraph($"{columnName}: {value}").SetFontSize(12));
                 }
                 // 添加换行
                 document.Add(new iText.Layout.Element.Paragraph("\n"));
             }

             document.Close();
         }

         // 复制数据到新的 MemoryStream 对象
         byte[] pdfBytes = ms.ToArray();
         using var msCopy = new MemoryStream(pdfBytes);

         // 将 PDF 数据保存到内存中,并准备下载
         msCopy.Position = 0;
         byte[] pdfCopyBytes = msCopy.ToArray();

         await JS.InvokeVoidAsync("downloadPdf", pdfCopyBytes, fileName);
     }
     catch (Exception ex)
     {
         // Debug异常
         Console.WriteLine($"导出 PDF 文件时出现异常:{ex.Message}");
         
     }
 }

效果图:没有获取到中文字体翻译实际上Debug是有翻译的。

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-05 13:24
    关注

    引自免费微信小程序:皆我百晓生

    在使用iText 7库进行PDF导出时,为了确保中文字体正常显示,你需要做两件事:首先,在文档初始化阶段设置字体源,其次,确保你的文本包含正确的Unicode字符。这里是一个修改过的版本,包含了设置字体的步骤:

    首先,下载并引入思源黑体(Noto Sans CJK)字体文件,这是一个支持多种语言的开源字体,包括中文。将字体文件(例如noto-sans-cjk-cn.ttc)放置在项目的合适位置,比如wwwroot/fonts目录下。

    然后,在代码中添加以下部分来加载字体并应用到文档中:

    using System.IO;
    using iText.Kernel.Font;
    
    // ...
    
    public static async Task ExportToPdfAsync(IJSRuntime JS, List<Dictionary<string, object>> lsTableSource, IStringLocalizer _translator, string fileName)
    {
        try
        {
            // 加载字体
            var fontFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "fonts");
            var notoSansCjkFontPath = Path.Combine(fontFolder, "noto-sans-cjk-cn.ttc");
            var fontProgram = FontProgramFactory.CreateFont(notoSansCjkFontPath);
            var baseFont = BaseFont.CreateFont(fontProgram, BaseFont.IDENTITY_H, true); // 使用嵌入字体
    
            // 设置字体工厂
            var fontFactory = new FontFactory();
            fontFactory.Register(baseFont);
    
            using var ms = new MemoryStream();
            using (var writer = new PdfWriter(ms))
            {
                var pdf = new PdfDocument(writer);
                var document = new Document(pdf, PageSize.A4);
    
                // 设置默认字体
                document.SetDefaultFont(fontFactory.GetFont());
    
                // 添加标题
                document.Add(new Paragraph(fileName).SetFontSize(20));
    
                // 添加数据
                foreach (var row in lsTableSource)
                {
                    foreach (var keyValue in row)
                    {
                        var columnName = _translator[keyValue.Key];
                        var value = keyValue.Value?.ToString() ?? "";
    
                        // 将数据按照指定格式添加到文档中
                        document.Add(new Paragraph($"{columnName}: {value}").SetFontSize(12));
                    }
                    // 添加换行
                    document.Add(new Paragraph("\n"));
                }
    
                document.Close();
            }
    
            // ...
        }
        catch (Exception ex)
        {
            // ...
        }
    }
    

    这段代码会从指定的路径加载思源黑体字体,并将其注册到字体工厂。接着,将这个工厂用于设置文档的默认字体,这样所有的文本都会使用这个支持中文的字体。

    注意:上述代码假定你已经正确地设置了IStringLocalizer并能正确翻译中文列名。如果你的翻译功能有问题,你需要检查这部分的实现。此外,确保你的项目中包含思源黑体字体文件,并且路径是正确的。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月5日

悬赏问题

  • ¥15 Pyqt 如何正确的关掉Qthread,并且释放其中的锁?
  • ¥30 网站服务器通过node.js部署了一个项目!前端访问失败
  • ¥15 WPS访问权限不足怎么解决
  • ¥15 java幂等控制问题
  • ¥15 海湾GST-DJ-N500
  • ¥15 氧化掩蔽层与注入条件关系
  • ¥15 Django DRF 如何反序列化得到Python对象类型数据
  • ¥15 多数据源与Hystrix的冲突
  • ¥15 如何在线硕士了解,广告太多,希望有真实接触过的人回答下?(标签-学习|关键词-在线硕士)
  • ¥15 zabbix6.4与frp如何进行联动