从网页打印条形码标签

13
我正在开发一个ASP.Net Web应用程序,必须在标准的Avery式标签纸上(只有一个特定尺寸的整体布局)打印动态创建的标签。标签有可变行数(3-6行),可能包含文本或图形条形码图像。
我们最初使用等宽字体来减少格式问题,但是这样无法容纳足够的文本以适合标签,客户不满意。基本上是格式化文本。
我的下一个版本使用了TABLE、DIV、CSS和一些JavaScript计算来使用比例字体格式化标签。它仍然需要一些调整(用户必须正确设置打印页边距并关闭打印标题和页脚),但似乎可以工作。
然而,看起来有一些不同的打印机如何呈现文本的变化(所见即所得并非所想),因此即使我们在至少两种不同的打印机(喷墨和激光打印机)上使用不同的浏览器进行测试,某些用户的标签也不对齐。微小的边距变化可以通过在页面设置对话框中调整边距来调整,但更困难的问题是标签之间的间距可能偏差很小,因此如果第一个标签相当居中,则到页面结束时标签文本和图像会爬出标签的顶部或底部。
我们即将切换到生成Word、Excel或PDF输出的阶段,这将需要相当多的开发时间,并可能在打印过程中添加额外的步骤。
因此,有没有人有任何建议,可以进行HTML/CSS布局,在不同类型的打印机上精确呈现?我并不真正关心行/单词断点是否稍有不同,但我需要能够可预测地定位每个标签区域的左上角。

目前,标签在表格中依次排列,并且我们一直在调整单元格和内部DIV的盒模型,使它们具有统一的高度。我怀疑每个元素使用绝对定位可能是最好的答案,但由于ASP.Net生成标签元素而变得棘手。如果我确定这样做可行,我宁愿尝试它,也不愿抛弃我们已经拥有的一切来采用不同的生成方法。

轻微更新: 目前,我正在进行一些使用绝对定位的测试-仅设置包含块元素的顶部和左侧坐标。到目前为止,页面上的偏移(边距,纸张对齐等)有轻微变化,但所有测试的浏览器和打印机将元素放置在彼此之间的完全相同的位置。我感谢PDF提示,但是否有人知道以这种方式使用绝对定位的其他技巧?

更新: 值得一提的是,我使用iTextSharp重新编写了标签打印部分,它运行完美-绝对是未来要做的事情...

10个回答

29

放弃使用HTML,采用PDF格式。HTML打印的可变性非常大,不仅在不同浏览器之间存在差异,即使是同一浏览器的不同版本也存在问题。相比之下,PDF简单得多。

即使你在一个浏览器/字体设置/打印机/月相等多个方面都准确无误,它仍然是你需要维护的最脆弱的东西。即使你认为制作PDF需要花费很长时间(实际上并不难,因为有一些免费库可以使用),使用HTML始终需要更多的时间。 PDF阅读器被广泛应用,并且打印结果比Word文件更加稳定。


2
我必须同意。最近我们也遇到了类似的问题,生成PDF是最快和最简单的解决方案。我们甚至提供了一个校准页面,以处理不同打印机的标签和打印校准。 - Diago
PDF比Word文档更难,也更不灵活,对吧? - Matt Dawdy
PDF文件在易于编辑方面比Word文件缺乏灵活性。然而,我认为这里并不需要考虑这一点。与Word文件相比,PDF文件的生成确实更容易。此维基百科文章列出了一些方法:http://en.wikipedia.org/wiki/List_of_PDF_software - Neall

5

网络并不是一种保证能够在打印时得到一致结果的格式。鉴于MS Word对标签打印的标准支持以及自动化和生成的相对容易性,我强烈建议采用这种方式。

在使用网络内容时,我不知道任何一种方法可以确保在所有类型的浏览器、操作系统和打印机上都能得到精确的打印。


1
你现在可能没问题,但下一个FireFox更新、下一个IE更新,你就又回到了原点。 - Mitchel Sellers

