草庐IT

javascript - 如何计算打印HTML的CSS分页符?

coder 2023-08-04 原文

我正在使用HTML生成报告,并且正在使用CSS通过page-break-after等来控制分页。我为用户提供了一次打印多个报告的选项,这些报告是作为单个动态生成的HTML的部分创建的文档。将其设为单个文档可以使其成为单个打印作业,从而避免打印假脱机问题。

我的问题是:我想以“page x of n”的格式编号较大动态HTML的一部分的页面。但是,如果我让打印机执行此操作,它将(正确地)将文档视为单个文档,并对整个文档进行编号。

有什么方法可以确定CSS分页符何时发生,因此我可以在打印前将它们计算为一个部分,然后在长文档中将自己的编号(例如HTML元素)放入其中?

似乎应该有一种方法可以使我执行此操作,但是在过去的几天中,解决方案一直困扰着我,因此我认为我应该对Stackoverflow进行ping操作。

更新:我最终要做的是:

我接受了克里斯托弗(Christopher)的回答,因为尽管我没有完全使用它,但它为我指明了正确的方向。

我最终使用jQuery根据要打印的纸张大小,页边距,字体大小等对内容进行了计算,然后添加了具有CSS用于分页的分页符的元素。我跟踪添加了多少个分页符div,然后在处理完所有内容后更新每个分页符div中的html“n个页面x”信息。这使我不必知道一开始会有多少个页面(感谢jQuery .each)。

显然,此解决方案存在一些问题:

  • “第x页,共n页”元素不会显示为真正的页脚,而是显示在每页内容的底部。在我的情况下,这是可以接受的折衷方案。
  • 拆分本身大于页面的内容元素,特别是考虑到大多数内容是由php生成的,变得有些复杂。我使它起作用,但是同样,它需要一个可能随打印变化而中断的假设。
  • 计算取决于有关打印纸尺寸,边距,字体大小等的假设。就我在Intranet上运行的情况而言,这也是可以接受的折衷方案,因为我可以控制这些选项。可以添加其他代码来处理将来的某些变化(例如纸张尺寸)。

  • 该解决方案虽然不完美,但有点“脆弱”,它解决了我的问题,使我可以一次打印多个报告,避免打印机假脱机超时,跟踪并重新启动页码,并避免生成PDF作为打印的中间步骤。

    我发现这是一个很难破解的螺母,因此,我仍然感谢您对解决方案的意见和建议。

    谢谢!

    更新2:最终解决方案...自己避免头痛:

    尽管我使用这种方法的步伐可能比我想做的要好得多,但取得了一些小的成功,但最终解决方案并不是真正的解决方案,因为它最终变得太“脆弱”,无法应对变更。报告格式的任何更改,添加到现有报告中的新内容,纸张大小等都破坏了计算,最终导致大量的额外工作!

    那么,最终的解决方案是什么? “抵抗是徒劳的!”只需将报告制作为PDF即可。如果愿意,您可以开始“我们告诉过您”合唱;我可以接受;-)

    我选择了TCPDF库,如果开始时有点困难,它会非常出色。这些示例非常有帮助。现在,我已经对报告进行了完全自定义,并且一切都按需生成。多报告可以很容易地创建为具有页面组的单个PDF(防止打印假脱机问题),从而使编号工作完全符合我的需要。

    因此,如果您尝试做这样的事情,我建议您切入正题,跳过对HTML/CSS类型报告的不满,并制作PDF。

    最佳答案

    使用wkhtmltopdf,我能够在创建打印PDF时实现分页符。
    尽管我不确定我的解决方案是否与非Webkit浏览器兼容,但是如果需要的话,请确保您可以为所有浏览器获取供应商前缀。

    这是我所做的,使用page-break-inside: avoid;page-break-after: always;
    然后使用jquery计算出各节的高度,并计算(如果页面大小将为a4)中断发生了多少次,并使用jquery和pdf页脚(在创建pdf之前)对页面进行动态编号,因此当用户下载了正确编号的pdf文件。

    我建议设置页面(作为打印样式表),以使页面编号在页面的这些高度处可见,也许使用绝对位置。

    但是我不认为这是故障安全的。

    给他们一个PDF打印,然后,如果PDF下载链接明显消失,您将有更多的控制权,而不必担心网络打印样式表。

    关于javascript - 如何计算打印HTML的CSS分页符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4650482/

    有关javascript - 如何计算打印HTML的CSS分页符?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    6. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    8. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    9. ruby - capybara field.has_css?匹配器 - 2

      我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

    10. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

      在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

    随机推荐