打印HTML表到点阵打印机


Print HTML table to dot matrix printer

我有一个php网站,以html表格的形式生成发票,我需要将这些html表格打印到点阵打印机。我曾尝试直接使用浏览器打印选项打印网页,但似乎打印机将其视为图像,因为它逐点打印字符,而不是像ascii文本文件那样在单个通道中打印完整字符,从而导致字符模糊。

有没有办法让打印机把它当作文本文件?或者是否有任何方法将html页面转换为文本文件而不丢失位置样式(间距,边距等)?或者我可以用别的方法?需要注意的一点是,我不能使用基于文本的浏览器来完成此操作,因为它将被客户端使用。

发票是一个html表格,左上角有小徽标,标题和描述作为标题,简单的表格单元格作为主体。

我用的是爱普生LX300+II打印机

<?php
 // Download printer driver for dot matrix printer ex. 1979 Dot Matrix      Regular or Consola
?>
<html>
<head>
<title>PHP to Dot Matrix Printer</title>
<style>
@font-face { font-family: kitfont; src: url('1979 Dot Matrix Regular.TTF'); } 
.customFont { /*  <div class="customFont" /> */
font-style: kitfont;
font-size:10;
}
#mainDiv {
height: 324px; /* height of receipt 4.5 inches*/
width: 618px;  /* weight of receipt 8.6 inches*/
position:relative; /* positioned relative to its normal position */
}
#cqm { /*  <img id="cqm" /> */
top: 10px; /* top is distance from top (x axis)*/
left: 105px; /* left is distance from left (y axis)*/
position:absolute; /* position absolute based on "top" and "left"    parameters x and y  */
}
#or_mto { 
position: absolute;
left: 0px;
top: 0px;
z-index: -1; /*image */
}
    #arpno {
top: 80px;
left: 10px;
position:absolute;
}
#payee {
top: 80px;
left: 200px;
position:absolute;
}
#credit {
top: 80px;
right: 30px; /*   distance from right */
position:absolute;
}
#paydate {
top: 57px;
right: 120px;
position:absolute;
}
 </style>
</head>
<body>
<?php
//sample data
$arpno   = 1234567;
$payee   = "Juan dela Cruz";
$credit  = 10000;
$paydate = "Dec. 6, 2015" ;

?>
<div id="mainDiv"> <!--  invisible space -->
<div id="cqm" class="customFont">ABC TRADING</div>
<div id="arpno" class="customFont"><?php echo $arpno; ?></div>
<div id="payee" class="customFont"><?php echo $payee; ?></div>
<div id="credit" class="customFont"><?php echo $credit; ?></div>
<div id="paydate" class="customFont"><?php echo $paydate; ?></div>
<img id="or_mto" src="or_mto.jpg" /> <!---- sample for logo  ---->
</div>
</body>
</html>

对于那些想直接从浏览器打印到打印机的人,假设你只需要打印文本,我在这篇文章中找到了答案

应用程序的Github在这里。

一个简单的教程可以在这里找到。

基本上你安装QZ托盘在你的客户端机器,你添加脚本提供的html。

在Windows 10和OKI 320 Turbo点阵打印机上工作正常,但你必须将打印机的驱动程序更改为Generic/Text Only。

然后在javascript中这样做:

try {
    
    await qz.websocket.connect();
    console.log("connected")
    const printer = await qz.printers.find("OKI");
    console.log(`Printer ${printer} found !`);
    const config = qz.configs.create(printer);
    const data = [
        'Some Data 'n',
        'More Data   and More Data  'n'
    ]
    qz.print(config, data);
} catch(e) { console.log(e) }

工作像一个魅力!

我们过去使用Java Applet来完成此操作,该Applet可以在浏览器和Java安全性的适当权限后写入LPT端口。

但是,所有浏览器都已逐步取消了对该功能的支持。我们现在正在使用旧版本的浏览器运行它。

我们正在探索的一种方法是在本地PC的端口上运行java服务并从浏览器窗口调用该服务的可能性。

解决此问题的一个选项是下载TCPDF库https://tcpdf.org/docs/srcdoc/并将报告传递到pdf,但您必须下载一些dotmatrix类型的字体并使用链接http://www.xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf,将字体转换为TCPDF使用的格式。

我几乎有同样的需求,我没有得到一个完美的解决方案,所以我使用了另一个解决方案,

  • 使用"w3m"将html转换为文本
  • 通过套接字通信将此文本发送到运行在客户端机器上的python脚本
  • 通过python脚本(使用pyusb),我将此文本直接通过USB发送到打印机并打印。

在这个解决方案中,无法打印出所有的解决方案。