commit
						7264498645
					
				|  | @ -1704,6 +1704,8 @@ class htmlOutputText extends htmlElement { | |||
| 	private $markAsRequired = false; | ||||
| 	/** no wrap */ | ||||
| 	private $noWrap = false; | ||||
| 	/** preformatted */ | ||||
| 	private $isPreformatted = false; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Constructor. | ||||
|  | @ -1736,6 +1738,9 @@ class htmlOutputText extends htmlElement { | |||
| 		if ($this->isBold) { | ||||
| 			echo "<b>"; | ||||
| 		} | ||||
| 		if ($this->isPreformatted) { | ||||
| 			echo "<pre>"; | ||||
| 		} | ||||
| 		if ($this->escapeHTML) { | ||||
| 			echo htmlspecialchars($this->string); | ||||
| 		} | ||||
|  | @ -1747,6 +1752,9 @@ class htmlOutputText extends htmlElement { | |||
| 			if (is_dir("../graphics")) $graphicsPath = "../graphics"; | ||||
| 			echo '<img src="' . $graphicsPath . '/required.png" alt="required" width=16 height=16 title="' . _('required') . '">'; | ||||
| 		} | ||||
| 		if ($this->isPreformatted) { | ||||
| 			echo "</pre>"; | ||||
| 		} | ||||
| 		if ($this->isBold) { | ||||
| 			echo "</b>"; | ||||
| 		} | ||||
|  | @ -1783,6 +1791,15 @@ class htmlOutputText extends htmlElement { | |||
| 		$this->noWrap = $noWrap; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets if the text is preformatted. | ||||
| 	 * | ||||
| 	 * @param boolean $preformatted is preformatted (default true) | ||||
| 	 */ | ||||
| 	public function setPreformatted($preformatted = true) { | ||||
| 		$this->isPreformatted = $preformatted; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
							
								
								
									
										100
									
								
								lam/lib/pdf.inc
								
								
								
								
							
							
						
						
									
										100
									
								
								lam/lib/pdf.inc
								
								
								
								
							|  | @ -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 | ||||
|  | @ -43,9 +41,6 @@ define('LAMPDF_FONT_SIZE', 7); | |||
| /** font size for bigger text */ | ||||
| define('LAMPDF_FONT_SIZE_BIG', 10); | ||||
| 
 | ||||
| /** XML functions */ | ||||
| include_once('xml_parser.inc'); | ||||
| 
 | ||||
| /** access to PDF configuration files */ | ||||
| include_once('pdfstruct.inc'); | ||||
| 
 | ||||
|  | @ -71,20 +66,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 +89,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 +101,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 +112,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) { | ||||
|  |  | |||
|  | @ -71,94 +71,6 @@ function getPDFStructures($typeId, $profile = null) { | |||
|  	return $return; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * This function is used to get the PDF structure from XML file. | ||||
|  * | ||||
|  * @param string $typeId the account type | ||||
|  * @param string $name structure name | ||||
|  * | ||||
|  * @return array PDF structure | ||||
|  */ | ||||
| function loadPDFStructure($typeId, $name='default') { | ||||
| 	if (!isValidPDFStructureName($name) || !preg_match('/[a-zA-Z]+/', $typeId)) { | ||||
| 		return null; | ||||
| 	} | ||||
| 	$parser = new xmlParser(); | ||||
| 	$file = dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName() . '/' . $name . '.' . $typeId . '.xml'; | ||||
| 	$xml = $parser->parse($file); | ||||
| 	$border = array(); | ||||
| 	$structure = array(); | ||||
| 	$complete_page_definitions = array('filename' => 'printLogo.jpg', 'headline' => 'LDAP Account Manager'); | ||||
| 	if (!empty($xml)) { | ||||
| 		$border['start'] = $xml[1]['PDF'][0]; | ||||
| 		$page_definitions = $xml[0][$xml[1]['PDF'][0]]['attributes']; | ||||
| 		foreach($page_definitions as $key => $value) { | ||||
| 			$complete_page_definitions[strtolower($key)] = $value; | ||||
| 			unset($page_definitions[$key]); | ||||
| 		} | ||||
| 		$border['end'] = $xml[1]['PDF'][1]; | ||||
| 		$structure = array_slice($xml[0],$border['start'] + 1,$border['end'] - ($border['start'] + 1)); | ||||
| 	} | ||||
| 	return array('structure' => $structure, 'page_definitions' => $complete_page_definitions); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * Saves PDF structure to XML file in format: <name>.<typeId>.xml | ||||
|  * | ||||
|  * @param string $typeId account type | ||||
|  * @param string $name name of structure | ||||
|  * @return string "no perms" if access denied or "ok". | ||||
|  */ | ||||
| function savePDFStructure($typeId, $name) { | ||||
| 	if (!isValidPDFStructureName($name) || !preg_match('/[a-zA-Z]+/', $typeId)) { | ||||
| 		return 'no perms'; | ||||
| 	} | ||||
| 	$struct_file = dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName() . '/' . $name . '.' . $typeId . '.xml'; | ||||
| 	if(!is_writable(dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName())) { | ||||
| 		return 'no perms'; | ||||
| 	} | ||||
| 	else { | ||||
| 		$handle = @fopen($struct_file,'w'); | ||||
| 		if (!$handle) return 'no perms'; | ||||
| 		$pdf_attributes = ''; | ||||
| 		foreach($_SESSION['currentPageDefinitions'] as $key => $value) { | ||||
| 			$pdf_attributes .= ' ' . $key . '="' . $value . '"'; | ||||
| 		} | ||||
| 		$file = '<pdf' . $pdf_attributes . ">\n"; | ||||
| 		foreach($_SESSION['currentPDFStructure'] as $entry) { | ||||
| 			$ident = ''; | ||||
| 			for($i=0;$i<$entry['level'] -1;$i++) { | ||||
| 				$ident .= "\t"; | ||||
| 			} | ||||
| 			$attributes = ''; | ||||
| 			if(isset($entry['attributes']) && is_array($entry['attributes'])) { | ||||
| 				foreach($entry['attributes'] as $key => $value) { | ||||
| 					$attributes .= ' ' . strtolower($key) . '="' . $value . '"'; | ||||
| 				} | ||||
| 			} | ||||
| 			if($entry['type'] == 'open') { | ||||
| 				$file .= $ident . '<' . strtolower($entry['tag']) . $attributes . ">\n"; | ||||
| 			} | ||||
| 			elseif($entry['type'] == 'close') { | ||||
| 				$file .= $ident . '</' . strtolower($entry['tag']) . ">\n"; | ||||
| 			} | ||||
| 			elseif($entry['type'] == 'complete') { | ||||
| 				if(isset($entry['value'])) { | ||||
| 					$file .= $ident . '<' . strtolower($entry['tag']) . $attributes . '>' . $entry['value'] . '</' . strtolower($entry['tag']) . ">\n"; | ||||
| 				} | ||||
| 				else { | ||||
| 					$file .= $ident . '<' . strtolower($entry['tag']) . $attributes . " />\n"; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		$file .= "</pdf>"; | ||||
| 		fwrite($handle,$file); | ||||
| 		fclose($handle); | ||||
| 		return 'ok'; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Deletes XML file with PDF structure definitions. | ||||
|  * | ||||
|  | @ -323,7 +235,7 @@ function deletePDFLogo($name) { | |||
|  * @return boolean is valid | ||||
|  */ | ||||
| function isValidPDFStructureName($name) { | ||||
| 	return preg_match('/[a-zA-Z0-9\-\_]+/',$name) === 1; | ||||
| 	return preg_match('/^[a-z0-9\-\_]+$/i',$name) === 1; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  | @ -382,4 +294,441 @@ function installPDFTemplates() { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Reads a PDF structure. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFStructureReader { | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Reads a PDF structure. | ||||
| 	 * | ||||
| 	 * @param string $typeId type id | ||||
| 	 * @param string $name structure name | ||||
| 	 * @return PDFStructure structure | ||||
| 	 */ | ||||
| 	public function read($typeId, $name) { | ||||
| 		if (!isValidPDFStructureName($name) || !preg_match('/[a-zA-Z]+/', $typeId)) { | ||||
| 			return null; | ||||
| 		} | ||||
| 		$file = $this->getFileName($typeId, $name); | ||||
| 		return $this->readPDFFile($file); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the file name for the given structure. | ||||
| 	 * | ||||
| 	 * @param string $typeId type id | ||||
| 	 * @param string $name structure name | ||||
| 	 * @return string file name | ||||
| 	 */ | ||||
| 	protected function getFileName($typeId, $name) { | ||||
| 		return dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName() . '/' . $name . '.' . $typeId . '.xml'; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Reads a PDF structure file. | ||||
| 	 * | ||||
| 	 * @param string $file file name | ||||
| 	 * @return PDFStructure structure | ||||
| 	 */ | ||||
| 	private function readPDFFile($file) { | ||||
| 		$xml = new \XMLReader(); | ||||
| 		$xml->open($file); | ||||
| 		$structure = new PDFStructure(); | ||||
| 		// open <pdf>
 | ||||
| 		@$xml->read(); | ||||
| 		if (!$xml->name == 'pdf') { | ||||
| 			logNewMessage(LOG_ERR, 'Unknown tag name: ' . $xml->name); | ||||
| 			throw new \LAMException(_('Unable to read PDF structure.')); | ||||
| 		} | ||||
| 		$structure->setLogo($xml->getAttribute('filename')); | ||||
| 		$structure->setTitle($xml->getAttribute('headline')); | ||||
| 		$structure->setFoldingMarks($xml->getAttribute('foldingmarks')); | ||||
| 		$sections = array(); | ||||
| 		while ($xml->read()) { | ||||
| 			if ($xml->nodeType === \XMLReader::SIGNIFICANT_WHITESPACE) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			elseif (($xml->name === 'pdf') && ($xml->nodeType == \XMLReader::END_ELEMENT)) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			elseif ($xml->name === 'text') { | ||||
| 				$xml->read(); | ||||
| 				$sections[] = new PDFTextSection($xml->value); | ||||
| 				$xml->read(); | ||||
| 				if (!$xml->name === 'text') { | ||||
| 					logNewMessage(LOG_ERR, 'Unexpected tag name: ' . $xml->name); | ||||
| 					throw new \LAMException(_('Unable to read PDF structure.')); | ||||
| 				} | ||||
| 			} | ||||
| 			elseif ($xml->name === 'section') { | ||||
| 				$sections[] = $this->readSection($xml); | ||||
| 			} | ||||
| 			else { | ||||
| 				logNewMessage(LOG_ERR, 'Unexpected tag name: ' . $xml->name); | ||||
| 				throw new \LAMException(_('Unable to read PDF structure.')); | ||||
| 			} | ||||
| 		} | ||||
| 		$xml->close(); | ||||
| 		$structure->setSections($sections); | ||||
| 		return $structure; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Reads a single section from XML. | ||||
| 	 * | ||||
| 	 * @param \XMLReader $xml reader | ||||
| 	 */ | ||||
| 	private function readSection(&$xml) { | ||||
| 		$section = new PDFEntrySection($xml->getAttribute('name')); | ||||
| 		$entries = array(); | ||||
| 		while ($xml->read()) { | ||||
| 			if (($xml->name === 'section') && ($xml->nodeType == \XMLReader::END_ELEMENT)) { | ||||
| 				break; | ||||
| 			} | ||||
| 			elseif ($xml->nodeType === \XMLReader::END_ELEMENT) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			elseif ($xml->nodeType === \XMLReader::SIGNIFICANT_WHITESPACE) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			elseif ($xml->name === 'entry') { | ||||
| 				$entries[] = new PDFSectionEntry($xml->getAttribute('name')); | ||||
| 			} | ||||
| 			elseif (!$xml->name === 'entry') { | ||||
| 				logNewMessage(LOG_ERR, 'Unexpected tag name: ' . $xml->name); | ||||
| 				throw new \LAMException(_('Unable to read PDF structure.')); | ||||
| 			} | ||||
| 		} | ||||
| 		$section->setEntries($entries); | ||||
| 		return $section; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Writes PDF structures to files. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFStructureWriter { | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Writes the PDF structure to disk. | ||||
| 	 * | ||||
| 	 * @param string $typeId type ID | ||||
| 	 * @param string $name structure name | ||||
| 	 * @param PDFStructure $structure structure | ||||
| 	 */ | ||||
| 	public function write($typeId, $name, $structure) { | ||||
| 		$fileName = $this->getFileName($typeId, $name); | ||||
| 		$xml = $this->getXML($structure); | ||||
| 		$this->writeXML($xml, $fileName); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Writes the PDF structure to disk. | ||||
| 	 * | ||||
| 	 * @param string $typeId type ID | ||||
| 	 * @param string $name structure name | ||||
| 	 * @return string file name | ||||
| 	 */ | ||||
| 	protected function getFileName($typeId, $name) { | ||||
| 		if (!isValidPDFStructureName($name) || !preg_match('/[a-zA-Z]+/', $typeId)) { | ||||
| 			throw new \LAMException(_('PDF structure name not valid'), | ||||
| 					_('The name for that PDF-structure you submitted is not valid. A valid name must consist of the following characters: \'a-z\',\'A-Z\',\'0-9\',\'_\',\'-\'.')); | ||||
| 		} | ||||
| 		if(!is_writable(dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName())) { | ||||
| 			throw new \LAMException(_('Could not save PDF structure, access denied.')); | ||||
| 		} | ||||
| 		return dirname(__FILE__) . '/../config/pdf/' . $_SESSION['config']->getName() . '/' . $name . '.' . $typeId . '.xml'; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the generated XML. | ||||
| 	 * | ||||
| 	 * @param PDFStructure $structure structure | ||||
| 	 * @return string XML | ||||
| 	 */ | ||||
| 	public function getXML($structure) { | ||||
| 		$writer = new \XMLWriter(); | ||||
| 		$writer->openMemory(); | ||||
| 		$writer->setIndent(true); | ||||
| 		$writer->setIndentString("\t"); | ||||
| 		$writer->startElement('pdf'); | ||||
| 		$writer->writeAttribute('filename', $structure->getLogo()); | ||||
| 		$writer->writeAttribute('headline', $structure->getTitle()); | ||||
| 		$writer->writeAttribute('foldingmarks', $structure->getFoldingMarks()); | ||||
| 		foreach ($structure->getSections() as $section) { | ||||
| 			if ($section instanceof PDFTextSection) { | ||||
| 				$writer->startElement('text'); | ||||
| 				$writer->text($section->getText()); | ||||
| 				$writer->endElement(); | ||||
| 			} | ||||
| 			else { | ||||
| 				$writer->startElement('section'); | ||||
| 				if ($section->isAttributeTitle()) { | ||||
| 					$writer->writeAttribute('name', '_' . $section->getPdfKey()); | ||||
| 				} | ||||
| 				else { | ||||
| 					$writer->writeAttribute('name', $section->getTitle()); | ||||
| 				} | ||||
| 				foreach ($section->getEntries() as $entry) { | ||||
| 					$writer->startElement('entry'); | ||||
| 					$writer->writeAttribute('name', $entry->getKey()); | ||||
| 					$writer->endElement(); | ||||
| 				} | ||||
| 				$writer->endElement(); | ||||
| 			} | ||||
| 		} | ||||
| 		$writer->endElement(); | ||||
| 		return $writer->outputMemory(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Writes the XML to the given file. | ||||
| 	 * | ||||
| 	 * @param string $xml XML | ||||
| 	 * @param string $file file name | ||||
| 	 */ | ||||
| 	protected function writeXML($xml, $file) { | ||||
| 		$handle = @fopen($file,'w'); | ||||
| 		if (!$handle) { | ||||
| 			throw new \LAMException(_('Could not save PDF structure, access denied.')); | ||||
| 		} | ||||
| 		fwrite($handle, $xml); | ||||
| 		fclose($handle); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * PDF structure | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFStructure { | ||||
| 
 | ||||
| 	/** no folding marks */ | ||||
| 	const FOLDING_NONE = 'no'; | ||||
| 	/** standard folding marks */ | ||||
| 	const FOLDING_STANDARD = 'standard'; | ||||
| 
 | ||||
| 	private $logo = null; | ||||
| 
 | ||||
| 	private $title = 'LDAP Account Manager'; | ||||
| 
 | ||||
| 	private $foldingMarks = 'no'; | ||||
| 
 | ||||
| 	private $sections = array(); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the logo file path. | ||||
| 	 * | ||||
| 	 * @return string logo | ||||
| 	 */ | ||||
| 	public function getLogo() { | ||||
| 		return $this->logo; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the logo file path. | ||||
| 	 * | ||||
| 	 * @param string $logo logo | ||||
| 	 */ | ||||
| 	public function setLogo($logo) { | ||||
| 		$this->logo = $logo; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the title. | ||||
| 	 * | ||||
| 	 * @return string title | ||||
| 	 */ | ||||
| 	public function getTitle() { | ||||
| 		return $this->title; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the title. | ||||
| 	 * | ||||
| 	 * @param string $title title | ||||
| 	 */ | ||||
| 	public function setTitle($title) { | ||||
| 		$this->title = $title; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns if to print folding marks. | ||||
| 	 * | ||||
| 	 * @return string print folding marks | ||||
| 	 */ | ||||
| 	public function getFoldingMarks() { | ||||
| 		return $this->foldingMarks; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets if to print folding marks. | ||||
| 	 * | ||||
| 	 * @param string $foldingMarks print folding marks | ||||
| 	 */ | ||||
| 	public function setFoldingMarks($foldingMarks) { | ||||
| 		$this->foldingMarks = $foldingMarks; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the sections. | ||||
| 	 * | ||||
| 	 * @return PDFTextSection[]|PDFEntrySection[] $sections | ||||
| 	 */ | ||||
| 	public function getSections() { | ||||
| 		return $this->sections; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the sections. | ||||
| 	 * | ||||
| 	 * @param PDFTextSection[]|PDFEntrySection[] $sections sections | ||||
| 	 */ | ||||
| 	public function setSections($sections) { | ||||
| 		$this->sections = $sections; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Section for static text. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFTextSection { | ||||
| 
 | ||||
| 	private $text = ''; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Constructor. | ||||
| 	 * | ||||
| 	 * @param string $text text | ||||
| 	 */ | ||||
| 	public function __construct($text) { | ||||
| 		$this->text = $text; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the text. | ||||
| 	 * | ||||
| 	 * @return string text | ||||
| 	 */ | ||||
| 	public function getText() { | ||||
| 		return $this->text; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * PDF section that contains LDAP data entries. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFEntrySection { | ||||
| 
 | ||||
| 	private $title; | ||||
| 	private $entries; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * @param string $title title | ||||
| 	 */ | ||||
| 	public function __construct($title) { | ||||
| 		$this->title = $title; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns if the title is an attribute value. | ||||
| 	 * | ||||
| 	 * @return boolean is attribute | ||||
| 	 */ | ||||
| 	public function isAttributeTitle() { | ||||
| 		return boolval(preg_match('/^_([a-zA-Z0-9_-])+$/', $this->title)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the PDF key name. | ||||
| 	 * | ||||
| 	 * @return string PDF key name | ||||
| 	 */ | ||||
| 	public function getPdfKey() { | ||||
| 		return substr($this->title, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the text title. | ||||
| 	 * | ||||
| 	 * @return string title | ||||
| 	 */ | ||||
| 	public function getTitle() { | ||||
| 		return $this->title; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the title text. | ||||
| 	 * | ||||
| 	 * @param string $title title | ||||
| 	 */ | ||||
| 	public function setTitle($title) { | ||||
| 		$this->title = $title; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the entries. | ||||
| 	 * | ||||
| 	 * @return PDFSectionEntry[] entries | ||||
| 	 */ | ||||
| 	public function getEntries() { | ||||
| 		return $this->entries; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the entries. | ||||
| 	 * | ||||
| 	 * @param PDFSectionEntry[] $entries entries | ||||
| 	 */ | ||||
| 	public function setEntries($entries) { | ||||
| 		$this->entries = $entries; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Single PDF entry. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  */ | ||||
| class PDFSectionEntry { | ||||
| 
 | ||||
| 	private $key; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 * | ||||
| 	 * @param string $key key | ||||
| 	 */ | ||||
| 	public function __construct($key) { | ||||
| 		$this->key = $key; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the PDF key. | ||||
| 	 * | ||||
| 	 * @return string $key key | ||||
| 	 */ | ||||
| 	public function getKey() { | ||||
| 		return $this->key; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| ?>
 | ||||
|  |  | |||
|  | @ -1,70 +0,0 @@ | |||
| <?php | ||||
| namespace LAM\PDF; | ||||
| /* | ||||
| $Id$ | ||||
| 
 | ||||
|   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) | ||||
|   Copyright (C) 2003 - 2006  Michael Duergner | ||||
|                 2017         Roland Gruber | ||||
| 
 | ||||
|   This program is free software; you can redistribute it and/or modify | ||||
|   it under the terms of the GNU General Public License as published by | ||||
|   the Free Software Foundation; either version 2 of the License, or | ||||
|   (at your option) any later version. | ||||
| 
 | ||||
|   This program is distributed in the hope that it will be useful, | ||||
|   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|   GNU General Public License for more details. | ||||
| 
 | ||||
|   You should have received a copy of the GNU General Public License | ||||
|   along with this program; if not, write to the Free Software | ||||
|   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| */ | ||||
| 
 | ||||
| /** | ||||
|  * Simple XML parser. | ||||
|  * | ||||
|  * @author Michael Duergner | ||||
|  * @package PDF | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * Simple XML parser. | ||||
|  * | ||||
|  * @author Michael Duergner | ||||
|  * @package PDF | ||||
|  */ | ||||
| class xmlParser { | ||||
| 
 | ||||
| 	/**	XML parser */ | ||||
| 	private $xmlParser; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 */ | ||||
| 	function __construct() { | ||||
| 		$this->xmlParser = xml_parser_create(); | ||||
| 		xml_set_object($this->xmlParser, $this); | ||||
| 		xml_parser_set_option($this->xmlParser, XML_OPTION_CASE_FOLDING, 1); | ||||
| 		xml_parser_set_option($this->xmlParser, XML_OPTION_SKIP_WHITE, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Starts the parsing. | ||||
| 	 * | ||||
| 	 * @param String $filename file name | ||||
| 	 * @return array XML structure | ||||
| 	 */ | ||||
| 	function parse($filename) { | ||||
| 		if(file_exists($filename)) { | ||||
| 			$xmlStructure = array(); | ||||
| 			$xmlIndex = array(); | ||||
| 			$xmlContent = | ||||
| 			xml_parse_into_struct($this->xmlParser, implode("", file($filename)), $xmlStructure, $xmlIndex); | ||||
| 			return array($xmlStructure, $xmlIndex); | ||||
| 		} | ||||
| 		return array(); | ||||
| 	} | ||||
| } | ||||
| ?>
 | ||||
|  | @ -75,7 +75,6 @@ setlanguage(); | |||
| // Unset PDF structure definitions in session if set
 | ||||
| if(isset($_SESSION['currentPDFStructure'])) { | ||||
| 	unset($_SESSION['currentPDFStructure']); | ||||
| 	unset($_SESSION['currentPageDefinitions']); | ||||
| } | ||||
| 
 | ||||
| // check if user is logged in, if not go to login
 | ||||
|  | @ -223,6 +222,12 @@ include '../main_header.php'; | |||
| 			$container->addElement($message, true); | ||||
| 		} | ||||
| 
 | ||||
| 		if (isset($_GET['loadFailed'])) { | ||||
| 			$message = new htmlStatusMessage("ERROR", _("Unable to read PDF structure."), htmlspecialchars($_GET['name'])); | ||||
| 			$message->colspan = 10; | ||||
| 			$container->addElement($message, true); | ||||
| 		} | ||||
| 
 | ||||
| 		// new template
 | ||||
| 		if (!empty($availableTypes)) { | ||||
| 			$container->addElement(new htmlSubTitle(_('Create a new PDF structure')), true); | ||||
|  |  | |||
|  | @ -14,6 +14,12 @@ use \htmlSubTitle; | |||
| use \htmlFieldset; | ||||
| use \htmlInputTextarea; | ||||
| use \htmlHiddenInput; | ||||
| use LAM\PDF\PDFStructureReader; | ||||
| use LAM\PDF\PDFTextSection; | ||||
| use LAM\PDF\PDFEntrySection; | ||||
| use LAM\PDF\PDFStructure; | ||||
| use LAM\PDF\PDFSectionEntry; | ||||
| use LAM\PDF\PDFStructureWriter; | ||||
| /* | ||||
| $Id$ | ||||
| 
 | ||||
|  | @ -57,8 +63,6 @@ include_once('../../lib/ldap.inc'); | |||
| include_once('../../lib/config.inc'); | ||||
| /** module functions */ | ||||
| include_once('../../lib/modules.inc'); | ||||
| /** XML functions */ | ||||
| include_once('../../lib/xml_parser.inc'); | ||||
| 
 | ||||
| // start session
 | ||||
| startSecureSession(); | ||||
|  | @ -84,9 +88,6 @@ if (!$_SESSION['ldap'] || !$_SESSION['ldap']->server()) { | |||
| // Write $_POST variables to $_GET when form was submitted via post
 | ||||
| if (isset($_POST['type'])) { | ||||
| 	$_GET = $_POST; | ||||
| 	if ($_POST['pdfname'] == '') { | ||||
| 		unset($_GET['pdfname']); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| $typeManager = new \LAM\TYPES\TypeManager(); | ||||
|  | @ -103,270 +104,48 @@ if(isset($_GET['abort'])) { | |||
| 	exit; | ||||
| } | ||||
| 
 | ||||
| // set new logo and headline
 | ||||
| if ((isset($_GET['headline'])) && ($_GET['logoFile'] != $_SESSION['currentPageDefinitions']['filename'])) { | ||||
| 	$_SESSION['currentPageDefinitions']['filename'] = $_GET['logoFile']; | ||||
| } | ||||
| if ((isset($_GET['headline'])) && ($_GET['headline'] != $_SESSION['currentPageDefinitions']['headline'])) { | ||||
| 	$_SESSION['currentPageDefinitions']['headline'] = str_replace('<','',str_replace('>','',$_GET['headline'])); | ||||
| } | ||||
| if ((isset($_GET['foldingmarks'])) && (!isset($_SESSION['currentPageDefinitions']['foldingmarks']) || ($_GET['foldingmarks'] != $_SESSION['currentPageDefinitions']['foldingmarks']))) { | ||||
| 	$_SESSION['currentPageDefinitions']['foldingmarks'] = $_GET['foldingmarks']; | ||||
| // Load PDF structure from file if it is not defined in session
 | ||||
| if(!isset($_SESSION['currentPDFStructure'])) { | ||||
| 	// Load structure file to be edit
 | ||||
| 	$reader = new PDFStructureReader(); | ||||
| 	try { | ||||
| 		if(isset($_GET['edit'])) { | ||||
| 			$_SESSION['currentPDFStructure'] = $reader->read($type->getId(), $_GET['edit']); | ||||
| 		} | ||||
| 		// Load default structure file when creating a new one
 | ||||
| 		else { | ||||
| 			$_SESSION['currentPDFStructure'] = $reader->read($type->getId(), 'default'); | ||||
| 		} | ||||
| 	} | ||||
| 	catch (\LAMException $e) { | ||||
| 		metaRefresh('pdfmain.php?loadFailed=1&name=' . $_GET['edit']); | ||||
| 		exit; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Change section headline
 | ||||
| foreach ($_GET as $key => $value) { | ||||
| 	if (strpos($key, 'section_') === 0) { | ||||
| 		$pos = substr($key, strlen('section_')); | ||||
| 		$_SESSION['currentPDFStructure'][$pos]['attributes']['NAME'] = $value; | ||||
| 	} | ||||
| if (!empty($_POST['form_submit'])) { | ||||
| 	updateBasicSettings($_SESSION['currentPDFStructure']); | ||||
| 	updateSectionTitles($_SESSION['currentPDFStructure']); | ||||
| 	addSection($_SESSION['currentPDFStructure']); | ||||
| 	addSectionEntry($_SESSION['currentPDFStructure']); | ||||
| 	removeItem($_SESSION['currentPDFStructure']); | ||||
| 	moveUp($_SESSION['currentPDFStructure']); | ||||
| 	moveDown($_SESSION['currentPDFStructure']); | ||||
| } | ||||
| 
 | ||||
| // Check if pdfname is valid, then save current structure to file and go to
 | ||||
| // main pdf structure page
 | ||||
| $saveErrors = array(); | ||||
| if(isset($_GET['submit'])) { | ||||
| 	if(!isset($_GET['pdfname']) || !preg_match('/[a-zA-Z0-9\-\_]+/',$_GET['pdfname'])) { | ||||
| 		$saveErrors[] = array('ERROR', _('PDF structure name not valid'), _('The name for that PDF-structure you submitted is not valid. A valid name must consist of the following characters: \'a-z\',\'A-Z\',\'0-9\',\'_\',\'-\'.')); | ||||
| 	$writer = new PDFStructureWriter(); | ||||
| 	try { | ||||
| 		$writer->write($type->getId(), $_POST['pdfname'], $_SESSION['currentPDFStructure']); | ||||
| 		unset($_SESSION['currentPDFStructure']); | ||||
| 		metaRefresh('pdfmain.php?savedSuccessfully=' . $_POST['pdfname']); | ||||
| 		exit; | ||||
| 	} | ||||
| 	else { | ||||
| 		$return = \LAM\PDF\savePDFStructure($type->getId(), $_GET['pdfname']); | ||||
| 		if($return == 'ok') { | ||||
| 			metaRefresh('pdfmain.php?savedSuccessfully=' . $_GET['pdfname']); | ||||
| 			exit; | ||||
| 		} | ||||
| 		elseif($return == 'no perms'){ | ||||
| 			$saveErrors[] = array('ERROR', _("Could not save PDF structure, access denied."), $_GET['pdfname']); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| // add a new text field
 | ||||
| elseif(isset($_GET['add_text'])) { | ||||
| 	// Check if text for static text field is specified
 | ||||
| 	if(empty($_GET['text_text'])) { | ||||
| 		StatusMessage('ERROR',_('No static text specified'),_('The static text must contain at least one character.')); | ||||
| 	} | ||||
| 	else { | ||||
| 		$entry = array(array('tag' => 'TEXT','type' => 'complete','level' => '2','value' => str_replace("\r", "\n", $_GET['text_text']))); | ||||
| 		// Insert new field in structure
 | ||||
| 		array_splice($_SESSION['currentPDFStructure'],$_GET['add_text_position'],0,$entry); | ||||
| 	} | ||||
| } | ||||
| // add a new section with text headline
 | ||||
| elseif(isset($_GET['add_sectionText'])) { | ||||
| 	// Check if name for new section is specified when needed
 | ||||
| 	if(!isset($_GET['new_section_text']) || ($_GET['new_section_text'] == '')) { | ||||
| 		StatusMessage('ERROR',_('No section text specified'),_('The headline for a new section must contain at least one character.')); | ||||
| 	} | ||||
| 	else { | ||||
| 		$attributes = array(); | ||||
| 		$attributes['NAME'] = $_GET['new_section_text']; | ||||
| 		$entry = array(array('tag' => 'SECTION','type' => 'open','level' => '2','attributes' => $attributes),array('tag' => 'SECTION','type' => 'close','level' => '2')); | ||||
| 		// Insert new field in structure
 | ||||
| 		array_splice($_SESSION['currentPDFStructure'],$_GET['add_sectionText_position'],0,$entry); | ||||
| 	} | ||||
| } | ||||
| // Add a new section with item as headline
 | ||||
| elseif(isset($_GET['add_section'])) { | ||||
| 		$attributes = array(); | ||||
| 		$attributes['NAME'] = '_' . $_GET['new_section_item']; | ||||
| 		$entry = array(array('tag' => 'SECTION','type' => 'open','level' => '2','attributes' => $attributes),array('tag' => 'SECTION','type' => 'close','level' => '2')); | ||||
| 		// Insert new field in structure
 | ||||
| 		array_splice($_SESSION['currentPDFStructure'],$_GET['add_section_position'],0,$entry); | ||||
| } | ||||
| // Add a new value field
 | ||||
| elseif(isset($_GET['add_new_field'])) { | ||||
| 	$field = array('tag' => 'ENTRY','type' => 'complete','level' => '3','attributes' => array('NAME' => $_GET['new_field'])); | ||||
| 	$pos = 0; | ||||
| 	// Find begin section to insert into
 | ||||
| 	while($pos < $_GET['add_field_position']) { | ||||
| 		next($_SESSION['currentPDFStructure']); | ||||
| 		$pos++; | ||||
| 	} | ||||
| 	$current = next($_SESSION['currentPDFStructure']); | ||||
| 	$pos++; | ||||
| 	// End of section to insert into
 | ||||
| 	while($current && $current['tag'] != 'SECTION' && $current['type'] != 'close') { | ||||
| 		$current = next($_SESSION['currentPDFStructure']); | ||||
| 		$pos++; | ||||
| 	} | ||||
| 	// Insert new entry before closing section tag
 | ||||
| 	array_splice($_SESSION['currentPDFStructure'],$pos,0,array($field)); | ||||
| } | ||||
| 
 | ||||
| foreach ($_GET as $key => $value) { | ||||
| 	// remove entry or section
 | ||||
| 	if (strpos($key, 'remove_') === 0) { | ||||
| 		$pos = substr($key, strlen('remove_')); | ||||
| 		$remove = $_SESSION['currentPDFStructure'][$pos]; | ||||
| 		// We have a section to remove
 | ||||
| 		if($remove['tag'] == "SECTION") { | ||||
| 			$end = $pos + 1; | ||||
| 			// Find end of section to remove
 | ||||
| 			while (isset($_SESSION['currentPDFStructure'][$end]) && ($_SESSION['currentPDFStructure'][$end]['tag'] != 'SECTION') | ||||
| 				&& ($_SESSION['currentPDFStructure'][$end]['type'] != 'close')) { | ||||
| 				$end++; | ||||
| 			} | ||||
| 			// Remove complete section with all value entries in it from structure
 | ||||
| 			array_splice($_SESSION['currentPDFStructure'], $pos, $end - $pos + 1); | ||||
| 		} | ||||
| 		// We have a value entry to remove
 | ||||
| 		elseif($remove['tag'] == "ENTRY") { | ||||
| 			array_splice($_SESSION['currentPDFStructure'], $pos, 1); | ||||
| 		} | ||||
| 		// We hava a static text to remove
 | ||||
| 		elseif($remove['tag'] == "TEXT") { | ||||
| 			array_splice($_SESSION['currentPDFStructure'], $pos, 1); | ||||
| 		} | ||||
| 	} | ||||
| 	// Move a section, static text field or value entry downwards
 | ||||
| 	elseif (strpos($key, 'down_') === 0) { | ||||
| 		$index = substr($key, strlen('down_')); | ||||
| 		$tmp = $_SESSION['currentPDFStructure'][$index]; | ||||
| 		$next = $_SESSION['currentPDFStructure'][$index + 1]; | ||||
| 		// We have a section or static text to move
 | ||||
| 		if($tmp['tag'] == 'SECTION' || $tmp['tag'] == 'TEXT') { | ||||
| 			$pos = 0; | ||||
| 			$current = current($_SESSION['currentPDFStructure']); | ||||
| 			// Find section or static text entry to move
 | ||||
| 			while($pos < $index) { | ||||
| 				$current = next($_SESSION['currentPDFStructure']); | ||||
| 				$pos++; | ||||
| 			} | ||||
| 			$borders = array(); | ||||
| 			// We have a section to move
 | ||||
| 			if($current['tag'] == 'SECTION'){ | ||||
| 				$borders[$current['type']][] = $pos; | ||||
| 				$current = next($_SESSION['currentPDFStructure']); | ||||
| 				$pos++; | ||||
| 				// Find end of section to move
 | ||||
| 				while($current && $current['tag'] != 'SECTION' && $current['type'] != 'close') { | ||||
| 					$current = next($_SESSION['currentPDFStructure']); | ||||
| 					$pos++; | ||||
| 				} | ||||
| 				$borders['close'][] = $pos; | ||||
| 			} | ||||
| 			// We have a static text entry to move
 | ||||
| 			elseif($current['tag'] == 'TEXT') { | ||||
| 				$borders['open'][] = $pos; | ||||
| 				$borders['close'][] = $pos; | ||||
| 			} | ||||
| 			$current = next($_SESSION['currentPDFStructure']); | ||||
| 			$pos++; | ||||
| 			// Find next section or static text entry in structure
 | ||||
| 			if($current) { | ||||
| 				// Next is a section
 | ||||
| 				if($current['tag'] == 'SECTION') { | ||||
| 					$borders[$current['type']][] = $pos; | ||||
| 					$current = next($_SESSION['currentPDFStructure']); | ||||
| 					$pos++; | ||||
| 					// Find end of this section
 | ||||
| 					while($current && $current['tag'] != 'SECTION' && $current['type'] != 'close') { | ||||
| 						if($current['tag'] == 'SECTION') { | ||||
| 							$borders[$current['type']][] = $pos; | ||||
| 						} | ||||
| 						$current = next($_SESSION['currentPDFStructure']); | ||||
| 						$pos++; | ||||
| 					} | ||||
| 				} | ||||
| 				// Next is static text entry
 | ||||
| 				elseif($current['tag'] == 'TEXT') { | ||||
| 					$borders['open'][] = $pos; | ||||
| 				} | ||||
| 				$borders['close'][] = $pos; | ||||
| 			} | ||||
| 			// Move only downwars if not bottenmost element of this structure
 | ||||
| 			if(count($borders['open']) > 1) { | ||||
| 				// Calculate entries to move and move them
 | ||||
| 				$cut_start = $borders['open'][count($borders['open']) - 1]; | ||||
| 				$cut_count = $borders['close'][count($borders['close']) - 1] - $borders['open'][count($borders['open']) - 1] + 1; | ||||
| 				$insert_pos = $borders['open'][count($borders['open']) - 2]; | ||||
| 				$tomove = array_splice($_SESSION['currentPDFStructure'],$cut_start,$cut_count); | ||||
| 				array_splice($_SESSION['currentPDFStructure'],$insert_pos,0,$tomove); | ||||
| 			} | ||||
| 		} | ||||
| 		// We have a value entry to move; move it only if it is not the bottmmost
 | ||||
| 		// element of this section.
 | ||||
| 		elseif($tmp['tag'] == 'ENTRY' && $next['tag'] == 'ENTRY') { | ||||
| 			$_SESSION['currentPDFStructure'][$index] = $_SESSION['currentPDFStructure'][$index + 1]; | ||||
| 			$_SESSION['currentPDFStructure'][$index + 1] = $tmp; | ||||
| 		} | ||||
| 	} | ||||
| 	// Move a section, static text or value entry upwards
 | ||||
| 	elseif (strpos($key, 'up_') === 0) { | ||||
| 		$index = substr($key, strlen('up_')); | ||||
| 		$tmp = $_SESSION['currentPDFStructure'][$index]; | ||||
| 		$prev = $_SESSION['currentPDFStructure'][$index - 1]; | ||||
| 		// We have a section or static text to move
 | ||||
| 		if($tmp['tag'] == 'SECTION' || $tmp['tag'] == 'TEXT') { | ||||
| 			$pos = 0; | ||||
| 			$borders = array(); | ||||
| 			$current = current($_SESSION['currentPDFStructure']); | ||||
| 			// Add borders of sections and static text entry to array
 | ||||
| 			if($current['tag'] == 'SECTION') { | ||||
| 				$borders[$current['type']][] = $pos; | ||||
| 			} | ||||
| 			elseif($current['tag'] == 'TEXT') { | ||||
| 				$borders['open'][] = $pos; | ||||
| 				$borders['close'][] = $pos; | ||||
| 			} | ||||
| 			// Find all sections and statci text fields before the section or static
 | ||||
| 			// text entry to move upwards
 | ||||
| 			while($pos < $index) { | ||||
| 				$current = next($_SESSION['currentPDFStructure']); | ||||
| 				$pos++; | ||||
| 				if($current['tag'] == 'SECTION') { | ||||
| 					$borders[$current['type']][] = $pos; | ||||
| 				} | ||||
| 				elseif($current['tag'] == 'TEXT') { | ||||
| 					$borders['open'][] = $pos; | ||||
| 					$borders['close'][] = $pos; | ||||
| 				} | ||||
| 			} | ||||
| 			// Move only when not topmost element
 | ||||
| 			if(count($borders['close']) > 0) { | ||||
| 				// We have a section to move up
 | ||||
| 				if($current['tag'] == 'SECTION') { | ||||
| 					$current = next($_SESSION['currentPDFStructure']); | ||||
| 					$pos++; | ||||
| 					// Find end of section to move
 | ||||
| 					while($current && $current['tag'] != 'SECTION' && $current['type'] != 'close') { | ||||
| 						$current = next($_SESSION['currentPDFStructure']); | ||||
| 						$pos++; | ||||
| 					} | ||||
| 					$borders['close'][] = $pos; | ||||
| 				} | ||||
| 				// Calculate the entries to move and move them
 | ||||
| 				$cut_start = $borders['open'][count($borders['open']) - 1]; | ||||
| 				$cut_count = $borders['close'][count($borders['close']) - 1] - $borders['open'][count($borders['open']) - 1] + 1; | ||||
| 				$insert_pos = $borders['open'][count($borders['open']) - 2]; | ||||
| 				$tomove = array_splice($_SESSION['currentPDFStructure'],$cut_start,$cut_count); | ||||
| 				array_splice($_SESSION['currentPDFStructure'],$insert_pos,0,$tomove); | ||||
| 			} | ||||
| 		} | ||||
| 		// We have a value entry to move; move it only if its not the topmost
 | ||||
| 		// entry in this section
 | ||||
| 		elseif($tmp['tag'] == 'ENTRY' && $prev['tag'] == 'ENTRY') { | ||||
| 			$_SESSION['currentPDFStructure'][$index] = $prev; | ||||
| 			$_SESSION['currentPDFStructure'][$index - 1] = $tmp; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Load PDF structure from file if it is not defined in session
 | ||||
| if(!isset($_SESSION['currentPDFStructure'])) { | ||||
| 	// Load structure file to be edit
 | ||||
| 	if(isset($_GET['edit'])) { | ||||
| 		$load = \LAM\PDF\loadPDFStructure($type->getId(), $_GET['edit']); | ||||
| 		$_SESSION['currentPDFStructure'] = $load['structure']; | ||||
| 		$_SESSION['currentPageDefinitions'] = $load['page_definitions']; | ||||
| 		$_GET['pdfname'] = $_GET['edit']; | ||||
| 	} | ||||
| 	// Load default structure file when creating a new one
 | ||||
| 	else { | ||||
| 		$load = \LAM\PDF\loadPDFStructure($type->getId()); | ||||
| 		$_SESSION['currentPDFStructure'] = $load['structure']; | ||||
| 		$_SESSION['currentPageDefinitions'] = $load['page_definitions']; | ||||
| 	catch (\LAMException $e) { | ||||
| 		$saveErrors[] = array('ERROR', $e->getTitle(), $e->getMessage()); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -432,17 +211,11 @@ $structureName = ''; | |||
| if (isset($_GET['edit'])) { | ||||
| 	$structureName = $_GET['edit']; | ||||
| } | ||||
| elseif (isset($_GET['pdfname'])) { | ||||
| 	$structureName = $_GET['pdfname']; | ||||
| } | ||||
| else if (isset($_POST['pdfname'])) { | ||||
| 	$structureName = $_POST['pdfname']; | ||||
| } | ||||
| // headline
 | ||||
| $headline = 'LDAP Account Manager'; | ||||
| if (isset($_SESSION['currentPageDefinitions']['headline'])) { | ||||
| 	$headline = $_SESSION['currentPageDefinitions']['headline']; | ||||
| } | ||||
| $headline = $_SESSION['currentPDFStructure']->getTitle(); | ||||
| // logo
 | ||||
| $logoFiles = \LAM\PDF\getAvailableLogos(); | ||||
| $logos = array(_('No logo') => 'none'); | ||||
|  | @ -450,8 +223,8 @@ foreach($logoFiles as $logoFile) { | |||
| 	$logos[$logoFile['filename'] . ' (' . $logoFile['infos'][0] . ' x ' . $logoFile['infos'][1] . ")"] = $logoFile['filename']; | ||||
| } | ||||
| $selectedLogo = array('printLogo.jpg'); | ||||
| if (isset($_SESSION['currentPageDefinitions']['filename'])) { | ||||
| 	$selectedLogo = array($_SESSION['currentPageDefinitions']['filename']); | ||||
| if (isset($_SESSION['currentPDFStructure'])) { | ||||
| 	$selectedLogo = array($_SESSION['currentPDFStructure']->getLogo()); | ||||
| } | ||||
| 
 | ||||
| ?>
 | ||||
|  | @ -473,8 +246,8 @@ $logoSelect = new htmlTableExtendedSelect('logoFile', $logos, $selectedLogo, _(' | |||
| $logoSelect->setHasDescriptiveElements(true); | ||||
| $mainContent->addElement($logoSelect, true); | ||||
| $foldingMarks = 'no'; | ||||
| if (isset($_SESSION['currentPageDefinitions']['foldingmarks'])) { | ||||
| 	$foldingMarks = $_SESSION['currentPageDefinitions']['foldingmarks']; | ||||
| if (isset($_SESSION['currentPDFStructure'])) { | ||||
| 	$foldingMarks = $_SESSION['currentPDFStructure']->getFoldingMarks(); | ||||
| } | ||||
| $possibleFoldingMarks = array(_('No') => 'no', _('Yes') => 'standard'); | ||||
| $foldingMarksSelect = new htmlTableExtendedSelect('foldingmarks', $possibleFoldingMarks, array($foldingMarks), _('Folding marks')); | ||||
|  | @ -482,38 +255,38 @@ $foldingMarksSelect->setHasDescriptiveElements(true); | |||
| $mainContent->addElement($foldingMarksSelect, true); | ||||
| $mainContent->addElement(new htmlSpacer(null, '30px'), true); | ||||
| // PDF structure
 | ||||
| $structure = $_SESSION['currentPDFStructure']; | ||||
| // print every entry in the current structure
 | ||||
| $structureContent = new htmlTable(); | ||||
| for ($key = 0; $key < sizeof($_SESSION['currentPDFStructure']); $key++) { | ||||
| 	$entry = $_SESSION['currentPDFStructure'][$key]; | ||||
| $sections = $structure->getSections(); | ||||
| for ($key = 0; $key < sizeof($sections); $key++) { | ||||
| 	$section = $sections[$key]; | ||||
| 	// create the up/down/remove links
 | ||||
| 	$linkBase = 'pdfpage.php?type=' . $type->getId() . '&pdfname=' . $structureName . '&headline=' . $headline . '&logoFile=' . $selectedLogo[0] . '&foldingmarks=' . $foldingMarks; | ||||
| 	$linkUp = new htmlButton('up_' . $key, 'up.gif', true); | ||||
| 	$linkUp = new htmlButton('up_section_' . $key, 'up.gif', true); | ||||
| 	$linkUp->setTitle(_("Up")); | ||||
| 	$linkDown = new htmlButton('down_' . $key, 'down.gif', true); | ||||
| 	$linkDown = new htmlButton('down_section_' . $key, 'down.gif', true); | ||||
| 	$linkDown->setTitle(_("Down")); | ||||
| 	$linkRemove = new htmlButton('remove_' . $key, 'delete.gif', true); | ||||
| 	$linkRemove = new htmlButton('remove_section_' . $key, 'delete.gif', true); | ||||
| 	$linkRemove->setTitle(_("Remove")); | ||||
| 	$emptyBox = new htmlOutputText(''); | ||||
| 	// We have a new section to start
 | ||||
| 	if(($entry['tag'] == "SECTION") && ($entry['type'] == 'open')) { | ||||
| 		$name = $entry['attributes']['NAME']; | ||||
| 		if(preg_match("/^_[a-zA-Z0-9_]+_[a-zA-Z0-9_]+/",$name)) { | ||||
| 			$section_headline = translateFieldIDToName(substr($name,1), $type->getScope(), $availablePDFFields); | ||||
| 	if($section instanceof PDFEntrySection) { | ||||
| 		if($section->isAttributeTitle()) { | ||||
| 			$section_headline = translateFieldIDToName($section->getPdfKey(), $type->getScope(), $availablePDFFields); | ||||
| 		} | ||||
| 		else { | ||||
| 			$section_headline = $name; | ||||
| 			$section_headline = $section->getTitle(); | ||||
| 		} | ||||
| 		$nonTextSectionElements[$section_headline] = $key; | ||||
| 		$sectionElements[$section_headline] = $key; | ||||
| 		$structureContent->addElement(new htmlSpacer(null, '15px'), true); | ||||
| 		// Section headline is a value entry
 | ||||
| 		if(preg_match("/^_[a-zA-Z0-9_]+_[a-zA-Z0-9_]+/",$name)) { | ||||
| 		if($section->isAttributeTitle()) { | ||||
| 			$headlineElements = array(); | ||||
| 			foreach($section_items_array as $item) { | ||||
| 				$headlineElements[translateFieldIDToName($item, $type->getScope(), $availablePDFFields)] = '_' . $item; | ||||
| 			} | ||||
| 			$sectionHeadlineSelect = new htmlSelect('section_' . $key, $headlineElements, array($name)); | ||||
| 			$sectionHeadlineSelect = new htmlSelect('section_' . $key, $headlineElements, array('_' . $section->getPdfKey())); | ||||
| 			$sectionHeadlineSelect->setHasDescriptiveElements(true); | ||||
| 			$sectionHeadlineGroup = new htmlGroup(); | ||||
| 			$sectionHeadlineGroup->addElement($sectionHeadlineSelect); | ||||
|  | @ -534,14 +307,7 @@ for ($key = 0; $key < sizeof($_SESSION['currentPDFStructure']); $key++) { | |||
| 		else { | ||||
| 			$structureContent->addElement($emptyBox); | ||||
| 		} | ||||
| 		$hasAdditionalSections = false; | ||||
| 		for ($a = $key + 1; $a < sizeof($_SESSION['currentPDFStructure']); $a++) { | ||||
| 			if ((($_SESSION['currentPDFStructure'][$a]['tag'] == "SECTION") && ($_SESSION['currentPDFStructure'][$a]['type'] == "open")) | ||||
| 				|| ($_SESSION['currentPDFStructure'][$a]['tag'] == "TEXT")) { | ||||
| 				$hasAdditionalSections = true; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		$hasAdditionalSections = $key < (sizeof($sections) - 1); | ||||
| 		if ($hasAdditionalSections) { | ||||
| 			$structureContent->addElement($linkDown); | ||||
| 		} | ||||
|  | @ -549,12 +315,46 @@ for ($key = 0; $key < sizeof($_SESSION['currentPDFStructure']); $key++) { | |||
| 			$structureContent->addElement($emptyBox); | ||||
| 		} | ||||
| 		$structureContent->addElement($linkRemove, true); | ||||
| 		// add section entries
 | ||||
| 		$sectionEntries = $section->getEntries(); | ||||
| 		for ($e = 0; $e < sizeof($sectionEntries); $e++) { | ||||
| 			$sectionEntry = $sectionEntries[$e]; | ||||
| 			$structureContent->addElement(new htmlSpacer('10px', null)); | ||||
| 			$fieldOutput = new htmlOutputText(translateFieldIDToName($sectionEntry->getKey(), $type->getScope(), $availablePDFFields)); | ||||
| 			$structureContent->addElement($fieldOutput); | ||||
| 			if ($e != 0) { | ||||
| 				$entryLinkUp = new htmlButton('up_entry_' . $key . '_' . $e, 'up.gif', true); | ||||
| 				$entryLinkUp->setTitle(_("Up")); | ||||
| 				$structureContent->addElement($entryLinkUp); | ||||
| 			} | ||||
| 			else { | ||||
| 				$structureContent->addElement($emptyBox); | ||||
| 			} | ||||
| 			if ($e < (sizeof($sectionEntries) - 1)) { | ||||
| 				$linkDown = new htmlButton('down_entry_' . $key . '_' . $e, 'down.gif', true); | ||||
| 				$linkDown->setTitle(_("Down")); | ||||
| 				$structureContent->addElement($linkDown); | ||||
| 			} | ||||
| 			else { | ||||
| 				$structureContent->addElement($emptyBox); | ||||
| 			} | ||||
| 			$entryLinkRemove = new htmlButton('remove_entry_' . $key . '_' . $e, 'delete.gif', true); | ||||
| 			$entryLinkRemove->setTitle(_("Remove")); | ||||
| 			$structureContent->addElement($entryLinkRemove, true); | ||||
| 		} | ||||
| 	} | ||||
| 	// We have to include a static text.
 | ||||
| 	elseif($entry['tag'] == "TEXT") { | ||||
| 	elseif($section instanceof PDFTextSection) { | ||||
| 		// Add current satic text for dropdown box needed for the position when inserting a new
 | ||||
| 		// section or static text entry
 | ||||
| 		$sectionElements[_('Static text')] = $key + 1; | ||||
| 		$textSnippet = $section->getText(); | ||||
| 		$textSnippet = str_replace(array("\n", "\r"), array(" ", " "), $textSnippet); | ||||
| 		$textSnippet = trim($textSnippet); | ||||
| 		if (strlen($textSnippet) > 15) { | ||||
| 			$textSnippet = substr($textSnippet, 0, 15) . '...'; | ||||
| 		} | ||||
| 		$textSnippet = htmlspecialchars($textSnippet); | ||||
| 		$sectionElements[_('Static text') . ': ' . $textSnippet] = $key; | ||||
| 		$structureContent->addElement(new htmlSpacer(null, '15px'), true); | ||||
| 		$sectionHeadlineOutput = new htmlOutputText(_('Static text')); | ||||
| 		$sectionHeadlineOutput->colspan = 2; | ||||
|  | @ -565,7 +365,7 @@ for ($key = 0; $key < sizeof($_SESSION['currentPDFStructure']); $key++) { | |||
| 		else { | ||||
| 			$structureContent->addElement($emptyBox); | ||||
| 		} | ||||
| 		if ($key != sizeof($_SESSION['currentPDFStructure']) - 1) { | ||||
| 		if ($key != sizeof($sections) - 1) { | ||||
| 			$structureContent->addElement($linkDown); | ||||
| 		} | ||||
| 		else { | ||||
|  | @ -573,32 +373,12 @@ for ($key = 0; $key < sizeof($_SESSION['currentPDFStructure']); $key++) { | |||
| 		} | ||||
| 		$structureContent->addElement($linkRemove, true); | ||||
| 		$structureContent->addElement(new htmlSpacer('10px', null)); | ||||
| 		$staticTextOutput = new htmlOutputText($entry['value']); | ||||
| 		$staticTextOutput = new htmlOutputText($section->getText()); | ||||
| 		$staticTextOutput->setPreformatted(); | ||||
| 		$structureContent->addElement($staticTextOutput, true); | ||||
| 	} | ||||
| 	// We have to include an entry from the account
 | ||||
| 	elseif($entry['tag'] == "ENTRY") { | ||||
| 		// Get name of current entry
 | ||||
| 		$name = $entry['attributes']['NAME']; | ||||
| 		$structureContent->addElement(new htmlSpacer('10px', null)); | ||||
| 		$fieldOutput = new htmlOutputText(translateFieldIDToName($name, $type->getScope(), $availablePDFFields)); | ||||
| 		$structureContent->addElement($fieldOutput); | ||||
| 		if ($_SESSION['currentPDFStructure'][$key - 1]['tag'] != 'SECTION') { | ||||
| 			$structureContent->addElement($linkUp); | ||||
| 		} | ||||
| 		else { | ||||
| 			$structureContent->addElement($emptyBox); | ||||
| 		} | ||||
| 		if ($_SESSION['currentPDFStructure'][$key + 1]['tag'] != 'SECTION') { | ||||
| 			$structureContent->addElement($linkDown); | ||||
| 		} | ||||
| 		else { | ||||
| 			$structureContent->addElement($emptyBox); | ||||
| 		} | ||||
| 		$structureContent->addElement($linkRemove, true); | ||||
| 	} | ||||
| } | ||||
| $sectionElements[_('End')] = sizeof($_SESSION['currentPDFStructure']); | ||||
| $sectionElements[_('End')] = sizeof($structure->getSections()); | ||||
| $structureContent->colspan = 3; | ||||
| $mainContent->addElement($structureContent); | ||||
| $container->addElement(new htmlFieldset($mainContent), true); | ||||
|  | @ -663,6 +443,7 @@ $buttonContainer->addElement($saveButton); | |||
| $buttonContainer->addElement($cancelButton); | ||||
| $buttonContainer->addElement(new htmlHiddenInput('modules', $modules)); | ||||
| $buttonContainer->addElement(new htmlHiddenInput('type', $type->getId())); | ||||
| $buttonContainer->addElement(new htmlHiddenInput('form_submit', 'true')); | ||||
| 
 | ||||
| $container->addElement($buttonContainer, true); | ||||
| addSecurityTokenToMetaHTML($container); | ||||
|  | @ -710,4 +491,190 @@ function translateFieldIDToName($id, $scope, $availablePDFFields) { | |||
| 	return $id; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Updates basic settings such as logo and head line. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function updateBasicSettings(&$structure) { | ||||
| 	// set headline
 | ||||
| 	if (isset($_POST['headline'])) { | ||||
| 		$structure->setTitle(str_replace('<', '', str_replace('>', '', $_POST['headline']))); | ||||
| 	} | ||||
| 	// set logo
 | ||||
| 	if (isset($_POST['logoFile'])) { | ||||
| 		$structure->setLogo($_POST['logoFile']); | ||||
| 	} | ||||
| 	// set folding marks
 | ||||
| 	if (isset($_POST['foldingmarks'])) { | ||||
| 		$structure->setFoldingMarks($_POST['foldingmarks']); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Updates section titles. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function updateSectionTitles(&$structure) { | ||||
| 	$sections = $structure->getSections(); | ||||
| 	foreach ($_POST as $key => $value) { | ||||
| 		if (strpos($key, 'section_') === 0) { | ||||
| 			$pos = substr($key, strlen('section_')); | ||||
| 			$sections[$pos]->setTitle($value); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Adds a new section if requested. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function addSection(&$structure) { | ||||
| 	$sections = $structure->getSections(); | ||||
| 	// add a new text field
 | ||||
| 	if(isset($_POST['add_text'])) { | ||||
| 		// Check if text for static text field is specified
 | ||||
| 		if(empty($_POST['text_text'])) { | ||||
| 			StatusMessage('ERROR',_('No static text specified'),_('The static text must contain at least one character.')); | ||||
| 		} | ||||
| 		else { | ||||
| 			$section = new PDFTextSection(str_replace("\r", "", $_POST['text_text'])); | ||||
| 			array_splice($sections, $_POST['add_text_position'], 0, array($section)); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 	} | ||||
| 	// add a new section with text headline
 | ||||
| 	elseif(isset($_POST['add_sectionText'])) { | ||||
| 		// Check if name for new section is specified when needed
 | ||||
| 		if(empty($_POST['new_section_text'])) { | ||||
| 			StatusMessage('ERROR',_('No section text specified'),_('The headline for a new section must contain at least one character.')); | ||||
| 		} | ||||
| 		else { | ||||
| 			$section = new PDFEntrySection($_POST['new_section_text']); | ||||
| 			array_splice($sections, $_POST['add_text_position'], 0, array($section)); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 	} | ||||
| 	// Add a new section with item as headline
 | ||||
| 	elseif(isset($_POST['add_section'])) { | ||||
| 		$section = new PDFEntrySection('_' . $_POST['new_section_item']); | ||||
| 		array_splice($sections, $_POST['add_text_position'], 0, array($section)); | ||||
| 		$structure->setSections($sections); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Adds a new entry to a section if requested. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function addSectionEntry(&$structure) { | ||||
| 	if(isset($_POST['add_new_field'])) { | ||||
| 		$field = new PDFSectionEntry($_POST['new_field']); | ||||
| 		$sections = $structure->getSections(); | ||||
| 		$pos = $_POST['add_field_position']; | ||||
| 		$entries = $sections[$pos]->getEntries(); | ||||
| 		$entries[] = $field; | ||||
| 		$sections[$pos]->setEntries($entries); | ||||
| 		$structure->setSections($sections); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Removes a section or entry if requested. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function removeItem(&$structure) { | ||||
| 	$sections = $structure->getSections(); | ||||
| 	foreach ($_POST as $key => $value) { | ||||
| 		// remove section
 | ||||
| 		if (strpos($key, 'remove_section_') === 0) { | ||||
| 			$pos = substr($key, strlen('remove_section_')); | ||||
| 			unset($sections[$pos]); | ||||
| 			$sections = array_values($sections); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 		// remove section entry
 | ||||
| 		if (strpos($key, 'remove_entry_') === 0) { | ||||
| 			$parts = substr($key, strlen('remove_entry_')); | ||||
| 			$parts = explode('_', $parts); | ||||
| 			$sectionPos = $parts[0]; | ||||
| 			$entryPos = $parts[1]; | ||||
| 			$entries = $sections[$sectionPos]->getEntries(); | ||||
| 			unset($entries[$entryPos]); | ||||
| 			$entries = array_values($entries); | ||||
| 			$sections[$sectionPos]->setEntries($entries); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Moves up a section or entry if requested. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function moveUp(&$structure) { | ||||
| 	$sections = $structure->getSections(); | ||||
| 	foreach ($_POST as $key => $value) { | ||||
| 		// move section
 | ||||
| 		if (strpos($key, 'up_section_') === 0) { | ||||
| 			$pos = substr($key, strlen('up_section_')); | ||||
| 			$sectionTmp = $sections[$pos - 1]; | ||||
| 			$sections[$pos - 1] = $sections[$pos]; | ||||
| 			$sections[$pos] = $sectionTmp; | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 		// move section entry
 | ||||
| 		if (strpos($key, 'up_entry_') === 0) { | ||||
| 			$parts = substr($key, strlen('up_entry_')); | ||||
| 			$parts = explode('_', $parts); | ||||
| 			$sectionPos = $parts[0]; | ||||
| 			$entryPos = $parts[1]; | ||||
| 			$entries = $sections[$sectionPos]->getEntries(); | ||||
| 			$entryTmp = $entries[$entryPos - 1]; | ||||
| 			$entries[$entryPos - 1] = $entries[$entryPos]; | ||||
| 			$entries[$entryPos] = $entryTmp; | ||||
| 			$sections[$sectionPos]->setEntries($entries); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Moves down a section or entry if requested. | ||||
|  * | ||||
|  * @param PDFStructure $structure | ||||
|  */ | ||||
| function moveDown(&$structure) { | ||||
| 	$sections = $structure->getSections(); | ||||
| 	foreach ($_POST as $key => $value) { | ||||
| 		// move section
 | ||||
| 		if (strpos($key, 'down_section_') === 0) { | ||||
| 			$pos = substr($key, strlen('down_section_')); | ||||
| 			$sectionTmp = $sections[$pos + 1]; | ||||
| 			$sections[$pos + 1] = $sections[$pos]; | ||||
| 			$sections[$pos] = $sectionTmp; | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 		// move section entry
 | ||||
| 		if (strpos($key, 'down_entry_') === 0) { | ||||
| 			$parts = substr($key, strlen('down_entry_')); | ||||
| 			$parts = explode('_', $parts); | ||||
| 			$sectionPos = $parts[0]; | ||||
| 			$entryPos = $parts[1]; | ||||
| 			$entries = $sections[$sectionPos]->getEntries(); | ||||
| 			$entries = $sections[$sectionPos]->getEntries(); | ||||
| 			$entryTmp = $entries[$entryPos + 1]; | ||||
| 			$entries[$entryPos + 1] = $entries[$entryPos]; | ||||
| 			$entries[$entryPos] = $entryTmp; | ||||
| 			$sections[$sectionPos]->setEntries($entries); | ||||
| 			$structure->setSections($sections); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| ?>
 | ||||
|  |  | |||
|  | @ -0,0 +1,114 @@ | |||
| <?php | ||||
| use LAM\PDF\PDFTextSection; | ||||
| use LAM\PDF\PDFEntrySection; | ||||
| use LAM\PDF\PDFStructureReader; | ||||
| use LAM\PDF\PDFStructure; | ||||
| use LAM\PDF\PDFStructureWriter; | ||||
| 
 | ||||
| /* | ||||
|   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) | ||||
|   Copyright (C) 2017  Roland Gruber | ||||
| 
 | ||||
|   This program is free software; you can redistribute it and/or modify | ||||
|   it under the terms of the GNU General Public License as published by | ||||
|   the Free Software Foundation; either version 2 of the License, or | ||||
|   (at your option) any later version. | ||||
| 
 | ||||
|   This program is distributed in the hope that it will be useful, | ||||
|   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|   GNU General Public License for more details. | ||||
| 
 | ||||
|   You should have received a copy of the GNU General Public License | ||||
|   along with this program; if not, write to the Free Software | ||||
|   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| include_once 'lam/lib/pdfstruct.inc'; | ||||
| 
 | ||||
| /** | ||||
|  * Reads a sample PDF structure. | ||||
|  * | ||||
|  * @author Roland Gruber | ||||
|  * | ||||
|  */ | ||||
| class ReadStructureTest extends PHPUnit_Framework_TestCase { | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Reads the sample structure. | ||||
| 	 */ | ||||
| 	public function testRead() { | ||||
| 		$reader = $this->getMockBuilder('\LAM\PDF\PDFStructureReader') | ||||
| 			->setMethods(array('getFileName')) | ||||
| 			->getMock(); | ||||
| 		$reader->method('getFileName')->willReturn($this->getTestFileName('test.xml')); | ||||
| 
 | ||||
| 		$structure = $reader->read('type', 'name'); | ||||
| 		$this->assertEquals('printLogo.jpg', $structure->getLogo()); | ||||
| 		$this->assertEquals('User information', $structure->getTitle()); | ||||
| 		$this->assertEquals(PDFStructure::FOLDING_STANDARD, $structure->getFoldingMarks()); | ||||
| 		$sections = $structure->getSections(); | ||||
| 		$this->assertEquals(4, sizeof($sections)); | ||||
| 		// check first section
 | ||||
| 		$this->assertInstanceOf(PDFEntrySection::class, $sections[0]); | ||||
| 		$this->assertFalse($sections[0]->isAttributeTitle()); | ||||
| 		$this->assertEquals('Personal user information', $sections[0]->getTitle()); | ||||
| 		$entries = $sections[0]->getEntries(); | ||||
| 		$this->assertEquals(3, sizeof($entries)); | ||||
| 		$this->assertEquals('inetOrgPerson_givenName', $entries[0]->getKey()); | ||||
| 		$this->assertEquals('inetOrgPerson_sn', $entries[1]->getKey()); | ||||
| 		$this->assertEquals('inetOrgPerson_street', $entries[2]->getKey()); | ||||
| 		// check text section
 | ||||
| 		$this->assertInstanceOf(PDFTextSection::class, $sections[1]); | ||||
| 		$this->assertEquals('test text', $sections[1]->getText()); | ||||
| 		// check third section
 | ||||
| 		$this->assertInstanceOf(PDFEntrySection::class, $sections[2]); | ||||
| 		$this->assertTrue($sections[2]->isAttributeTitle()); | ||||
| 		$this->assertEquals('posixAccount_uid', $sections[2]->getPdfKey()); | ||||
| 		$entries = $sections[2]->getEntries(); | ||||
| 		$this->assertEquals(2, sizeof($entries)); | ||||
| 		$this->assertEquals('posixAccount_homeDirectory', $entries[0]->getKey()); | ||||
| 		$this->assertEquals('posixAccount_loginShell', $entries[1]->getKey()); | ||||
| 		// check fourth section
 | ||||
| 		$this->assertInstanceOf(PDFEntrySection::class, $sections[3]); | ||||
| 		$this->assertFalse($sections[3]->isAttributeTitle()); | ||||
| 		$this->assertEquals('No entries', $sections[3]->getTitle()); | ||||
| 		$entries = $sections[3]->getEntries(); | ||||
| 		$this->assertEquals(0, sizeof($entries)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns the full path to the given file name. | ||||
| 	 * | ||||
| 	 * @param string $file file name | ||||
| 	 */ | ||||
| 	private function getTestFileName($file) { | ||||
| 		return dirname(dirname(__FILE__)) . '/resources/pdf/' . $file; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Tests if the output is the same as the original PDF. | ||||
| 	 */ | ||||
| 	public function testWrite() { | ||||
| 		$file = $this->getTestFileName('writer.xml'); | ||||
| 		// read input XML
 | ||||
| 		$fileHandle = fopen($file, "r"); | ||||
| 		$originalXML = fread($fileHandle, 1000000); | ||||
| 		fclose($fileHandle); | ||||
| 		// read structure
 | ||||
| 		$reader = $this->getMockBuilder('\LAM\PDF\PDFStructureReader') | ||||
| 		->setMethods(array('getFileName')) | ||||
| 		->getMock(); | ||||
| 		$reader->method('getFileName')->willReturn($file); | ||||
| 		$structure = $reader->read('type', 'name'); | ||||
| 		// create writer and get output XML
 | ||||
| 		$writer = new PDFStructureWriter(); | ||||
| 		$xml = $writer->getXML($structure); | ||||
| 		// compare
 | ||||
| 		$this->assertEquals($originalXML, $xml); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| ?>
 | ||||
|  | @ -0,0 +1,14 @@ | |||
| <pdf filename="printLogo.jpg" headline="User information" foldingmarks="standard"> | ||||
| 	<section name="Personal user information"> | ||||
| 		<entry name="inetOrgPerson_givenName" /> | ||||
| 		<entry name="inetOrgPerson_sn"> | ||||
| 		</entry> | ||||
| 		<entry name="inetOrgPerson_street" /> | ||||
| 	</section> | ||||
| 	<text>test text</text> | ||||
| 	<section name="_posixAccount_uid"> | ||||
| 		<entry name="posixAccount_homeDirectory" /> | ||||
| 		<entry name="posixAccount_loginShell" /> | ||||
| 	</section> | ||||
| 	<section name="No entries"/> | ||||
| </pdf> | ||||
|  | @ -0,0 +1,12 @@ | |||
| <pdf filename="printLogo.jpg" headline="User information" foldingmarks="standard"> | ||||
| 	<section name="Personal user information"> | ||||
| 		<entry name="inetOrgPerson_givenName"/> | ||||
| 		<entry name="inetOrgPerson_sn"/> | ||||
| 		<entry name="inetOrgPerson_street"/> | ||||
| 	</section> | ||||
| 	<text>test text</text> | ||||
| 	<section name="_posixAccount_uid"> | ||||
| 		<entry name="posixAccount_homeDirectory"/> | ||||
| 		<entry name="posixAccount_loginShell"/> | ||||
| 	</section> | ||||
| </pdf> | ||||
		Loading…
	
		Reference in New Issue