PDFLib 工厂。从 class 中的函数调用 $this->pdf 时出错
PDFLib Factory. Error when calling $this->pdf from functions within class
想法如下,为了使 PDF 的创建更清晰一些,我应该创建一个 Factory/Abstract class,它将包含一组预定义函数,例如 [=14] =]
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 是从以下
中调用的
class PDF extends AbstractPDF{
public function __construct(){
parent::__construct();
parent::startAFourPage();
}
public function generateContent(){
return "";
}
}
很抱歉有这么多代码,但我想画一个完整的图。
问题是,当我尝试调用这些 classes 时,出现以下错误:
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
Stack trace:
#0 /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php(30): pdf_begin_page_ext(Resource 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 {main}
thrown in /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php on line 30" while reading response header from upstream, client: 192.168.34.51, server: dev-vm-stretch.de, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm.sock:", host: "dev-vm-stretch.de"
我认为那是因为我将 PDFLib 相关代码分成函数,但我不是 100% 确定,因为我的 PDFLib 经验仅限于略多于 5 天,而且我还没有找到任何 PDFLib 教程可以处理有这些问题:-(
欢迎提出任何关于如何修复此错误的想法。
问题很简单。当您有输出文档时,您只能创建一个页面。您创建一个新的输出文档,使用 begin_document($file, $options);
您也可以 __construct
.
您可以查看 PDFlib 9.1.1 API 参考资料,第 1.2 章 "Function Scopes"。此外,所有 PDFlib PHP 示例(包括在 PDFlib PHP 包中)都演示了正确的用法。
想法如下,为了使 PDF 的创建更清晰一些,我应该创建一个 Factory/Abstract class,它将包含一组预定义函数,例如 [=14] =]
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 是从以下
中调用的class PDF extends AbstractPDF{
public function __construct(){
parent::__construct();
parent::startAFourPage();
}
public function generateContent(){
return "";
}
}
很抱歉有这么多代码,但我想画一个完整的图。
问题是,当我尝试调用这些 classes 时,出现以下错误:
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
Stack trace:
#0 /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php(30): pdf_begin_page_ext(Resource 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 {main}
thrown in /var/www/dev-vm-stretch.de/htdocs/AbstractPDF.php on line 30" while reading response header from upstream, client: 192.168.34.51, server: dev-vm-stretch.de, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm.sock:", host: "dev-vm-stretch.de"
我认为那是因为我将 PDFLib 相关代码分成函数,但我不是 100% 确定,因为我的 PDFLib 经验仅限于略多于 5 天,而且我还没有找到任何 PDFLib 教程可以处理有这些问题:-(
欢迎提出任何关于如何修复此错误的想法。
问题很简单。当您有输出文档时,您只能创建一个页面。您创建一个新的输出文档,使用 begin_document($file, $options);
您也可以 __construct
.
您可以查看 PDFlib 9.1.1 API 参考资料,第 1.2 章 "Function Scopes"。此外,所有 PDFlib PHP 示例(包括在 PDFlib PHP 包中)都演示了正确的用法。