不引入中文字体,导出的pdf文件中的中文不会正常显示,网上的引入中文字体的方式很多都直接读取本地文件“C:\Windows\Fonts”,这样写死了很容易出错。
解决方法是把字体文件放到项目中的Properties.Resources下,资源文件都放在指定目录也符合良好编程习惯。
右击Properties,点击“新建项”,添加资源文件
选择上传“其他”类型的资源,点击“添加资源”上传字体文件。
会在项目中自动创建Resources文件夹,从里面找到添加的字体文件,右击编辑属性,选择“始终复制”。
这样项目运行后字体文件就会出现在项目运行目录bin/Debug/Resources中
然后通过Directory.GetCurrentDirectory()方法获取应用程序的当前工作目录,后面再拼接上字体的目录。
代码如下:
/// <summary> /// 导出Pdf /// </summary> /// <param name="localFilePath">文件保存路径</param> /// <param name="dtSource">数据源</param> private void ExportPDF(string localFilePath, DataTable dtSource) { string path = Directory.GetCurrentDirectory();//获取应用程序的当前工作目录 BaseFont bf = BaseFont.CreateFont(path+ "\\Resources\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//添加中文字体 Font font = new Font(bf); iTextSharp.text.Document pdf = new iTextSharp.text.Document(PageSize.A4.Rotate()); PdfPTable table = new PdfPTable(dtSource.Columns.Count); table.HorizontalAlignment = Element.ALIGN_CENTER; PdfPCell cell; for (int i = 0; i < dtSource.Rows.Count + 1; i++) { for (int j = 0; j < dtSource.Columns.Count; j++) { if (i == 0) { cell = new PdfPCell(new Phrase(dtSource.Columns[j].ColumnName, font)); } else { cell = new PdfPCell(new Phrase(dtSource.Rows[i - 1][j].ToString(), font)); } table.AddCell(cell); } } using (FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write)) { PdfWriter.GetInstance(pdf, fs); pdf.Open(); pdf.Add(table); pdf.Close(); } }
对外的方法:
/// 导出文档 /// </summary> /// <param name="path">文件保存路径</param> /// <param name="dtSource">数据源</param> /// /// <param name="FileName">默认文件名称</param> public void Export(DataTable dtSource,string FileName) { try { SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Filter = "Excel|*.xls|TXT|*.txt|PDF|*.pdf"; fileDialog.FileName = FileName+"-"+DateTime.Now.ToString("D"); if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) { return; } string FileSavePath = fileDialog.FileName; switch (fileDialog.FilterIndex) { case 1: ExportXls(FileSavePath, dtSource); //导出xls break; case 2: ExportTxt(FileSavePath, dtSource); //导出txt break; case 3: ExportPDF(FileSavePath, dtSource); //导出pdf break; case 4: ExportDocx(FileSavePath, dtSource); //导出docx break; } MessageBox.Show("文件 "+ FileSavePath + " 导出成功"); } catch(Exception e){ MessageBox.Show("导出文件失败,请稍后重新尝试"+ e); } }
需要其他几种导出方法可在评论区回复。