Itext7 - pdfHTML - 文档 SetMargins 方法不起作用

Itext7 - pdfHTML - Document SetMargins method is not working

我正在研究 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. 我想知道生成文档后流没有受到影响吗?

提前致谢。

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

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

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

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

关于你的其他问题

The object order (I mean MemoryStream -> PdfWriter -> pdfDocument) is correct, isn't it?

是的,是的。不过,严格来说,您应该将 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[] 检索需要移出。