【问题标题】:Set line spacing when using XMLWorker to parse HTML to PDF - ITextSharp C#使用 XMLWorker 将 HTML 解析为 PDF 时设置行距 - ITextSharp C#
【发布时间】:2015-05-31 04:33:35
【问题描述】:

我正在使用 XMLWorker 将 HTML 字符串解析为 PDF 文档,但找不到控制正在生成的 PDF 的行距的方法。

Document document = new Document(PageSize.LETTER, 72f, 72f, 108f, 90f);
MemoryStream stream1 = new MemoryStream();
PdfWriter pdfWriter = PdfWriter.GetInstance(document, stream1);

document.Open();

//parse HTML into document
XMLWorkerHelper.GetInstance().ParseXHtml(pdfWriter, document, new StringReader(summary.Content));

“summary.Content”是来自数据库字段的 HTML 字符串。

现在,我最近将我们的 ITextSharp 库升级到了 5.5.5.0,并升级到了新的 XMLWorker 库。使用上面的代码,行间距(PDF 中的“前导”)比之前生成的 PDF 小得多。我需要确保行距看起来和以前一样。

我读到我可以在我构建的段落上设置前导,但这在简单地调用 ParseXHtml() 时对我没有帮助。我读到 ITextSharp 默认的前导大小是字体大小的 1.5 倍。

我在这里读到itextsupport documentation,我可以使用这一行来使用 XML Worker 附带的 default.css。

CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);

我认为默认 CSS 可能会生成与我的旧 PDF 具有相同前导的 PDF,但以下代码导致的输出 PDF 与我仅使用 ParseXHtml() 时相同。

var sr = new StringReader(summary.Content);

HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, pdfWriter)));

XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser xmlParse = new XMLParser(true, worker);

document.Open();

xmlParse.Parse(sr);

我需要控制我生成的 PDF 文档中的行高(行距、行距)。谁能帮我指出正确的方向?我正在尝试解决一些选项。这些都有意义吗?

  • 在定义不同 HTML 标记的行高的目录中创建一个 CSS 文件,使用流读取该文件,并将其传递给 parseXHtml(PdfWriter writer, Document doc, InputStream in, InputStream inCssFile)
  • 为我的文档定义一个指定行高的字体?我看了看,但没有找到方法。

【问题讨论】:

    标签: c# css pdf itextsharp xmlworker


    【解决方案1】:

    如果您想为不同的段落设置不同的行高,您必须在 CSS 中为 line-height 属性定义不同的值。我用一些非常简单的内联 CSS 做了一个非常简单的例子:

    如您所见,以 Non eram nescius 开头的段落的行高为 16pt。因为我使用的是 12 pt Helvetica 的默认字体。该段落看起来不错。

    对于以 Contra quos omnis 开头的段落,我使用 25pt 的行高,你会看到行之间有很大的间隙。

    对于以 Sive enim ad 开头的段落,我使用 13pt 的行高,仅比字体高度高 1 pt。这一段的线条非常接近。

    在哪里定义 line-height 并不重要。您的选择是在标记中、在 HTML 的 <head> 部分或在从 HTML 的标头引用或单独加载到 XML Worker 的外部 CSS 文件中定义它。你最喜欢什么都可以。

    【讨论】:

    • 感谢 Bruno,我最终使用了一个外部 CSS 文件来设置适当的行高,并将其加载到 XML Worker 中。最初我在连续的段落标签都呈现在彼此之上时遇到了一些问题,但我认为我的 HTML 字符串有一些不正确的地方,而不是 ITextSharp 的问题。
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多