From ac23e90ef44adde9545b5d622b9f1e4373f1df3c Mon Sep 17 00:00:00 2001 From: Ivan Lanin Date: Tue, 20 May 2014 18:00:00 +0700 Subject: [PATCH] ODT Reader: Ability to read standard and custom document properties --- CHANGELOG.md | 1 + samples/resources/Sample_24_ReadODText.odt | Bin 11935 -> 11952 bytes src/PhpWord/Reader/ODText.php | 1 + src/PhpWord/Reader/ODText/Content.php | 2 + src/PhpWord/Reader/ODText/Meta.php | 79 +++++++++++++++++++++ src/PhpWord/Writer/ODText/Part/Meta.php | 19 +++-- 6 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 src/PhpWord/Reader/ODText/Meta.php diff --git a/CHANGELOG.md b/CHANGELOG.md index af9754cb..fce2bdac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ This release marked the change of PHPWord license from LGPL 2.1 to LGPL 3; new r - ODT Writer: Enable section and column - @ivanlanin - PDF Writer: Add TCPDF and mPDF as optional PDF renderer library - @ivanlanin - ODT Writer: Enable title element and custom document properties - @ivanlanin +- ODT Reader: Ability to read standard and custom document properties - @ivanlanin ### Bugfixes diff --git a/samples/resources/Sample_24_ReadODText.odt b/samples/resources/Sample_24_ReadODText.odt index a8e1b7a2ae3793c0e2a6f88c2787a3986a4fa682..d37c4e6629209390eca9e281454d1eb14e77307f 100644 GIT binary patch delta 874 zcmbOqyCIe*z?+#xgaHIjwoT;GVLI71`8=c2#F&Xd*2ec-TtI5`Z?0-azNx)iT+Y1U z5wT%nV31{<+`^+!uf6b+S!nf4skJkIS?v7A`;p6Rlkep}za^z7ty#In%j3lJIy<|4 z$8_@JZ>v=?=C({)EwMaOrZJ_9J97P__}RNt1n-B-l!qgHO}^u;C9K}c=AlwT zUaNOppQMr1qBv<=LPx4gslsy2Cv(*57B1Lh=47}2(cG=Fjv4#!FaKR1xvHeMAadG? zaP=vhm9Kx@^-(09LrNmdfMdCY@0$r97B6J`W-}@1)s71d?HB5H+MMPRIVK#NeQvh7 z^o$#lMVu>_p6qV;``kimd;PT!HtUYP`z3MpQoCSKgyZa%%mraDv;NlpU11Wx==-Y2 zGWJF5I->nWN!BN z@`OcI9AV}6UM*pteL2NPz_lE8^7Lqsh z&Gy}WH$>z3p$V0j(##j1DC0{P`*Lwv%#nxb#HKS-g*2lYu%&utKP1#IkNon zo&*1%UyxpXYX{f+jJ0>~Uj6oAo#3zM=N5kdmw$Eh9zG8~P-ic zcy97dok&LM$;P^|jD?dY>e_-#yr3(?#4S7dovtMBdQnZV!C-pw87=9_`g&4KCbE<5 QWu+#k>Y1=zRRv`&06{I0E&u=k delta 835 zcmdlGJ3p2uz?+#xgaHJ!$|myYFlm)dKF_E$F=ir=wedX{7m(Wgo2#0U&#G*T%k+Xg zVQnS`hAS+STX+=ey8|+3uiER=dCjMGPR#GN3RdZx%RK-6?P*l;{$-%4Z}jbC+lP7q%^E`^VB;&~x#~H_rd&A?M@Vg1qMPz51xQ#a_>M5)bd|&UGfwzlJgk zTRZD1ZZ)YA-|%0CE%~=Nv;X0uIqUiZ#q4?}9O8;{_hH`ZHU0Jb*Wybn8|_y0RsT7) z)9syu#$}fDz)7x|`#go3o_YUoqT~yC1Zcw&gz(-mWy@#l4`yyJ<;LaQ?u*d{k38B4Utn+ckJB%`%>pD_n*x5 z=h}{)D|7ZU@aeu*zT+mR@D6!ip4?kfO>0*qdQ>kv7LZ?XXZMa&|8EzTzUcM+ervhL zeD>Aq`K8y`XMavMx#oK_;vm!d=wDIJM?%!!8kOAt^5LY(mR*8Vx9<+S%`G(F#8=z* z_T7*Z$DQU^UP|L%e4>mmUF^$AwfL5dp1YFEi*Lwqao&0SFH`UE`c;`LZQ7pS-gEFY z)8Ee_7u@T;pKd&{7NU1k!!MxZY*a4FxeNEROX~k_S2P|d{|co wWcouO^-E^*e_ctg{}B+!{*Rb^OG|FDgPs(Vvh3slS*giodM0c~R6%(L01hc}vj6}9 diff --git a/src/PhpWord/Reader/ODText.php b/src/PhpWord/Reader/ODText.php index 911295d9..19efdc51 100644 --- a/src/PhpWord/Reader/ODText.php +++ b/src/PhpWord/Reader/ODText.php @@ -40,6 +40,7 @@ class ODText extends AbstractReader implements ReaderInterface $readerParts = array( 'content.xml' => 'Content', + 'meta.xml' => 'Meta', ); foreach ($readerParts as $xmlFile => $partName) { diff --git a/src/PhpWord/Reader/ODText/Content.php b/src/PhpWord/Reader/ODText/Content.php index d2195679..12b39f74 100644 --- a/src/PhpWord/Reader/ODText/Content.php +++ b/src/PhpWord/Reader/ODText/Content.php @@ -22,6 +22,8 @@ use PhpOffice\PhpWord\Shared\XMLReader; /** * Content reader + * + * @since 0.10.0 */ class Content extends AbstractPart { diff --git a/src/PhpWord/Reader/ODText/Meta.php b/src/PhpWord/Reader/ODText/Meta.php new file mode 100644 index 00000000..f7f4542d --- /dev/null +++ b/src/PhpWord/Reader/ODText/Meta.php @@ -0,0 +1,79 @@ +getDomFromZip($this->docFile, $this->xmlFile); + $docProps = $phpWord->getDocumentProperties(); + + $metaNode = $xmlReader->getElement('office:meta'); + + // Standard properties + $properties = array( + 'title' => 'dc:title', + 'subject' => 'dc:subject', + 'description' => 'dc:description', + 'keywords' => 'meta:keyword', + 'creator' => 'meta:initial-creator', + 'lastModifiedBy' => 'dc:creator', + // 'created' => 'meta:creation-date', + // 'modified' => 'dc:date', + ); + foreach ($properties as $property => $path) { + $method = "set{$property}"; + $propertyNode = $xmlReader->getElement($path, $metaNode); + if ($propertyNode !== null && method_exists($docProps, $method)) { + $docProps->$method($propertyNode->nodeValue); + } + } + + // Custom properties + $propertyNodes = $xmlReader->getElements('meta:user-defined', $metaNode); + foreach ($propertyNodes as $propertyNode) { + $property = $xmlReader->getAttribute('meta:name', $propertyNode); + + // Set category, company, and manager property + if (in_array($property, array('Category', 'Company', 'Manager'))) { + $method = "set{$property}"; + $docProps->$method($propertyNode->nodeValue); + + // Set other custom properties + } else { + $docProps->setCustomProperty($property, $propertyNode->nodeValue); + } + } + } +} diff --git a/src/PhpWord/Writer/ODText/Part/Meta.php b/src/PhpWord/Writer/ODText/Part/Meta.php index 8c6ad3a9..50a38047 100644 --- a/src/PhpWord/Writer/ODText/Part/Meta.php +++ b/src/PhpWord/Writer/ODText/Part/Meta.php @@ -21,6 +21,8 @@ use PhpOffice\PhpWord\Shared\XMLWriter; /** * ODText meta part writer: meta.xml + * + * @since 0.11.0 */ class Meta extends AbstractPart { @@ -47,19 +49,19 @@ class Meta extends AbstractPart $xmlWriter->startElement('office:meta'); // Core properties + $xmlWriter->writeElement('dc:title', $docProps->getTitle()); + $xmlWriter->writeElement('dc:subject', $docProps->getSubject()); + $xmlWriter->writeElement('dc:description', $docProps->getDescription()); $xmlWriter->writeElement('dc:creator', $docProps->getLastModifiedBy()); $xmlWriter->writeElement('dc:date', gmdate('Y-m-d\TH:i:s.000', $docProps->getModified())); - $xmlWriter->writeElement('dc:description', $docProps->getDescription()); - $xmlWriter->writeElement('dc:subject', $docProps->getSubject()); - $xmlWriter->writeElement('dc:title', $docProps->getTitle()); // Extended properties $xmlWriter->writeElement('meta:generator', 'PHPWord'); - $xmlWriter->writeElement('meta:creation-date', gmdate('Y-m-d\TH:i:s.000', $docProps->getCreated())); $xmlWriter->writeElement('meta:initial-creator', $docProps->getCreator()); + $xmlWriter->writeElement('meta:creation-date', gmdate('Y-m-d\TH:i:s.000', $docProps->getCreated())); $xmlWriter->writeElement('meta:keyword', $docProps->getKeywords()); - // Category, company, and manager should be put in meta namespace + // Category, company, and manager are put in meta namespace $properties = array('Category', 'Company', 'Manager'); foreach ($properties as $property) { $method = "get{$property}"; @@ -87,12 +89,17 @@ class Meta extends AbstractPart * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter * @param string $property * @param string $value - * @param string $type + * @param string $type string (default/null) + * + * @todo Handle other `$type`: double|date|dateTime|duration|boolean */ private function writeCustomProperty(XMLWriter $xmlWriter, $property, $value, $type = null) { $xmlWriter->startElement('meta:user-defined'); $xmlWriter->writeAttribute('meta:name', $property); + if ($type !== null) { + $xmlWriter->writeAttribute('meta:value-type', $type); + } $xmlWriter->writeRaw($value); $xmlWriter->endElement(); // meta:user-defined }