FastReport+iText7生成PDF文件

linux FastReport pdf 中文字符缺失

近日在linux下配置net core 项目,在使用FastReport.OpenSource.Export.PdfSimple生成PDF时,

生成的PDF部分中文会出现字符丢失。比如“数量”只剩下一个“数”,各种安装字体调试无果,便更换了PDF生成工具iText7,使用了墙外一个示例,表示墙裂感谢!

Yusuf Bal 这位老哥的代码,非常详细。

辅助类,增加了一个转pdf的方法,iText7 Pagesize 使用的是英寸,转了一下

/// <summary>
	/// 使用itext7导出pdf
	/// </summary>
	public static class iText7Utils
	{
		public const int PageDivProperty = -10;
		public const float Inch = 2.834645f;

		/// <summary>
		/// 导出pdf
		/// </summary>
		/// <param name="report">Fastreport对象Report</param>
		/// <param name="filePdf">导出文件绝对路径</param>
		public static void ExportPdf(Report report, string filePdf)
		{
			PageSize pageSize = PageSize.A4;

			foreach (var item in report.AllObjects)
			{
				if (item is ReportPage rptPage)
				{
					//英寸换算
					pageSize = new PageSize(rptPage.PaperWidth* Inch, rptPage.PaperHeight* Inch);
					break;
				}
			}
			string html;
			using (MemoryStream ms = new MemoryStream())
			{
				HTMLExport htmlExport = new HTMLExport();
            	htmlExport.SinglePage = false; // Single page report
				htmlExport.Navigator = true; // Top navigation bar
				htmlExport.EmbedPictures = true; // Embeds images into a document
				htmlExport.Layers = true;
				htmlExport.Export(report, ms);
				ms.Flush();
				html = Encoding.UTF8.GetString(ms.ToArray());
			}
			using (var workStream = new MemoryStream())
			{
				using (var pdfWriter = new PdfWriter(workStream))
				{
					FontProvider fontProvider = new DefaultFontProvider(true, true, true);
					var convpro = new ConverterProperties();
					convpro.SetTagWorkerFactory(new CustomTagWorkerFactory());
					convpro.SetFontProvider(fontProvider);
					var pdfDocument = new PdfDocument(pdfWriter);
					pdfDocument.SetDefaultPageSize(pageSize);
					var elements = HtmlConverter.ConvertToElements(html, convpro);
					var document = new Document(pdfDocument, pageSize);
					document.SetMargins(0, 0, 0, 0);
					int elIndex = 0;
					foreach (var item in elements)
					{
						if (item.HasProperty(iText7Utils.PageDivProperty) && elIndex > 0)
						{
							document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
						}
						document.Add((IBlockElement)item);
						elIndex++;

					}
					document.Close();
					File.WriteAllBytes(filePdf, workStream.ToArray());
				}
			}
		}
	}

搞一个Factory,主要是为了解析html,英语好的大神可以看原文

 public class CustomTagWorkerFactory : DefaultTagWorkerFactory
    {
        public override ITagWorker GetCustomTagWorker(IElementNode tag, ProcessorContext context)
        {
            if (TagConstants.DIV.Equals(tag.Name().ToLower()))
            {
                return new CustomPageTagWorker(tag, context);
            }
            return base.GetCustomTagWorker(tag, context);
        }
    }
public class CustomPageTagWorker : DivTagWorker
	{
		public CustomPageTagWorker(IElementNode element, ProcessorContext context) : base(element, context)
		{
		}

		public override void ProcessEnd(IElementNode element, ProcessorContext context)
		{
			base.ProcessEnd(element, context);
			IPropertyContainer elementResult = GetElementResult();
			if (elementResult != null && !String.IsNullOrEmpty(element.GetAttribute(AttributeConstants.CLASS)) && element.GetAttribute(AttributeConstants.CLASS).StartsWith("frpage"))
			{
				elementResult.SetProperty(iText7Utils.PageDivProperty, element.GetAttribute(AttributeConstants.CLASS));
			}
		}
	}

使用时直接

 iText7Utils.ExportPdf(report, tempFile);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值