Печать таблицы 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;">&nbsp;</td>
            <td width="70%" colspan="2">
                <?php echo sub_cad(trim($reg['cliente'], "ยบ"), 32); ?>
            </td>
            <td width="20%" colspan="2" align="right">
                &nbsp;
            </td>
        </tr>
        <tr>
            <td width="10%" style="height: 18px;">&nbsp;</td>
            <td width="70%" colspan="2">
                <?php echo sub_cad(trim($reg['direccion'], "ยบ"), 32) ?>
            </td>
            <td width="20%" colspan="2" align="center">
                &nbsp;
            </td>
        </tr>
        <tr>
            <td width="10%" style="height: 18px;">&nbsp;</td>
            <td width="45%" colspan="2">
            <?php echo trim($reg['dni_ruc']) ?>
            </td>
            <td width="45%" colspan="2" align="right">
                <?php
                echo $dia .
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
                    $mes .
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
                    $anio
                ?>
            </td>
        </tr>
        <tr>
            <td colspan="5" style="height: 18px">&nbsp;</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">&nbsp;</td>
                <td width="100">&nbsp;</td>
                <td width="205">&nbsp;</td>
                <td width="80" align="right">&nbsp;</td>
                <td width="100" align="right">&nbsp;</td>
            </tr>
            <?php
        }
        ?>
    </table>
    <table width="870" border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td>&nbsp;</td>
            <td style="height:22px;">&nbsp;</td>
        </tr>
        <tr>
            <td style="height:30px;">&nbsp;</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

Другие вопросы по тегам