首页 > 解决方案 > Itext7 - pdfHTML - 文档 SetMargins 方法不起作用

问题描述

我正在努力Itext7,我遇到了麻烦,Documen无法设置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. 我想知道生成文档后流没有受到影响?

提前致谢。

标签: c#asp.net-mvcitextitext7

解决方案


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

您可能会尝试使用@media printHTML 源代码中的定义或MediaDeviceDescriptionConverterProperties提供给HtmlConverter.ConvertToDocument.

或者,您可以使用HtmlConverter.ConvertToElements而不是HtmlConverter.ConvertToDocument将返回的元素添加到Document您创建的具有您选择的页面大小和边距设置的元素中。

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

关于你的另一个问题

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

是的。但是,严格来说,您应该将byte[]down 的检索移动到如下所示的位置:

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[]检索需要移出。


推荐阅读