0

私は dompdf を使用して、RP327 80mm Thermal Receipt Printerを使用して印刷される PDF 形式の領収書を生成しています。しかし、印刷された領収書は用紙に適切に収まりません。これは印刷された領収書の添付画像です。これは、pdfファイルに変換された私のhtmlテーブルです

<?php
ob_clean();
$dompdf = new DOMPDF();
$dompdf->set_option('default_font', 'Courier');

$customPaper = array(0,0,340,650);
//$dompdf->set_paper($customPaper);
$dompdf->set_option('enable_css_float',true);
//$dompdf->set_paper("A3", "portrait");

$html =' <html>
    <head><style>
        .table { display: table; width: 100%; border-collapse: collapse; }
        .table-row { display: table-row; }
        .table-cell { display: table-cell; border: 1px solid black; padding: 1em; }
    }
    span {  display: block;  }
    @page table {
      size: 340px 650px;
      margin: 0px;;
    }

    .table {
       page: table;
       page-break-after: always;
       font-size: 20px;
    }
    </style>
    </head>
    <body>
    <div class="table">
      <div class="table-row"><div class="table-cell" colspan="3" style="text-align: center"><img src="../../img/top-logo.png"></div></div>
        <div class="table-row">
          <div class="table-cell" ><span><b> Merchant: </b> '.$parceldetails['company'].' </span><span><b> Pick Addr: </b> '.$parceldetails['addr'].' </span><span><b> Mobile: </b> '.$parceldetails['mobile'].' </span></div>
           <div class="table-cell" style="padding: 0px">
           <div class="" >Delivery Date:</div><br>
           <div class="" style="border-bottom: 1px solid #000000"> '.$parceldetails['r_delivery_time'].' at '.$parceldetails['bytime'].'</div>

           <div class="">Agent:</div><br>
           <div class=""> '.$parceldetails['name'].' </div>
           </div>
        </div>
        <div class="table-row">
          <div class="table-cell" colspan="3" style="text-align: center"> <b style="font-size: larger">'.$ecr.'</b></div>
        </div>
        <div class="table-row">
           <div class="table-cell" colspan="1"><span><b>Customer Name:</b> '.$parceldetails['r_name'].'</span><span><b> Addr:</b> '.$parceldetails['r_address'].' </span><span><b> Mobile: </b> '.$parceldetails['r_mobile'].' </span></div>
           <div class="table-cell" style="padding: 0px">
              <div class="" style="border-bottom: 2px solid #000000; text-align: center"><b> '.$parceldetails['paymentmethod'].' </b></div>
              <div class="" style="text-align: center"><b> '.$parceldetails['product_price'].' BDT </b></div>
           </div>
         </div>
         <div class="table-row">
           <div class="table-cell"  style="text-align: center"> '.genarateQRCode($data).' </div>
            <div class="table-cell"  style="padding: 0px">
              <div class="" style="border-bottom: 2px solid #000000; text-align: center; height:63px"> Delivered </div>
              <div class="" style="text-align: center; min-height:63px"> Cancel </div>
           </div>
            <div class="table-cell" style="padding: 0px">
              <div class="" style="border-bottom: 2px solid #000000; text-align: center; height:63px">&#160;</div>
              <div class="" style="text-align: center; min-height:63px""></div>
           </div>
        </div>
        <div class="table-row">
          <div class="table-cell" colspan="3">
          <b style="margin-top:50px; margin-bottom:-10px; border-bottom: 1px solid #000000; font-size:10px; margin-left:10px">Agent signature</b>
          <b style="margin-top:50px; margin-bottom:-10px; border-bottom: 1px solid #000000; font-size:10px; margin-left:50px">Receiver signature</b></div>
        </div>
      </div>';
      $html .='<table class="table">
      <tr>
       <td colspan="3"><img src="../../img/top-logo.png"></td>
      </tr>
      <tr>
        <td rowspan="2" colspan="2"><span><b> Merchant: </b> '.$parceldetails['company'].' </span><span><b> Pick Addr: </b> '.$parceldetails['addr'].' </span><span><b> Mobile: </b> '.$parceldetails['mobile'].' </span></td>
        <td>D. Date<span>'.$parceldetails['r_delivery_time'].'</span></td>
       </tr>
       <tr>
        <td>Agent<span>'.$parceldetails['name'].'</span></td>
       </tr>
      <tr>
        <td colspan="3">'.$ecr.'</td>
      </tr>
        <tr>
        <td rowspan="2" colspan="2"><span><b>Customer Name:</b> '.$parceldetails['r_name'].'</span><span><b> Addr:</b> '.$parceldetails['r_address'].' </span><span><b> Mobile: </b> '.$parceldetails['r_mobile'].' </span></td>
        <td><b>'.$parceldetails['paymentmethod'].'</b></td>
      </tr>
      <tr>
         <td><b>'.$parceldetails['product_price'].' BDT</b></td>
      </tr>
      <tr>
        <td rowspan="2" colspan="1">'.genarateQRCode($data).'</td>
        <td>Delivered</td>
        <td></td>
      </tr>
      <tr>
         <td>Cancel</td>
         <td></td>
      </tr>
        <tr>
        <td colspan="3">&nbsp</td>
      </tr>
        <tr>
        <td colspan="3">Agent Signature Receiver Signature</td>
      </tr>
    </table>
    </body>
    </html>';
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("dompdf_out.pdf", array('Attachment' => 0));
<?>
4

2 に答える 2

1

リンクされたプリンターの仕様によると、プリンターは 72mm または 64mm の幅に印刷できます。これは、およそ 204pt と 181pt に相当します (それぞれ)。より大きな用紙サイズに依存してコンテンツの幅を制限するのではなく、私はあなたが持っている制約内で作業しようとします.

また、dompdf は、ドキュメントに指定された DPI に基づいて、ピクセル ベースの測定値を適切なポイント サイズに変換することにも注意してください。PDF の PPI は 72 に固定されているため、HTML ドキュメントとレンダリングされた PDF を 1 対 1 で対応させたい場合は、Dompdf DPI を 72 に設定する必要があります。

それを念頭に置いて、ここに私のアドバイスがあります。メソッド呼び出しに基づいて Dompdf 0.6.x を使用していると仮定しています。

  1. 用紙サイズを適切に設定します。幅 72mm の用紙があるとします。

    $dompdf->set_paper(array(0,0,204,650));
    
  2. DPI を設定する

    $dompdf->set_option('dpi', 72);
    
  3. レイアウトに表を使用する場合は、先に進んで表要素を使用する必要があります。表の表示タイプで DIV をスタイリングすると、表の要素のように扱われるだけです。あなたが持っているものは問題なく動作しますが、テーブル要素を使用するだけで何が起こっているのかがより明確になります.

  4. Dompdf は、テーブルに関して少し変わっていることを知っておいてください。覚えておくべきことの 1 つは、Dompdf ではテーブル セルが含まれているコンテンツよりも小さいことを許可しないということです (通常のフロー コンテンツの場合)。


プリンターがコンテンツを切り取る理由について、何らかの意見を述べるのは困難です。コードをクリーンアップすることをお勧めします。1 回目はテーブル要素としてスタイル設定された DIV として、2 回目は実際のテーブルとして、同じコンテンツが 2 回あることに気付きました。

于 2017-01-11T23:31:22.120 に答える