【问题标题】:PDFLib Factory. Error when calling $this->pdf from functions within classPDFLib 工厂。从类中的函数调用 $this->pdf 时出错
【发布时间】:2018-06-02 23:58:26
【问题描述】:

这个想法如下,为了让 PDF 的创建更简洁,我应该创建一个工厂/抽象类,它将像这样的一组预定义函数

class AbstractPDF{
    
    protected $pdf;
    protected $searchpath;
    
    public function __construct(){
        
        $this->pdf = PDF_new();
        $this->searchpath = "fonts/";
        
        pdf_set_option($this->pdf,"errorpolicy=return");

        pdf_set_option($this->pdf,"searchpath={" . $this->searchpath . "}");

        pdf_set_option($this->pdf,"stringformat=utf8");
        
    }
    
    protected function startAFourPage(){
        
        pdf_begin_page_ext($this->pdf, 0, 0, "width=a4.width height=a4.height");
                }
    

    
    /* When setting up any of the PDF content types, one should */
    /* remember that in PDFLib, x=>y axis start with 0(zero) at */
    /* lower left corner.                                       */
    /* The text line is set up in space by setting up the       */
    /* coordinates of the lower left corner and then providing  */
    /* height and width of the object as separate values        */  
    


protected function setupTextLine($xcoordinate, $ycoordinate, $width, $height,
                        $fontName, $fontEncoding, $fontSize, $text, $textPosition = "left"){
        
        //adding text directly through the PDFLib documentation
        $font = PDF_load_font($this->pdf, $fontName, $fontEncoding, "");
        PDF_setfont($this->pdf, $font, $fontSize);
        //PDF_set_text_pos($this->pdf, 25, 650);
        //PDF_show($this->pdf, $text);
        PDF_fit_textline ($this->pdf, $text, 111, 744, "boxsize {".$width." ".$height."} position=left");
        
    }
    
    
    /* When setting up any of the PDF content types, one should */
    /* remember that in PDFLib, x=>y axis start with 0(zero) at */
    /* lower left corner.                                       */
    /* The text flow is set up by providing the coordinate for  */
    /* lower left corner and upper right, as a rule.            */
    /* But overall PDFLib will placed it by coordinates for     */
    /* two corners diagonal to each other.                      */
    /* For this class we will identify these corners as         */
    /* lowLeft and upperRight                                   */
    
    
protected function setupMultilineTextflow($lowLeftX, $lowLeftY, $upperRightX, $upperRightY,
                        $fontName, $fontEncoding, $fontSize, $text){
        
        $orderDetails = 'Datum:
        Auftrags-NR:
        Auftragsname:
        Kunden-Nr:';

        $textFlow = PDF_create_textflow($this->pdf, $text, 
                    "fontname=".$fontName." 
                    fontsize=".$fontSize." 
                    encoding=".$fontEncoding);
        PDF_fit_textflow($this->pdf, $textFlow3, $lowLeftX, $lowLeftY, $upperRightX, $upperRightY,"");
        
    }
    
    protected function setupTable($headers=array('test'=>''), array $field){        
                }
    
}
?>

这个类是从下面调用的

class PDF extends AbstractPDF{
    
    public function __construct(){
        
        parent::__construct();
        
        parent::startAFourPage();
        
    }
    
    public function generateContent(){
        
        return "";
        
    }
    
    
}

我很抱歉有这么多代码,但我想画一个完整的画面。

问题是当我尝试调用这些类时出现以下错误:

2017/12/19 18:47:58 [error] 465#465: *252 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught PDFlibException: Function must not be called in 'object' scope in/ var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php:30

堆栈跟踪:

#0 /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php(30): pdf_begin_page_ext(资源 id #1, 0, 0, 'width=a4.width ...')

#1 /var/www/dev-vm-stretch.de/htdocs/PDF.php(10):AbstractPDF->startAFourPage()

#2 /var/www/dev-vm-stretch.de/htdocs/index.php(18): PDF->__construct()

#3 {主}

在从上游读取响应标头时,在第 30 行的 /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php 中抛出,客户端:192.168.34.51,服务器:dev-vm-stretch.de,请求:“GET /index.php HTTP/1.1”,上游:“fastcgi://unix:/var/run/php/php7.0-fpm.sock:”,主机:“dev-vm-stretch.de”

我认为这是因为我将 PDFLib 相关代码分成了函数,但我不能 100% 确定我的 PDFLib 经验仅限于 5 天多一点,而且我还没有找到任何可以处理这些的 PDFLib 教程类型的问题:-(

欢迎任何关于如何修复此错误的想法。

【问题讨论】:

    标签: php pdflib


    【解决方案1】:

    问题很简单。当您有一个输出文档时,您只能创建一个页面。您创建一个新的输出文档,使用begin_document($file, $options); 您也可以使用__construct

    您可以查看 PDFlib 9.1.1 API 参考,第 1.2 章“函数范围”。此外,所有 PDFlib PHP 示例(包括 PDFlib PHP 包中的)都演示了正确的用法。

    【讨论】:

    • 我实际上在我用于测试的测试文件中有那行,并作为样本拉到各个部分......我绝对错过了它:-( 谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2017-01-29
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多