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);