【问题标题】:Itext7 - pdfHTML - Document SetMargins method is not workingItext7 - pdfHTML - 文档 SetMargins 方法不起作用
【发布时间】:2020-01-29 08:39:41
【问题描述】:

我正在处理Itext7,我遇到了麻烦Document 无法在此设置Width/HeightMargin。 我已经研究过(通过堆栈溢出、itext7_pdfHTML 电子书等),但还没有找到解决方案。

    public static byte[] GeneratePdf(string rootPath, string htmlString)
    {
        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.SetMargins(1,2,3,4);
                    document.Close();

                    return stream.ToArray();
                }
            }
        }
    }

谁能告诉我我错过了什么?

我有以下几个问题:

  1. 对象顺序(我的意思是 MemoryStream -> PdfWriter -> pdfDocument)是正确的,不是吗?
  2. 我想知道生成文档后流没有受到影响?

提前致谢。

【问题讨论】:

  • document.SetMargins 更改即将到来的页面的边距,而不是已经生成的页面。我不确定最好的解决方案是什么,但可以选择使用 @media print 定义。
  • 感谢您的回复,我会检查它。顺便说一句,我不知道为什么我的字体被包括在内,但不是粗体字。此外,我的 CSS 没有按预期工作(我之前使用过 ItextSharp(又名 itext5,这个对我来说很好)。
  • 如果 iText 5 更好地处理了您的 HTML 和 CSS,您可能希望将其作为一个专门的问题。
  • 不幸的是,我对 html-to-pdf 的东西并不是很深入,所以我没有直接的想法。不过,我已经标记了这个问题。如果我有空余时间,我可能会对此进行调查。
  • 嗨@mkl,您能否给我答案,然后我可以将其标记为已解决?我真的很感谢你的帮助。谢谢,先生。

标签: c# asp.net-mvc itext itext7


【解决方案1】:

document.SetMargins 更改即将到来的页面的边距,而不是已经生成的页面。这解释了为什么您在调用 HtmlConverter.ConvertToDocument 后设置边距不会影响转换结果。

您可以尝试使用 HTML 源代码中的 @media print 定义或提供给 HtmlConverter.ConvertToDocumentConverterProperties 中的 MediaDeviceDescription 对象。

或者,您可以使用HtmlConverter.ConvertToElements 代替HtmlConverter.ConvertToDocument,并将返回的元素添加到您使用您选择的页面大小和边距设置创建的Document

哪种方法最好,取决于您的任务细节,例如关于您是否可以轻松影响 HTML 源代码中的@media print 定义。

关于您的其他问题

对象顺序(我的意思是 MemoryStream -> PdfWriter -> pdfDocument)是正确的,不是吗?

是的,是的。不过,严格来说,您应该将byte[] 的检索下移一点,如下所示:

using (var stream = new MemoryStream())
{
    using (var pdfWriter = new PdfWriter(stream))
    using (var pdfDocument = new PdfDocument(pdfWriter))
    {
        [...]
    }
    return stream.ToArray();
}

在你的代码中,它可以保留在你最里面的using,因为你在document.Close()之后调用它,它调用pdfDocument.Close,它又调用pdfWriter.Close;但是,如果在其他代码中您没有明确关闭事物并依靠 using 为您执行此操作,那么 byte[] 检索需要移出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多