c# - Itextsharp - 检查添加元素是否会创建新页面

标签 c# html pdf itextsharp

我正在使用 ITextSharp 将 HTML 文档转换为 PDF。我使用 HTMLWorker.ParseToList 并依次循环遍历每个项目。这很好用,但是第一页需要与后续页面具有不同的页边距大小。我可以通过调用 MyDocument.NewPage() 和 MyDocument.SetMargins() 来实现。

我在尝试检测页面转换时出现问题。

我可以使用循环来跟踪页面转换,然后调用 NewPage() 并重置页边距,但是,这只有在我实际添加了一个换行到新页面的段落后才会发生,而整个页面几乎是白色的-空间。

如果我添加某个 Paragraph 对象,我需要一种先发制人的方法来检测页面是否会发生变化。 我试过使用 ColumnText.Go(true) 来模拟它(如果结果是 ColumnText.NO_MORE_COLUMN,那么让它成为一个分页符),不幸的是,这看起来充其量是古怪的,并且倾向于检测分页符完全错误的地方。

这是我当前的代码:

            ColumnText simulation = new ColumnText(Writer.DirectContent);
            simulation.SetSimpleColumn(Writer.PageSize);   
            bool FirstPage = true;
            foreach (var item in ItemList)
            {
                var para = new Paragraph("", Normal);
                para.AddAll(item.Chunks);                    
                para.SpacingAfter = 10;
                foreach (Chunk c in item.Chunks)
                {
                    simulation.AddText(c);
                }
                if(FirstPage) {
                    int simresult = simulation.Go(true);
                    if(simresult == (int)ColumnText.NO_MORE_COLUMN)
                    {
                        textDocument.SetMargins(100,100,100,100);
                        textDocument.NewPage();    
                        FirstPage = false;                 
                    }
                }

                textDocument.Add(para);
            }

这导致它直到第 2 页结束时才检测到分页符。这是不好的。

我发现让它工作的唯一方法是将进入 simulation.SetSimpleColumn 的高度减半。

它有效,但我不知道为什么,老实说,这不好。如果有人能给我任何见解,那就太好了。



感谢亚历克西斯,我已经解决了。 ITextSharp 完全遵循 Java 事件模型,这很烦人,因为我直接在 Writer 和 Document 中寻找事件。 首先,我必须创建一个覆盖 PdfPageEventHelper 的类:

internal class MainTextEventsHandler : PdfPageEventHelper
{
    public override void OnStartPage(PdfWriter writer, Document document)
    {
        document.SetMargins(document.LeftMargin, document.LeftMargin, document.TopMargin, document.BottomMargin); //Mirror the horizontal margins
        document.NewPage(); //do this otherwise the margins won't take
    }
}

接下来,我设置了 Writer 对象的 PageEvent 属性,并修改了我的循环以移除模拟。

        Writer.PageEvent = new MainTextEventsHandler();
        foreach (var item in ItemList)
        {
            var para = new Paragraph("", Normal);
            para.AddAll(item.Chunks);
            /* per-paragraph stuff here */
            para.SpacingAfter = 10;                    
            textDocument.Add(para);
        }

最佳答案

看看Page Events , 特别是 onStartPage和/或 onEndPage以确定是否必须更改文档的边距。

请注意,这些示例适用于 Java 版本,但转换为 iTextSharp 应该很简单。

关于c# - Itextsharp - 检查添加元素是否会创建新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554611/

相关文章:

c# - 无法在 Visual Studio 中关联测试用例

c# - 在 C# 中获取驱动类型?或查明我的驱动器是否可移动?

php - 动态创建带有背景图像的 PDF

python - 将 PDF 插入 Excel、Python

c# - C# (.NET 4.5) 应用程序是否出现在 Windows 的任务管理器中?

c# - 处理这种逻辑的更优雅的方式

javascript - 使用 jQuery .load() 加载的内容不起作用

javascript - 将图像分配给随机 div?

html - 如何在 Bootstrap 3 中将正确的社交媒体图标与导航栏折叠对齐?

php - TCPDF 保持在一起功能,将内容保留在一页上(PDF 生成)