如何防止 itext7.pdfhtml 创建的 PDF 中的文本跨页中断?

2024-05-01

我正在使用 itext7 版本 7.1.2 和 itext7.pdfhtml 版本 2.0.2 从一些包含不得跨页面中断的元素(例如图形及其随附文本)的 HTML 生成 PDF。

我尝试过使用显式分页符(正如在我们的旧版 iTextSharp 解决方案中成功使用的那样(使用page-break-before: always在任何包含不应分离的元素的元素上))但这些根本不起作用,所以尝试使用更优选的page-break-inside: avoid作为包含我不想跨多个页面的元素的元素的样式。这是代码的简化版本,它将内联 HTML 作为 PDF 在“我的文档”路径中输出...

using iText.Html2pdf;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using System;
using System.Linq;

namespace IText7Html2PdfPageBreakTester
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var html = @"<html>
    <head>
    </head>
    <body>
        <div style=""font-size: 60pt"">
            Some Initial Text.
        </div>
        <div style=""page-break-inside: avoid; font-size: 120pt"">
            This text should all be on the same page.
        </div>
    </body>
</html>";
            var pdfFilePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Example PDF.pdf");

            Console.WriteLine($"Converting example HTML to PDF and writing the PDF to: \"{pdfFilePath}\".");

            using (var pdfWriter = new PdfWriter(pdfFilePath))
            {
                using (var pdfDocument = new PdfDocument(pdfWriter))
                {
                    var converterProperties = new ConverterProperties();

                    pdfDocument.SetDefaultPageSize(PageSize.A4);

                    using (var document = new Document(pdfDocument))
                    {
                        //NOTE: If this line is commented then the "page-break-inside: avoid" style behaves as expected.
                        document.SetMargins(40, 40, 40, 40);

                        foreach (var element in HtmlConverter.ConvertToElements(html, converterProperties).OfType<IBlockElement>())
                            document.Add(element);
                    }
                }
            }

            Console.WriteLine($"PDF written to: \"{pdfFilePath}\".");
        }
    }
}

请注意,如果文档上没有设置边距,我就能够实现所需的行为;但是,业务要求在文档上设置边距,因此我如何既设置这些边距又保留page-break-inside: avoid行为?

我也尝试过创建自定义ITagWorker解释一个习俗<pageBreak/>我尝试使用元素作为解决方法,但没有运气得到ProcessorContext.GetPdfDocument().AddNewPage()实际添加页面的方法。

补充: 如果你替换html变量具有以下内容,您可以看到两者都不是page-break-before: always nor page-break-after: always无论文档中是否设置了边距,都会按预期工作。

