TCPDF - 调用输出方法似乎什么都不做

时间:2014-09-03 17:00:50

标签: php tcpdf

我为网上的TCPDF示例创建了一个简单的包装类。 我的目标是连续调用类中的方法,然后将pdf文件输出到项目中的目录。

当我在一个blob中有一个版本并从页面调用它时,代码工作正常。将它放入一个类之后,它似乎在对 Output()的调用中挂起/不执行任何操作。在netbeans中调试时我无法进入它,并且不会抛出任何错误。

如果是文件夹权限问题,我在相关的输出目录上运行chmod。

这是班级:

<?php

define('IMAGE_DIR', '/home/user/NetBeansProjects/PDF_Quote/img/');
require_once('lib/tcpdf/tcpdf.php');

class PDF_Test extends TCPDF {


    function __construct() {
        parent::__construct(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    }

    public function set_document_info($creator = '', $author = '', $title = '', $subject = '', $keywords = '')
    {            
        $creator = PDF_CREATOR;
        $author = 'Author';
        $title = 'Title Example';
        $subject = 'Subject Example';
        $keywords = 'TCPDF, PDF, example, test, guide';

        // set document information
        $this->SetCreator($creator);
        $this->SetAuthor($author);
        $this->SetTitle($title);
        $this->SetSubject($subject);
        $this->SetKeywords($keywords);
    }

    public function header($logo_img = '', $title_text = '', $addit_text = '')
    {
        $logo_img = IMAGE_DIR . 'headerimg.png';
        $title_text = 'the title';
        $addit_text = 'additional text';

        $this->SetHeaderData($logo_img, PDF_HEADER_LOGO_WIDTH, $title_text.' 001', $addit_text, array(0,64,255), array(0,64,128));
        $this->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    }

    public function footer($logo_img = '', $text = '')
    {
        $this->setFooterData(array(0,64,0), array(0,64,128));
        $this->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    }

    public function set_default_monospaced_font($font = '')
    {
        if (strlen($font) === 0) { $font = 'courier'; }
        $this->SetDefaultMonospacedFont($font);
    }

    public function set_margins($margin_left = '', $margin_top = '', $margin_right = '', $margin_header = '', $margin_footer = '')
    {
        $margin_left = PDF_MARGIN_LEFT; $margin_top = PDF_MARGIN_TOP; $margin_right = PDF_MARGIN_RIGHT;
        $margin_header = PDF_MARGIN_HEADER; $margin_foot = PDF_MARGIN_FOOTER;

        $this->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
        $this->SetHeaderMargin(PDF_MARGIN_HEADER);
        $this->SetFooterMargin(PDF_MARGIN_FOOTER);            
    }

    public function set_auto_page_break($set = True, $margin = '')
    {
        $set = True;
        $margin = PDF_MARGIN_BOTTOM;

        $this->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    }

    public function set_image_scale($img_scale_ratio = '')
    {
        $img_scale_ratio = PDF_IMAGE_SCALE_RATIO;

        $this->setImageScale(PDF_IMAGE_SCALE_RATIO);
    }

    public function set_language_array()
    {
    if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
        require_once(dirname(__FILE__).'/lang/eng.php');
        $this->setLanguageArray($l);
    }
    }

    public function set_font_subsetting($set = True)
    {
        $set = True;

        $this->setFontSubsetting($set);
    }

    public function set_font($family = '', $style = '', $size = '', $fontfile = '', $subset = '', $out = True)
    {
        $family = 'dejavusans'; $size = '14'; 

        $this->SetFont($family, $style, $size, '', $out);
    }

    public function add_page()
    {
        $this->AddPage();
    }

    // Can be html or just plain text
    public function add_text_blob($html = '')
    {
        $html = '<h1>This is some stuff</h1><p style="background-color: green;">This is some content adhjdjasjd</p>';

        $this->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
    }

    public function output($path, $file_name)
    {
        $path = dirname(__FILE__) . '/pdfcache/'; //'/home/user/NetBeansProjects/PDF_Quote/pdfcache/';
        $file_name = 'file_' . date('Y_m_d_H_i_s') . '.pdf';

        try
        {
            $fp = $path . 'example1.pdf'; //. $file_name; //'/home/user/NetBeansProjects/PDF_Quote/pdfcache/example_001.pdf';
            $this->Output($fp, 'F');
        }
        catch (exception $ex)
        {
            return $ex;
        }            
        return $path . $file_name;
    }
}

?>

以下是在另一个php文件中调用该类的代码:

require_once('PDF_Test.php');
$pdf = new PDF_Test();

$pdf->set_document_info();
$pdf->header();
$pdf->footer();
$pdf->set_default_monospaced_font();
$pdf->set_margins();
$pdf->set_auto_page_break();
$pdf->set_image_scale();
$pdf->set_language_array();
$pdf->set_font_subsetting();
$pdf->set_font();
$pdf->add_page();
$pdf->add_text_blob();
$pdf->output();

我在google搜索中没有找到任何类似的问题,但我是PHP的新手,所以我不确定我是否也忽略了任何明显的东西。

1 个答案:

答案 0 :(得分:1)

我建议使用Output方法将PDF作为二进制字符串返回,这样您就可以随意使用它。这将是$pdfdoc = $pdf->Output('', 'S')

这样,您仍然可以将文件放到您选择的路径中,但也可以将其直接转储到客户端,或者将其附加到电子邮件中......您可以更好地处理错误,因为您可以控制关于TCPDF产生的内容。

顺便说一下,当你在PHP中覆盖一个方法,并且想要调用父方法时,你必须使用parent::METHOD()。因为您实际上已经覆盖了TCPDF的headerfooteroutput方法(即使您的方法较小)。