祝您有美好的一天,
我正在使用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();
}
}
}
}
任何人都可以告诉我我所缺少的吗?
我有以下一些问题:
谢谢。
答案 0 :(得分:1)
document.SetMargins
更改即将到来的页面的页边距,而不是已生成的页边距。这解释了为什么您在 HtmlConverter.ConvertToDocument
调用后设置边距不会影响转换结果。
您可以改为尝试使用 HTML 源代码中的 @media print
定义或您提供给 MediaDeviceDescription
的 ConverterProperties
中的 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[]
检索需要移出。