%PDF- %PDF-
Direktori : /home/tjamichg/intranet.tjamich.gob.mx/intranet/common/tcpdf/src/ |
Current File : /home/tjamichg/intranet.tjamich.gob.mx/intranet/common/tcpdf/src/MetaInfo.php |
<?php /** * MetaInfo.php * * @since 2002-08-03 * @category Library * @package Pdf * @author Nicola Asuni <info@tecnick.com> * @copyright 2002-2017 Nicola Asuni - Tecnick.com LTD * @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) * @link https://github.com/tecnickcom/tc-lib-pdf * * This file is part of tc-lib-pdf software library. */ namespace Com\Tecnick\Pdf; /** * Com\Tecnick\Pdf\MetaInfo * * Meta Informaton PDF class * * @since 2002-08-03 * @category Library * @package Pdf * @author Nicola Asuni <info@tecnick.com> * @copyright 2002-2017 Nicola Asuni - Tecnick.com LTD * @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) * @link https://github.com/tecnickcom/tc-lib-pdf */ abstract class MetaInfo extends \Com\Tecnick\Pdf\Output { /** * TCPDF version. * * @var string */ protected $version = '8.0.0'; /** * Time is seconds since EPOCH when the document was created. * * @var int */ protected $doctime = 0; /** * Time is seconds since EPOCH when the document was modified. * * @var int */ protected $docmodtime = 0; /** * The name of the application that generates the PDF. * * If the document was converted to PDF from another format, * the name of the conforming product that created the original document from which it was converted. * * @var string */ protected $creator = 'TCPDF'; /** * The name of the person who created the document. * * @var string */ protected $author = 'TCPDF'; /** * Subject of the document. * * @var string */ protected $subject = '-'; /** * Title of the document. * * @var string */ protected $title = 'PDF Document'; /** * Space-separated list of keywords associated with the document. * * @var string */ protected $keywords = 'TCPDF'; /** * Additional XMP data to be appended just before the end of "x:xmpmeta" tag. * * @var string */ protected $custom_xmp = ''; /** * Set this to TRUE to add the default sRGB ICC color profile * * @var bool */ protected $sRGB = false; /** * Viewer preferences dictionary controlling the way the document is to be presented on the screen or in print. * (Section 8.1 of PDF reference, "Viewer Preferences"). * * @var array */ protected $viewerpref = array(); /** * Boolean flag to set the default document language direction. * False = LTR = Left-To-Right. * True = RTL = Right-To-Left. * * @val bool */ protected $rtl = false; /** * Return the program version. * * @return string */ public function getVersion() { return $this->version; } /** * Set a field value only if it is not empty. * * @param strign $field Field name * @param srting $value Value to set */ private function setNonEmptyFieldValue($field, $value) { if (!empty($value)) { $this->$field = $value; } return $this; } /** * Defines the creator of the document. * This is typically the name of the application that generates the PDF. * * @param string $creator The name of the creator. */ public function setCreator($creator) { return $this->setNonEmptyFieldValue('creator', $creator); } /** * Defines the author of the document. * * @param string $author The name of the author. */ public function setAuthor($author) { return $this->setNonEmptyFieldValue('author', $author); } /** * Defines the subject of the document. * * @param string $subject The subject. */ public function setSubject($subject) { return $this->setNonEmptyFieldValue('subject', $subject); } /** * Defines the title of the document. * * @param string $title The title. */ public function setTitle($title) { return $this->setNonEmptyFieldValue('title', $title); } /** * Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. * * @param string $keywords Space-separated list of keywords. */ public function setKeywords($keywords) { return $this->setNonEmptyFieldValue('keywords', $keywords); } /** * Set the PDF version (check PDF reference for valid values). * * @param string $version PDF document version. * * @throw PdfException in case of error */ public function setPDFVersion($version = '1.7') { if ($this->pdfa) { // PDF/A mode $this->pdfver = '1.4'; return $this; } $isvalid = preg_match('/^[1-9]+[.][0-9]+$/', $version); if (empty($isvalid)) { throw new PdfException('Invalid PDF version format'); } $this->pdfver = $version; return $this; } /** * Set the sRGB mode * * @param bool $enabled Set to true to add the default sRGB ICC color profile */ public function setSRGB($enabled) { $this->srgb = (bool) $enabled; return $this; } /** * Format a text string for output. * * @param string $str String to escape. * @param int $oid Current PDF object number. * * @return string escaped string. */ protected function getOutTextString($str, $oid) { if ($this->isunicode) { $str = $this->uniconv->toUTF16BE($str); } return $this->encrypt->escapeDataString($str, $oid); } /** * Returns a formatted date for meta information * * @param int $time Time in seconds. * * @return string date-time string. */ protected function getFormattedDate($time) { return substr_replace(date('YmdHisO', intval($time)), '\'', (0 - 2), 0).'\''; } /** * Returns a formatted date for XMP meta information * * @param int $time Time in seconds. * * @return string date-time string. */ protected function getXMPFormattedDate($time) { return date('Y-m-dTH:i:sP', intval($time)); } /** * Returns the producer string * * @return string */ protected function getProducer() { return "\x54\x43\x50\x44\x46\x20" .$this->version ."\x20\x28\x68\x74\x74\x70\x73\x3a\x2f\x2f\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29"; } /** * Returns a formatted date for meta information * * @param int $time Time in seconds. * @param int $oid Current PDF object number. * * @return string escaped date-time string. */ protected function getOutDateTimeString($time, $oid) { if (empty($time)) { $time = $this->doctime; } return $this->getOutTextString('D:'.$this->getFormattedDate($time), $oid); } /** * Get the PDF output string for the Document Information Dictionary. * (ref. Chapter 14.3.3 Document Information Dictionary of PDF32000_2008.pdf) * * @return string */ protected function getOutMetaInfo() { $oid = ++$this->pon; $this->objid['info'] = $oid; $out = $oid.' 0 obj'."\n" .'<<' .' /Creator '.$this->getOutTextString($this->creator, $oid) .' /Author '.$this->getOutTextString($this->author, $oid) .' /Subject '.$this->getOutTextString($this->subject, $oid) .' /Title '.$this->getOutTextString($this->title, $oid) .' /Keywords '.$this->getOutTextString($this->keywords, $oid) .' /Producer '.$this->getOutTextString($this->getProducer(), $oid) .' /CreationDate '.$this->getOutDateTimeString($this->doctime, $oid) .' /ModDate '.$this->getOutDateTimeString($this->docmodtime, $oid) .' /Trapped /False' .' >>'."\n" .'endobj'."\n"; return $out; } /** * Escape some special characters (< > &) for XML output. * * @param string $str Input string to escape. * * @return string */ protected function getEscapedXML($str) { return strtr($str, array("\0" => '', '&' => '&', '<' => '<', '>' => '>')); } /** * Set additional XMP data to be appended just before the end of "x:xmpmeta" tag. * * IMPORTANT: * This data is added as-is without controls, so you have to validate your data before using this method. * * @param string $xmp Custom XMP data. */ public function setExtraXMP($xmp) { return $this->setNonEmptyFieldValue('custom_xmp', $xmp); } /** * Get the PDF output string for the XMP data object * * @return string * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function getOutXMP() { $uuid = 'uuid:'.substr($this->fileid, 0, 8) .'-'.substr($this->fileid, 8, 4) .'-'.substr($this->fileid, 12, 4) .'-'.substr($this->fileid, 16, 4) .'-'.substr($this->fileid, 20, 12); // @codingStandardsIgnoreStart $xmp = '<?xpacket begin="'.$this->uniconv->chr(0xfeff).'" id="W5M0MpCehiHzreSzNTczkc9d"?>'."\n" .'<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04">'."\n" ."\t".'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'."\n" ."\t\t".'<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">'."\n" ."\t\t\t".'<dc:format>application/pdf</dc:format>'."\n" ."\t\t\t".'<dc:title>'."\n" ."\t\t\t\t".'<rdf:Alt>'."\n" ."\t\t\t\t\t".'<rdf:li xml:lang="x-default">'.$this->getEscapedXML($this->title).'</rdf:li>'."\n" ."\t\t\t\t".'</rdf:Alt>'."\n" ."\t\t\t".'</dc:title>'."\n" ."\t\t\t".'<dc:creator>'."\n" ."\t\t\t\t".'<rdf:Seq>'."\n" ."\t\t\t\t\t".'<rdf:li>'.$this->getEscapedXML($this->author).'</rdf:li>'."\n" ."\t\t\t\t".'</rdf:Seq>'."\n" ."\t\t\t".'</dc:creator>'."\n" ."\t\t\t".'<dc:description>'."\n" ."\t\t\t\t".'<rdf:Alt>'."\n" ."\t\t\t\t\t".'<rdf:li xml:lang="x-default">'.$this->getEscapedXML($this->subject).'</rdf:li>'."\n" ."\t\t\t\t".'</rdf:Alt>'."\n" ."\t\t\t".'</dc:description>'."\n" ."\t\t\t".'<dc:subject>'."\n" ."\t\t\t\t".'<rdf:Bag>'."\n" ."\t\t\t\t\t".'<rdf:li>'.$this->getEscapedXML($this->keywords).'</rdf:li>'."\n" ."\t\t\t\t".'</rdf:Bag>'."\n" ."\t\t\t".'</dc:subject>'."\n" ."\t\t".'</rdf:Description>'."\n" ."\t\t".'<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">'."\n" ."\t\t\t".'<xmp:CreateDate>'.$this->getXMPFormattedDate($this->doctime).'</xmp:CreateDate>'."\n" ."\t\t\t".'<xmp:CreatorTool>'.$this->creator.'</xmp:CreatorTool>'."\n" ."\t\t\t".'<xmp:ModifyDate>'.$this->getXMPFormattedDate($this->docmodtime).'</xmp:ModifyDate>'."\n" ."\t\t\t".'<xmp:MetadataDate>'.$this->getXMPFormattedDate($this->doctime).'</xmp:MetadataDate>'."\n" ."\t\t".'</rdf:Description>'."\n" ."\t\t".'<rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">'."\n" ."\t\t\t".'<pdf:Keywords>'.$this->getEscapedXML($this->keywords).'</pdf:Keywords>'."\n" ."\t\t\t".'<pdf:Producer>'.$this->getEscapedXML($this->getProducer()).'</pdf:Producer>'."\n" ."\t\t".'</rdf:Description>'."\n" ."\t\t".'<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">'."\n" ."\t\t\t".'<xmpMM:DocumentID>'.$uuid.'</xmpMM:DocumentID>'."\n" ."\t\t\t".'<xmpMM:InstanceID>'.$uuid.'</xmpMM:InstanceID>'."\n" ."\t\t".'</rdf:Description>'."\n"; if ($this->pdfa) { $xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/">'."\n" ."\t\t\t".'<pdfaid:part>1</pdfaid:part>'."\n" ."\t\t\t".'<pdfaid:conformance>B</pdfaid:conformance>'."\n" ."\t\t".'</rdf:Description>'."\n"; } // XMP extension schemas $xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">'."\n" ."\t\t\t".'<pdfaExtension:schemas>'."\n" ."\t\t\t\t".'<rdf:Bag>'."\n" ."\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://ns.adobe.com/pdf/1.3/</pdfaSchema:namespaceURI>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:prefix>pdf</pdfaSchema:prefix>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:schema>Adobe PDF Schema</pdfaSchema:schema>'."\n" ."\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://ns.adobe.com/xap/1.0/mm/</pdfaSchema:namespaceURI>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:prefix>xmpMM</pdfaSchema:prefix>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:schema>XMP Media Management Schema</pdfaSchema:schema>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:property>'."\n" ."\t\t\t\t\t\t\t".'<rdf:Seq>'."\n" ."\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>UUID based identifier for specific incarnation of a document</pdfaProperty:description>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>InstanceID</pdfaProperty:name>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>URI</pdfaProperty:valueType>'."\n" ."\t\t\t\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t\t\t".'</rdf:Seq>'."\n" ."\t\t\t\t\t\t".'</pdfaSchema:property>'."\n" ."\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://www.aiim.org/pdfa/ns/id/</pdfaSchema:namespaceURI>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:prefix>pdfaid</pdfaSchema:prefix>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:schema>PDF/A ID Schema</pdfaSchema:schema>'."\n" ."\t\t\t\t\t\t".'<pdfaSchema:property>'."\n" ."\t\t\t\t\t\t\t".'<rdf:Seq>'."\n" ."\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Part of PDF/A standard</pdfaProperty:description>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>part</pdfaProperty:name>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Integer</pdfaProperty:valueType>'."\n" ."\t\t\t\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Amendment of PDF/A standard</pdfaProperty:description>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>amd</pdfaProperty:name>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."\n" ."\t\t\t\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Conformance level of PDF/A standard</pdfaProperty:description>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>conformance</pdfaProperty:name>'."\n" ."\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."\n" ."\t\t\t\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t\t\t\t".'</rdf:Seq>'."\n" ."\t\t\t\t\t\t".'</pdfaSchema:property>'."\n" ."\t\t\t\t\t".'</rdf:li>'."\n" ."\t\t\t\t".'</rdf:Bag>'."\n" ."\t\t\t".'</pdfaExtension:schemas>'."\n" ."\t\t".'</rdf:Description>'."\n" ."\t".'</rdf:RDF>'."\n" .$this->custom_xmp .'</x:xmpmeta>'."\n" .'<?xpacket end="w"?>'; // @codingStandardsIgnoreEnd $oid = ++$this->pon; $this->objid['xmp'] = $oid; $out = $oid.' 0 obj'."\n" .'<<' .' /Type /Metadata' .' /Subtype /XML' .' /Length '.strlen($xmp) .' >> stream'."\n" .$xmp."\n" .'endstream'."\n" .'endobj'."\n"; return $out; } /** * Set the default document language direction. * * @param bool $enabled False = LTR = Left-To-Right; True = RTL = Right-To-Left. */ public function setRTL($enabled) { $this->rtl = (bool) $enabled; return $this; } /** * Set the viewer preferences dictionary * controlling the way the document is to be presented on the screen or in print. * * @param array $pref Array of options (see Section 8.1 of PDF reference, "Viewer Preferences"). */ public function setViewerPreferences($pref) { $this->viewerpref = $pref; return $this; } /** * Sanitize the page box name and return the default 'CropBox' in case of error. * * @param string $name Entry name. * * @return string */ protected function getPageBoxName($name) { $box = 'CropBox'; if (isset($this->viewerpref[$name])) { $val = $this->viewerpref[$name]; if (isset($this->page->$box[$val])) { $box = $this->page->$box[$val]; } } return ' /'.$name.' /'.$box; } /** * Sanitize the page box name and return the default 'CropBox' in case of error. * * @return string */ protected function getPagePrintScaling() { $mode = 'AppDefault'; if (isset($this->viewerpref['PrintScaling'])) { $name = strtolower($this->viewerpref['PrintScaling']); $valid = array( 'none' => 'None', 'appdefault' => 'AppDefault', ); if (isset($valid[$name])) { $mode = $valid[$name]; } } return ' /PrintScaling /'.$mode; } /** * Returns the Duplex mode for the Viewer Preferences * * @return string */ protected function getDuplexMode() { $mode = 'none'; if (isset($this->viewerpref['Duplex'])) { $name = strtolower($this->viewerpref['Duplex']); $valid = array( 'simplex' => 'Simplex', 'duplexflipshortedge' => 'DuplexFlipShortEdge', 'duplexfliplongedge' => 'DuplexFlipLongEdge', ); if (isset($valid[$name])) { $mode = $valid[$name]; } } return ' /Duplex /'.$mode; } /** * Returns the Viewer Preference boolean entry. * * @param string $name Entry name. * * @return string */ protected function getBooleanMode($name) { if (isset($this->viewerpref[$name])) { return ' /'.$name.' '.var_export((bool)$this->viewerpref[$name], true); } return ''; } /** * Returns the PDF viewer preferences for the catalog section * * @return string */ protected function getOutViewerPref() { $vpr = $this->viewerpref; $out = ' /ViewerPreferences <<'; if ($this->rtl) { $out .= ' /Direction /R2L'; } else { $out .= ' /Direction /L2R'; } $out .= $this->getBooleanMode('HideToolbar'); $out .= $this->getBooleanMode('HideMenubar'); $out .= $this->getBooleanMode('HideWindowUI'); $out .= $this->getBooleanMode('FitWindow'); $out .= $this->getBooleanMode('CenterWindow'); $out .= $this->getBooleanMode('DisplayDocTitle'); if (isset($vpr['NonFullScreenPageMode'])) { $out .= ' /NonFullScreenPageMode /'.$this->page->getDisplay($vpr['NonFullScreenPageMode']); } $out .= $this->getPageBoxName('ViewArea'); $out .= $this->getPageBoxName('ViewClip'); $out .= $this->getPageBoxName('PrintArea'); $out .= $this->getPageBoxName('PrintClip'); $out .= $this->getPagePrintScaling(); $out .= $this->getDuplexMode(); $out .= $this->getBooleanMode('PickTrayByPDFSize'); if (isset($vpr['PrintPageRange'])) { $PrintPageRangeNum = ''; foreach ($vpr['PrintPageRange'] as $pnum) { $PrintPageRangeNum .= ' '.($pnum - 1).''; } $out .= ' /PrintPageRange ['.$PrintPageRangeNum.' ]'; } if (isset($vpr['NumCopies'])) { $out .= ' /NumCopies '.intval($vpr['NumCopies']); } $out .= ' >>'; return $out; } }