我正在开发一个ASP.Net Web应用程序,该应用程序必须在标准的Avery样式标签页(一个特定大小,因此只有一个整体布局)上打印动态创建的标签。标签的行数可变(3-6),可能包含文本行或图形条形码图像。
我继承的第一个剪辑,使用等宽字体来减少格式问题,但是这不允许在标签上放置足够的文字,并且客户不满意。基本上它是格式化文本。
我的下一个版本使用TABLE,DIV,CSS和一些JavaScript计算来使用比例字体格式化标签。它仍然需要一些调整(用户必须正确设置他们的打印边距并关闭打印页眉和页脚),但它似乎工作。
然而,似乎不同的打印机如何渲染文本(WYS不是WYG)有一些变化,所以即使我们使用至少两种不同的打印机(喷墨打印机和激光打印机)在不同的浏览器上进行测试,某些用户的标签没有排列。通过调整页面设置对话框中的边距可以调整轻微的边距变化,但更难的问题是标签间距可能会偏离一小部分英寸,因此如果第一个标签很好地居中,页面末尾标签文本和图像已从标签的顶部或底部爬出。
我们即将转向生成Word,Excel或PDF输出,这将花费相当多的开发时间,并可能在打印过程中添加额外的步骤。
那么,有没有人对如何在不同类型的打印机上精确渲染的HTML / CSS布局有任何建议?我真的不在乎线/字断点是否有点不同,但我需要能够预测每个标签区域左上角的位置。
现在,标签在表格中向下流动,我们一直在调整单元格和内部DIV的盒子模型,使它们达到统一的高度。我怀疑使用每个元素的绝对定位可能是最好的答案,但由于ASP.Net生成标签元素,这也很棘手。如果我肯定知道它会起作用,我宁愿尝试它而不是抛弃我们必须采用的不同代方法。
轻微更新: 现在我正在进行一些绝对定位的测试 - 仅设置包含块元素的顶部和左侧坐标。到目前为止,页面上的偏移量(边距,纸张对齐等)略有不同,但所有测试的浏览器和打印机都将 中的元素完全 放在正确的位置相对于彼此。我很欣赏PDF提示,但有没有人知道使用绝对定位的其他“陷阱”?
更新 为了记录,我使用iTextSharp重写了标签打印部分,它完美无缺 - 绝对是将来这样做的方式......
答案 0 :(得分:28)
忘记HTML并制作PDF。 HTML打印变化很大 - 不仅跨浏览器,而且跨同一浏览器的不同版本。 PDF更容易。
即使您使用一个浏览器/字体设置/打印机/月亮阶段完全正确,它也是您必须维护的最脆弱的事情。无论你认为制作PDF需要多长时间(并且它并不像那里有一些免费的库那么难),HTML最终会花费你更多的时间。 PDF阅读器的广泛部署和打印比Word文件更加一致。
答案 1 :(得分:5)
网络不是保证获得一致打印结果的格式。鉴于MS Word标签打印的标准支持,以及相对容易的自动化和生成,我强烈建议采用这种方式。
我不知道在使用网页内容时,在所有类型的浏览器,操作系统和打印机上进行percise打印的方法。
答案 2 :(得分:3)
“精确地”和“打印”不是两个真正协同工作的词。我大约一年前做过OCR / OMR应用程序,甚至在构建PDF时我发现不同的打印驱动程序之间存在显着差异。因此,我的直觉是告诉你,你可能没有100%的成功。
如果CSS和布局问题对你来说效果不好,你可能需要使用GDI +来构建标签作为图像 - 至少你可以使用GetFontMetrics()等。
祝你好运!答案 3 :(得分:3)
我有类似的问题,答案是你不能这样做。相反,我使用iTextSharp实时生成PDF文件并将其传递给响应。
答案 4 :(得分:2)
使用SQL Server Reporting Services,我生成一个PDF以发送到打印机,但可以使用您可以包含在网页中的控件在屏幕上将其视为HTML。互联网上有RDLC文件可以打印到各种Avery格式。
答案 5 :(得分:2)
我重写了本周在2011年提到的SharpPDFLabel代码,因为我需要它更灵活(并且使用当前的iTextSharp库)。
你可以在这里得到它: https://github.com/finalcut/SharpPDFLabel
如果需要,我添加了指定每个单独标签内容的功能(或者也可以继续创建一张相同的标签)。通过扩展LabelDefinition
类,您可以非常轻松地指定标签的布局。
答案 6 :(得分:1)
由于浏览器的打印行为不一致,我也在努力使用HTML / CSS方法。
我创建了一个C#库来生成ASP.NET中的Avery Labels,我希望你会觉得它很有用:
https://github.com/wheelibin/SharpPDFLabel#readme
您可以在标签上添加图片和文字,并且可以轻松定义更多标签类型。
(我将它用于条形码标签,条形码生成为图像,然后使用此库添加到标签中。)
干杯
答案 7 :(得分:0)
为您的应用添加一些选项,让用户可以调整其特定配置的间距。如果你愿意,可以在标签上包含这个权利,并通过媒体选择器将其设置为样式,但你可能也希望将它们保存在某个地方。
答案 8 :(得分:0)
Flash也是推送像标签一样可打印的好方法,虽然实现和维护要复杂一些。在大多数情况下,它显示比PDF快得多,您可以将其嵌入到页面设计中,只需在闪存中添加“打印”按钮。
几年前,当我们使用HTML和PDF生成确认收据时,我就这样做了。 HTML是“ok”但是受最终用户Web浏览器的支配,所以我们快速转储该方法。只要他们有PDF阅读器,PDF就是好的,令我们惊讶的是,很多客户都没有。在我们使用包含一些动态文本区域和“打印”按钮的简单flash电影切换到FLASH版本之后,这也被抛弃了。我使用一些flash vars在页面和flash之间传递数据。您也可以使用网络服务。
当我需要的不仅仅是简单的文本时,我使用DynamicPDF.com的PDF生成器组件的免费社区版。它工作得很好而且很快。
答案 9 :(得分:0)
我刚刚经历了同样的事情。结束切换并制作一个简短的小型JSF应用程序(在Glassfish上运行),它使用JasperReports直接打印到标签打印机。按钮,打印机上的即时标签,甚至不需要在屏幕上查看,如果您不想,因为Jasper可以直接输出到打印机(以及浏览器中的PDF)。