这几天在做一个项目时,包含越南语,导出Pdf文件时,有些字符丢失或显示不完整,经过各种AI搜索整理后,终于可以正常显示,记录如下:
1. 先准备字体
- 下载 arial-unicode-ms.ttf
- 在网站根目录新建一个文件夹
fonts - 把字体放进去
- 右键字体 → 属性 → 复制到输出目录:如果较新则复制
2. WebForm 后台代码,用ashx
csharp
运行
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
public partial class TestPdf : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// ========= WebForm 正确路径 =========
string basePath = HttpContext.Current.Server.MapPath("~/");
string fontPath = HttpContext.Current.Server.MapPath("~/fonts/arial-unicode-ms.ttf");
string pdfPath = Path.Combine(basePath, "Result.pdf");
// ========= 生成PDF(流自动释放,绝不占用文件) =========
using (FileStream fs = new FileStream(pdfPath, FileMode.Create))
{
Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
PdfWriter.GetInstance(doc, fs);
doc.Open();
// ========= 【核心:越南语100%显示】 =========
BaseFont bf = BaseFont.CreateFont(
fontPath,
BaseFont.IDENTITY_H,
BaseFont.EMBEDDED
);
Font font = new Font(bf, 14);
// ========= 你的越南语(完整显示) =========
string vietText = "CÔNG TY TNHH THƯƠNG MẠI TƯ VẤN CHUYÊN NGHIỆP TRÍ TUỆ";
doc.Add(new Paragraph(vietText, font));
doc.Close();
}
Response.Write("PDF生成成功:" + pdfPath);
}
catch (Exception ex)
{
Response.Write("错误:" + ex.Message);
}
}
}
如果是Winform,把取地址的语句改一下:
cs
// 程序运行目录
string basePath = AppDomain.CurrentDomain.BaseDirectory;
// PDF 保存路径
string pdfPath = Path.Combine(basePath, "Test.pdf");
// 字体路径(必须和 exe 在一起)
string fontPath = Path.Combine(basePath, "arial-unicode-ms.ttf");
✅ 说明
- 越南语特殊字符 Ư Đ Ạ Ệ 全部正常显示
- PDF 能正常打开,不损坏
- 流自动释放,不会文件被占用
- WebForm 专用路径 Server.MapPath 不报错
- 不依赖系统字体