c# - Itext7 - pdfHTML - 文档 SetMargins 方法不起作用
问题描述
我正在努力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();
}
}
}
}
有人可以告诉我我缺少什么吗?
我有以下几个问题:
- 对象顺序(我的意思是 MemoryStream -> PdfWriter -> pdfDocument)是正确的,不是吗?
- 我想知道生成文档后流没有受到影响?
提前致谢。
解决方案
document.SetMargins
更改即将到来的页面的边距,而不是已经生成的页面。这解释了为什么您在调用后设置边距HtmlConverter.ConvertToDocument
不会影响转换结果。
您可能会尝试使用@media print
HTML 源代码中的定义或MediaDeviceDescription
您ConverterProperties
提供给HtmlConverter.ConvertToDocument
.
或者,您可以使用HtmlConverter.ConvertToElements
而不是HtmlConverter.ConvertToDocument
将返回的元素添加到Document
您创建的具有您选择的页面大小和边距设置的元素中。
哪种方法最好,取决于您的任务细节,例如您是否可以轻松影响@media print
HTML 源代码中的定义。
关于你的另一个问题
对象顺序(我的意思是 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[]
检索需要移出。
推荐阅读
- haskell - Haskell Turtle 离开 Shell Monad
- oracle - Oracle:合并相当于插入所有?
- .net - 当本地帐户存在时,非域 cpu 上的 LogonUser Lib“advapi32.dll”奇怪吗?
- python - 将值插入数据框列
- javascript - 正则表达式以千、百万等添加逗号(但避免在小数点后添加它们)Javascript
- ruby-on-rails - (Rails 新手)rails 服务器错误:无法加载此类文件 -- bootsnap/setup (LoadError)
- powershell - Powershell GUI 文本框事件处理程序
- bash - bash、awk 和/或 sed 清理具有特殊格式的字符串
- sql - 使用 ORACLE SQL 从不同行查询数据
- javascript - 更新 select2 组件的选项 - vue js