Печать таблицы HTML на матричном принтере
У меня есть сайт php, который генерирует счета в виде HTML-таблиц, мне нужно распечатать эти HTML-таблицы на матричном принтере. Я пытался напечатать веб-страницу напрямую с помощью опции печати в браузере, но кажется, что принтер воспринимает ее как изображение, потому что печатает символы за точкой вместо полных символов за один проход, как если бы это был текстовый файл ascii, что приводит к размытости персонажи.
Есть ли способ заставить принтер обрабатывать его как текстовый файл? Или есть ли какой-нибудь способ конвертировать HTML-страницу в текстовый файл без потери стиля позиции (интервал, поля и т. Д.)? Или, может быть, есть альтернативный подход, который я мог бы использовать? Стоит отметить, что я не могу использовать текстовый браузер для этого, так как он будет использоваться клиентами.
Счет-фактура представляет собой HTML-таблицу с небольшим логотипом в верхнем левом углу, заголовком и описанием в качестве thead, и простой ячейкой таблицы с границами в виде tbody.
Я использую принтер Epson LX300+II.
6 ответов
<?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 Tray на свой клиентский компьютер и добавляете сценарий, предоставленный ими, в свой html.
Работает нормально в Windows 10 с принтером OKI 320 Turbo Dot Matrix, но вам нужно изменить драйвер принтера на 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) }
Работает как шарм!
Один из вариантов решения этой проблемы - загрузить библиотеку TCPDF https://tcpdf.org/docs/srcdoc/ и передать отчеты в pdf, но вам необходимо скачать какой-нибудь шрифт типа dotmatrix и использовать ссылку http://www.xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf, конвертируйте шрифты в формат, используемый TCPDF.
Мы привыкли делать это с помощью Java-апплета, который мог записывать данные в LPT-порт после должных разрешений в браузере и безопасности Java.
Однако поддержка этого была прекращена всеми браузерами. Мы запускаем его прямо сейчас, используя более старые версии браузеров.
Один из способов, который мы исследуем, - это возможность запуска java-сервиса на порту на локальном ПК и вызова этого сервиса из окна браузера.
У меня было почти такое же требование, как это, я не получил идеальное решение, поэтому я использовал альтернативное решение,
- преобразовал HTML в текст с помощью "w3m"
- отправить этот текст скрипту Python, работающему на клиентском компьютере, через сокет
- через скрипт на python (используется pyusb) я отправил этот текст прямо на принтер через USB и распечатал.
В этом решении не может получить все решение в печати.
<!DOCTYPE html>
<html lang="es">
<head>
<title>print-boleta</title>
<meta charset="UTF-8">
<style type="text/css">
@media print {
header {
background: none;
color: #000;
}
aside#sidebar, header[role="banner"], footer, #comments, #respond {
display: none;
}
#container #content #main {
width: 100%;
margin: 0px;
padding: 0px;
}
* {
color: #000;
background-color: #fff;
@include box-shadow(none);
@include text-shadow(none);
}
@page {
size: A4 portrait;
margin-top: 4cm;
margin-bottom: 1cm;
margin-right: 1cm;
margin-left: 1cm;
font-family: sans-serif, Verdana, Geneva !important;
font-size: 10px !important;
}
}
@media screen {
#container {
background: tomato;
font-size: 12px;
font-family: sans-serif;
}
}
</style>
</head>
<body>
<input type="hidden" id="imprimir" name="imprimir" value="S"/>
<div id="container">
<?php
require_once '../conf/conexion.php';
require_once '../libs/funciones_gen.php';
require_once '../libs/letras.php';
$meses = array("", "ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SETIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE");
$query = "SELECT
ventas.id_venta,
ventas.id_cliente,
ventas.id_comprobante,
ventas.id_condicion,
ventas.num_comprobante,
ventas.fecha_venta,
ventas.total_venta,
comprobantes.comprobante,
condiciones.condicion,
clientes.cliente,
clientes.direccion,
clientes.dni_ruc,
clientes.telefono
FROM
ventas
INNER JOIN comprobantes ON ventas.id_comprobante = comprobantes.id_comprobante
INNER JOIN condiciones ON ventas.id_condicion = condiciones.id_condicion
INNER JOIN clientes ON ventas.id_cliente = clientes.id_cliente
WHERE ventas.id_venta = " . $_GET['id'] . "";
$res = mysql_query($query); //echo $query;
$reg = mysql_fetch_array($res);
$dia = substr($reg['fecha_venta'], 8, 2);
$mes = substr($reg['fecha_venta'], 5, 2);
$nmes = $mes * 1;
$anio = substr($reg['fecha_venta'], 0, 4);
?>
<table width="870" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="10%" style="height: 18px;"> </td>
<td width="70%" colspan="2">
<?php echo sub_cad(trim($reg['cliente'], "ยบ"), 32); ?>
</td>
<td width="20%" colspan="2" align="right">
</td>
</tr>
<tr>
<td width="10%" style="height: 18px;"> </td>
<td width="70%" colspan="2">
<?php echo sub_cad(trim($reg['direccion'], "ยบ"), 32) ?>
</td>
<td width="20%" colspan="2" align="center">
</td>
</tr>
<tr>
<td width="10%" style="height: 18px;"> </td>
<td width="45%" colspan="2">
<?php echo trim($reg['dni_ruc']) ?>
</td>
<td width="45%" colspan="2" align="right">
<?php
echo $dia .
" " .
" " .
" " .
$mes .
" " .
" " .
$anio
?>
</td>
</tr>
<tr>
<td colspan="5" style="height: 18px"> </td>
</tr>
</table>
<table width="870" cellpadding="0" cellspacing="0" border="0">
<?php
$sql = "SELECT
prod_ventas.id_venta,
prod_ventas.cantidad,
prod_ventas.precio_unitario,
prod_ventas.descuento,
prod_ventas.importe,
productos.id_producto,
productos.codigo,
productos.producto
FROM
prod_ventas
INNER JOIN productos ON prod_ventas.id_producto = productos.id_producto
WHERE prod_ventas.id_venta = " . $_GET['id'];
$result = mysql_query($sql); //echo $query;
$numReg = mysql_num_rows($result);
if ($numReg == 27) {
$valign = "top";
} else {
$valign = "bottom";
}
$item = 1;
while ($row = mysql_fetch_array($result)) {
?>
<tr>
<td width="70" height="20px" align="center">
<?php echo $row['cantidad'] ?>
</td>
<td width="100">
<?php echo $row['codigo'] ?>
</td>
<td width="205">
<?php echo sub_cad(trim($row['producto'], "ยบ"), 28) ?>
</td>
<td width="80" align="right">
<?php echo $row['precio_unitario'] ?>
</td>
<td width="100" align="right">
<?php echo number_format(($row['cantidad'] * $row['precio_unitario']), 2); ?>
</td>
</tr>
<?php
}
for ($i = 0; $i < 7 - $numReg; $i++) {
?>
<tr>
<td width="70" height="20px" align="center"> </td>
<td width="100"> </td>
<td width="205"> </td>
<td width="80" align="right"> </td>
<td width="100" align="right"> </td>
</tr>
<?php
}
?>
</table>
<table width="870" border="0" cellpadding="0" cellspacing="0">
<tr>
<td> </td>
<td style="height:22px;"> </td>
</tr>
<tr>
<td style="height:30px;"> </td>
<td align="right">
<?php echo number_format($reg['total_venta'], 2); ?>
</td>
</tr>
</table>
</div>
<script src="../js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
var printing = $("#imprimir").val();
if (printing == 'S') {
window.print();
} else {
window.close();
}
});
</script>
</body>
</html>
У меня та же проблема, что и с этим кодом, но я не получил хороший результат, но это что-то, я оставляю на всякий случай, если кто-то улучшит в моем случае принтер EPSON LX-350