new PDF API
This commit is contained in:
parent
e4eed3c55d
commit
ba3782b685
|
@ -1,4 +1,6 @@
|
|||
<?PHP
|
||||
use \LAM\PDF\PDFStructure;
|
||||
|
||||
/*
|
||||
$Id$
|
||||
|
||||
|
@ -41,9 +43,9 @@ $Id$
|
|||
class lamPDF extends UFPDF {
|
||||
|
||||
/**
|
||||
* format settings for page layout
|
||||
* PDF structure
|
||||
*/
|
||||
private $page_definitions;
|
||||
private $structure;
|
||||
|
||||
/**
|
||||
* current active font name
|
||||
|
@ -61,10 +63,10 @@ class lamPDF extends UFPDF {
|
|||
/**
|
||||
* Creates a new lamPDF object.
|
||||
*
|
||||
* @param array $page_definitions page settings
|
||||
* @param PDFStructure structure
|
||||
* @param String $fontName font name
|
||||
*/
|
||||
function __construct($page_definitions = array(),$fontName) {
|
||||
function __construct($structure, $fontName) {
|
||||
$this->fontName = $fontName;
|
||||
if (!defined('FPDF_FONTPATH')) {
|
||||
define('FPDF_FONTPATH', dirname(__FILE__) . '/font/');
|
||||
|
@ -72,7 +74,7 @@ class lamPDF extends UFPDF {
|
|||
// Call constructor of superclass
|
||||
parent::__construct('P','mm','A4');
|
||||
|
||||
$this->page_definitions = $page_definitions;
|
||||
$this->structure = $structure;
|
||||
|
||||
// Open PDF file and write some basic information
|
||||
$this->Open();
|
||||
|
@ -81,7 +83,7 @@ class lamPDF extends UFPDF {
|
|||
$this->AddFont($this->fontName, 'I', $this->fontList[$this->fontName][2]);
|
||||
$this->AddFont($this->fontName, 'BI', $this->fontList[$this->fontName][3]);
|
||||
$this->setFont($this->fontName,"",12);
|
||||
$this->setTitle($this->page_definitions['headline']);
|
||||
$this->setTitle($structure->getTitle());
|
||||
$this->setCreator("LDAP Account Manager");
|
||||
$this->setMargins('10.0','10.0','10.0');
|
||||
$this->setAutoPageBreak(true,'20.0');
|
||||
|
@ -91,21 +93,21 @@ class lamPDF extends UFPDF {
|
|||
* Creates the PDF page header.
|
||||
*/
|
||||
function header() {
|
||||
if($this->page_definitions['filename'] != 'none') {
|
||||
$imageFile = substr(__FILE__,0,strlen(__FILE__)- 14) . "config/pdf/" . $_SESSION['config']->getName() . "/logos/" . $this->page_definitions['filename'];
|
||||
if($this->structure->getLogo() != 'none') {
|
||||
$imageFile = substr(__FILE__,0,strlen(__FILE__)- 14) . "config/pdf/" . $_SESSION['config']->getName() . "/logos/" . $this->structure->getLogo();
|
||||
$imgProperties = getimagesize($imageFile);
|
||||
$this->Image($imageFile,10,15,($imgProperties[0] / $this->k) / 5, ($imgProperties[1] / $this->k) / 5,0,"JPG");
|
||||
}
|
||||
$this->SetY(23);
|
||||
$this->SetFont($this->fontName,"B",18);
|
||||
$this->Cell(170,5,$this->page_definitions['headline'],0,1,"R",0);
|
||||
$this->Cell(170,5,$this->structure->getTitle(), 0, 1, "R", 0);
|
||||
$this->Ln(3);
|
||||
$this->SetLineWidth(0.4);
|
||||
$this->Line(10,38,200,38);
|
||||
$this->Line(10,40,200,40);
|
||||
$this->SetY(50);
|
||||
//set folding marks
|
||||
if (isset($this->page_definitions['foldingmarks']) && ($this->page_definitions['foldingmarks'] == 'standard')) {
|
||||
if ($this->structure->getFoldingMarks() == PDFStructure::FOLDING_STANDARD) {
|
||||
$this->SetLineWidth(0.2);
|
||||
$foldingMarks = array(97, 202);
|
||||
foreach ($foldingMarks as $mark) {
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<?php
|
||||
namespace LAM\PDF;
|
||||
/*
|
||||
$Id$
|
||||
|
||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||
Copyright (C) 2003 - 2004 Michael Duergner
|
||||
2003 - 2017 Roland Gruber
|
||||
|
@ -71,20 +69,19 @@ function createModulePDF($accounts, $pdf_structure="default", $returnAsString =
|
|||
|
||||
$account_type = $accounts[0]->get_type();
|
||||
// Get PDF structure from xml file
|
||||
$load = \LAM\PDF\loadPDFStructure($account_type->getId(), $pdf_structure);
|
||||
$structure = $load['structure'];
|
||||
$reader = new PDFStructureReader();
|
||||
$structure = $reader->read($account_type->getId(), $pdf_structure);
|
||||
// get list of PDF keys
|
||||
$pdfKeys = array();
|
||||
foreach($structure as $entry) {
|
||||
if ($entry['tag'] == "SECTION" && $entry['type'] == "open") {
|
||||
$key = $entry['attributes']['NAME'];
|
||||
// only values with a starting "_" are keys
|
||||
if (strpos($key, '_') === 0) {
|
||||
$pdfKeys[] = substr($key, 1);
|
||||
}
|
||||
foreach($structure->getSections() as $section) {
|
||||
if (!$section instanceof PDFEntrySection) {
|
||||
continue;
|
||||
}
|
||||
if ($entry['tag'] == "ENTRY") {
|
||||
$pdfKeys[] = $entry['attributes']['NAME'];
|
||||
if ($section->isAttributeTitle()) {
|
||||
$pdfKeys[] = $section->getPdfKey();
|
||||
}
|
||||
foreach ($section->getEntries() as $entry) {
|
||||
$pdfKeys[] = $entry->getKey();
|
||||
}
|
||||
}
|
||||
$pdfKeys = array_unique($pdfKeys);
|
||||
|
@ -95,7 +92,7 @@ function createModulePDF($accounts, $pdf_structure="default", $returnAsString =
|
|||
$fontName = "Dejavu";
|
||||
|
||||
// Create a new PDF file acording to the account type
|
||||
$pdf = new \lamPDF($load['page_definitions'],$fontName);
|
||||
$pdf = new \lamPDF($structure, $fontName);
|
||||
|
||||
// Loop over each account and add a new page in the PDF file for it
|
||||
foreach($accounts as $account) {
|
||||
|
@ -107,28 +104,10 @@ function createModulePDF($accounts, $pdf_structure="default", $returnAsString =
|
|||
$entries = $account->get_pdfEntries($pdfKeys, $account_type->getId());
|
||||
|
||||
// Now create the PDF file acording to the structure with the submitted values
|
||||
foreach($structure as $entry) {
|
||||
// We have a new section to start
|
||||
if($entry['tag'] == "SECTION" && $entry['type'] == "open") {
|
||||
$name = $entry['attributes']['NAME'];
|
||||
if(preg_match("/^_[a-zA-Z_]+/",$name)) {
|
||||
$section_headline = getSectionHeadline($entries[substr($name,1)][0]);
|
||||
}
|
||||
else {
|
||||
$section_headline = $name;
|
||||
}
|
||||
$pdf->setFont($fontName, "B", LAMPDF_FONT_SIZE_BIG);
|
||||
$pdf->Write(0,$section_headline . ":");
|
||||
$pdf->Ln(LAMPDF_LINEHEIGHT);
|
||||
}
|
||||
// We have a section to end
|
||||
elseif($entry['tag'] == "SECTION" && $entry['type'] == "close") {
|
||||
$pdf->Ln(LAMPDF_LINEHEIGHT * 2);
|
||||
}
|
||||
// We have to include a static text.
|
||||
elseif($entry['tag'] == "TEXT") {
|
||||
foreach ($structure->getSections() as $section) {
|
||||
if ($section instanceof PDFTextSection) {
|
||||
$pdf->setFont($fontName, "", LAMPDF_FONT_SIZE);
|
||||
$info_string = str_replace("\r", "", $entry['value']);
|
||||
$info_string = str_replace("\r", "", $section->getText());
|
||||
$info_string = explode("\n", $info_string);
|
||||
foreach ($info_string as $text) {
|
||||
$pdf->MultiCell(0, LAMPDF_LINEHEIGHT, trim($text), 0, "L", 0);
|
||||
|
@ -136,32 +115,42 @@ function createModulePDF($accounts, $pdf_structure="default", $returnAsString =
|
|||
}
|
||||
$pdf->Ln(LAMPDF_LINEHEIGHT * 2);
|
||||
}
|
||||
// We have to include an entry from the account
|
||||
elseif($entry['tag'] == "ENTRY") {
|
||||
// Get name of current entry
|
||||
$name = $entry['attributes']['NAME'];
|
||||
// skip non-existent entries
|
||||
if (isset($entries[$name])) {
|
||||
// Get current entry
|
||||
$valueEntries = $entries[$name];
|
||||
|
||||
// Print entry only when module sumitted values for it
|
||||
if(is_array($valueEntries)) {
|
||||
// Loop over all rows of this entry (most of the time this will be just one)
|
||||
foreach($valueEntries as $valueEntry) {
|
||||
if ($valueEntry instanceof PDFLabelValue) {
|
||||
printLabelValue($pdf, $valueEntry, $fontName);
|
||||
}
|
||||
else if ($valueEntry instanceof PDFTable) {
|
||||
printTable($pdf, $valueEntry, $fontName);
|
||||
elseif ($section instanceof PDFEntrySection) {
|
||||
// section headline
|
||||
if($section->isAttributeTitle()) {
|
||||
$section_headline = getSectionHeadline($entries[$section->getPdfKey()][0]);
|
||||
}
|
||||
else {
|
||||
$section_headline = $section->getTitle();
|
||||
}
|
||||
$pdf->setFont($fontName, "B", LAMPDF_FONT_SIZE_BIG);
|
||||
$pdf->Write(0,$section_headline . ":");
|
||||
$pdf->Ln(LAMPDF_LINEHEIGHT);
|
||||
// entries
|
||||
foreach ($section->getEntries() as $entry) {
|
||||
// skip non-existent entries
|
||||
if (isset($entries[$entry->getKey()])) {
|
||||
// Get current entry
|
||||
$valueEntries = $entries[$entry->getKey()];
|
||||
// Print entry only when module sumitted values for it
|
||||
if(is_array($valueEntries)) {
|
||||
// Loop over all rows of this entry (most of the time this will be just one)
|
||||
foreach($valueEntries as $valueEntry) {
|
||||
if ($valueEntry instanceof PDFLabelValue) {
|
||||
printLabelValue($pdf, $valueEntry, $fontName);
|
||||
}
|
||||
else if ($valueEntry instanceof PDFTable) {
|
||||
printTable($pdf, $valueEntry, $fontName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// section end
|
||||
$pdf->Ln(LAMPDF_LINEHEIGHT * 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Close PDF
|
||||
$pdf->Close();
|
||||
if (!$returnAsString) {
|
||||
|
|
|
@ -401,10 +401,7 @@ class PDFStructureReader {
|
|||
}
|
||||
$structure->setLogo($xml->getAttribute('filename'));
|
||||
$structure->setTitle($xml->getAttribute('headline'));
|
||||
$foldingMarks = $xml->getAttribute('foldingmarks');
|
||||
if ($foldingMarks === 'yes') {
|
||||
$structure->setFoldingMarks(true);
|
||||
}
|
||||
$structure->setFoldingMarks($xml->getAttribute('foldingmarks'));
|
||||
$sections = array();
|
||||
while ($xml->read()) {
|
||||
if ($xml->nodeType === \XMLReader::SIGNIFICANT_WHITESPACE) {
|
||||
|
@ -474,11 +471,16 @@ class PDFStructureReader {
|
|||
*/
|
||||
class PDFStructure {
|
||||
|
||||
/** no folding marks */
|
||||
const FOLDING_NONE = 'no';
|
||||
/** standard folding marks */
|
||||
const FOLDING_STANDARD = 'standard';
|
||||
|
||||
private $logo = null;
|
||||
|
||||
private $title = null;
|
||||
|
||||
private $foldingMarks = false;
|
||||
private $foldingMarks = 'no';
|
||||
|
||||
private $sections = array();
|
||||
|
||||
|
@ -521,7 +523,7 @@ class PDFStructure {
|
|||
/**
|
||||
* Returns if to print folding marks.
|
||||
*
|
||||
* @return boolean print folding marks
|
||||
* @return string print folding marks
|
||||
*/
|
||||
public function getFoldingMarks() {
|
||||
return $this->foldingMarks;
|
||||
|
@ -530,7 +532,7 @@ class PDFStructure {
|
|||
/**
|
||||
* Sets if to print folding marks.
|
||||
*
|
||||
* @param boolean $foldingMarks print folding marks
|
||||
* @param string $foldingMarks print folding marks
|
||||
*/
|
||||
public function setFoldingMarks($foldingMarks) {
|
||||
$this->foldingMarks = $foldingMarks;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
use LAM\PDF\PDFTextSection;
|
||||
use LAM\PDF\PDFEntrySection;
|
||||
use LAM\PDF\PDFStructureReader;
|
||||
use LAM\PDF\PDFStructure;
|
||||
|
||||
/*
|
||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||
|
@ -45,7 +46,7 @@ class ReadStructureTest extends PHPUnit_Framework_TestCase {
|
|||
$structure = $reader->read('type', 'name');
|
||||
$this->assertEquals('printLogo.jpg', $structure->getLogo());
|
||||
$this->assertEquals('User information', $structure->getTitle());
|
||||
$this->assertEquals(true, $structure->getFoldingMarks());
|
||||
$this->assertEquals(PDFStructure::FOLDING_STANDARD, $structure->getFoldingMarks());
|
||||
$sections = $structure->getSections();
|
||||
$this->assertEquals(3, sizeof($sections));
|
||||
// check first section
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<pdf filename="printLogo.jpg" headline="User information" type="user" foldingmarks="yes">
|
||||
<pdf filename="printLogo.jpg" headline="User information" foldingmarks="standard">
|
||||
<section name="Personal user information">
|
||||
<entry name="inetOrgPerson_givenName" />
|
||||
<entry name="inetOrgPerson_sn">
|
||||
|
|
Loading…
Reference in New Issue