Blazor C#(.NET 6)生成含希伯来文及图片的可下载PDF问题
解决方案:Blazor .NET 6 生成含希伯来文与图片的可下载PDF
服务器端:修复iTextSharp字体问题
你遇到的字体编码问题是因为未正确嵌入支持希伯来文的字体并指定对应编码,按以下步骤处理:
嵌入Assistant字体
- 将Assistant的
.ttf文件加入项目,设置文件属性为「复制到输出目录 = 始终复制」。 - 加载字体时指定
IDENTITY_H编码(专门支持非拉丁字符集):var fontPath = Path.Combine(Directory.GetCurrentDirectory(), "Fonts", "Assistant-Regular.ttf"); var baseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); var hebrewFont = new iTextSharp.text.Font(baseFont, 12);
- 将Assistant的
处理希伯来文排版
希伯来文为从右到左书写,需设置段落的方向和对齐方式:var hebrewParagraph = new Paragraph("טקסט עברי", hebrewFont); hebrewParagraph.Alignment = Element.ALIGN_RIGHT; hebrewParagraph.RunDirection = PdfWriter.RUN_DIRECTION_RTL; document.Add(hebrewParagraph);添加图片到PDF
直接加载图片文件或字节流,调整尺寸后加入文档:var image = Image.GetInstance(Path.Combine(Directory.GetCurrentDirectory(), "Images", "demo.png")); image.ScaleToFit(500, 500); document.Add(image);返回下载流
生成PDF后通过FileStreamResult提供给客户端下载:public IActionResult GetPdf() { var stream = new MemoryStream(); // 执行PDF生成逻辑并写入stream stream.Position = 0; return new FileStreamResult(stream, "application/pdf") { FileDownloadName = "hebrew-document.pdf" }; }
客户端:用JS生成PDF(无需.NET库)
如果服务器端方案受限,可采用前端开源库jsPDF+html2canvas实现:
引入JS库
在_Host.cshtml(Server Blazor)或index.html(WASM Blazor)中添加:<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>转换并注册Assistant字体
将Assistant的.ttf字体转换为jsPDF支持的JS格式(用本地转换工具处理),然后在JS中注册:const { jsPDF } = window.jspdf; // 假设转换后的字体数据已存入assistantFont变量 jsPDF.API.addFileToVFS('Assistant-Regular.ttf', assistantFont); jsPDF.API.addFont('Assistant-Regular.ttf', 'Assistant', 'normal');Blazor调用JS生成PDF
创建JS隔离文件pdfUtils.js:export function generatePdf() { const doc = new jsPDF('p', 'mm', 'a4'); doc.setFont('Assistant'); // 写入希伯来文(右对齐) doc.text('טקסט עברי', 190, 20, { align: 'right' }); // 转换DOM中的图片并添加到PDF html2canvas(document.getElementById("pdf-image-container")).then(canvas => { doc.addImage(canvas.toDataURL('image/png'), 'PNG', 10, 30, 190, 0); doc.save('hebrew-pdf.pdf'); }); }在Blazor组件中调用:
[Inject] IJSRuntime JsRuntime { get; set; } private async Task DownloadPdf() { await JsRuntime.InvokeVoidAsync("generatePdf"); }
关键注意事项
- 服务器端要确保字体文件路径正确,避免部署时出现找不到字体的情况。
- 客户端生成时,DOM中的希伯来文需设置
direction: rtl样式,保证排版符合从右到左的阅读习惯。
内容的提问来源于stack exchange,提问作者Ido Sherman
相关产品推荐
相关产品推荐