3
“precisely”和“printing”这两个词并不是很搭配。我大约一年前做了一个OCR / OMR应用程序,即使在构建PDF时,我也看到了不同的打印驱动程序之间存在显着差异。因此,我的直觉告诉你,你可能无法达到100%的成功率。
如果CSS和布局问题对你不起作用,你可能需要使用GDI +构建标签图像-至少这样你可以使用GetFontMetrics()等函数。
祝你好运!

3

我曾经遇到过类似的问题,答案是你无法这样做。相反,我使用iTextSharp实时生成了一个PDF文件,并将其传递给响应。


2
本周我重写了2011年提到的SharpPDFLabel代码,因为我需要它更加灵活(并且能够与当前的iTextSharp库一起使用)。
你可以在这里获取它: https://github.com/finalcut/SharpPDFLabel 我增加了指定每个标签内容的能力(如果需要,也可以继续创建一张相同标签的标签页)。通过扩展LabelDefinition类,你可以很容易地指定标签的布局。

我脑海中暂时不确定,抱歉。自从我进行更新以来,我很少使用这个库。我没有在我的任何标签上添加条形码,只有姓名和地址(邮寄标签)。我猜它是一张图片(条形码),所以可能像这样:singleSheetLabelCreator.AddImage(myImageAsAStream); - Bill Rawlinson

2
使用SQL Server Reporting Services,我生成了一个PDF文件发送给打印机,但是在网页上使用的控件中可以看到它是HTML格式。互联网上有可用于打印各种Avery格式的RDLC文件。

1

由于不同浏览器打印行为不一致,我也曾苦恼于HTML/CSS的方法。

我创建了一个C#库,从ASP.NET生成Avery标签,希望你会发现它有用:

https://github.com/wheelibin/SharpPDFLabel#readme

你可以在标签中添加图片和文本,并且很容易定义更多的标签类型。
(我将其用于条形码标签,条形码作为图像生成,然后使用此库添加到标签。)
干杯

我只是因为代码已经过时而对此进行了负评。不过,我确实以你的项目为基础回答了问题,所以对你的负评感到有些不好意思/尴尬。 - Bill Rawlinson
1
哈哈,不用担心 - 很高兴有人觉得它有用(如果您还能贡献到原始项目中以使其变得更好,那就更好了,但是没关系)。 - wheelibin
我曾经错误地认为你并没有真正维护旧项目,所以我不想打扰你。我已经向你发送了一个拉取请求。 - Bill Rawlinson

0
我刚经历了同样的事情。最终我转而制作了一个简短的JSF应用程序(在Glassfish上运行),使用JasperReports直接打印到标签打印机。按下按钮,即可在打印机上立即获得标签,如果您不想查看屏幕上的标签,则Jasper可以直接输出到打印机(以及浏览器中的PDF)。

0

在您的应用程序中添加一些选项,让用户调整其特定配置的间距。如果您愿意,您可以将此直接包含在标签上,并通过媒体选择器进行样式设置,但您可能还想在某个地方保留它们。


我们无法让他们可靠地设置边距并关闭页眉和页脚,而这些说明正好显示在标签网页上(并且在打印时被媒体选择器隐藏),因此要求他们对标签间距进行微调不适用于我们。 - CMPalmer

0

Flash也是将可打印内容(例如标签)推送的好方法,尽管它的实现和维护稍微复杂一些。在大多数情况下,它比PDF显示更快,并且您可以将其嵌入到页面设计中,并在Flash中添加一个“打印”按钮。

几年前,当我们使用HTML和PDF生成确认收据时,我就这样做了。 HTML还好,但要看最终用户的Web浏览器情况,所以我们很快放弃了该方法。只要有PDF阅读器,PDF就很好,但令我们惊讶的是,我们的许多客户没有PDF阅读器。因此,在我们切换到使用包括几个动态文本区域和一个“打印”按钮的简单Flash电影的FLASH版本之后,我们也放弃了该方法。我使用了几个flash vars在页面和flash之间传递数据。您还可以使用Web服务。

当我需要的不仅仅是简单文本时,我会使用DynamicPDF.com的免费社区版PDF Generator组件。它效果很棒,并且速度非常快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接