问题
Just like the title says I am having problems combining two classes. Altough this is about FPDF, i do think this is a regular question, since the question could have been about any script.
I am using FPDF to create PDF-documents on the fly. I use it in combination with the FPDI class to add vector images to the PDF file. The script can be found below and works like a charm.
<?php
// Add FPDF to generate PDF files
require_once('../fpdf16/fpdf.php');
// Add FPDI to add the functionality of importing PDF files for layout purposes
require_once('../fpdi131/fpdi.php');
// Code128 to create barcodes
require('code128.php');
// Function that extends FPDI to import a PDF file for layout purposes
class bezwaar extends FPDI
{
//Page header
function Header()
{
global $tplidx;
global $pagecount;
$this->SetFont('Arial','',8); // Font
if($this->PageNo()>1) $this->SetY(62); // Margins
$pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Open template
$tplidx = $this->importPage(1, '/MediaBox'); // Template import
$this->useTemplate($tplidx, 0, 0, 210); // Margins, Margins, Width.
}
}
#### General settings
$pdf = new bezwaar();
$pdf->AliasNbPages(); // Add headers
$pdf->SetTopMargin(34.7); // Margins top
$pdf->addPage(); // Open page
$pdf->SetFont('Arial','',8); // Set font
#### Content;
$pdf->MultiCell(0,4,$inhoud); // $inhoud is content from a database
$pdf->Output();
?>
The problem is that i would like to add another class to add barcodes, but i don't know how to integrate that. The script below works fine on it's own with FPDF, but not with FPDI combined.
<?php
$pdf=new PDF_Code128();
$code='CODE 128';
$pdf->Code128(50,20,$code,80,20);
$pdf->SetXY(50,45);
$pdf->Write(5,'A set: "'.$code.'"');
?>
The problem is probably because i need to combine these two:
<?php
// I don't know how to combine the two below, especially not since both extend another class..
class bezwaar extends FPDI { } // Extends FPDI
class PDF_Code128 extends FPDF { } // Extends FPDF
// And / Or
$pdf = new PDF_Code128();
$pdf = new bezwaar();
?>
Sources
FPDF: http://www.fpdf.org
FPDI: http://www.setasign.de/products/pdf-php-solutions/fpdi/
Barcodeclass: http://www.fpdf.org/en/script/script88.php
Question
Could anyone help me out and tell me how to combine both scripts (above)? I am not new in PHP, but I am new with classes, making it pretty hard..enter code here
Trial and Error combining the above two - updates based on the answers I am getting
require_once('../fpdf16/fpdf.php');
require_once('../fpdi131/fpdi.php');
require('code128.php');
// Klasse en functie voor de header
class bezwaar extends FPDI // for example
{
//Page header
function Header()
{
global $tplidx;
global $pagecount;
$this->SetFont('Arial','',8); // Font instellen
if($this->PageNo()>1) $this->SetY(62); // Pagina marge voor subpaginas
$pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Template openen
$tplidx = $this->importPage(1, '/MediaBox'); // Template importeren
$this->useTemplate($tplidx, 0, 0, 210); // Marge, Marge, Breedte.
}
/**
* the pdf object
* @var PDF_Code128
*/
protected $_pdf;
/**
* the code string
* @var string
*/
protected $_code = 'CODE 128';
/**
* the class constructor method (called automatically upon instantiation)
* @param PDF_Code128 $pdf
*/
public function __construct(PDF_Code128 $pdf)
{
$this->_pdf = $pdf;
parent::__construct(); // might be optional
}
public function setCode($code)
{
$this->_code = $code;
return $this;
}
public function getCode()
{
return $this->_code;
}
/**
* The code you had before (bad function name, I know)
*/
public function setPdfStuff()
{
$this->_pdf->Code128(50, 20, $this->_code, 80, 20);
$this->_pdf->SetXY(50, 45);
$this->_pdf->Write(5,'A set: "'.$this->_code.'"');
}
}
$pdf = new bezwaar(new PDF_Code128());
$pdf->AliasNbPages(); // header
$pdf->SetTopMargin(34.7); // margins
$pdf->addPage(); // create new page
//Arial
$pdf->SetFont('Arial','',8);
//Output
$pdf->MultiCell(0,4,$inhoud);
$pdf->setPdfStuff();
$pdf->Output();
Error
Warning: Division by zero in /home/fpdf16/fpdf.php on line 812
Another trial and error
This is what usually works, except this time. I am adding the functions within the barcode class simply in the extended FPDI class. The result is that the script times out unless i deleted this line: $pdf->Code128(50,20,$code,80,20), but that line is ofcoarse needed to create the barcode. Does anyone have an idea where it could time out?
require_once('../fpdf16/fpdf.php');
require_once('../fpdi131/fpdi.php');
require('code128.php');
// Klasse en functie voor de header
class bezwaar extends FPDI
{
//Page header
function Header()
{
global $tplidx;
global $pagecount;
$this->SetFont('Arial','',8); // Font instellen
if($this->PageNo()>1) $this->SetY(62); // Pagina marge voor subpaginas
$pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Template openen
$tplidx = $this->importPage(1, '/MediaBox'); // Template importeren
$this->useTemplate($tplidx, 0, 0, 210); // Marge, Marge, Breedte.
}
var $T128; // tableau des codes 128
var $ABCset=""; // jeu des caractères éligibles au C128
var $Aset=""; // Set A du jeu des caractères éligibles
var $Bset=""; // Set B du jeu des caractères éligibles
var $Cset=""; // Set C du jeu des caractères éligibles
var $SetFrom; // Convertisseur source des jeux vers le tableau
var $SetTo; // Convertisseur destination des jeux vers le tableau
var $JStart = array("A"=>103, "B"=>104, "C"=>105); // Caractères de sélection de jeu au début du C128
var $JSwap = array("A"=>101, "B"=>100, "C"=>99); // Caractères de changement de jeu
//____________________________ Extension du constructeur _______________________
function PDF_Code128($orientation='P', $unit='mm', $format='A4') {
parent::FPDF($orientation,$unit,$format);
$this->T128[] = array(2, 1, 2, 2, 2, 2); //0 : [ ] // composition des caractères
$this->T128[] = array(2, 2, 2, 1, 2, 2); //1 : [!]
$this->T128[] = array(2, 2, 2, 2, 2, 1); //2 : ["]
$this->T128[] = array(1, 2, 1, 2, 2, 3); //3 : [#]
$this->T128[] = array(1, 2, 1, 3, 2, 2); //4 : [$]
$this->T128[] = array(1, 3, 1, 2, 2, 2); //5 : [%]
$this->T128[] = array(1, 2, 2, 2, 1, 3); //6 : [&]
$this->T128[] = array(1, 2, 2, 3, 1, 2); //7 : [']
$this->T128[] = array(1, 3, 2, 2, 1, 2); //8 : [(]
$this->T128[] = array(2, 2, 1, 2, 1, 3); //9 : [)]
$this->T128[] = array(2, 2, 1, 3, 1, 2); //10 : [*]
$this->T128[] = array(2, 3, 1, 2, 1, 2); //11 : [+]
$this->T128[] = array(1, 1, 2, 2, 3, 2); //12 : [,]
$this->T128[] = array(1, 2, 2, 1, 3, 2); //13 : [-]
$this->T128[] = array(1, 2, 2, 2, 3, 1); //14 : [.]
$this->T128[] = array(1, 1, 3, 2, 2, 2); //15 : [/]
$this->T128[] = array(1, 2, 3, 1, 2, 2); //16 : [0]
$this->T128[] = array(1, 2, 3, 2, 2, 1); //17 : [1]
$this->T128[] = array(2, 2, 3, 2, 1, 1); //18 : [2]
$this->T128[] = array(2, 2, 1, 1, 3, 2); //19 : [3]
$this->T128[] = array(2, 2, 1, 2, 3, 1); //20 : [4]
$this->T128[] = array(2, 1, 3, 2, 1, 2); //21 : [5]
$this->T128[] = array(2, 2, 3, 1, 1, 2); //22 : [6]
$this->T128[] = array(3, 1, 2, 1, 3, 1); //23 : [7]
$this->T128[] = array(3, 1, 1, 2, 2, 2); //24 : [8]
$this->T128[] = array(3, 2, 1, 1, 2, 2); //25 : [9]
$this->T128[] = array(3, 2, 1, 2, 2, 1); //26 : [:]
$this->T128[] = array(3, 1, 2, 2, 1, 2); //27 : [;]
$this->T128[] = array(3, 2, 2, 1, 1, 2); //28 : [<]
$this->T128[] = array(3, 2, 2, 2, 1, 1); //29 : [=]
$this->T128[] = array(2, 1, 2, 1, 2, 3); //30 : [>]
$this->T128[] = array(2, 1, 2, 3, 2, 1); //31 : [?]
$this->T128[] = array(2, 3, 2, 1, 2, 1); //32 : [@]
$this->T128[] = array(1, 1, 1, 3, 2, 3); //33 : [A]
$this->T128[] = array(1, 3, 1, 1, 2, 3); //34 : [B]
$this->T128[] = array(1, 3, 1, 3, 2, 1); //35 : [C]
$this->T128[] = array(1, 1, 2, 3, 1, 3); //36 : [D]
$this->T128[] = array(1, 3, 2, 1, 1, 3); //37 : [E]
$this->T128[] = array(1, 3, 2, 3, 1, 1); //38 : [F]
$this->T128[] = array(2, 1, 1, 3, 1, 3); //39 : [G]
$this->T128[] = array(2, 3, 1, 1, 1, 3); //40 : [H]
$this->T128[] = array(2, 3, 1, 3, 1, 1); //41 : [I]
$this->T128[] = array(1, 1, 2, 1, 3, 3); //42 : [J]
$this->T128[] = array(1, 1, 2, 3, 3, 1); //43 : [K]
$this->T128[] = array(1, 3, 2, 1, 3, 1); //44 : [L]
$this->T128[] = array(1, 1, 3, 1, 2, 3); //45 : [M]
$this->T128[] = array(1, 1, 3, 3, 2, 1); //46 : [N]
$this->T128[] = array(1, 3, 3, 1, 2, 1); //47 : [O]
$this->T128[] = array(3, 1, 3, 1, 2, 1); //48 : [P]
$this->T128[] = array(2, 1, 1, 3, 3, 1); //49 : [Q]
$this->T128[] = array(2, 3, 1, 1, 3, 1); //50 : [R]
$this->T128[] = array(2, 1, 3, 1, 1, 3); //51 : [S]
$this->T128[] = array(2, 1, 3, 3, 1, 1); //52 : [T]
$this->T128[] = array(2, 1, 3, 1, 3, 1); //53 : [U]
$this->T128[] = array(3, 1, 1, 1, 2, 3); //54 : [V]
$this->T128[] = array(3, 1, 1, 3, 2, 1); //55 : [W]
$this->T128[] = array(3, 3, 1, 1, 2, 1); //56 : [X]
$this->T128[] = array(3, 1, 2, 1, 1, 3); //57 : [Y]
$this->T128[] = array(3, 1, 2, 3, 1, 1); //58 : [Z]
$this->T128[] = array(3, 3, 2, 1, 1, 1); //59 : [[]
$this->T128[] = array(3, 1, 4, 1, 1, 1); //60 : [\]
$this->T128[] = array(2, 2, 1, 4, 1, 1); //61 : []]
$this->T128[] = array(4, 3, 1, 1, 1, 1); //62 : [^]
$this->T128[] = array(1, 1, 1, 2, 2, 4); //63 : [_]
$this->T128[] = array(1, 1, 1, 4, 2, 2); //64 : [`]
$this->T128[] = array(1, 2, 1, 1, 2, 4); //65 : [a]
$this->T128[] = array(1, 2, 1, 4, 2, 1); //66 : [b]
$this->T128[] = array(1, 4, 1, 1, 2, 2); //67 : [c]
$this->T128[] = array(1, 4, 1, 2, 2, 1); //68 : [d]
$this->T128[] = array(1, 1, 2, 2, 1, 4); //69 : [e]
$this->T128[] = array(1, 1, 2, 4, 1, 2); //70 : [f]
$this->T128[] = array(1, 2, 2, 1, 1, 4); //71 : [g]
$this->T128[] = array(1, 2, 2, 4, 1, 1); //72 : [h]
$this->T128[] = array(1, 4, 2, 1, 1, 2); //73 : [i]
$this->T128[] = array(1, 4, 2, 2, 1, 1); //74 : [j]
$this->T128[] = array(2, 4, 1, 2, 1, 1); //75 : [k]
$this->T128[] = array(2, 2, 1, 1, 1, 4); //76 : [l]
$this->T128[] = array(4, 1, 3, 1, 1, 1); //77 : [m]
$this->T128[] = array(2, 4, 1, 1, 1, 2); //78 : [n]
$this->T128[] = array(1, 3, 4, 1, 1, 1); //79 : [o]
$this->T128[] = array(1, 1, 1, 2, 4, 2); //80 : [p]
$this->T128[] = array(1, 2, 1, 1, 4, 2); //81 : [q]
$this->T128[] = array(1, 2, 1, 2, 4, 1); //82 : [r]
$this->T128[] = array(1, 1, 4, 2, 1, 2); //83 : [s]
$this->T128[] = array(1, 2, 4, 1, 1, 2); //84 : [t]
$this->T128[] = array(1, 2, 4, 2, 1, 1); //85 : [u]
$this->T128[] = array(4, 1, 1, 2, 1, 2); //86 : [v]
$this->T128[] = array(4, 2, 1, 1, 1, 2); //87 : [w]
$this->T128[] = array(4, 2, 1, 2, 1, 1); //88 : [x]
$this->T128[] = array(2, 1, 2, 1, 4, 1); //89 : [y]
$this->T128[] = array(2, 1, 4, 1, 2, 1); //90 : [z]
$this->T128[] = array(4, 1, 2, 1, 2, 1); //91 : [{]
$this->T128[] = array(1, 1, 1, 1, 4, 3); //92 : [|]
$this->T128[] = array(1, 1, 1, 3, 4, 1); //93 : [}]
$this->T128[] = array(1, 3, 1, 1, 4, 1); //94 : [~]
$this->T128[] = array(1, 1, 4, 1, 1, 3); //95 : [DEL]
$this->T128[] = array(1, 1, 4, 3, 1, 1); //96 : [FNC3]
$this->T128[] = array(4, 1, 1, 1, 1, 3); //97 : [FNC2]
$this->T128[] = array(4, 1, 1, 3, 1, 1); //98 : [SHIFT]
$this->T128[] = array(1, 1, 3, 1, 4, 1); //99 : [Cswap]
$this->T128[] = array(1, 1, 4, 1, 3, 1); //100 : [Bswap]
$this->T128[] = array(3, 1, 1, 1, 4, 1); //101 : [Aswap]
$this->T128[] = array(4, 1, 1, 1, 3, 1); //102 : [FNC1]
$this->T128[] = array(2, 1, 1, 4, 1, 2); //103 : [Astart]
$this->T128[] = array(2, 1, 1, 2, 1, 4); //104 : [Bstart]
$this->T128[] = array(2, 1, 1, 2, 3, 2); //105 : [Cstart]
$this->T128[] = array(2, 3, 3, 1, 1, 1); //106 : [STOP]
$this->T128[] = array(2, 1); //107 : [END BAR]
for ($i = 32; $i <= 95; $i++) { // jeux de caractères
$this->ABCset .= chr($i);
}
$this->Aset = $this->ABCset;
$this->Bset = $this->ABCset;
for ($i = 0; $i <= 31; $i++) {
$this->ABCset .= chr($i);
$this->Aset .= chr($i);
}
for ($i = 96; $i <= 126; $i++) {
$this->ABCset .= chr($i);
$this->Bset .= chr($i);
}
$this->Cset="0123456789";
for ($i=0; $i<96; $i++) { // convertisseurs des jeux A & B
@$this->SetFrom["A"] .= chr($i);
@$this->SetFrom["B"] .= chr($i + 32);
@$this->SetTo["A"] .= chr(($i < 32) ? $i+64 : $i-32);
@$this->SetTo["B"] .= chr($i);
}
}
//________________ Fonction encodage et dessin du code 128 _____________________
function Code128($x, $y, $code, $w, $h) {
$Aguid = ""; // Création des guides de choix ABC
$Bguid = "";
$Cguid = "";
for ($i=0; $i < strlen($code); $i++) {
$needle = substr($code,$i,1);
$Aguid .= ((strpos($this->Aset,$needle)===false) ? "N" : "O");
$Bguid .= ((strpos($this->Bset,$needle)===false) ? "N" : "O");
$Cguid .= ((strpos($this->Cset,$needle)===false) ? "N" : "O");
}
$SminiC = "OOOO";
$IminiC = 4;
$crypt = "";
while ($code > "") {
// BOUCLE PRINCIPALE DE CODAGE
$i = strpos($Cguid,$SminiC); // forçage du jeu C, si possible
if ($i!==false) {
$Aguid [$i] = "N";
$Bguid [$i] = "N";
}
if (substr($Cguid,0,$IminiC) == $SminiC) { // jeu C
$crypt .= chr(($crypt > "") ? $this->JSwap["C"] : $this->JStart["C"]); // début Cstart, sinon Cswap
$made = strpos($Cguid,"N"); // étendu du set C
if ($made === false) {
$made = strlen($Cguid);
}
if (fmod($made,2)==1) {
$made--; // seulement un nombre pair
}
for ($i=0; $i < $made; $i += 2) {
$crypt .= chr(strval(substr($code,$i,2))); // conversion 2 par 2
}
$jeu = "C";
} else {
$madeA = strpos($Aguid,"N"); // étendu du set A
if ($madeA === false) {
$madeA = strlen($Aguid);
}
$madeB = strpos($Bguid,"N"); // étendu du set B
if ($madeB === false) {
$madeB = strlen($Bguid);
}
$made = (($madeA < $madeB) ? $madeB : $madeA ); // étendu traitée
$jeu = (($madeA < $madeB) ? "B" : "A" ); // Jeu en cours
$crypt .= chr(($crypt > "") ? $this->JSwap[$jeu] : $this->JStart[$jeu]); // début start, sinon swap
$crypt .= strtr(substr($code, 0,$made), $this->SetFrom[$jeu], $this->SetTo[$jeu]); // conversion selon jeu
}
$code = substr($code,$made); // raccourcir légende et guides de la zone traitée
$Aguid = substr($Aguid,$made);
$Bguid = substr($Bguid,$made);
$Cguid = substr($Cguid,$made);
} // FIN BOUCLE PRINCIPALE
$check = ord($crypt[0]); // calcul de la somme de contrôle
for ($i=0; $i<strlen($crypt); $i++) {
$check += (ord($crypt[$i]) * $i);
}
$check %= 103;
$crypt .= chr($check) . chr(106) . chr(107); // Chaine Cryptée complète
$i = (strlen($crypt) * 11) - 8; // calcul de la largeur du module
$modul = $w/$i;
for ($i=0; $i<strlen($crypt); $i++) { // BOUCLE D'IMPRESSION
$c = $this->T128[ord($crypt[$i])];
for ($j=0; $j<count($c); $j++) {
$this->Rect($x,$y,$c[$j]*$modul,$h,"F");
$x += ($c[$j++]+$c[$j])*$modul;
}
}
}
}
$pdf = new bezwaar(); // PDF aanmaken met nieuwe klasses en functies
$pdf->AliasNbPages(); // Toevoeging voor headers
$pdf->SetTopMargin(34.7); // Marge bovenkant instellen
$pdf->addPage(); // Pagina openen
//Arial
$pdf->SetFont('Arial','',8);
//Output inhoud
$pdf->MultiCell(0,4,$inhoud);
//A set
$code='CODE 128';
$pdf->Code128(50,20,$code,80,20);
$pdf->SetXY(50,45);
$pdf->Write(5,'A set: "'.$code.'"');
$pdf->Output();
回答1:
If you want to pass objects laterally (e.g. two classes who are not hierarchically related), here is a simple example of how you'd do it. By passing the entire object to your class, you can manipulate it right within the class like so:
class bezwaar extends FPDI // for example
{
/**
* the pdf object
* @var PDF_Code128
*/
protected $_pdf;
/**
* the code string
* @var string
*/
protected $_code = 'CODE 128';
/**
* the class constructor method (called automatically upon instantiation)
* @param PDF_Code128 $pdf
*/
public function __construct(PDF_Code128 $pdf)
{
$this->_pdf = $pdf;
parent::__construct(); // might be optional
}
public function setCode($code)
{
$this->_code = $code;
return $this;
}
public function getCode()
{
return $this->_code;
}
/**
* The code you had before (bad function name, I know)
*/
public function setPdfStuff()
{
$this->_pdf->Code128(50, 20, $this->_code, 80, 20);
$this->_pdf->SetXY(50, 45);
$this->_pdf->Write(5,'A set: "'.$this->_code.'"');
}
}
$pdf = new bezwaar(new PDF_Code128());
$pdf->setCode('CODE 128')
->setPdfStuff();
来源:https://stackoverflow.com/questions/8429624/php-how-to-combine-these-two-classes