itext7-pdfHTML-Document SetMargins方法不起作用

时间:2019-09-30 03:54:46

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

祝您有美好的一天,

我正在使用Itext7,但遇到麻烦。文档无法对此设置宽度/高度,边距。 我已经进行了研究(通过堆栈溢出,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. 我想知道生成文档后流是否不会受到影响?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

或者,您可以使用 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[] 检索需要移出。