var html = @"<html>
            <head>
            </head>
            <body>
                <div style=""page-break-after: always"">
                    Some Initial Text.
                </div>
                <div>
                    This text should be on a new page.
                </div>
                <div style=""page-break-before: always; font-size: 60pt"">
                    This text should be on a further new page.
                </div>
                <div style=""page-break-inside: avoid; font-size: 120pt"">
                    This text should all be on the same page.
                </div>
            </body>
        </html>";

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 itext7.pdfhtml 创建的 PDF 中的文本跨页中断? 的相关文章

  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 将 CSS 生成的三角形拆分为 2 个水平不同的相同颜色

    正如您应该能够通过此代码看到的那样fiddle http jsfiddle net Xh36r 1 以及下面 我希望能够分割显示在第二个 div 顶部的 CSS 生成的三角形水平均等在 之间orange and green使用的颜色 现在它
  • 使用@font-face时浏览器下载什么字体

    font face 有点令人困惑 因为所有浏览器都无法决定使用哪种文件格式 下面是我目前正在使用的向网站添加 1 个新字体的方法 您可以看到有 4 个单独的字体文件 我知道每个文件都是因为某些浏览器支持不同的格式 但浏览器是下载所有文件还是
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何让div与包含td的高度相匹配?

    我沿着桌子的一排布置了三个 面板 一个比另外两个高 我希望所有三个面板都与最高的一个的高度相匹配 我尝试将 div 的样式设置为 height 100 但是即使包含的 tds 增长 短面板仍然很短 我的 HTML 是由 JSF 生成的 因此
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 我可以根据同一容器中另一个元素的大小强制内联文本换行吗?

    考虑这个 jsbin http jsbin com ElIKOKe 3 edit html css output 我有这个html div class container span The lime outlined container h
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 使 Web.config 转换在本地工作

    我想让 web config 转换在本地工作 但显然这些转换仅在进行部署时发生 有谁知道一种方法来运行 msbuild 目标 TransformWebConfig 而不需要经历 重建 过程 并指定和输出目录来吐出转换后的 web confi
  • 如何获取spring data jpa中更新记录的数量?

    我使用 spring data jpa 和 hibernate 作为 jpa 持久性提供程序 我在我的应用程序中使用本机查询 有一些更新查询 我想在执行更新查询时获取更新的实际记录数 spring data jpa 有没有办法做到这一点 我
  • 在源代码管理中维护存储过程

    你们如何维护存储过程 由于一些不同的原因 我想保留它们的版本 本周末我还将设置 Cruisecontrol net 和 nant 来自动化构建 我正在考虑编写一些代码 为我的开发数据库中的所有表 sprocs udf xml 模式生成创建脚
  • 使用java实现网站家长控制

    我想用java编写一个独立的应用程序来控制对受限网站的访问 而孩子们在父母不在身边时使用互联网 主要思想是根据浏览者来阻止成人 不需要的网站 用例是这样的 1 用户打开浏览器 2 我们的应用程序 在后台运行 应该弹出一个身份验证框并要求用户
  • 获取当前文件夹路径

    我想创建一个转换文件的程序 我希望用户能够将可执行文件放在任何目录中 并且在执行该程序时 双击 exe 我希望该程序能够处理exe 文件所在的当前文件夹中的所有文件 程序如何确定当前执行的路径 I tried System Windows
  • 如何在Python 3.10中的匹配(其他语言中切换)案例中使用多个案例

    我正在尝试在类似于下面所示的函数中使用多个案例 以便我能够使用 python 3 10 中的匹配案例来执行多个案例 def sayHi name match name case Egide Eric return f Hi Mr name
  • 运行 npmserve 时收到错误消息模块构建失败(来自 ./node_modules/sass-loader/dist/cjs.js)

    我现在从事 Vue Vuetify 项目已经有一段时间了 直到昨天一切都运转良好 我在使用时遇到问题
  • 当vim进入可视模式时运行命令

    我使用一个小脚本来触发插入模式以更改行号颜色 function CursorLineNrColorInsert mode Insert mode blue if a mode i highlight CursorLineNr ctermfg
  • 如何编写操作系统程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Javascript 对象值的 Sum 数组

    我认为这是一个令人惊讶的常见和简单的问题 但我似乎找不到我要找的东西 如果我有 var array a 4 b 5 d 6 a 4 c 5 c 4 我如何对要得到的对象求和 a 8 b 5 c 9 d 6 使用下划线 lodash 或相当快
  • Linux 上的 头文件在哪里?为什么我找不到 ? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在Linux中实现C的getch 函数 https stackoverflow com questions 3276546 how to implement getch function of c
  • 多列下拉菜单[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个包
  • iOS 由于未捕获的异常“NSUnknownKeyException”而终止应用程序

    我对 Objective C 和 iOS 编程很陌生 并且遇到了这个非常奇怪的错误 相关应用程序使用我使用 NSObject 制作的自定义类型的一组预设值来初始化 NSMutableArray 这是由应用程序操纵的 如果在应用程序运行时添加
  • 将搜索图标添加到输入框

    div div
  • 禁用输入提交

    I have a form with a textfield inside and I am trying to disable the default behavior when the browser submits the whole
  • 防伪令牌和网络测试

    我正在尝试在 VS2012 中为 MVC 网站进行 Web 测试 其中一种情况是登录并浏览产品列表 选择您想要的产品并进入购买页面 问题是 当运行网络测试时 我收到有关防伪令牌的错误 并且它不匹配 到底如何才能用防伪令牌进行测试呢 用户mu
  • 如何通过互联网在两台计算机之间发送数据

    我一整天都在为此苦苦挣扎 我希望有人能帮助我 我的问题相当简单 我希望通过互联网将数据 主要是简单的命令 从一台电脑传输到另一台电脑 当两台计算机都连接到我的家庭路由器时 我已经能够使用 Java 中的套接字来实现这一点 然后 我使用两部不
  • 使用 Cartopy 从数据中屏蔽海洋或陆地

    我想从全球海面温度数据中掩盖陆地区域 我正在使用 Cartopy 来绘制数据 import numpy as np import matplotlib pyplot as plt import cartopy crs as ccrs fro
  • 带有托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)

    我有一个 C dll 它实现了多个 COM 接口 我正在尝试将其迁移到托管 C 我设置了 clr 编译器标志并将运行时库属性从 MT 更改为 MD 以避免这两个标志之间的冲突 但这就是我所做的全部更改 当它尝试在构建过程中注册 dll 时
  • 如何防止 itext7.pdfhtml 创建的 PDF 中的文本跨页中断?

    我正在使用 itext7 版本 7 1 2 和 itext7 pdfhtml 版本 2 0 2 从一些包含不得跨页面中断的元素 例如图形及其随附文本 的 HTML 生成 PDF 我尝试过使用显式分页符 正如在我们的旧版 iTextSharp