我正在Itext7上工作,我遇到了麻烦,Documen不能在这个上面设置Width/Height,Margin。我研究过(通过堆栈溢出、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();
}
}
}
}有人能告诉我我错过了什么吗?
我有以下几个问题:
提前谢谢。
发布于 2021-01-28 11:41:12
document.SetMargins更改即将出现的页面的页边距,而不是已经生成的页面。这解释了为什么在HtmlConverter.ConvertToDocument调用之后设置边距不会影响转换的结果。
相反,您可以尝试在HTML中使用@media print定义,或者在提供给HtmlConverter.ConvertToDocument的ConverterProperties中使用ConverterProperties对象。
或者,您可以使用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[]检索需要移出。
https://stackoverflow.com/questions/58161328
复制相似问题