2012-02-12 62 views
8

我想要做的是准备PHP生成的结果打印与强大的规则。在PHP中使用PDF

尝试所有可能的方式与CSS + HTML:设置尺寸在PX,毫米,厘米。 没有帮助。每个浏览器,甚至每台打印机都打印出完全不同的纸张结果(使用&(不带边框打印)也尝试过,也没有得到结果)。经过长时间的研究,发现CSS不是实现此目的和更好的方式的最佳途径 - 使用PHP创建PDF创建功能。所以,安装TCPDF。但是无法使用我为HTML输出创建的逻辑部分来工作。

我想从上边距和纸底双方必须11毫米
  • 之间行保证金获取
    • 表的第一行和最后一行0毫米
    • 表的什么行必须在4毫米左右纸边
    • 2毫米每列
    • 38毫米宽×21.2毫米高度每个小区
    • 13 x行,5×列之间服务,13x5 = 65个细胞
    • 在新的页面中的每个表。换句话说 - 每个表分页符
    • 在每个小区中39码条码后(值必须是$id
    • 在PDF结果只有表 - 没有页眉,页脚没有,没有标题...等

    这里有更详细的解释上的图像:

    enter image description here

    什么我越来越

    表单提交后,在PHP端处理需要很长的时间 - 大约一分钟,打开空白页而不是PDF结果。

    代码:

    (代码也不是那么巨大,评论使它看起来像这样:)

    <?php 
    require_once('tcpdf/config/lang/eng.php'); 
    require_once('tcpdf/tcpdf.php'); 
    
    // create new PDF document 
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
    
    $pdf->SetPrintHeader(false); 
    $pdf->SetPrintFooter(false); 
    // set document information 
    $pdf->SetCreator(PDF_CREATOR); 
    $pdf->SetAuthor('John Smith'); 
    $pdf->SetTitle(false); 
    $pdf->SetSubject(false); 
    $pdf->SetKeywords(false); 
    
    // set default header data.set all false because don't want to output header footer 
    $pdf->SetHeaderData(false, false, false, false); 
    
    // set header and footer fonts 
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 
    
    // set default monospaced font 
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 
    
    //set margins 
    $pdf->SetMargins(4, 11, 4); 
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 
    
    //set auto page breaks 
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 
    
    //set image scale factor 
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
    
    //set some language-dependent strings 
    $pdf->setLanguageArray($l); 
    
    // --------------------------------------------------------- 
    // set font 
    $pdf->SetFont('helvetica', '', 10); 
    
    // add a page 
    $pdf->AddPage(); 
    
    // define barcode style 
    $style = array(
        'position' => '', 
        'align' => 'C', 
        'stretch' => false, 
        'fitwidth' => true, 
        'cellfitalign' => '', 
        'border' => true, 
        'hpadding' => 'auto', 
        'vpadding' => 'auto', 
        'fgcolor' => array(0, 0, 0), 
        'bgcolor' => false, //array(255,255,255), 
        'text' => true, 
        'font' => 'helvetica', 
        'fontsize' => 8, 
        'stretchtext' => 4 
    ); 
    
    ob_start(); 
    ?> 
    
    
    
    <style type="text/css"> 
    
        table { 
    
         width: 100%;   
    
         border-collapse: collapse; 
    
        } 
    
        td img { 
         height:10mm; 
        } 
    
        td { 
         padding: 0 1mm 0 1mm; 
         vertical-align:middle;    
        } 
    
        .cell { 
         width: 38mm; 
         height:21mm; 
         font-style: bold; 
         text-align: center; 
        } 
    
        tr { 
         height:21mm; 
         margin:0; 
         padding:0;    
        } 
    
    
    </style> 
    
    <?php 
    
    $i = 0; 
    $item = new item($db); 
    foreach ($_POST['checkbox'] as $id) { 
        $details = $item->getDetails($id); 
        $qt = (isset($_POST['qt'])) ? $_POST['qt'] : $details['qt']; 
        for ($cnt = 1; $cnt <= $qt; $cnt++) { 
         // check if it's the beginning of a new table 
         if ($i % 65 == 0) 
          echo '<table>'; 
    
         // check if it's the beginning of a new row 
         if ($i % 5 == 0) 
          echo '<tr>'; 
    
         echo '<td><div class="cell">www.fety.fr<br/>'; 
         $pdf->Cell(0, 0, 'CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9', 0, 1); 
         $pdf->write1DBarcode($id, 'C39', '', '', '', 18, 0.4, $style, 'N'); 
         $pdf->Ln(); 
         echo '<br/>' . $details['hcode'] . '</div></td>'; 
    
         // check if it's the end of a row 
         if (($i + 1) % 5 == 0) 
          echo '</tr>'; 
    
         // check if it's the end of a table 
         if (($i + 1) % 65 == 0) 
          echo '</tr></table>'; 
    
         $i++; 
        } 
    } 
    
    // if the last table isn't full, print the remaining cells 
    if ($i % 65 != 0) { 
        for ($j = $i % 65; $j < 65; $j++) { 
         if ($j % 65 == 0) 
          echo '<table>'; 
         if ($j % 5 == 0) 
          echo '<tr>'; 
         echo '<td></td>'; 
         if (($j + 1) % 5 == 0) 
          echo '</tr>'; 
         if (($j + 1) % 65 == 0) 
          echo '</table>'; 
        } 
    } 
    
    $markup = ob_get_clean(); 
    
    // output the HTML content 
    $pdf->writeHTML($markup, true, false, true, false, ''); 
    
    
    
    // reset pointer to the last page 
    $pdf->lastPage(); 
    
    // --------------------------------------------------------- 
    //Close and output PDF document 
    $pdf->Output('bcsheet.pdf', 'I'); 
    ?> 
    

    脚本就像是:

    1. 用户选择项复选框
    2. 表单提交后,PHP通过Ajax获取复选框的值
    3. 在f oreach循环,PHP从数据库中获取每个项目的数量。
    4. 生成的表
    +0

    准备给100代表解决此问题 – heron 2012-02-12 11:59:24

    +0

    您是否考虑过使用原始PostScript?这是一项具有挑战性的任务,但您可以完全控制渲染画布。你也可以找到渲染条形码的库/教程。 – Tibo 2012-02-12 12:01:01

    +0

    @Tibo我需要将结果输出为PDF或HTML格式。 HTML给出了不同的结果。所以我有1种方法 - PDF。所以需要让它工作 – heron 2012-02-12 12:02:42

    回答

    4

    这里是一个HTML/CSS PDF转换库http://www.mpdf1.com/mpdf/

    这有它自己的HTML/CSS语法分析器,因而会产生在所有的浏览器相同的结果。

    <?php 
    
    $html = ' 
        <html> 
        <head> 
        <style> 
         table { 
         width: 100%; 
          border-collapse: collapse; 
         }  
         tr { 
    
         } 
         td { 
          width: 38mm; 
          height: 21.2mm; 
          margin: 0 1mm; 
          text-align: center; 
          vertical-align:middle; 
         } 
        </style> 
        </head> 
        <body> 
        <table>'; 
    
        for ($i = 0; $i < 13; $i++) 
        { 
         $html .= '<tr>'; 
         for($j = 0; $j < 5; $j++) 
         { 
          $html .= '<td><barcode code="TEC-IT" type="C39" class="barcode" /></td>'; 
         } 
         $html .= '</tr>'; 
        }  
    
    $html .= '</table> 
        </body> 
        </html>'; 
    
        include("MPDF53/mpdf.php"); 
    
        $mpdf = new mPDF('c', 'A4', '', '', 4, 4, 10.7, 10.7, 0, 0); 
    
        $mpdf->SetDisplayMode('fullpage'); 
    
        $mpdf->list_indent_first_level = 0; 
    
        $mpdf->WriteHTML($html,0); 
    
        $mpdf->Output('test.pdf','I'); 
        exit; 
    
    ?> 
    
    +0

    TCPDF也支持html。看看http://www.tcpdf.org/examples/example_061.phps – heron 2012-02-12 12:23:38

    +0

    是的,但这个更完整(它实际上建立在fpdf上),我在上一个项目中唯一能做的就是改变它div的不透明度。 – redmoon7777 2012-02-12 12:42:48

    +0

    TCPDF中还有一件事情,它支持代码39条形码。反正,如果您有使用pdf输出的经验,请帮助您使用mpdf或任何pdf文档进行此项工作。 – heron 2012-02-12 12:49:33

    2

    我认为,如果你没有得到的结果在所有的,你可能会被抑制你不能你与你的脚本让他们的方式错误。另外,你使用HTML的方法并不是它的工作原理,您不能使用HTML交织TCPDF本地单元调用;他们不是“输出”标记。所以你要混合两种不同的,不兼容的格式,这两种格式将会分到两个不同的缓冲区。

    但是,您的代码仍应该生成PDF。

    请注意最后一页,带有标记生成的内容。

    我所做的唯一变化就是将它在那里我可以不运行的访问到您的数据:

    $i = 0; 
    //$item = new item($db); 
    //foreach ($_POST['checkbox'] as $id) { 
    for ($id = 0; $id < 1; $id++) { 
        //$details = $item->getDetails($id); 
        //$qt = (isset($_POST['qt'])) ? $_POST['qt'] : $details['qt']; 
        $details = array('These are details'); 
        $qt = 50; 
        for ($cnt = 1; $cnt <= $qt; $cnt++) { 
         // check if it's the beginning of a new table 
         if ($i % 65 == 0) 
          echo '<table>'; 
    
         // check if it's the beginning of a new row 
         if ($i % 5 == 0) 
          echo '<tr>'; 
    
         echo '<td><div class="cell">www.fety.fr<br/>'; 
         $pdf->Cell(0, 0, 'CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9', 0, 1); 
         $pdf->write1DBarcode($id, 'C39', '', '', '', 18, 0.4, $style, 'N'); 
         $pdf->Ln(); 
         echo '<br/>' . $details['hcode'] . '</div></td>'; 
    
         // check if it's the end of a row 
         if (($i + 1) % 5 == 0) 
          echo '</tr>'; 
    
         // check if it's the end of a table 
         if (($i + 1) % 65 == 0) 
          echo '</tr></table>'; 
    
         $i++; 
        } 
    } 
    

    我得到一个PDF。它看起来不像你在图像中有什么,但它确实产生了PDF。我看你的代码是类似于此示例在TDPDF现场约90%:

    http://www.tcpdf.org/examples/example_027.phps

    当我走进去,做我自己的例子,我能得到一个PDF通常模仿大家展示一下在照片里。正如你将在下面的代码中看到的那样,你的可以使用本地TCPDF单元方法来使条形码生成工作。这并不难;花了我大约30分钟来弄清楚如何制作pdf。

    我无法弄清楚的唯一原因是顶部的黑线来自哪里;它以某种方式与标题相关联,但我无法找到将其关闭的位置。这是第二个PDF后面的代码:

    <?php 
    
    require_once('tcpdf/config/lang/eng.php'); 
    require_once('tcpdf/tcpdf.php'); 
    
    // create new PDF document 
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
    
    //set auto page breaks 
    $pdf->SetAutoPageBreak(TRUE); 
    
    //set image scale factor 
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
    
    //set some language-dependent strings 
    $pdf->setLanguageArray($l); 
    
    $pdf->SetFont('helvetica', '', 10); 
    
    // define barcode style 
    $style = array(
        'position' => '', 
        'align' => 'L', 
        'stretch' => true, 
        'fitwidth' => false, 
        'cellfitalign' => '', 
        'border' => true, 
        'hpadding' => 'auto', 
        'vpadding' => 'auto', 
        'fgcolor' => array(0,0,0), 
        'bgcolor' => false, //array(255,255,255), 
        'text' => true, 
        'font' => 'helvetica', 
        'fontsize' => 8, 
        'stretchtext' => 4 
    ); 
    
    for ($o = 0; $o < 5; $o++) { 
        $pdf->AddPage(); 
    
        $y = 10; 
    
        for ($i = 0; $i < 13; $i++) { 
         $x = 10; 
    
         for ($p = 0; $p < 5; $p++) { 
          // UPC-E 
          $pdf->write1DBarcode('04210000526', 'UPCE', $x, $y, 37, 20, 0.4, $style); 
    
          $x = $x + 38; 
         } 
    
         $y = $y + 21; 
    
         $pdf->Ln(); 
        } 
    } 
    
    //Close and output PDF document 
    $pdf->Output('example_027.pdf', 'I'); 
    
    ?> 
    
    +0

    Thx非常多。我解决了所有与mpdf有关的问题。正在测试。如果它会失败,我会测试你的方法。 – heron 2012-02-12 15:30:41

    +0

    @Jared Farrish:我有同样的问题,出现在顶部的黑线。 (你怎么样)设法解决这个问题? – Connum 2012-04-06 13:15:52

    +0

    @Connum - 我从来没有真正知道它,我只是把它放在很难看到它的地方。 – 2012-04-06 18:08:11

    0

    这里是为PDF看起来酷似图像的链接:

    Link to embrasse-moi.com barcode label file

    ,这里是创建它的功能。我使用tcpdf。我创建了3行文本,id,description,price,我从我的sub-id中查找,以便代码必须替换。我还传入行/列偏移量以便与avery5167一起使用,以便我们可以使用所有贴纸。

    function printProductLabelsAvery5167($product_sub_ids, $quantities, $row_offset, $column_offset, $filename) 
    { 
        // Embrasse-moi.com 
        require_once('../../../3rdParty/tcpdf/config/lang/eng.php'); 
        require_once('../../../3rdParty/tcpdf/tcpdf.php'); 
    
        $pdf_file_name = $filename; 
    
        $subid = array(); 
        $poc_title = array(); 
        $color_price = array(); 
    
        for($i=0;$i<sizeof($product_sub_ids);$i++) 
        { 
         $pos_product_sub_id = $product_sub_ids[$i]; 
         $pos_product_id = getProductIdFromProductSubId($pos_product_sub_id); 
         for($qty=0;$qty<$quantities[$i];$qty++) 
         { 
          $subid[] = getProductSubIDName($pos_product_sub_id); 
          $poc_title[] = substr(getProductTitle($pos_product_id),0,48); 
          $color_price[] = substr(getProductSubIdColorDescription($pos_product_sub_id),0,38) . '  $' . number_format(getProductRetail($pos_product_id),2); 
         } 
        } 
    
        $margin_left = 0; 
        $margin_right = 0; 
        $margin_top = 0; 
        $margin_bottom = 0; 
        $cell_width = 1.75; 
        $cell_height = 0.5; 
        $cell_spacing = 0.3; 
        $columns = 4; 
        $rows = 20; 
        $line_spacing_adjust = 0.015; 
        $barcode_spacing_adjust = 0.1; 
        $barcode_height_adjust = 0.05; 
    
        $title = 'Avery 5167 template'; 
        $subject = 'PO # 123'; 
        $keywords = 'purchase order 123'; 
        $page_orientation = 'P'; 
        $page_format = 'LETTER'; 
        $unit = 'in'; 
    
        // create new PDF document 
        $pdf = new TCPDF($page_orientation, $unit, $page_format, true, 'UTF-8', false); 
        // set document information 
        $pdf->SetCreator(COMPANY_NAME); 
        $pdf->SetAuthor(getUserFullName($_SESSION['pos_user_id'])); 
        $pdf->SetTitle($title); 
        $pdf->SetSubject($subject); 
        $pdf->SetKeywords($keywords); 
        $pdf->setPrintHeader(false); 
        $pdf->setPrintFooter(false); 
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 
        $pdf->SetMargins($margin_left, $margin_top, $margin_right); 
        $pdf->SetAutoPageBreak(TRUE, $margin_bottom); 
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
        $pdf->setLanguageArray($l); 
        $preferences = array('PrintScaling' => 'None'); 
        $pdf->setViewerPreferences($preferences); 
        $pdf->SetFont('helvetica', 'R', 5); 
    
        //barcode: 128a? 
        // define barcode style 
        $barcode_style = array(
        'position' => '', 
        'align' => 'C', 
        'stretch' => false, 
        'fitwidth' => false, 
        'cellfitalign' => '', 
        'border' => false, 
        'hpadding' => '0', 
        'vpadding' => '0', 
        'fgcolor' => array(0,0,0), 
        'bgcolor' => false, //array(255,255,255), 
        'text' => false, 
        'font' => 'helvetica', 
        'fontsize' => 4, 
        'stretchtext' => 0 
    ); 
    
    
        // set border width 
        $pdf->SetLineWidth(0.01); 
        $pdf->SetDrawColor(0,0,0); 
        //$pdf->setCellHeightRatio(3); 
        $counter = 0; 
    
        //calculating the pages.... how many labels are to be printed on the sheet... 
        //how many labels are going on the first sheet? 
        $first_page_number_of_spots = ($rows)*($columns-($column_offset-1)) -($row_offset-1); 
        $number_of_labels = sizeof($subid); 
        if($number_of_labels <= $first_page_number_of_spots) 
        { 
         $pages = 1; 
        } 
        else 
        { 
         $lables_on_first_page = $first_page_number_of_spots; 
         $labels_remaining = $number_of_labels -$lables_on_first_page; 
         $number_of_spots_per_page = $rows*$columns; 
         $pages = ceil($labels_remaining/($number_of_spots_per_page)) + 1; 
        } 
        for($page=0;$page<$pages;$page++) 
        { 
         $pdf->AddPage(); 
         for($col=$column_offset-1;$col<$columns;$col++) 
         { 
          for($row=$row_offset-1;$row<$rows;$row++) 
          { 
           if($counter< sizeof($subid)) 
           { 
            //barcodes must be cap 
            $line1 = strtoupper($subid[$counter]); 
            $line2 = $poc_title[$counter]; 
            $line3 = $color_price[$counter]; 
           } 
           else 
           { 
            $line1 = ''; 
            $line2 = ''; 
            $line3 = ''; 
           } 
           $counter++; 
           $x_spot = $cell_spacing + $col*$cell_width + $col*$cell_spacing; 
           $y_spot = $cell_height + $row*$cell_height; 
           $coords = 'X:'.$x_spot . ' Y:' .$y_spot; 
           $border = 0; 
           $border2 = 0; 
           //this is the cell that will allow allignment to sticker checking 
           $pdf->SetXY($x_spot, $y_spot); 
           $pdf->Cell($cell_width, $cell_height, '', $border, 0, 'C', 0, '', 0, false, 'T', 'M'); 
    
           // CODE 128 A 
           $pdf->SetXY($x_spot+$barcode_spacing_adjust, $y_spot); 
           //cell to check the barcode placement 
           $pdf->Cell($cell_width-2*$barcode_spacing_adjust, $cell_height/2, '', $border, 0, 'C', 0, '', 0, false, 'T', 'M'); 
           $pdf->write1DBarcode($line1, 'C128A', $x_spot+$barcode_spacing_adjust, $y_spot+$barcode_height_adjust, $cell_width-2*$barcode_spacing_adjust, $cell_height/2 - $barcode_height_adjust, 0.4, $barcode_style, 'N'); 
    
           //the remaining 3 lines have to fit in 1/2 the sticker size 
           //$y_offset = $cell_height/2; 
           $pdf->SetXY($x_spot, $y_spot - 0*$line_spacing_adjust + 3/6*$cell_height); 
           $pdf->Cell($cell_width, $cell_height/6, $line1, $border2, 0, 'C', 0, '', 0, false, 'T', 'C'); 
           $pdf->SetXY($x_spot, $y_spot - 1*$line_spacing_adjust + 4/6*$cell_height); 
           $pdf->Cell($cell_width, $cell_height/6, $line2, $border2, 0, 'C', 0, '', 0, false, 'T', 'C'); 
           $pdf->SetXY($x_spot, $y_spot -2*$line_spacing_adjust + 5/6*$cell_height); 
           $pdf->Cell($cell_width, $cell_height/6, $line3, $border2, 0, 'C', 0, '', 0, false, 'T', 'C'); 
    
    
           //$pdf->writeHTMLCell($cell_width, $cell_height, $x_spot, $y_spot, $text_for_label, 1, 1, false, true, '', false); 
           // no work $pdf->MultiCell($cell_width, $cell_height, $text_for_label, 1, 'J', false, '','',true, 0, false, true, $cell_height, 'T', false); 
          } 
          $row_offset = 1; 
         } 
         $column_offset = 1; 
        } 
        //Close and output PDF document 
        $pdf->Output($pdf_file_name, 'D'); 
    
        //============================================================+ 
        // END OF FILE 
        //============================================================+ 
        }