IText7-pdfHTML-如何在从HTML到PDF文件的生成中使用SetBold()方法增加笔画宽度

问题描述 投票:-1回答:1

我目前正在将[[ASP.NET MVC(v 4.6.1)和itext.html2pdfv 2.1.5.0)中的HTML文件转换为pdf文件。

[this tutorial提到:

在iText 5中,如果要使用其他大小或颜色的字体,则必须创建另一个Font对象。我们在iText 7中对此进行了更改:您只需要一个PdfFont对象。

setBold()

字体将更改文本的渲染模式并增加笔触宽度。这意味着我们仅在PDF中定义了一种字体。

但是,此示例是非常基本的(仅一个段落),而在我的情况下,必须将其从HTML转换为PDF文件。

到目前为止我尝试过的事情

    包括2种字体(普通字体和粗体),对我来说很好用。但是,
  1. 这种方式使我的pdf文件增加了一倍。
  2. 覆盖GetStrategy方法,但对我不起作用。

    public class FontProviderFactory : DefaultFontProvider { private static readonly string FontPath = HttpContext.Current.Request.PhysicalApplicationPath + "Areas\\font\\msyh.ttf"; private readonly FontProgram _fontProgram; public FontProviderFactory() : this(false, false, false) { } public FontProviderFactory( bool registerStandardPdfFonts, bool registerShippedFreeFonts, bool registerSystemFonts) : base(registerStandardPdfFonts, registerShippedFreeFonts, registerSystemFonts) { _fontProgram = FontProgramFactory.CreateFont(FontPath); AddFont(_fontProgram); } public override FontSelectorStrategy GetStrategy(string text, IList<string> fontFamilies, FontCharacteristics fc, FontSet additonalFonts) { fc.SetBoldFlag(fc.GetFontWeight() == 700); fc.IsBold(); return new ComplexFontSelectorStrategy(text, GetFontSelector(fontFamilies, fc, additonalFonts), this, additonalFonts); } }

所以,

我该如何正确使用SetBold()方法?


我的以下代码片段:

1。 GeneratePdf()方法

private static byte[] GeneratePdf(string htmlString, string rootPath) { using (var stream = new MemoryStream()) { using (var pdfWriter = new PdfWriter(stream)) { using (var pdfDocument = new PdfDocument(pdfWriter)) { pdfDocument.SetDefaultPageSize(PageSize.A4); pdfDocument.SetDefaultPageSize(PageSize.A4.Rotate()); var document = HtmlConverter.ConvertToDocument(htmlString, pdfDocument, GetConverterProperties(rootPath)); document.Close(); return stream.ToArray(); } } } }

2。 GetConverterProperties()方法

private static ConverterProperties GetConverterProperties(string rootPath) { var fontPath = HttpContext.Current.Request.PhysicalApplicationPath + "Areas\\Font\\msyh.ttf"; var defaultFontProvider = new DefaultFontProvider(false, false, false); var fontProgram = FontProgramFactory.CreateFont(fontPath); defaultFontProvider.AddFont(fontProgram); return new ConverterProperties().SetBaseUri(rootPath) .SetFontProvider(defaultFontProvider); // .SetFontProvider(new FontProviderFactory()); Use it when I try to override the GetStrategy method }
有人有什么想法/解决方案吗?

我非常感谢。

c# asp.net-mvc itext itext7 pdfhtml
1个回答
1
投票
无法在您的问题上发表评论,所以我只想在这里问:您打算什么时候使用定制字体?因为在iText 7中,HtmlConverter可以自行获得字体。您唯一需要做的就是创建一个新的ConverterProperties对象,并将基本文件夹URI传递给它。这样做时,转换器将具有必要的上下文,以单独包括字体。我将在下面提供一个简短示例说明需要做的事情:

HTML:

<html><head> <style type="text/css"> @font-face { font-family: MPLUS; src: url('MPLUS1p-Regular.ttf'); } </style> </head> <body> <div style="position:relative;min-height: 297mm;max-height: 297mm;width: 210mm"> <div style="width:100mm;background-color:red"> <p style="text-align:left;font-size:3.52mm;font-family:'MPLUS', sans-serif;line-height:5.56mm">...content...</p> </body> </html>

。NET:

public void manipulatepdf() { ConverterProperties prop = new ConverterProperties(); prop.SetBaseUri("src/main/resources/"); HtmlConverter.ConvertToPdf(HTML,new FileStream(DEST,FileMode.Create),prop); }

当将字体如上所述添加到HTML中,并且使用ConverterProperties设置我们的基本目录时,我们的HtmlConverter将具有必要的上下文来正确地自行解析字体。 

亲切的问候,KaeseKüchen

© www.soinside.com 2019 - 2024. All rights reserved.