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 a8e1b7a2..d37c4e66 100644 Binary files a/samples/resources/Sample_24_ReadODText.odt and b/samples/resources/Sample_24_ReadODText.odt differ 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 }