diff --git a/src/Examples/AdvancedTable.php b/src/Examples/AdvancedTable.php new file mode 100644 index 00000000..5a2088ff --- /dev/null +++ b/src/Examples/AdvancedTable.php @@ -0,0 +1,53 @@ +createSection(); + +// Define table style arrays +$styleTable = array('borderSize'=>6, 'borderColor'=>'006699', 'cellMargin'=>80); +$styleFirstRow = array('borderBottomSize'=>18, 'borderBottomColor'=>'0000FF', 'bgColor'=>'66BBFF'); + +// Define cell style arrays +$styleCell = array('valign'=>'center'); +$styleCellBTLR = array('valign'=>'center', 'textDirection'=>PHPWord_Style_Cell::TEXT_DIR_BTLR); + +// Define font style for first row +$fontStyle = array('bold'=>true, 'align'=>'center'); + +// Add table style +$PHPWord->addTableStyle('myOwnTableStyle', $styleTable, $styleFirstRow); + +// Add table +$table = $section->addTable('myOwnTableStyle'); + +// Add row +$table->addRow(900); + +// Add cells +$table->addCell(2000, $styleCell)->addText('Row 1', $fontStyle); +$table->addCell(2000, $styleCell)->addText('Row 2', $fontStyle); +$table->addCell(2000, $styleCell)->addText('Row 3', $fontStyle); +$table->addCell(2000, $styleCell)->addText('Row 4', $fontStyle); +$table->addCell(500, $styleCellBTLR)->addText('Row 5', $fontStyle); + +// Add more rows / cells +for($i = 1; $i <= 10; $i++) { + $table->addRow(); + $table->addCell(2000)->addText("Cell $i"); + $table->addCell(2000)->addText("Cell $i"); + $table->addCell(2000)->addText("Cell $i"); + $table->addCell(2000)->addText("Cell $i"); + + $text = ($i % 2 == 0) ? 'X' : ''; + $table->addCell(500)->addText($text); +} + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('AdvancedTable.docx'); +?> \ No newline at end of file diff --git a/src/Examples/BasicTable.php b/src/Examples/BasicTable.php new file mode 100644 index 00000000..96aedab6 --- /dev/null +++ b/src/Examples/BasicTable.php @@ -0,0 +1,26 @@ +createSection(); + +// Add table +$table = $section->addTable(); + +for($r = 1; $r <= 10; $r++) { // Loop through rows + // Add row + $table->addRow(); + + for($c = 1; $c <= 5; $c++) { // Loop through cells + // Add Cell + $table->addCell(1750)->addText("Row $r, Cell $c"); + } +} + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('BasicTable.docx'); +?> \ No newline at end of file diff --git a/src/Examples/HeaderFooter.php b/src/Examples/HeaderFooter.php new file mode 100644 index 00000000..918280cd --- /dev/null +++ b/src/Examples/HeaderFooter.php @@ -0,0 +1,28 @@ +createSection(); + +// Add header +$header = $section->createHeader(); +$table = $header->addTable(); +$table->addRow(); +$table->addCell(4500)->addText('This is the header.'); +$table->addCell(4500)->addImage('_earth.jpg', array('width'=>50, 'height'=>50, 'align'=>'right')); + +// Add footer +$footer = $section->createFooter(); +$footer->addPreserveText('Page {PAGE} of {NUMPAGES}.', array('align'=>'center')); + +// Write some text +$section->addTextBreak(); +$section->addText('Some text...'); + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('HeaderFooter.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Image.php b/src/Examples/Image.php new file mode 100644 index 00000000..8362a2dc --- /dev/null +++ b/src/Examples/Image.php @@ -0,0 +1,24 @@ +createSection(); + +// Add image elements +$section->addImage('_mars.jpg'); +$section->addTextBreak(2); + +$section->addImage('_earth.JPG', array('width'=>210, 'height'=>210, 'align'=>'center')); +$section->addTextBreak(2); + +$section->addImage('_mars.jpg', array('width'=>100, 'height'=>100, 'align'=>'right')); + + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Image.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Link.php b/src/Examples/Link.php new file mode 100644 index 00000000..7cebaece --- /dev/null +++ b/src/Examples/Link.php @@ -0,0 +1,24 @@ +createSection(); + +// Add hyperlink elements +$section->addLink('http://www.google.com', 'Best search engine', array('color'=>'0000FF', 'underline'=>PHPWord_Style_Font::UNDERLINE_SINGLE)); +$section->addTextBreak(2); + +$PHPWord->addLinkStyle('myOwnLinkStyle', array('bold'=>true, 'color'=>'808000')); +$section->addLink('http://www.bing.com', null, 'myOwnLinkStyle'); +$section->addLink('http://www.yahoo.com', null, 'myOwnLinkStyle'); + + + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Link.docx'); +?> \ No newline at end of file diff --git a/src/Examples/ListItem.php b/src/Examples/ListItem.php new file mode 100644 index 00000000..475c3fb5 --- /dev/null +++ b/src/Examples/ListItem.php @@ -0,0 +1,47 @@ +createSection(); + +// Add listitem elements +$section->addListItem('List Item 1', 0); +$section->addListItem('List Item 2', 0); +$section->addListItem('List Item 3', 0); +$section->addTextBreak(2); + +// Add listitem elements +$section->addListItem('List Item 1', 0); +$section->addListItem('List Item 1.1', 1); +$section->addListItem('List Item 1.2', 1); +$section->addListItem('List Item 1.3 (styled)', 1, array('bold'=>true)); +$section->addListItem('List Item 1.3.1', 2); +$section->addListItem('List Item 1.3.2', 2); +$section->addTextBreak(2); + +// Add listitem elements +$listStyle = array('listType'=>PHPWord_Style_ListItem::TYPE_NUMBER); +$section->addListItem('List Item 1', 0, null, $listStyle); +$section->addListItem('List Item 2', 0, null, $listStyle); +$section->addListItem('List Item 3', 0, null, $listStyle); +$section->addTextBreak(2); + +// Add listitem elements +$PHPWord->addFontStyle('myOwnStyle', array('color'=>'FF0000')); +$PHPWord->addParagraphStyle('P-Style', array('spaceAfter'=>95)); +$listStyle = array('listType'=>PHPWord_Style_ListItem::TYPE_NUMBER_NESTED); +$section->addListItem('List Item 1', 0, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 2', 0, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 3', 1, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 4', 1, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 5', 2, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 6', 1, 'myOwnStyle', $listStyle, 'P-Style'); +$section->addListItem('List Item 7', 0, 'myOwnStyle', $listStyle, 'P-Style'); + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('ListItem.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Object.php b/src/Examples/Object.php new file mode 100644 index 00000000..cb488daa --- /dev/null +++ b/src/Examples/Object.php @@ -0,0 +1,20 @@ +createSection(); + +// Add text elements +$section->addText('You can open this OLE object by double clicking on the icon:'); +$section->addTextBreak(2); + +// Add object +$section->addObject('_sheet.xls'); + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Object.docx'); +?> diff --git a/src/Examples/Section.php b/src/Examples/Section.php new file mode 100644 index 00000000..81292ad1 --- /dev/null +++ b/src/Examples/Section.php @@ -0,0 +1,26 @@ +createSection(array('borderColor'=>'00FF00', 'borderSize'=>12)); +$section->addText('I am placed on a default section.'); + +// New landscape section +$section = $PHPWord->createSection(array('orientation'=>'landscape')); +$section->addText('I am placed on a landscape section. Every page starting from this section will be landscape style.'); +$section->addPageBreak(); +$section->addPageBreak(); + +// New portrait section +$section = $PHPWord->createSection(array('marginLeft'=>600, 'marginRight'=>600, 'marginTop'=>600, 'marginBottom'=>600)); +$section->addText('This section uses other margins.'); + + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Section.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Template.docx b/src/Examples/Template.docx new file mode 100644 index 00000000..cb908794 Binary files /dev/null and b/src/Examples/Template.docx differ diff --git a/src/Examples/Template.php b/src/Examples/Template.php new file mode 100644 index 00000000..9046d810 --- /dev/null +++ b/src/Examples/Template.php @@ -0,0 +1,23 @@ +loadTemplate('Template.docx'); + +$document->setValue('Value1', 'Sun'); +$document->setValue('Value2', 'Mercury'); +$document->setValue('Value3', 'Venus'); +$document->setValue('Value4', 'Earth'); +$document->setValue('Value5', 'Mars'); +$document->setValue('Value6', 'Jupiter'); +$document->setValue('Value7', 'Saturn'); +$document->setValue('Value8', 'Uranus'); +$document->setValue('Value9', 'Neptun'); +$document->setValue('Value10', 'Pluto'); + +$document->setValue('weekday', date('l')); +$document->setValue('time', date('H:i')); + +$document->save('Solarsystem.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Text.docx b/src/Examples/Text.docx new file mode 100644 index 00000000..c01e9b6d Binary files /dev/null and b/src/Examples/Text.docx differ diff --git a/src/Examples/Text.php b/src/Examples/Text.php new file mode 100644 index 00000000..4437b926 --- /dev/null +++ b/src/Examples/Text.php @@ -0,0 +1,27 @@ +createSection(); + +// Add text elements +$section->addText('Hello World!'); +$section->addTextBreak(2); + +$section->addText('I am inline styled.', array('name'=>'Verdana', 'color'=>'006699')); +$section->addTextBreak(2); + +$PHPWord->addFontStyle('rStyle', array('bold'=>true, 'italic'=>true, 'size'=>16)); +$PHPWord->addParagraphStyle('pStyle', array('align'=>'center', 'spaceAfter'=>100)); +$section->addText('I am styled by two style definitions.', 'rStyle', 'pStyle'); +$section->addText('I have only a paragraph style definition.', null, 'pStyle'); + + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Text.docx'); +?> \ No newline at end of file diff --git a/src/Examples/Textrun.php b/src/Examples/Textrun.php new file mode 100644 index 00000000..84fac37e --- /dev/null +++ b/src/Examples/Textrun.php @@ -0,0 +1,32 @@ +createSection(); + +// Add style definitions +$PHPWord->addParagraphStyle('pStyle', array('spacing'=>100)); +$PHPWord->addFontStyle('BoldText', array('bold'=>true)); +$PHPWord->addFontStyle('ColoredText', array('color'=>'FF8080')); +$PHPWord->addLinkStyle('NLink', array('color'=>'0000FF', 'underline'=>PHPWord_Style_Font::UNDERLINE_SINGLE)); + +// Add text elements +$textrun = $section->createTextRun('pStyle'); + +$textrun->addText('Each textrun can contain native text or link elements.'); +$textrun->addText(' No break is placed after adding an element.', 'BoldText'); +$textrun->addText(' All elements are placed inside a paragraph with the optionally given p-Style.', 'ColoredText'); +$textrun->addText(' The best search engine: '); +$textrun->addLink('http://www.google.com', null, 'NLink'); +$textrun->addText('. Also not bad: '); +$textrun->addLink('http://www.bing.com', null, 'NLink'); + + + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Textrun.docx'); +?> \ No newline at end of file diff --git a/src/Examples/TitleTOC.php b/src/Examples/TitleTOC.php new file mode 100644 index 00000000..6f712cc5 --- /dev/null +++ b/src/Examples/TitleTOC.php @@ -0,0 +1,49 @@ +createSection(); + +// Define the TOC font style +$fontStyle = array('spaceAfter'=>60, 'size'=>12); + +// Add title styles +$PHPWord->addTitleStyle(1, array('size'=>20, 'color'=>'333333', 'bold'=>true)); +$PHPWord->addTitleStyle(2, array('size'=>16, 'color'=>'666666')); + +// Add text elements +$section->addText('Table of contents:'); +$section->addTextBreak(2); + +// Add TOC +$section->addTOC($fontStyle); + +// Add Titles +$section->addPageBreak(); +$section->addTitle('I am Title 1', 1); +$section->addText('Some text...'); +$section->addTextBreak(2); + +$section->addTitle('I am a Subtitle of Title 1', 2); +$section->addTextBreak(2); +$section->addText('Some more text...'); +$section->addTextBreak(2); + +$section->addTitle('Another Title (Title 2)', 1); +$section->addText('Some text...'); +$section->addPageBreak(); +$section->addTitle('I am Title 3', 1); +$section->addText('And more text...'); +$section->addTextBreak(2); +$section->addTitle('I am a Subtitle of Title 3', 2); +$section->addText('Again and again, more text...'); + +echo 'Note: The pagenumbers in the TOC doesnt refresh automatically.'; + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('TitleTOC.docx'); +?> diff --git a/src/Examples/Watermark.php b/src/Examples/Watermark.php new file mode 100644 index 00000000..6a9ac337 --- /dev/null +++ b/src/Examples/Watermark.php @@ -0,0 +1,21 @@ +createSection(); + +// Create header +$header = $section->createHeader(); + +// Add a watermark to the header +$header->addWatermark('_earth.jpg', array('marginTop'=>200, 'marginLeft'=>55)); + +$section->addText('The header reference to the current section includes a watermark image.'); + +// Save File +$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); +$objWriter->save('Watermark.docx'); +?> \ No newline at end of file diff --git a/src/Examples/_earth.JPG b/src/Examples/_earth.JPG new file mode 100644 index 00000000..28537b06 Binary files /dev/null and b/src/Examples/_earth.JPG differ diff --git a/src/Examples/_mars.jpg b/src/Examples/_mars.jpg new file mode 100644 index 00000000..584d3171 Binary files /dev/null and b/src/Examples/_mars.jpg differ diff --git a/src/Examples/_sheet.xls b/src/Examples/_sheet.xls new file mode 100644 index 00000000..b8da43c6 Binary files /dev/null and b/src/Examples/_sheet.xls differ diff --git a/src/PHPWord.php b/src/PHPWord.php new file mode 100644 index 00000000..cf160233 --- /dev/null +++ b/src/PHPWord.php @@ -0,0 +1,230 @@ +_properties = new PHPWord_DocumentProperties(); + $this->_defaultFontName = 'Arial'; + $this->_defaultFontSize = 20; + } + + /** + * Get properties + * @return PHPWord_DocumentProperties + */ + public function getProperties() { + return $this->_properties; + } + + /** + * Set properties + * + * @param PHPWord_DocumentProperties $value + * @return PHPWord + */ + public function setProperties(PHPWord_DocumentProperties $value) { + $this->_properties = $value; + return $this; + } + + /** + * Create a new Section + * + * @param PHPWord_Section_Settings $settings + * @return PHPWord_Section + */ + public function createSection($settings = null) { + $sectionCount = $this->_countSections() + 1; + + $section = new PHPWord_Section($sectionCount, $settings); + $this->_sectionCollection[] = $section; + return $section; + } + + /** + * Get default Font name + * @return string + */ + public function getDefaultFontName() { + return $this->_defaultFontName; + } + + /** + * Set default Font name + * @param string $pValue + */ + public function setDefaultFontName($pValue) { + $this->_defaultFontName = $pValue; + } + + /** + * Get default Font size + * @return string + */ + public function getDefaultFontSize() { + return $this->_defaultFontSize; + } + + /** + * Set default Font size + * @param int $pValue + */ + public function setDefaultFontSize($pValue) { + $pValue = $pValue * 2; + $this->_defaultFontSize = $pValue; + } + + /** + * Adds a paragraph style definition to styles.xml + * + * @param $styleName string + * @param $styles array + */ + public function addParagraphStyle($styleName, $styles) { + PHPWord_Style::addParagraphStyle($styleName, $styles); + } + + /** + * Adds a font style definition to styles.xml + * + * @param $styleName string + * @param $styles array + */ + public function addFontStyle($styleName, $styleFont, $styleParagraph = null) { + PHPWord_Style::addFontStyle($styleName, $styleFont, $styleParagraph); + } + + /** + * Adds a table style definition to styles.xml + * + * @param $styleName string + * @param $styles array + */ + public function addTableStyle($styleName, $styleTable, $styleFirstRow = null) { + PHPWord_Style::addTableStyle($styleName, $styleTable, $styleFirstRow); + } + + /** + * Adds a heading style definition to styles.xml + * + * @param $titleCount int + * @param $styles array + */ + public function addTitleStyle($titleCount, $styleFont, $styleParagraph = null) { + PHPWord_Style::addTitleStyle($titleCount, $styleFont, $styleParagraph); + } + + /** + * Adds a hyperlink style to styles.xml + * + * @param $styleName string + * @param $styles array + */ + public function addLinkStyle($styleName, $styles) { + PHPWord_Style::addLinkStyle($styleName, $styles); + } + + /** + * Get sections + * @return PHPWord_Section[] + */ + public function getSections() { + return $this->_sectionCollection; + } + + /** + * Get section count + * @return int + */ + private function _countSections() { + return count($this->_sectionCollection); + } + + /** + * Load a Template File + * + * @param string $strFilename + * @return PHPWord_Template + */ + public function loadTemplate($strFilename) { + if(file_exists($strFilename)) { + $template = new PHPWord_Template($strFilename); + return $template; + } else { + trigger_error('Template file '.$strFilename.' not found.', E_ERROR); + } + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Autoloader.php b/src/PHPWord/Autoloader.php new file mode 100644 index 00000000..d682f4d1 --- /dev/null +++ b/src/PHPWord/Autoloader.php @@ -0,0 +1,48 @@ + \ No newline at end of file diff --git a/src/PHPWord/DocumentProperties.php b/src/PHPWord/DocumentProperties.php new file mode 100644 index 00000000..b284f631 --- /dev/null +++ b/src/PHPWord/DocumentProperties.php @@ -0,0 +1,330 @@ +_creator = ''; + $this->_lastModifiedBy = $this->_creator; + $this->_created = time(); + $this->_modified = time(); + $this->_title = ''; + $this->_subject = ''; + $this->_description = ''; + $this->_keywords = ''; + $this->_category = ''; + $this->_company = ''; + } + + /** + * Get Creator + * + * @return string + */ + public function getCreator() { + return $this->_creator; + } + + /** + * Set Creator + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setCreator($pValue = '') { + $this->_creator = $pValue; + return $this; + } + + /** + * Get Last Modified By + * + * @return string + */ + public function getLastModifiedBy() { + return $this->_lastModifiedBy; + } + + /** + * Set Last Modified By + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setLastModifiedBy($pValue = '') { + $this->_lastModifiedBy = $pValue; + return $this; + } + + /** + * Get Created + * + * @return datetime + */ + public function getCreated() { + return $this->_created; + } + + /** + * Set Created + * + * @param datetime $pValue + * @return PHPWord_DocumentProperties + */ + public function setCreated($pValue = null) { + if (is_null($pValue)) { + $pValue = time(); + } + $this->_created = $pValue; + return $this; + } + + /** + * Get Modified + * + * @return datetime + */ + public function getModified() { + return $this->_modified; + } + + /** + * Set Modified + * + * @param datetime $pValue + * @return PHPWord_DocumentProperties + */ + public function setModified($pValue = null) { + if (is_null($pValue)) { + $pValue = time(); + } + $this->_modified = $pValue; + return $this; + } + + /** + * Get Title + * + * @return string + */ + public function getTitle() { + return $this->_title; + } + + /** + * Set Title + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setTitle($pValue = '') { + $this->_title = $pValue; + return $this; + } + + /** + * Get Description + * + * @return string + */ + public function getDescription() { + return $this->_description; + } + + /** + * Set Description + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setDescription($pValue = '') { + $this->_description = $pValue; + return $this; + } + + /** + * Get Subject + * + * @return string + */ + public function getSubject() { + return $this->_subject; + } + + /** + * Set Subject + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setSubject($pValue = '') { + $this->_subject = $pValue; + return $this; + } + + /** + * Get Keywords + * + * @return string + */ + public function getKeywords() { + return $this->_keywords; + } + + /** + * Set Keywords + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setKeywords($pValue = '') { + $this->_keywords = $pValue; + return $this; + } + + /** + * Get Category + * + * @return string + */ + public function getCategory() { + return $this->_category; + } + + /** + * Set Category + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setCategory($pValue = '') { + $this->_category = $pValue; + return $this; + } + + /** + * Get Company + * + * @return string + */ + public function getCompany() { + return $this->_company; + } + + /** + * Set Company + * + * @param string $pValue + * @return PHPWord_DocumentProperties + */ + public function setCompany($pValue = '') { + $this->_company = $pValue; + return $this; + } +} +?> diff --git a/src/PHPWord/IOFactory.php b/src/PHPWord/IOFactory.php new file mode 100644 index 00000000..ac4b206b --- /dev/null +++ b/src/PHPWord/IOFactory.php @@ -0,0 +1,120 @@ + 'IWriter', 'path' => 'PHPWord/Writer/{0}.php', 'class' => 'PHPWord_Writer_{0}') + ); + + /** + * Autoresolve classes + * + * @var array + */ + private static $_autoResolveClasses = array( + 'Serialized' + ); + + /** + * Private constructor for PHPWord_IOFactory + */ + private function __construct() { } + + /** + * Get search locations + * + * @return array + */ + public static function getSearchLocations() { + return self::$_searchLocations; + } + + /** + * Set search locations + * + * @param array $value + * @throws Exception + */ + public static function setSearchLocations($value) { + if (is_array($value)) { + self::$_searchLocations = $value; + } else { + throw new Exception('Invalid parameter passed.'); + } + } + + /** + * Add search location + * + * @param string $type Example: IWriter + * @param string $location Example: PHPWord/Writer/{0}.php + * @param string $classname Example: PHPWord_Writer_{0} + */ + public static function addSearchLocation($type = '', $location = '', $classname = '') { + self::$_searchLocations[] = array( 'type' => $type, 'path' => $location, 'class' => $classname ); + } + + /** + * Create PHPWord_Writer_IWriter + * + * @param PHPWord $PHPWord + * @param string $writerType Example: Word2007 + * @return PHPWord_Writer_IWriter + */ + public static function createWriter(PHPWord $PHPWord, $writerType = '') { + $searchType = 'IWriter'; + + foreach (self::$_searchLocations as $searchLocation) { + if ($searchLocation['type'] == $searchType) { + $className = str_replace('{0}', $writerType, $searchLocation['class']); + $classFile = str_replace('{0}', $writerType, $searchLocation['path']); + + $instance = new $className($PHPWord); + if(!is_null($instance)) { + return $instance; + } + } + } + + throw new Exception("No $searchType found for type $writerType"); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Media.php b/src/PHPWord/Media.php new file mode 100644 index 00000000..fcc53ac5 --- /dev/null +++ b/src/PHPWord/Media.php @@ -0,0 +1,328 @@ +array(), + 'embeddings'=>array(), + 'links'=>array()); + + /** + * Header Media Elements + * + * @var array + */ + private static $_headerMedia = array(); + + /** + * Footer Media Elements + * + * @var array + */ + private static $_footerMedia = array(); + + /** + * ObjectID Counter + * + * @var int + */ + private static $_objectId = 1325353440; + + + /** + * Add new Section Media Element + * + * @param string $src + * @param string $type + * + * @return mixed + */ + public static function addSectionMediaElement($src, $type, PHPWord_Section_MemoryImage $memoryImage = null) { + $mediaId = md5($src); + $key = ($type == 'image') ? 'images' : 'embeddings'; + + if(!array_key_exists($mediaId, self::$_sectionMedia[$key])) { + $cImg = self::countSectionMediaElements('images'); + $cObj = self::countSectionMediaElements('embeddings'); + $rID = self::countSectionMediaElements() + 7; + + $media = array(); + + if($type == 'image') { + $cImg++; + $inf = pathinfo($src); + $isMemImage = (substr(strtolower($inf['extension']), 0, 3) == 'php' && $type == 'image') ? true : false; + + if($isMemImage) { + $ext = $memoryImage->getImageExtension(); + $media['isMemImage'] = true; + $media['createfunction'] = $memoryImage->getImageCreateFunction(); + $media['imagefunction'] = $memoryImage->getImageFunction(); + } else { + $ext = $inf['extension']; + if($ext == 'jpeg') { // Office crashes when adding a jpEg Image, so rename to jpg + $ext = 'jpg'; + } + } + + $folder = 'media'; + $file = $type.$cImg.'.'.strtolower($ext); + } elseif($type == 'oleObject') { + $cObj++; + $folder = 'embedding'; + $file = $type.$cObj.'.bin'; + } + + $media['source'] = $src; + $media['target'] = "$folder/section_$file"; + $media['type'] = $type; + $media['rID'] = $rID; + + self::$_sectionMedia[$key][$mediaId] = $media; + + if($type == 'oleObject') { + return array($rID, ++self::$_objectId); + } else { + return $rID; + } + } else { + if($type == 'oleObject') { + $rID = self::$_sectionMedia[$key][$mediaId]['rID']; + return array($rID, ++self::$_objectId); + } else { + return self::$_sectionMedia[$key][$mediaId]['rID']; + } + } + } + + /** + * Add new Section Link Element + * + * @param string $linkSrc + * @param string $linkName + * + * @return mixed + */ + public static function addSectionLinkElement($linkSrc) { + $rID = self::countSectionMediaElements() + 7; + + $link = array(); + $link['target'] = $linkSrc; + $link['rID'] = $rID; + $link['type'] = 'hyperlink'; + + self::$_sectionMedia['links'][] = $link; + + return $rID; + } + + /** + * Get Section Media Elements + * + * @param string $key + * @return array + */ + public static function getSectionMediaElements($key = null) { + if(!is_null($key)) { + return self::$_sectionMedia[$key]; + } else { + $arrImages = self::$_sectionMedia['images']; + $arrObjects = self::$_sectionMedia['embeddings']; + $arrLinks = self::$_sectionMedia['links']; + return array_merge($arrImages, $arrObjects, $arrLinks); + } + } + + /** + * Get Section Media Elements Count + * + * @param string $key + * @return int + */ + public static function countSectionMediaElements($key = null) { + if(!is_null($key)) { + return count(self::$_sectionMedia[$key]); + } else { + $cImages = count(self::$_sectionMedia['images']); + $cObjects = count(self::$_sectionMedia['embeddings']); + $cLinks = count(self::$_sectionMedia['links']); + return ($cImages + $cObjects + $cLinks); + } + } + + /** + * Add new Header Media Element + * + * @param int $headerCount + * @param string $src + * @return int + */ + public static function addHeaderMediaElement($headerCount, $src, PHPWord_Section_MemoryImage $memoryImage = null) { + $mediaId = md5($src); + $key = 'header'.$headerCount; + + if(!array_key_exists($key, self::$_headerMedia)) { + self::$_headerMedia[$key] = array(); + } + + if(!array_key_exists($mediaId, self::$_headerMedia[$key])) { + $cImg = self::countHeaderMediaElements($key); + $rID = $cImg + 1; + + $cImg++; + $inf = pathinfo($src); + $isMemImage = (substr(strtolower($inf['extension']), 0, 3) == 'php') ? true : false; + + $media = array(); + if($isMemImage) { + $ext = $memoryImage->getImageExtension(); + $media['isMemImage'] = true; + $media['createfunction'] = $memoryImage->getImageCreateFunction(); + $media['imagefunction'] = $memoryImage->getImageFunction(); + } else { + $ext = $inf['extension']; + if($ext == 'jpeg') { // Office crashes when adding a jpEg Image, so rename to jpg + $ext = 'jpg'; + } + } + $file = 'image'.$cImg.'.'.strtolower($ext); + + $media['source'] = $src; + $media['target'] = 'media/'.$key.'_'.$file; + $media['type'] = 'image'; + $media['rID'] = $rID; + + self::$_headerMedia[$key][$mediaId] = $media; + + return $rID; + } else { + return self::$_headerMedia[$key][$mediaId]['rID']; + } + } + + /** + * Get Header Media Elements Count + * + * @param string $key + * @return int + */ + public static function countHeaderMediaElements($key) { + return count(self::$_headerMedia[$key]); + } + + /** + * Get Header Media Elements + * + * @return int + */ + public static function getHeaderMediaElements() { + return self::$_headerMedia; + } + + /** + * Add new Footer Media Element + * + * @param int $footerCount + * @param string $src + * @return int + */ + public static function addFooterMediaElement($footerCount, $src, PHPWord_Section_MemoryImage $memoryImage = null) { + $mediaId = md5($src); + $key = 'footer'.$footerCount; + + if(!array_key_exists($key, self::$_footerMedia)) { + self::$_footerMedia[$key] = array(); + } + + if(!array_key_exists($mediaId, self::$_footerMedia[$key])) { + $cImg = self::countFooterMediaElements($key); + $rID = $cImg + 1; + + $cImg++; + $inf = pathinfo($src); + $isMemImage = (substr(strtolower($inf['extension']), 0, 3) == 'php') ? true : false; + + $media = array(); + if($isMemImage) { + $ext = $memoryImage->getImageExtension(); + $media['isMemImage'] = true; + $media['createfunction'] = $memoryImage->getImageCreateFunction(); + $media['imagefunction'] = $memoryImage->getImageFunction(); + } else { + $ext = $inf['extension']; + if($ext == 'jpeg') { // Office crashes when adding a jpEg Image, so rename to jpg + $ext = 'jpg'; + } + } + $file = 'image'.$cImg.'.'.strtolower($ext); + + $media['source'] = $src; + $media['target'] = 'media/'.$key.'_'.$file; + $media['type'] = 'image'; + $media['rID'] = $rID; + + self::$_footerMedia[$key][$mediaId] = $media; + + return $rID; + } else { + return self::$_footerMedia[$key][$mediaId]['rID']; + } + } + + /** + * Get Footer Media Elements Count + * + * @param string $key + * @return int + */ + public static function countFooterMediaElements($key) { + return count(self::$_footerMedia[$key]); + } + + /** + * Get Footer Media Elements + * + * @return int + */ + public static function getFooterMediaElements() { + return self::$_footerMedia; + } +} +?> diff --git a/src/PHPWord/Section.php b/src/PHPWord/Section.php new file mode 100644 index 00000000..10d1ce6d --- /dev/null +++ b/src/PHPWord/Section.php @@ -0,0 +1,371 @@ +_sectionCount = $sectionCount; + $this->_settings = new PHPWord_Section_Settings(); + + if(!is_null($settings) && is_array($settings)) { + foreach($settings as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_settings->setSettingValue($key, $value); + } + } + } + + /** + * Get Section Settings + * + * @return PHPWord_Section_Settings + */ + public function getSettings() { + return $this->_settings; + } + + /** + * Add a Text Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Text + */ + public function addText($text, $styleFont = null, $styleParagraph = null) { + $givenText = utf8_encode($text); + $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); + $this->_elementCollection[] = $text; + return $text; + } + + /** + * Add a Link Element + * + * @param string $linkSrc + * @param string $linkName + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Link + */ + public function addLink($linkSrc, $linkName = null, $styleFont = null, $styleParagraph = null) { + $linkSrc = utf8_encode($linkSrc); + if(!is_null($linkName)) { + $linkName = utf8_encode($linkName); + } + + $link = new PHPWord_Section_Link($linkSrc, $linkName, $styleFont, $styleParagraph); + $rID = PHPWord_Media::addSectionLinkElement($linkSrc); + $link->setRelationId($rID); + + $this->_elementCollection[] = $link; + return $link; + } + + /** + * Add a TextBreak Element + * + * @param int $count + */ + public function addTextBreak($count = 1) { + for($i=1; $i<=$count; $i++) { + $this->_elementCollection[] = new PHPWord_Section_TextBreak(); + } + } + + /** + * Add a PageBreak Element + */ + public function addPageBreak() { + $this->_elementCollection[] = new PHPWord_Section_PageBreak(); + } + + /** + * Add a Table Element + * + * @param mixed $style + * @return PHPWord_Section_Table + */ + public function addTable($style = null) { + $table = new PHPWord_Section_Table('section', $this->_sectionCount, $style); + $this->_elementCollection[] = $table; + return $table; + } + + /** + * Add a ListItem Element + * + * @param string $text + * @param int $depth + * @param mixed $styleFont + * @param mixed $styleList + * @param mixed $styleParagraph + * @return PHPWord_Section_ListItem + */ + public function addListItem($text, $depth = 0, $styleFont = null, $styleList = null, $styleParagraph = null) { + $text = utf8_encode($text); + $listItem = new PHPWord_Section_ListItem($text, $depth, $styleFont, $styleList, $styleParagraph); + $this->_elementCollection[] = $listItem; + return $listItem; + } + + /** + * Add a OLE-Object Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Object + */ + public function addObject($src, $style = null) { + $object = new PHPWord_Section_Object($src, $style); + + if(!is_null($object->getSource())) { + $inf = pathinfo($src); + $ext = $inf['extension']; + if(strlen($ext) == 4 && strtolower(substr($ext, -1)) == 'x') { + $ext = substr($ext, 0, -1); + } + + $iconSrc = PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/'; + if(!file_exists($iconSrc.'_'.$ext.'.png')) { + $iconSrc = $iconSrc.'_default.png'; + } else { + $iconSrc .= '_'.$ext.'.png'; + } + + $rIDimg = PHPWord_Media::addSectionMediaElement($iconSrc, 'image'); + $data = PHPWord_Media::addSectionMediaElement($src, 'oleObject'); + $rID = $data[0]; + $objectId = $data[1]; + + $object->setRelationId($rID); + $object->setObjectId($objectId); + $object->setImageRelationId($rIDimg); + + $this->_elementCollection[] = $object; + return $object; + } else { + trigger_error('Source does not exist or unsupported object type.'); + } + } + + /** + * Add a Image Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Image + */ + public function addImage($src, $style = null) { + $image = new PHPWord_Section_Image($src, $style); + + if(!is_null($image->getSource())) { + $rID = PHPWord_Media::addSectionMediaElement($src, 'image'); + $image->setRelationId($rID); + + $this->_elementCollection[] = $image; + return $image; + } else { + trigger_error('Source does not exist or unsupported image type.'); + } + } + + /** + * Add a by PHP created Image Element + * + * @param string $link + * @param mixed $style + * @return PHPWord_Section_MemoryImage + */ + public function addMemoryImage($link, $style = null) { + $memoryImage = new PHPWord_Section_MemoryImage($link, $style); + if(!is_null($memoryImage->getSource())) { + $rID = PHPWord_Media::addSectionMediaElement($link, 'image', $memoryImage); + $memoryImage->setRelationId($rID); + + $this->_elementCollection[] = $memoryImage; + return $memoryImage; + } else { + trigger_error('Unsupported image type.'); + } + } + + /** + * Add a Table-of-Contents Element + * + * @param mixed $styleFont + * @param mixed $styleTOC + * @return PHPWord_TOC + */ + public function addTOC($styleFont = null, $styleTOC = null) { + $toc = new PHPWord_TOC($styleFont, $styleTOC); + $this->_elementCollection[] = $toc; + return $toc; + } + + /** + * Add a Title Element + * + * @param string $text + * @param int $depth + * @return PHPWord_Section_Title + */ + public function addTitle($text, $depth = 1) { + $text = utf8_encode($text); + $styles = PHPWord_Style::getStyles(); + if(array_key_exists('Heading_'.$depth, $styles)) { + $style = 'Heading'.$depth; + } else { + $style = null; + } + + $title = new PHPWord_Section_Title($text, $depth, $style); + + $data = PHPWord_TOC::addTitle($text, $depth); + $anchor = $data[0]; + $bookmarkId = $data[1]; + + $title->setAnchor($anchor); + $title->setBookmarkId($bookmarkId); + + $this->_elementCollection[] = $title; + return $title; + } + + /** + * Create a new TextRun + * + * @return PHPWord_Section_TextRun + */ + public function createTextRun($styleParagraph = null) { + $textRun = new PHPWord_Section_TextRun($styleParagraph); + $this->_elementCollection[] = $textRun; + return $textRun; + } + + /** + * Get all Elements + * + * @return array + */ + public function getElements() { + return $this->_elementCollection; + } + + /** + * Create a new Header + * + * @return PHPWord_Section_Header + */ + public function createHeader() { + $header = new PHPWord_Section_Header($this->_sectionCount); + $this->_header = $header; + return $header; + } + + /** + * Get Header + * + * @return PHPWord_Section_Header + */ + public function getHeader() { + return $this->_header; + } + + /** + * Create a new Footer + * + * @return PHPWord_Section_Footer + */ + public function createFooter() { + $footer = new PHPWord_Section_Footer($this->_sectionCount); + $this->_footer = $footer; + return $footer; + } + + /** + * Get Footer + * + * @return PHPWord_Section_Footer + */ + public function getFooter() { + return $this->_footer; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/Footer.php b/src/PHPWord/Section/Footer.php new file mode 100644 index 00000000..90cc9a48 --- /dev/null +++ b/src/PHPWord/Section/Footer.php @@ -0,0 +1,201 @@ +_footerCount = $sectionCount; + } + + /** + * Add a Text Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Text + */ + public function addText($text, $styleFont = null, $styleParagraph = null) { + $givenText = utf8_encode($text); + $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); + $this->_elementCollection[] = $text; + return $text; + } + + /** + * Add a TextBreak Element + * + * @param int $count + */ + public function addTextBreak($count = 1) { + for($i=1; $i<=$count; $i++) { + $this->_elementCollection[] = new PHPWord_Section_TextBreak(); + } + } + + /** + * Create a new TextRun + * + * @return PHPWord_Section_TextRun + */ + public function createTextRun($styleParagraph = null) { + $textRun = new PHPWord_Section_TextRun($styleParagraph); + $this->_elementCollection[] = $textRun; + return $textRun; + } + + /** + * Add a Table Element + * + * @param mixed $style + * @return PHPWord_Section_Table + */ + public function addTable($style = null) { + $table = new PHPWord_Section_Table('footer', $this->_footerCount, $style); + $this->_elementCollection[] = $table; + return $table; + } + + /** + * Add a Image Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Image + */ + public function addImage($src, $style = null) { + $image = new PHPWord_Section_Image($src, $style); + + if(!is_null($image->getSource())) { + $rID = PHPWord_Media::addFooterMediaElement($this->_footerCount, $src); + $image->setRelationId($rID); + + $this->_elementCollection[] = $image; + return $image; + } else { + trigger_error('Src does not exist or invalid image type.', E_ERROR); + } + } + + /** + * Add a by PHP created Image Element + * + * @param string $link + * @param mixed $style + * @return PHPWord_Section_MemoryImage + */ + public function addMemoryImage($link, $style = null) { + $memoryImage = new PHPWord_Section_MemoryImage($link, $style); + if(!is_null($memoryImage->getSource())) { + $rID = PHPWord_Media::addFooterMediaElement($this->_footerCount, $link, $memoryImage); + $memoryImage->setRelationId($rID); + + $this->_elementCollection[] = $memoryImage; + return $memoryImage; + } else { + trigger_error('Unsupported image type.'); + } + } + + /** + * Add a PreserveText Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Footer_PreserveText + */ + public function addPreserveText($text, $styleFont = null, $styleParagraph = null) { + $text = utf8_encode($text); + $ptext = new PHPWord_Section_Footer_PreserveText($text, $styleFont, $styleParagraph); + $this->_elementCollection[] = $ptext; + return $ptext; + } + + /** + * Get Footer Relation ID + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Footer Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get all Footer Elements + */ + public function getElements() { + return $this->_elementCollection; + } + + /** + * Get Footer Count + */ + public function getFooterCount() { + return $this->_footerCount; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/Footer/PreserveText.php b/src/PHPWord/Section/Footer/PreserveText.php new file mode 100644 index 00000000..05442c2d --- /dev/null +++ b/src/PHPWord/Section/Footer/PreserveText.php @@ -0,0 +1,128 @@ +_styleFont = new PHPWord_Style_Font('text'); + + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleFont->setStyleValue($key, $value); + } + } else { + $this->_styleFont = $styleFont; + } + + // Set paragraph style + if(is_array($styleParagraph)) { + $this->_styleParagraph = new PHPWord_Style_Paragraph(); + + foreach($styleParagraph as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleParagraph->setStyleValue($key, $value); + } + } else { + $this->_styleParagraph = $styleParagraph; + } + + $pattern = '/({.*?})/'; + $this->_text = preg_split($pattern, $text, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + + return $this; + } + + /** + * Get Text style + * + * @return PHPWord_Style_Font + */ + public function getFontStyle() { + return $this->_styleFont; + } + + /** + * Get Paragraph style + * + * @return PHPWord_Style_Paragraph + */ + public function getParagraphStyle() { + return $this->_styleParagraph; + } + + /** + * Get Text content + * + * @return string + */ + public function getText() { + return $this->_text; + } +} +?> diff --git a/src/PHPWord/Section/Header.php b/src/PHPWord/Section/Header.php new file mode 100644 index 00000000..5ea9919a --- /dev/null +++ b/src/PHPWord/Section/Header.php @@ -0,0 +1,222 @@ +_headerCount = $sectionCount; + } + + /** + * Add a Text Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Text + */ + public function addText($text, $styleFont = null, $styleParagraph = null) { + $givenText = utf8_encode($text); + $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); + $this->_elementCollection[] = $text; + return $text; + } + + /** + * Add a TextBreak Element + * + * @param int $count + */ + public function addTextBreak($count = 1) { + for($i=1; $i<=$count; $i++) { + $this->_elementCollection[] = new PHPWord_Section_TextBreak(); + } + } + + /** + * Create a new TextRun + * + * @return PHPWord_Section_TextRun + */ + public function createTextRun($styleParagraph = null) { + $textRun = new PHPWord_Section_TextRun($styleParagraph); + $this->_elementCollection[] = $textRun; + return $textRun; + } + + /** + * Add a Table Element + * + * @param mixed $style + * @return PHPWord_Section_Table + */ + public function addTable($style = null) { + $table = new PHPWord_Section_Table('header', $this->_headerCount, $style); + $this->_elementCollection[] = $table; + return $table; + } + + /** + * Add a Image Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Image + */ + public function addImage($src, $style = null) { + $image = new PHPWord_Section_Image($src, $style); + + if(!is_null($image->getSource())) { + $rID = PHPWord_Media::addHeaderMediaElement($this->_headerCount, $src); + $image->setRelationId($rID); + + $this->_elementCollection[] = $image; + return $image; + } else { + trigger_error('Src does not exist or invalid image type.', E_ERROR); + } + } + + /** + * Add a by PHP created Image Element + * + * @param string $link + * @param mixed $style + * @return PHPWord_Section_MemoryImage + */ + public function addMemoryImage($link, $style = null) { + $memoryImage = new PHPWord_Section_MemoryImage($link, $style); + if(!is_null($memoryImage->getSource())) { + $rID = PHPWord_Media::addHeaderMediaElement($this->_headerCount, $link, $memoryImage); + $memoryImage->setRelationId($rID); + + $this->_elementCollection[] = $memoryImage; + return $memoryImage; + } else { + trigger_error('Unsupported image type.'); + } + } + + /** + * Add a PreserveText Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Footer_PreserveText + */ + public function addPreserveText($text, $styleFont = null, $styleParagraph = null) { + $text = utf8_encode($text); + $ptext = new PHPWord_Section_Footer_PreserveText($text, $styleFont, $styleParagraph); + $this->_elementCollection[] = $ptext; + return $ptext; + } + + /** + * Add a Watermark Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Image + */ + public function addWatermark($src, $style = null) { + $image = new PHPWord_Section_Image($src, $style, true); + + if(!is_null($image->getSource())) { + $rID = PHPWord_Media::addHeaderMediaElement($this->_headerCount, $src); + $image->setRelationId($rID); + + $this->_elementCollection[] = $image; + return $image; + } else { + trigger_error('Src does not exist or invalid image type.', E_ERROR); + } + } + + /** + * Get Header Relation ID + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Header Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get all Header Elements + */ + public function getElements() { + return $this->_elementCollection; + } + + /** + * Get Header Count + */ + public function getHeaderCount() { + return $this->_headerCount; + } +} +?> diff --git a/src/PHPWord/Section/Image.php b/src/PHPWord/Section/Image.php new file mode 100644 index 00000000..6eb2a418 --- /dev/null +++ b/src/PHPWord/Section/Image.php @@ -0,0 +1,168 @@ +_src = $src; + $this->_isWatermark = $isWatermark; + $this->_style = new PHPWord_Style_Image(); + + if(!is_null($style) && is_array($style)) { + foreach($style as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } + + if($this->_style->getWidth() == null && $this->_style->getHeight() == null) { + $imgData = getimagesize($this->_src); + $this->_style->setWidth($imgData[0]); + $this->_style->setHeight($imgData[1]); + } + + return $this; + } else { + return false; + } + } + + /** + * Get Image style + * + * @return PHPWord_Style_Image + */ + public function getStyle() { + return $this->_style; + } + + /** + * Get Image Relation ID + * + * @return int + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Image Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get Image Source + * + * @return string + */ + public function getSource() { + return $this->_src; + } + + /** + * Get Image Media ID + * + * @return string + */ + public function getMediaId() { + return md5($this->_src); + } + + /** + * Get IsWatermark + * + * @return int + */ + public function getIsWatermark() { + return $this->_isWatermark; + } + + /** + * Set IsWatermark + * + * @param bool $pValue + */ + public function setIsWatermark($pValue) { + $this->_isWatermark = $pValue; + } +} +?> diff --git a/src/PHPWord/Section/Link.php b/src/PHPWord/Section/Link.php new file mode 100644 index 00000000..5c582fa0 --- /dev/null +++ b/src/PHPWord/Section/Link.php @@ -0,0 +1,171 @@ +_linkSrc = $linkSrc; + $this->_linkName = $linkName; + + // Set font style + if(is_array($styleFont)) { + $this->_styleFont = new PHPWord_Style_Font('text'); + + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleFont->setStyleValue($key, $value); + } + } else { + $this->_styleFont = $styleFont; + } + + // Set paragraph style + if(is_array($styleParagraph)) { + $this->_styleParagraph = new PHPWord_Style_Paragraph(); + + foreach($styleParagraph as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleParagraph->setStyleValue($key, $value); + } + } else { + $this->_styleParagraph = $styleParagraph; + } + + return $this; + } + + /** + * Get Link Relation ID + * + * @return int + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Link Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get Link source + * + * @return string + */ + public function getLinkSrc() { + return $this->_linkSrc; + } + + /** + * Get Link name + * + * @return string + */ + public function getLinkName() { + return $this->_linkName; + } + + /** + * Get Text style + * + * @return PHPWord_Style_Font + */ + public function getFontStyle() { + return $this->_styleFont; + } + + /** + * Get Paragraph style + * + * @return PHPWord_Style_Paragraph + */ + public function getParagraphStyle() { + return $this->_styleParagraph; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/ListItem.php b/src/PHPWord/Section/ListItem.php new file mode 100644 index 00000000..c509252b --- /dev/null +++ b/src/PHPWord/Section/ListItem.php @@ -0,0 +1,104 @@ +_style = new PHPWord_Style_ListItem(); + $this->_textObject = new PHPWord_Section_Text($text, $styleFont, $styleParagraph); + $this->_depth = $depth; + + if(!is_null($styleList) && is_array($styleList)) { + foreach($styleList as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } + } + + /** + * Get ListItem style + */ + public function getStyle() { + return $this->_style; + } + + /** + * Get ListItem TextRun + */ + public function getTextObject() { + return $this->_textObject; + } + + /** + * Get ListItem depth + */ + public function getDepth() { + return $this->_depth; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/MemoryImage.php b/src/PHPWord/Section/MemoryImage.php new file mode 100644 index 00000000..8e5d840d --- /dev/null +++ b/src/PHPWord/Section/MemoryImage.php @@ -0,0 +1,231 @@ +_imageType = $imgData['mime']; + + $_supportedImageTypes = array('image/jpeg', 'image/gif', 'image/png'); + + if(in_array($this->_imageType, $_supportedImageTypes)) { + $this->_src = $src; + $this->_style = new PHPWord_Style_Image(); + + if(!is_null($style) && is_array($style)) { + foreach($style as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } + + if($this->_style->getWidth() == null && $this->_style->getHeight() == null) { + $this->_style->setWidth($imgData[0]); + $this->_style->setHeight($imgData[1]); + } + + $this->_setFunctions(); + + return $this; + } else { + return false; + } + } + + /** + * Set Functions + */ + private function _setFunctions() { + switch($this->_imageType) { + case 'image/png': + $this->_imageCreateFunc = 'imagecreatefrompng'; + $this->_imageFunc = 'imagepng'; + $this->_imageExtension = 'png'; + break; + case 'image/gif': + $this->_imageCreateFunc = 'imagecreatefromgif'; + $this->_imageFunc = 'imagegif'; + $this->_imageExtension = 'gif'; + break; + case 'image/jpeg': case 'image/jpg': + $this->_imageCreateFunc = 'imagecreatefromjpeg'; + $this->_imageFunc = 'imagejpeg'; + $this->_imageExtension = 'jpg'; + break; + } + } + + + /** + * Get Image style + * + * @return PHPWord_Style_Image + */ + public function getStyle() { + return $this->_style; + } + + /** + * Get Image Relation ID + * + * @return int + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Image Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get Image Source + * + * @return string + */ + public function getSource() { + return $this->_src; + } + + /** + * Get Image Media ID + * + * @return string + */ + public function getMediaId() { + return md5($this->_src); + } + + /** + * Get Image Type + * + * @return string + */ + public function getImageType() { + return $this->_imageType; + } + + /** + * Get Image Create Function + * + * @return string + */ + public function getImageCreateFunction() { + return $this->_imageCreateFunc; + } + + /** + * Get Image Function + * + * @return string + */ + public function getImageFunction() { + return $this->_imageFunc; + } + + /** + * Get Image Extension + * + * @return string + */ + public function getImageExtension() { + return $this->_imageExtension; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/Object.php b/src/PHPWord/Section/Object.php new file mode 100644 index 00000000..7aad4ba5 --- /dev/null +++ b/src/PHPWord/Section/Object.php @@ -0,0 +1,175 @@ +_src = $src; + $this->_style = new PHPWord_Style_Image(); + + if(!is_null($style) && is_array($style)) { + foreach($style as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } + + return $this; + } else { + return false; + } + } + + /** + * Get Image style + * + * @return PHPWord_Style_Image + */ + public function getStyle() { + return $this->_style; + } + + /** + * Get Source + * + * @return string + */ + public function getSource() { + return $this->_src; + } + + /** + * Get Object Relation ID + * + * @return int + */ + public function getRelationId() { + return $this->_rId; + } + + /** + * Set Object Relation ID + * + * @param int $rId + */ + public function setRelationId($rId) { + $this->_rId = $rId; + } + + /** + * Get Image Relation ID + * + * @return int + */ + public function getImageRelationId() { + return $this->_rIdImg; + } + + /** + * Set Image Relation ID + * + * @param int $rId + */ + public function setImageRelationId($rId) { + $this->_rIdImg = $rId; + } + + /** + * Get Object ID + * + * @return int + */ + public function getObjectId() { + return $this->_objId; + } + + /** + * Set Object ID + * + * @param int $objId + */ + public function setObjectId($objId) { + $this->_objId = $objId; + } +} +?> diff --git a/src/PHPWord/Section/PageBreak.php b/src/PHPWord/Section/PageBreak.php new file mode 100644 index 00000000..48b41c75 --- /dev/null +++ b/src/PHPWord/Section/PageBreak.php @@ -0,0 +1,45 @@ + \ No newline at end of file diff --git a/src/PHPWord/Section/Settings.php b/src/PHPWord/Section/Settings.php new file mode 100644 index 00000000..84dcc8ee --- /dev/null +++ b/src/PHPWord/Section/Settings.php @@ -0,0 +1,515 @@ +_orientation = null; + $this->_marginTop = 1418; + $this->_marginLeft = 1418; + $this->_marginRight = 1418; + $this->_marginBottom = 1134; + $this->_pageSizeW = $this->_defaultPageSizeW; + $this->_pageSizeH = $this->_defaultPageSizeH; + $this->_borderTopSize = null; + $this->_borderTopColor = null; + $this->_borderLeftSize = null; + $this->_borderLeftColor = null; + $this->_borderRightSize = null; + $this->_borderRightColor = null; + $this->_borderBottomSize = null; + $this->_borderBottomColor = null; + } + + /** + * Set Setting Value + * + * @param string $key + * @param string $value + */ + public function setSettingValue($key, $value) { + if($key == '_orientation' && $value == 'landscape') { + $this->setLandscape(); + } elseif($key == '_orientation' && is_null($value)) { + $this->setPortrait(); + } elseif($key == '_borderSize') { + $this->setBorderSize($value); + } elseif($key == '_borderColor') { + $this->setBorderColor($value); + } else { + $this->$key = $value; + } + } + + /** + * Get Margin Top + * + * @return int + */ + public function getMarginTop() { + return $this->_marginTop; + } + + /** + * Set Margin Top + * + * @param int $pValue + */ + public function setMarginTop($pValue = '') { + $this->_marginTop = $pValue; + return $this; + } + + /** + * Get Margin Left + * + * @return int + */ + public function getMarginLeft() { + return $this->_marginLeft; + } + + /** + * Set Margin Left + * + * @param int $pValue + */ + public function setMarginLeft($pValue = '') { + $this->_marginLeft = $pValue; + return $this; + } + + /** + * Get Margin Right + * + * @return int + */ + public function getMarginRight() { + return $this->_marginRight; + } + + /** + * Set Margin Right + * + * @param int $pValue + */ + public function setMarginRight($pValue = '') { + $this->_marginRight = $pValue; + return $this; + } + + /** + * Get Margin Bottom + * + * @return int + */ + public function getMarginBottom() { + return $this->_marginBottom; + } + + /** + * Set Margin Bottom + * + * @param int $pValue + */ + public function setMarginBottom($pValue = '') { + $this->_marginBottom = $pValue; + return $this; + } + + /** + * Set Landscape Orientation + */ + public function setLandscape() { + $this->_orientation = 'landscape'; + $this->_pageSizeW = $this->_defaultPageSizeH; + $this->_pageSizeH = $this->_defaultPageSizeW; + } + + /** + * Set Portrait Orientation + */ + public function setPortrait() { + $this->_orientation = null; + $this->_pageSizeW = $this->_defaultPageSizeW; + $this->_pageSizeH = $this->_defaultPageSizeH; + } + + /** + * Get Page Size Width + * + * @return int + */ + public function getPageSizeW() { + return $this->_pageSizeW; + } + + /** + * Get Page Size Height + * + * @return int + */ + public function getPageSizeH() { + return $this->_pageSizeH; + } + + /** + * Get Page Orientation + * + * @return string + */ + public function getOrientation() { + return $this->_orientation; + } + + /** + * Set Border Size + * + * @param int $pValue + */ + public function setBorderSize($pValue = null) { + $this->_borderTopSize = $pValue; + $this->_borderLeftSize = $pValue; + $this->_borderRightSize = $pValue; + $this->_borderBottomSize = $pValue; + } + + /** + * Get Border Size + * + * @return array + */ + public function getBorderSize() { + $t = $this->getBorderTopSize(); + $l = $this->getBorderLeftSize(); + $r = $this->getBorderRightSize(); + $b = $this->getBorderBottomSize(); + + return array($t, $l, $r, $b); + } + + /** + * Set Border Color + * + * @param string $pValue + */ + public function setBorderColor($pValue = null) { + $this->_borderTopColor = $pValue; + $this->_borderLeftColor = $pValue; + $this->_borderRightColor = $pValue; + $this->_borderBottomColor = $pValue; + } + + /** + * Get Border Color + * + * @return array + */ + public function getBorderColor() { + $t = $this->getBorderTopColor(); + $l = $this->getBorderLeftColor(); + $r = $this->getBorderRightColor(); + $b = $this->getBorderBottomColor(); + + return array($t, $l, $r, $b); + } + + /** + * Set Border Top Size + * + * @param int $pValue + */ + public function setBorderTopSize($pValue = null) { + $this->_borderTopSize = $pValue; + } + + /** + * Get Border Top Size + * + * @return int + */ + public function getBorderTopSize() { + return $this->_borderTopSize; + } + + /** + * Set Border Top Color + * + * @param string $pValue + */ + public function setBorderTopColor($pValue = null) { + $this->_borderTopColor = $pValue; + } + + /** + * Get Border Top Color + * + * @return string + */ + public function getBorderTopColor() { + return $this->_borderTopColor; + } + + /** + * Set Border Left Size + * + * @param int $pValue + */ + public function setBorderLeftSize($pValue = null) { + $this->_borderLeftSize = $pValue; + } + + /** + * Get Border Left Size + * + * @return int + */ + public function getBorderLeftSize() { + return $this->_borderLeftSize; + } + + /** + * Set Border Left Color + * + * @param string $pValue + */ + public function setBorderLeftColor($pValue = null) { + $this->_borderLeftColor = $pValue; + } + + /** + * Get Border Left Color + * + * @return string + */ + public function getBorderLeftColor() { + return $this->_borderLeftColor; + } + + /** + * Set Border Right Size + * + * @param int $pValue + */ + public function setBorderRightSize($pValue = null) { + $this->_borderRightSize = $pValue; + } + + /** + * Get Border Right Size + * + * @return int + */ + public function getBorderRightSize() { + return $this->_borderRightSize; + } + + /** + * Set Border Right Color + * + * @param string $pValue + */ + public function setBorderRightColor($pValue = null) { + $this->_borderRightColor = $pValue; + } + + /** + * Get Border Right Color + * + * @return string + */ + public function getBorderRightColor() { + return $this->_borderRightColor; + } + + /** + * Set Border Bottom Size + * + * @param int $pValue + */ + public function setBorderBottomSize($pValue = null) { + $this->_borderBottomSize = $pValue; + } + + /** + * Get Border Bottom Size + * + * @return int + */ + public function getBorderBottomSize() { + return $this->_borderBottomSize; + } + + /** + * Set Border Bottom Color + * + * @param string $pValue + */ + public function setBorderBottomColor($pValue = null) { + $this->_borderBottomColor = $pValue; + } + + /** + * Get Border Bottom Color + * + * @return string + */ + public function getBorderBottomColor() { + return $this->_borderBottomColor; + } +} +?> diff --git a/src/PHPWord/Section/Table.php b/src/PHPWord/Section/Table.php new file mode 100644 index 00000000..783c8776 --- /dev/null +++ b/src/PHPWord/Section/Table.php @@ -0,0 +1,152 @@ +_insideOf = $insideOf; + $this->_pCount = $pCount; + + if(!is_null($style)) { + if(is_array($style)) { + $this->_style = new PHPWord_Style_Table(); + + foreach($style as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } else { + $this->_style = $style; + } + } + } + + /** + * Add a row + * + * @param int $height + */ + public function addRow($height = null) { + $this->_rows[] = array(); + $this->_rowHeights[] = $height; + } + + /** + * Add a cell + * + * @param int $width + * @param mixed $style + * @return PHPWord_Section_Table_Cell + */ + public function addCell($width, $style = null) { + $cell = new PHPWord_Section_Table_Cell($this->_insideOf, $this->_pCount, $width, $style); + $i = count($this->_rows) - 1; + $this->_rows[$i][] = $cell; + return $cell; + } + + /** + * Get all rows + * + * @return array + */ + public function getRows() { + return $this->_rows; + } + + /** + * Get all row heights + * + * @return array + */ + public function getRowHeights() { + return $this->_rowHeights; + } + + /** + * Get table style + * + * @return PHPWord_Style_Table + */ + public function getStyle() { + return $this->_style; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/Table/Cell.php b/src/PHPWord/Section/Table/Cell.php new file mode 100644 index 00000000..2cf03a62 --- /dev/null +++ b/src/PHPWord/Section/Table/Cell.php @@ -0,0 +1,319 @@ +_insideOf = $insideOf; + $this->_pCount = $pCount; + $this->_width = $width; + + if(!is_null($style)) { + if(is_array($style)) { + $this->_style = new PHPWord_Style_Cell(); + + foreach($style as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_style->setStyleValue($key, $value); + } + } else { + $this->_style = $style; + } + } + } + + /** + * Add a Text Element + * + * @param string $text + * @param mixed $style + * @return PHPWord_Section_Text + */ + public function addText($text, $styleFont = null, $styleParagraph = null) { + $text = utf8_encode($text); + $text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph); + $this->_elementCollection[] = $text; + return $text; + } + + /** + * Add a Link Element + * + * @param string $linkSrc + * @param string $linkName + * @param mixed $style + * @return PHPWord_Section_Link + */ + public function addLink($linkSrc, $linkName = null, $style = null) { + if($this->_insideOf == 'section') { + $linkSrc = utf8_encode($linkSrc); + if(!is_null($linkName)) { + $linkName = utf8_encode($linkName); + } + + $link = new PHPWord_Section_Link($linkSrc, $linkName, $style); + $rID = PHPWord_Media::addSectionLinkElement($linkSrc); + $link->setRelationId($rID); + + $this->_elementCollection[] = $link; + return $link; + } else { + trigger_error('Unsupported Link header / footer reference'); + return false; + } + } + + /** + * Add a TextBreak Element + * + * @param int $count + */ + public function addTextBreak() { + $this->_elementCollection[] = new PHPWord_Section_TextBreak(); + } + + /** + * Add a ListItem Element + * + * @param string $text + * @param int $depth + * @param mixed $styleText + * @param mixed $styleList + * @return PHPWord_Section_ListItem + */ + public function addListItem($text, $depth = 0, $styleText = null, $styleList = null) { + $text = utf8_encode($text); + $listItem = new PHPWord_Section_ListItem($text, $depth, $styleText, $styleList); + $this->_elementCollection[] = $listItem; + return $listItem; + } + + /** + * Add a Image Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Image + */ + public function addImage($src, $style = null) { + $image = new PHPWord_Section_Image($src, $style); + + if(!is_null($image->getSource())) { + if($this->_insideOf == 'section') { + $rID = PHPWord_Media::addSectionMediaElement($src, 'image'); + } elseif($this->_insideOf == 'header') { + $rID = PHPWord_Media::addHeaderMediaElement($this->_pCount, $src); + } elseif($this->_insideOf == 'footer') { + $rID = PHPWord_Media::addFooterMediaElement($this->_pCount, $src); + } + $image->setRelationId($rID); + + $this->_elementCollection[] = $image; + return $image; + } else { + trigger_error('Source does not exist or unsupported image type.'); + } + } + + /** + * Add a by PHP created Image Element + * + * @param string $link + * @param mixed $style + * @return PHPWord_Section_MemoryImage + */ + public function addMemoryImage($link, $style = null) { + $memoryImage = new PHPWord_Section_MemoryImage($link, $style); + if(!is_null($memoryImage->getSource())) { + if($this->_insideOf == 'section') { + $rID = PHPWord_Media::addSectionMediaElement($link, 'image', $memoryImage); + } elseif($this->_insideOf == 'header') { + $rID = PHPWord_Media::addHeaderMediaElement($this->_pCount, $link, $memoryImage); + } elseif($this->_insideOf == 'footer') { + $rID = PHPWord_Media::addFooterMediaElement($this->_pCount, $link, $memoryImage); + } + $memoryImage->setRelationId($rID); + + $this->_elementCollection[] = $memoryImage; + return $memoryImage; + } else { + trigger_error('Unsupported image type.'); + } + } + + /** + * Add a OLE-Object Element + * + * @param string $src + * @param mixed $style + * @return PHPWord_Section_Object + */ + public function addObject($src, $style = null) { + $object = new PHPWord_Section_Object($src, $style); + + if(!is_null($object->getSource())) { + $inf = pathinfo($src); + $ext = $inf['extension']; + if(strlen($ext) == 4 && strtolower(substr($ext, -1)) == 'x') { + $ext = substr($ext, 0, -1); + } + + $iconSrc = PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/'; + if(!file_exists($iconSrc.'_'.$ext.'.png')) { + $iconSrc = $iconSrc.'_default.png'; + } else { + $iconSrc .= '_'.$ext.'.png'; + } + + $rIDimg = PHPWord_Media::addSectionMediaElement($iconSrc, 'image'); + $data = PHPWord_Media::addSectionMediaElement($src, 'oleObject'); + $rID = $data[0]; + $objectId = $data[1]; + + $object->setRelationId($rID); + $object->setObjectId($objectId); + $object->setImageRelationId($rIDimg); + + $this->_elementCollection[] = $object; + return $object; + } else { + trigger_error('Source does not exist or unsupported object type.'); + } + } + + /** + * Add a PreserveText Element + * + * @param string $text + * @param mixed $styleFont + * @param mixed $styleParagraph + * @return PHPWord_Section_Footer_PreserveText + */ + public function addPreserveText($text, $styleFont = null, $styleParagraph = null) { + if($this->_insideOf == 'footer' || $this->_insideOf == 'header') { + $text = utf8_encode($text); + $ptext = new PHPWord_Section_Footer_PreserveText($text, $styleFont, $styleParagraph); + $this->_elementCollection[] = $ptext; + return $ptext; + } else { + trigger_error('addPreserveText only supported in footer/header.'); + } + } + + /** + * Create a new TextRun + * + * @return PHPWord_Section_TextRun + */ + public function createTextRun($styleParagraph = null) { + $textRun = new PHPWord_Section_TextRun($styleParagraph); + $this->_elementCollection[] = $textRun; + return $textRun; + } + + /** + * Get all Elements + * + * @return array + */ + public function getElements() { + return $this->_elementCollection; + } + + /** + * Get Cell Style + * + * @return PHPWord_Style_Cell + */ + public function getStyle() { + return $this->_style; + } + + /** + * Get Cell width + * + * @return int + */ + public function getWidth() { + return $this->_width; + } +} +?> diff --git a/src/PHPWord/Section/Text.php b/src/PHPWord/Section/Text.php new file mode 100644 index 00000000..7ad15ee2 --- /dev/null +++ b/src/PHPWord/Section/Text.php @@ -0,0 +1,127 @@ +_styleFont = new PHPWord_Style_Font('text'); + + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleFont->setStyleValue($key, $value); + } + } else { + $this->_styleFont = $styleFont; + } + + // Set paragraph style + if(is_array($styleParagraph)) { + $this->_styleParagraph = new PHPWord_Style_Paragraph(); + + foreach($styleParagraph as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleParagraph->setStyleValue($key, $value); + } + } else { + $this->_styleParagraph = $styleParagraph; + } + + $this->_text = $text; + + return $this; + } + + /** + * Get Text style + * + * @return PHPWord_Style_Font + */ + public function getFontStyle() { + return $this->_styleFont; + } + + /** + * Get Paragraph style + * + * @return PHPWord_Style_Paragraph + */ + public function getParagraphStyle() { + return $this->_styleParagraph; + } + + /** + * Get Text content + * + * @return string + */ + public function getText() { + return $this->_text; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/TextBreak.php b/src/PHPWord/Section/TextBreak.php new file mode 100644 index 00000000..92a7b49b --- /dev/null +++ b/src/PHPWord/Section/TextBreak.php @@ -0,0 +1,45 @@ + \ No newline at end of file diff --git a/src/PHPWord/Section/TextRun.php b/src/PHPWord/Section/TextRun.php new file mode 100644 index 00000000..4f5eece9 --- /dev/null +++ b/src/PHPWord/Section/TextRun.php @@ -0,0 +1,129 @@ +_elementCollection = array(); + + // Set paragraph style + if(is_array($styleParagraph)) { + $this->_styleParagraph = new PHPWord_Style_Paragraph(); + + foreach($styleParagraph as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->_styleParagraph->setStyleValue($key, $value); + } + } else { + $this->_styleParagraph = $styleParagraph; + } + } + + + /** + * Add a Text Element + * + * @var string $text + * @var mixed $styleFont + * @return PHPWord_Section_Text + */ + public function addText($text = null, $styleFont = null) { + $givenText = utf8_encode($text); + $text = new PHPWord_Section_Text($givenText, $styleFont); + $this->_elementCollection[] = $text; + return $text; + } + + /** + * Add a Link Element + * + * @param string $linkSrc + * @param string $linkName + * @param mixed $styleFont + * @return PHPWord_Section_Link + */ + public function addLink($linkSrc, $linkName = null, $styleFont = null) { + $linkSrc = utf8_encode($linkSrc); + if(!is_null($linkName)) { + $linkName = utf8_encode($linkName); + } + + $link = new PHPWord_Section_Link($linkSrc, $linkName, $styleFont); + $rID = PHPWord_Media::addSectionLinkElement($linkSrc); + $link->setRelationId($rID); + + $this->_elementCollection[] = $link; + return $link; + } + + /** + * Get TextRun content + * + * @return string + */ + public function getElements() { + return $this->_elementCollection; + } + + /** + * Get Paragraph style + * + * @return PHPWord_Style_Paragraph + */ + public function getParagraphStyle() { + return $this->_styleParagraph; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Section/Title.php b/src/PHPWord/Section/Title.php new file mode 100644 index 00000000..0956b062 --- /dev/null +++ b/src/PHPWord/Section/Title.php @@ -0,0 +1,145 @@ +_style = $style; + } + + $this->_text = $text; + $this->_depth = $depth; + + return $this; + } + + /** + * Set Anchor + * + * @var int $anchor + */ + public function setAnchor($anchor) { + $this->_anchor = $anchor; + } + + /** + * Get Anchor + * + * @return int + */ + public function getAnchor() { + return $this->_anchor; + } + + /** + * Set Bookmark ID + * + * @var int $bookmarkId + */ + public function setBookmarkId($bookmarkId) { + $this->_bookmarkId = $bookmarkId; + } + + /** + * Get Anchor + * + * @return int + */ + public function getBookmarkId() { + return $this->_bookmarkId; + } + + /** + * Get Title Text content + * + * @return string + */ + public function getText() { + return $this->_text; + } + + /** + * Get Title style + * + * @return string + */ + public function getStyle() { + return $this->_style; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Shared/Drawing.php b/src/PHPWord/Shared/Drawing.php new file mode 100644 index 00000000..2e9a9983 --- /dev/null +++ b/src/PHPWord/Shared/Drawing.php @@ -0,0 +1,102 @@ +open($zipFile) === true) { + $returnValue = ($zip->getFromName($archiveFile) !== false); + $zip->close(); + return $returnValue; + } else { + return false; + } + } else { + // Regular file_exists + return file_exists($pFilename); + } + } + + /** + * Returns canonicalized absolute pathname, also for ZIP archives + * + * @param string $pFilename + * @return string + */ + public static function realpath($pFilename) { + // Returnvalue + $returnValue = ''; + + // Try using realpath() + $returnValue = realpath($pFilename); + + // Found something? + if ($returnValue == '' || is_null($returnValue)) { + $pathArray = split('/' , $pFilename); + while(in_array('..', $pathArray) && $pathArray[0] != '..') { + for ($i = 0; $i < count($pathArray); ++$i) { + if ($pathArray[$i] == '..' && $i > 0) { + unset($pathArray[$i]); + unset($pathArray[$i - 1]); + break; + } + } + } + $returnValue = implode('/', $pathArray); + } + + // Return + return $returnValue; + } +} diff --git a/src/PHPWord/Shared/Font.php b/src/PHPWord/Shared/Font.php new file mode 100644 index 00000000..aae43764 --- /dev/null +++ b/src/PHPWord/Shared/Font.php @@ -0,0 +1,72 @@ +) + * element or in the shared string element. + * + * @param string $value Value to unescape + * @return string + */ + public static function ControlCharacterOOXML2PHP($value = '') { + if(empty(self::$_controlCharacters)) { + self::_buildControlCharacters(); + } + + return str_replace( array_keys(self::$_controlCharacters), array_values(self::$_controlCharacters), $value ); + } + + /** + * Convert from PHP control character to OpenXML escaped control character + * + * Excel 2007 team: + * ---------------- + * That's correct, control characters are stored directly in the shared-strings table. + * We do encode characters that cannot be represented in XML using the following escape sequence: + * _xHHHH_ where H represents a hexadecimal character in the character's value... + * So you could end up with something like _x0008_ in a string (either in a cell value () + * element or in the shared string element. + * + * @param string $value Value to escape + * @return string + */ + public static function ControlCharacterPHP2OOXML($value = '') { + if(empty(self::$_controlCharacters)) { + self::_buildControlCharacters(); + } + + return str_replace( array_values(self::$_controlCharacters), array_keys(self::$_controlCharacters), $value ); + } + + /** + * Check if a string contains UTF8 data + * + * @param string $value + * @return boolean + */ + public static function IsUTF8($value = '') { + return utf8_encode(utf8_decode($value)) === $value; + } + + /** + * Formats a numeric value as a string for output in various output writers + * + * @param mixed $value + * @return string + */ + public static function FormatNumber($value) { + return number_format($value, 2, '.', ''); + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (8-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @return string + */ + public static function UTF8toBIFF8UnicodeShort($value) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + + // option flags + $opt = (self::getIsMbstringEnabled() || self::getIsIconvEnabled()) ? + 0x0001 : 0x0000; + + // characters + $chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + + $data = pack('CC', $ln, $opt) . $chars; + return $data; + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (16-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @return string + */ + public static function UTF8toBIFF8UnicodeLong($value) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + + // option flags + $opt = (self::getIsMbstringEnabled() || self::getIsIconvEnabled()) ? + 0x0001 : 0x0000; + + // characters + $chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + + $data = pack('vC', $ln, $opt) . $chars; + return $data; + } + + /** + * Convert string from one encoding to another. First try mbstring, then iconv, or no convertion + * + * @param string $value + * @param string $to Encoding to convert to, e.g. 'UTF-8' + * @param string $from Encoding to convert from, e.g. 'UTF-16LE' + * @return string + */ + public static function ConvertEncoding($value, $to, $from) + { + if (self::getIsMbstringEnabled()) { + $value = mb_convert_encoding($value, $to, $from); + return $value; + } + + if (self::getIsIconvEnabled()) { + $value = iconv($from, $to, $value); + return $value; + } + + // else, no conversion + return $value; + } + + /** + * Get character count. First try mbstring, then iconv, finally strlen + * + * @param string $value + * @param string $enc Encoding + * @return int Character count + */ + public static function CountCharacters($value, $enc = 'UTF-8') + { + if (self::getIsMbstringEnabled()) { + $count = mb_strlen($value, $enc); + return $count; + } + + if (self::getIsIconvEnabled()) { + $count = iconv_strlen($value, $enc); + return $count; + } + + // else strlen + $count = strlen($value); + return $count; + } + +} diff --git a/src/PHPWord/Shared/XMLWriter.php b/src/PHPWord/Shared/XMLWriter.php new file mode 100644 index 00000000..d16f981d --- /dev/null +++ b/src/PHPWord/Shared/XMLWriter.php @@ -0,0 +1,143 @@ +_xmlWriter = new XMLWriter(); + + // Open temporary storage + if ($pTemporaryStorage == self::STORAGE_MEMORY) { + $this->_xmlWriter->openMemory(); + } else { + // Create temporary filename + $this->_tempFileName = @tempnam($pTemporaryStorageFolder, 'xml'); + + // Open storage + if ($this->_xmlWriter->openUri($this->_tempFileName) === false) { + // Fallback to memory... + $this->_xmlWriter->openMemory(); + } + } + + // Set default values + // proposed to be false in production version + $this->_xmlWriter->setIndent(true); + //$this->_xmlWriter->setIndent(false); + + // Set indent + // proposed to be '' in production version + $this->_xmlWriter->setIndentString(' '); + //$this->_xmlWriter->setIndentString(''); + } + + /** + * Destructor + */ + public function __destruct() { + // Desctruct XMLWriter + unset($this->_xmlWriter); + + // Unlink temporary files + if ($this->_tempFileName != '') { + @unlink($this->_tempFileName); + } + } + + /** + * Get written data + * + * @return $data + */ + public function getData() { + if ($this->_tempFileName == '') { + return $this->_xmlWriter->outputMemory(true); + } else { + $this->_xmlWriter->flush(); + return file_get_contents($this->_tempFileName); + } + } + + /** + * Catch function calls (and pass them to internal XMLWriter) + * + * @param unknown_type $function + * @param unknown_type $args + */ + public function __call($function, $args) { + try { + @call_user_func_array(array($this->_xmlWriter, $function), $args); + } catch (Exception $ex) { + // Do nothing! + } + } + + /** + * Fallback method for writeRaw, introduced in PHP 5.2 + * + * @param string $text + * @return string + */ + public function writeRaw($text) + { + if (isset($this->_xmlWriter) && is_object($this->_xmlWriter) && (method_exists($this->_xmlWriter, 'writeRaw'))) { + return $this->_xmlWriter->writeRaw($text); + } + + return $this->text($text); + } +} diff --git a/src/PHPWord/Shared/ZipStreamWrapper.php b/src/PHPWord/Shared/ZipStreamWrapper.php new file mode 100644 index 00000000..9243f6f3 --- /dev/null +++ b/src/PHPWord/Shared/ZipStreamWrapper.php @@ -0,0 +1,176 @@ +_archive = new ZipArchive(); + $this->_archive->open($url['host']); + + $this->_fileNameInArchive = $url['fragment']; + $this->_position = 0; + $this->_data = $this->_archive->getFromName( $this->_fileNameInArchive ); + + return true; + } + + /** + * Stat stream + */ + public function stream_stat() { + return $this->_archive->statName( $this->_fileNameInArchive ); + } + + /** + * Read stream + */ + function stream_read($count) { + $ret = substr($this->_data, $this->_position, $count); + $this->_position += strlen($ret); + return $ret; + } + + /** + * Tell stream + */ + public function stream_tell() { + return $this->_position; + } + + /** + * EOF stream + */ + public function stream_eof() { + return $this->_position >= strlen($this->_data); + } + + /** + * Seek stream + */ + public function stream_seek($offset, $whence) { + switch ($whence) { + case SEEK_SET: + if ($offset < strlen($this->_data) && $offset >= 0) { + $this->_position = $offset; + return true; + } else { + return false; + } + break; + + case SEEK_CUR: + if ($offset >= 0) { + $this->_position += $offset; + return true; + } else { + return false; + } + break; + + case SEEK_END: + if (strlen($this->_data) + $offset >= 0) { + $this->_position = strlen($this->_data) + $offset; + return true; + } else { + return false; + } + break; + + default: + return false; + } + } +} +?> diff --git a/src/PHPWord/Style.php b/src/PHPWord/Style.php new file mode 100644 index 00000000..fd675d3b --- /dev/null +++ b/src/PHPWord/Style.php @@ -0,0 +1,151 @@ + $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $style->setStyleValue($key, $value); + } + + self::$_styleElements[$styleName] = $style; + } + } + + /** + * Add a font style + * + * @param string $styleName + * @param array $styleFont + * @param array $styleParagraph + */ + public static function addFontStyle($styleName, $styleFont, $styleParagraph = null) { + if(!array_key_exists($styleName, self::$_styleElements)) { + $font = new PHPWord_Style_Font('text', $styleParagraph); + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $font->setStyleValue($key, $value); + } + self::$_styleElements[$styleName] = $font; + } + } + + /** + * Add a link style + * + * @param string $styleName + * @param array $styles + */ + public static function addLinkStyle($styleName, $styles) { + if(!array_key_exists($styleName, self::$_styleElements)) { + $style = new PHPWord_Style_Font('link'); + foreach($styles as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $style->setStyleValue($key, $value); + } + + self::$_styleElements[$styleName] = $style; + } + } + + /** + * Add a table style + * + * @param string $styleName + * @param array $styles + */ + public static function addTableStyle($styleName, $styleTable, $styleFirstRow = null, $styleLastRow = null) { + if(!array_key_exists($styleName, self::$_styleElements)) { + $style = new PHPWord_Style_TableFull($styleTable, $styleFirstRow, $styleLastRow); + + self::$_styleElements[$styleName] = $style; + } + } + + /** + * Add a title style + * + * @param string $styleName + * @param array $styleFont + * @param array $styleParagraph + */ + public static function addTitleStyle($titleCount, $styleFont, $styleParagraph = null) { + $styleName = 'Heading_'.$titleCount; + if(!array_key_exists($styleName, self::$_styleElements)) { + $font = new PHPWord_Style_Font('title', $styleParagraph); + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $font->setStyleValue($key, $value); + } + + self::$_styleElements[$styleName] = $font; + } + } + + /** + * Get all styles + * + * @return PHPWord_Style_Font[] + */ + public static function getStyles() { + return self::$_styleElements; + } +} +?> diff --git a/src/PHPWord/Style/Cell.php b/src/PHPWord/Style/Cell.php new file mode 100644 index 00000000..a09b3067 --- /dev/null +++ b/src/PHPWord/Style/Cell.php @@ -0,0 +1,291 @@ +_valign = null; + $this->_textDirection = null; + $this->_bgColor = null; + $this->_borderTopSize = null; + $this->_borderTopColor = null; + $this->_borderLeftSize = null; + $this->_borderLeftColor = null; + $this->_borderRightSize = null; + $this->_borderRightColor = null; + $this->_borderBottomSize = null; + $this->_borderBottomColor = null; + $this->_defaultBorderColor = '000000'; + } + + /** + * Set style value + * + * @var string $key + * @var mixed $value + */ + public function setStyleValue($key, $value) { + if($key == '_borderSize') { + $this->setBorderSize($value); + } elseif($key == '_borderColor') { + $this->setBorderColor($value); + } else { + $this->$key = $value; + } + } + + public function getVAlign() { + return $this->_valign; + } + + public function setVAlign($pValue = null) { + $this->_valign = $pValue; + } + + public function getTextDirection() { + return $this->_textDirection; + } + + public function setTextDirection($pValue = null) { + $this->_textDirection = $pValue; + } + + public function getBgColor() { + return $this->_bgColor; + } + + public function setBgColor($pValue = null) { + $this->_bgColor = $pValue; + } + + public function setHeight($pValue = null) { + $this->_height = $pValue; + } + + public function setBorderSize($pValue = null) { + $this->_borderTopSize = $pValue; + $this->_borderLeftSize = $pValue; + $this->_borderRightSize = $pValue; + $this->_borderBottomSize = $pValue; + } + + public function getBorderSize() { + $t = $this->getBorderTopSize(); + $l = $this->getBorderLeftSize(); + $r = $this->getBorderRightSize(); + $b = $this->getBorderBottomSize(); + + return array($t, $l, $r, $b); + } + + public function setBorderColor($pValue = null) { + $this->_borderTopColor = $pValue; + $this->_borderLeftColor = $pValue; + $this->_borderRightColor = $pValue; + $this->_borderBottomColor = $pValue; + } + + public function getBorderColor() { + $t = $this->getBorderTopColor(); + $l = $this->getBorderLeftColor(); + $r = $this->getBorderRightColor(); + $b = $this->getBorderBottomColor(); + + return array($t, $l, $r, $b); + } + + public function setBorderTopSize($pValue = null) { + $this->_borderTopSize = $pValue; + } + + public function getBorderTopSize() { + return $this->_borderTopSize; + } + + public function setBorderTopColor($pValue = null) { + $this->_borderTopColor = $pValue; + } + + public function getBorderTopColor() { + return $this->_borderTopColor; + } + + + public function setBorderLeftSize($pValue = null) { + $this->_borderLeftSize = $pValue; + } + + public function getBorderLeftSize() { + return $this->_borderLeftSize; + } + + public function setBorderLeftColor($pValue = null) { + $this->_borderLeftColor = $pValue; + } + + public function getBorderLeftColor() { + return $this->_borderLeftColor; + } + + + public function setBorderRightSize($pValue = null) { + $this->_borderRightSize = $pValue; + } + + public function getBorderRightSize() { + return $this->_borderRightSize; + } + + public function setBorderRightColor($pValue = null) { + $this->_borderRightColor = $pValue; + } + + public function getBorderRightColor() { + return $this->_borderRightColor; + } + + + public function setBorderBottomSize($pValue = null) { + $this->_borderBottomSize = $pValue; + } + + public function getBorderBottomSize() { + return $this->_borderBottomSize; + } + + public function setBorderBottomColor($pValue = null) { + $this->_borderBottomColor = $pValue; + } + + public function getBorderBottomColor() { + return $this->_borderBottomColor; + } + + public function getDefaultBorderColor() { + return $this->_defaultBorderColor; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Style/Font.php b/src/PHPWord/Style/Font.php new file mode 100644 index 00000000..9bb2f467 --- /dev/null +++ b/src/PHPWord/Style/Font.php @@ -0,0 +1,261 @@ +_type = $type; + $this->_name = 'Arial'; + $this->_size = 20; + $this->_bold = false; + $this->_italic = false; + $this->_superScript = false; + $this->_subScript = false; + $this->_underline = PHPWord_Style_Font::UNDERLINE_NONE; + $this->_strikethrough = false; + $this->_color = '000000'; + $this->_fgColor = null; + + if(!is_null($styleParagraph)) { + $paragraph = new PHPWord_Style_Paragraph(); + foreach($styleParagraph as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $paragraph->setStyleValue($key, $value); + } + $this->_paragraphStyle = $paragraph; + } else { + $this->_paragraphStyle = null; + } + } + + public function getName() { + return $this->_name; + } + + public function setStyleValue($key, $value) { + if($key == '_size') { + $value *= 2; + } + $this->$key = $value; + } + + public function setName($pValue = 'Arial') { + if($pValue == '') { + $pValue = 'Arial'; + } + $this->_name = $pValue; + return $this; + } + + public function getSize() { + return $this->_size; + } + + public function setSize($pValue = 20) { + if($pValue == '') { + $pValue = 20; + } + $this->_size = ($pValue*2); + return $this; + } + + public function getBold() { + return $this->_bold; + } + + public function setBold($pValue = false) { + if($pValue == '') { + $pValue = false; + } + $this->_bold = $pValue; + return $this; + } + + public function getItalic() { + return $this->_italic; + } + + public function setItalic($pValue = false) { + if($pValue == '') { + $pValue = false; + } + $this->_italic = $pValue; + return $this; + } + + public function getSuperScript() { + return $this->_superScript; + } + + public function setSuperScript($pValue = false) { + if($pValue == '') { + $pValue = false; + } + $this->_superScript = $pValue; + $this->_subScript = !$pValue; + return $this; + } + + public function getSubScript() { + return $this->_subScript; + } + + public function setSubScript($pValue = false) { + if($pValue == '') { + $pValue = false; + } + $this->_subScript = $pValue; + $this->_superScript = !$pValue; + return $this; + } + + public function getUnderline() { + return $this->_underline; + } + + public function setUnderline($pValue = PHPWord_Style_Font::UNDERLINE_NONE) { + if ($pValue == '') { + $pValue = PHPWord_Style_Font::UNDERLINE_NONE; + } + $this->_underline = $pValue; + return $this; + } + + public function getStrikethrough() { + return $this->_strikethrough; + } + + public function setStrikethrough($pValue = false) { + if($pValue == '') { + $pValue = false; + } + $this->_strikethrough = $pValue; + return $this; + } + + public function getColor() { + return $this->_color; + } + + public function setColor($pValue = '000000') { + $this->_color = $pValue; + return $this; + } + + public function getFgColor() { + return $this->_fgColor; + } + + public function setFgColor($pValue = null) { + $this->_fgColor = $pValue; + return $this; + } + + public function getStyleType() { + return $this->_type; + } + + /** + * Get Paragraph style + * + * @return PHPWord_Style_Paragraph + */ + public function getParagraphStyle() { + return $this->_paragraphStyle; + } +} +?> diff --git a/src/PHPWord/Style/Image.php b/src/PHPWord/Style/Image.php new file mode 100644 index 00000000..c0007d3e --- /dev/null +++ b/src/PHPWord/Style/Image.php @@ -0,0 +1,130 @@ +_width = null; + $this->_height = null; + $this->_align = null; + $this->_marginTop = null; + $this->_marginLeft = null; + } + + public function setStyleValue($key, $value) { + $this->$key = $value; + } + + public function getWidth() { + return $this->_width; + } + + public function setWidth($pValue = null) { + $this->_width = $pValue; + } + + public function getHeight() { + return $this->_height; + } + + public function setHeight($pValue = null) { + $this->_height = $pValue; + } + + public function getAlign() { + return $this->_align; + } + + public function setAlign($pValue = null) { + $this->_align = $pValue; + } + + /** + * Get Margin Top + * + * @return int + */ + public function getMarginTop() { + return $this->_marginTop; + } + + /** + * Set Margin Top + * + * @param int $pValue + */ + public function setMarginTop($pValue = null) { + $this->_marginTop = $pValue; + return $this; + } + + /** + * Get Margin Left + * + * @return int + */ + public function getMarginLeft() { + return $this->_marginLeft; + } + + /** + * Set Margin Left + * + * @param int $pValue + */ + public function setMarginLeft($pValue = null) { + $this->_marginLeft = $pValue; + return $this; + } +} +?> diff --git a/src/PHPWord/Style/ListItem.php b/src/PHPWord/Style/ListItem.php new file mode 100644 index 00000000..f9da50e2 --- /dev/null +++ b/src/PHPWord/Style/ListItem.php @@ -0,0 +1,82 @@ +_listType = PHPWord_Style_ListItem::TYPE_BULLET_FILLED; + } + + /** + * Set style value + * + * @param string $key + * @param string $value + */ + public function setStyleValue($key, $value) { + $this->$key = $value; + } + + /** + * Set List Type + * + * @param int $pValue + */ + public function setListType($pValue = PHPWord_Style_ListItem::TYPE_BULLET_FILLED) { + $this->_listType = $pValue; + } + + /** + * Get List Type + */ + public function getListType() { + return $this->_listType; + } +} +?> diff --git a/src/PHPWord/Style/Paragraph.php b/src/PHPWord/Style/Paragraph.php new file mode 100644 index 00000000..451d1e84 --- /dev/null +++ b/src/PHPWord/Style/Paragraph.php @@ -0,0 +1,174 @@ +_align = null; + $this->_spaceBefore = null; + $this->_spaceAfter = null; + $this->_spacing = null; + } + + /** + * Set Style value + * + * @param string $key + * @param mixed $value + */ + public function setStyleValue($key, $value) { + if($key == '_spacing') { + $value += 240; // because line height of 1 matches 240 twips + } + $this->$key = $value; + } + + /** + * Get Paragraph Alignment + * + * @return string + */ + public function getAlign() { + return $this->_align; + } + + /** + * Set Paragraph Alignment + * + * @param string $pValue + * @return PHPWord_Style_Paragraph + */ + public function setAlign($pValue = null) { + if(strtolower($pValue) == 'justify') { + // justify becames both + $pValue = 'both'; + } + $this->_align = $pValue; + return $this; + } + + /** + * Get Space before Paragraph + * + * @return string + */ + public function getSpaceBefore() { + return $this->_spaceBefore; + } + + /** + * Set Space before Paragraph + * + * @param int $pValue + * @return PHPWord_Style_Paragraph + */ + public function setSpaceBefore($pValue = null) { + $this->_spaceBefore = $pValue; + return $this; + } + + /** + * Get Space after Paragraph + * + * @return string + */ + public function getSpaceAfter() { + return $this->_spaceAfter; + } + + /** + * Set Space after Paragraph + * + * @param int $pValue + * @return PHPWord_Style_Paragraph + */ + public function setSpaceAfter($pValue = null) { + $this->_spaceAfter = $pValue; + return $this; + } + + /** + * Get Spacing between breaks + * + * @return int + */ + public function getSpacing() { + return $this->_spacing; + } + + /** + * Set Spacing between breaks + * + * @param int $pValue + * @return PHPWord_Style_Paragraph + */ + public function setSpacing($pValue = null) { + $this->_spacing = $pValue; + return $this; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Style/TOC.php b/src/PHPWord/Style/TOC.php new file mode 100644 index 00000000..29b31304 --- /dev/null +++ b/src/PHPWord/Style/TOC.php @@ -0,0 +1,138 @@ +_tabPos = 9062; + $this->_tabLeader = PHPWord_Style_TOC::TABLEADER_DOT; + $this->_indent = 200; + } + + /** + * Get Tab Position + * + * @return int + */ + public function getTabPos() { + return $this->_tabPos; + } + + /** + * Set Tab Position + * + * @param int $pValue + */ + public function setTabPos($pValue) { + $this->_tabLeader = $pValue; + } + + /** + * Get Tab Leader + * + * @return string + */ + public function getTabLeader() { + return $this->_tabLeader; + } + + /** + * Set Tab Leader + * + * @param string $pValue + */ + public function setTabLeader($pValue = PHPWord_Style_TOC::TABLEADER_DOT) { + $this->_tabLeader = $pValue; + } + + /** + * Get Indent + * + * @return int + */ + public function getIndent() { + return $this->_indent; + } + + /** + * Set Indent + * + * @param string $pValue + */ + public function setIndent($pValue) { + $this->_indent = $pValue; + } + + /** + * Set style value + * + * @param string $key + * @param string $value + */ + public function setStyleValue($key, $value) { + $this->$key = $value; + } +} +?> diff --git a/src/PHPWord/Style/Table.php b/src/PHPWord/Style/Table.php new file mode 100644 index 00000000..a6f08060 --- /dev/null +++ b/src/PHPWord/Style/Table.php @@ -0,0 +1,83 @@ +_cellMarginTop = null; + $this->_cellMarginLeft = null; + $this->_cellMarginRight = null; + $this->_cellMarginBottom = null; + } + + public function setStyleValue($key, $value) { + $this->$key = $value; + } + + public function setCellMarginTop($pValue = null) { + $this->_cellMarginTop = $pValue; + } + + public function getCellMarginTop() { + return $this->_cellMarginTop; + } + + public function setCellMarginLeft($pValue = null) { + $this->_cellMarginLeft = $pValue; + } + + public function getCellMarginLeft() { + return $this->_cellMarginLeft; + } + + public function setCellMarginRight($pValue = null) { + $this->_cellMarginRight = $pValue; + } + + public function getCellMarginRight() { + return $this->_cellMarginRight; + } + + public function setCellMarginBottom($pValue = null) { + $this->_cellMarginBottom = $pValue; + } + + public function getCellMarginBottom() { + return $this->_cellMarginBottom; + } + + public function getCellMargin() { + return array($this->_cellMarginTop, $this->_cellMarginLeft, $this->_cellMarginRight, $this->_cellMarginBottom); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Style/TableFull.php b/src/PHPWord/Style/TableFull.php new file mode 100644 index 00000000..4140e639 --- /dev/null +++ b/src/PHPWord/Style/TableFull.php @@ -0,0 +1,442 @@ +_firstRow = clone $this; + + unset($this->_firstRow->_firstRow); + unset($this->_firstRow->_cellMarginBottom); + unset($this->_firstRow->_cellMarginTop); + unset($this->_firstRow->_cellMarginLeft); + unset($this->_firstRow->_cellMarginRight); + unset($this->_firstRow->_borderInsideVColor); + unset($this->_firstRow->_borderInsideVSize); + unset($this->_firstRow->_borderInsideHColor); + unset($this->_firstRow->_borderInsideHSize); + foreach($styleFirstRow as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + + $this->_firstRow->setStyleValue($key, $value); + } + } + + if(!is_null($styleTable) && is_array($styleTable)) { + foreach($styleTable as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + $this->setStyleValue($key, $value); + } + } + } + + /** + * Set style value + * + * @param string $key + * @param mixed $value + */ + public function setStyleValue($key, $value) { + if($key == '_borderSize') { + $this->setBorderSize($value); + } elseif($key == '_borderColor') { + $this->setBorderColor($value); + } elseif($key == '_cellMargin') { + $this->setCellMargin($value); + } else { + $this->$key = $value; + } + } + + /** + * Get First Row Style + * + * @return PHPWord_Style_TableFull + */ + public function getFirstRow() { + return $this->_firstRow; + } + + /** + * Get Last Row Style + * + * @return PHPWord_Style_TableFull + */ + public function getLastRow() { + return $this->_lastRow; + } + + public function getBgColor() { + return $this->_bgColor; + } + + public function setBgColor($pValue = null) { + $this->_bgColor = $pValue; + } + + /** + * Set TLRBVH Border Size + * + * @param int $pValue + */ + public function setBorderSize($pValue = null) { + $this->_borderTopSize = $pValue; + $this->_borderLeftSize = $pValue; + $this->_borderRightSize = $pValue; + $this->_borderBottomSize = $pValue; + $this->_borderInsideHSize = $pValue; + $this->_borderInsideVSize = $pValue; + } + + /** + * Get TLRBVH Border Size + * + * @return array + */ + public function getBorderSize() { + $t = $this->getBorderTopSize(); + $l = $this->getBorderLeftSize(); + $r = $this->getBorderRightSize(); + $b = $this->getBorderBottomSize(); + $h = $this->getBorderInsideHSize(); + $v = $this->getBorderInsideVSize(); + + return array($t, $l, $r, $b, $h, $v); + } + + /** + * Set TLRBVH Border Color + */ + public function setBorderColor($pValue = null) { + $this->_borderTopColor = $pValue; + $this->_borderLeftColor = $pValue; + $this->_borderRightColor = $pValue; + $this->_borderBottomColor = $pValue; + $this->_borderInsideHColor = $pValue; + $this->_borderInsideVColor = $pValue; + } + + /** + * Get TLRB Border Color + * + * @return array + */ + public function getBorderColor() { + $t = $this->getBorderTopColor(); + $l = $this->getBorderLeftColor(); + $r = $this->getBorderRightColor(); + $b = $this->getBorderBottomColor(); + $h = $this->getBorderInsideHColor(); + $v = $this->getBorderInsideVColor(); + + return array($t, $l, $r, $b, $h, $v); + } + + public function setBorderTopSize($pValue = null) { + $this->_borderTopSize = $pValue; + } + + public function getBorderTopSize() { + return $this->_borderTopSize; + } + + public function setBorderTopColor($pValue = null) { + $this->_borderTopColor = $pValue; + } + + public function getBorderTopColor() { + return $this->_borderTopColor; + } + + public function setBorderLeftSize($pValue = null) { + $this->_borderLeftSize = $pValue; + } + + public function getBorderLeftSize() { + return $this->_borderLeftSize; + } + + public function setBorderLeftColor($pValue = null) { + $this->_borderLeftColor = $pValue; + } + + public function getBorderLeftColor() { + return $this->_borderLeftColor; + } + + public function setBorderRightSize($pValue = null) { + $this->_borderRightSize = $pValue; + } + + public function getBorderRightSize() { + return $this->_borderRightSize; + } + + public function setBorderRightColor($pValue = null) { + $this->_borderRightColor = $pValue; + } + + public function getBorderRightColor() { + return $this->_borderRightColor; + } + + public function setBorderBottomSize($pValue = null) { + $this->_borderBottomSize = $pValue; + } + + public function getBorderBottomSize() { + return $this->_borderBottomSize; + } + + public function setBorderBottomColor($pValue = null) { + $this->_borderBottomColor = $pValue; + } + + public function getBorderBottomColor() { + return $this->_borderBottomColor; + } + + public function setBorderInsideHColor($pValue = null) { + $this->_borderInsideHColor = $pValue; + } + + public function getBorderInsideHColor() { + return (isset($this->_borderInsideHColor)) ? $this->_borderInsideHColor : null; + } + + public function setBorderInsideVColor($pValue = null) { + $this->_borderInsideVColor = $pValue; + } + + public function getBorderInsideVColor() { + return (isset($this->_borderInsideVColor)) ? $this->_borderInsideVColor : null; + } + + public function setBorderInsideHSize($pValue = null) { + $this->_borderInsideHSize = $pValue; + } + + public function getBorderInsideHSize() { + return (isset($this->_borderInsideHSize)) ? $this->_borderInsideHSize : null; + } + + public function setBorderInsideVSize($pValue = null) { + $this->_borderInsideVSize = $pValue; + } + + public function getBorderInsideVSize() { + return (isset($this->_borderInsideVSize)) ? $this->_borderInsideVSize : null; + } + + public function setCellMarginTop($pValue = null) { + $this->_cellMarginTop = $pValue; + } + + public function getCellMarginTop() { + return $this->_cellMarginTop; + } + + public function setCellMarginLeft($pValue = null) { + $this->_cellMarginLeft = $pValue; + } + + public function getCellMarginLeft() { + return $this->_cellMarginLeft; + } + + public function setCellMarginRight($pValue = null) { + $this->_cellMarginRight = $pValue; + } + + public function getCellMarginRight() { + return $this->_cellMarginRight; + } + + public function setCellMarginBottom($pValue = null) { + $this->_cellMarginBottom = $pValue; + } + + public function getCellMarginBottom() { + return $this->_cellMarginBottom; + } + + public function setCellMargin($pValue = null) { + $this->_cellMarginTop = $pValue; + $this->_cellMarginLeft = $pValue; + $this->_cellMarginRight = $pValue; + $this->_cellMarginBottom = $pValue; + } + + public function getCellMargin() { + return array($this->_cellMarginTop, $this->_cellMarginLeft, $this->_cellMarginRight, $this->_cellMarginBottom); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/TOC.php b/src/PHPWord/TOC.php new file mode 100644 index 00000000..ab4f05c6 --- /dev/null +++ b/src/PHPWord/TOC.php @@ -0,0 +1,155 @@ + $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + self::$_styleTOC->setStyleValue($key, $value); + } + } + + if(!is_null($styleFont)) { + if(is_array($styleFont)) { + self::$_styleFont = new PHPWord_Style_Font(); + + foreach($styleFont as $key => $value) { + if(substr($key, 0, 1) != '_') { + $key = '_'.$key; + } + self::$_styleFont->setStyleValue($key, $value); + } + } else { + self::$_styleFont = $styleFont; + } + } + } + + /** + * Add a Title + * + * @return array + */ + public static function addTitle($text, $depth = 0) { + $anchor = '_Toc'.++self::$_anchor; + $bookmarkId = self::$_bookmarkId++; + + $title = array(); + $title['text'] = $text; + $title['depth'] = $depth; + $title['anchor'] = $anchor; + $title['bookmarkId'] = $bookmarkId; + + self::$_titles[] = $title; + + return array($anchor, $bookmarkId); + } + + /** + * Get all titles + * + * @return array + */ + public static function getTitles() { + return self::$_titles; + } + + /** + * Get TOC Style + * + * @return PHPWord_Style_TOC + */ + public static function getStyleTOC() { + return self::$_styleTOC; + } + + /** + * Get Font Style + * + * @return PHPWord_Style_Font + */ + public static function getStyleFont() { + return self::$_styleFont; + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Template.php b/src/PHPWord/Template.php new file mode 100644 index 00000000..150676f7 --- /dev/null +++ b/src/PHPWord/Template.php @@ -0,0 +1,115 @@ +_tempFileName = $path.DIRECTORY_SEPARATOR.time().'.docx'; + + copy($strFilename, $this->_tempFileName); // Copy the source File to the temp File + + $this->_objZip = new ZipArchive(); + $this->_objZip->open($this->_tempFileName); + + $this->_documentXML = $this->_objZip->getFromName('word/document.xml'); + } + + /** + * Set a Template value + * + * @param mixed $search + * @param mixed $replace + */ + public function setValue($search, $replace) { + if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') { + $search = '${'.$search.'}'; + } + + if(!is_array($replace)) { + $replace = utf8_encode($replace); + } + + $this->_documentXML = str_replace($search, $replace, $this->_documentXML); + } + + /** + * Save Template + * + * @param string $strFilename + */ + public function save($strFilename) { + if(file_exists($strFilename)) { + unlink($strFilename); + } + + $this->_objZip->addFromString('word/document.xml', $this->_documentXML); + + // Close zip file + if($this->_objZip->close() === false) { + throw new Exception('Could not close zip file.'); + } + + rename($this->_tempFileName, $strFilename); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Writer/IWriter.php b/src/PHPWord/Writer/IWriter.php new file mode 100644 index 00000000..76db31e9 --- /dev/null +++ b/src/PHPWord/Writer/IWriter.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/src/PHPWord/Writer/Word2007.php b/src/PHPWord/Writer/Word2007.php new file mode 100644 index 00000000..0ad491dd --- /dev/null +++ b/src/PHPWord/Writer/Word2007.php @@ -0,0 +1,241 @@ +_document = $PHPWord; + + $this->_diskCachingDirectory = './'; + + $this->_writerParts['contenttypes'] = new PHPWord_Writer_Word2007_ContentTypes(); + $this->_writerParts['rels'] = new PHPWord_Writer_Word2007_Rels(); + $this->_writerParts['docprops'] = new PHPWord_Writer_Word2007_DocProps(); + $this->_writerParts['documentrels'] = new PHPWord_Writer_Word2007_DocumentRels(); + $this->_writerParts['document'] = new PHPWord_Writer_Word2007_Document(); + $this->_writerParts['styles'] = new PHPWord_Writer_Word2007_Styles(); + $this->_writerParts['header'] = new PHPWord_Writer_Word2007_Header(); + $this->_writerParts['footer'] = new PHPWord_Writer_Word2007_Footer(); + + foreach($this->_writerParts as $writer) { + $writer->setParentWriter($this); + } + } + + public function save($pFilename = null) { + if(!is_null($this->_document)) { + + // If $pFilename is php://output or php://stdout, make it a temporary file... + $originalFilename = $pFilename; + if(strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { + $pFilename = @tempnam('./', 'phppttmp'); + if($pFilename == '') { + $pFilename = $originalFilename; + } + } + + // Create new ZIP file and open it for writing + $objZip = new ZipArchive(); + + // Try opening the ZIP file + if($objZip->open($pFilename, ZIPARCHIVE::OVERWRITE) !== true) { + if($objZip->open($pFilename, ZIPARCHIVE::CREATE) !== true) { + throw new Exception("Could not open " . $pFilename . " for writing."); + } + } + + + $sectionElements = array(); + $_secElements = PHPWord_Media::getSectionMediaElements(); + foreach($_secElements as $element) { // loop through section media elements + if($element['type'] != 'hyperlink') { + $this->_addFileToPackage($objZip, $element); + } + $sectionElements[] = $element; + } + + $_hdrElements = PHPWord_Media::getHeaderMediaElements(); + foreach($_hdrElements as $_headerFile => $_hdrMedia) { // loop through headers + if(count($_hdrMedia) > 0) { + $objZip->addFromString('word/_rels/'.$_headerFile.'.xml.rels', $this->getWriterPart('documentrels')->writeHeaderFooterRels($_hdrMedia)); + foreach($_hdrMedia as $element) { // loop through header media elements + $this->_addFileToPackage($objZip, $element); + } + } + } + + $_ftrElements = PHPWord_Media::getFooterMediaElements(); + foreach($_ftrElements as $_footerFile => $_ftrMedia) { // loop through footers + if(count($_ftrMedia) > 0) { + $objZip->addFromString('word/_rels/'.$_footerFile.'.xml.rels', $this->getWriterPart('documentrels')->writeHeaderFooterRels($_ftrMedia)); + foreach($_ftrMedia as $element) { // loop through footers media elements + $this->_addFileToPackage($objZip, $element); + } + } + } + + + + $_cHdrs = 0; + $_cFtrs = 0; + $rID = PHPWord_Media::countSectionMediaElements() + 6; + $_sections = $this->_document->getSections(); + + foreach($_sections as $section) { + $_header = $section->getHeader(); + if(!is_null($_header)) { + $_cHdrs++; + $_header->setRelationId(++$rID); + $_headerCount = $_header->getHeaderCount(); + $_headerFile = 'header'.$_headerCount.'.xml'; + $sectionElements[] = array('target'=>$_headerFile, 'type'=>'header', 'rID'=>$rID); + $objZip->addFromString('word/'.$_headerFile, $this->getWriterPart('header')->writeHeader($_header)); + } + + $_footer = $section->getFooter(); + if(!is_null($_footer)) { + $_cFtrs++; + $_footer->setRelationId(++$rID); + $_footerCount = $_footer->getFooterCount(); + $_footerFile = 'footer'.$_footerCount.'.xml'; + $sectionElements[] = array('target'=>$_footerFile, 'type'=>'footer', 'rID'=>$rID); + $objZip->addFromString('word/'.$_footerFile, $this->getWriterPart('footer')->writeFooter($_footer)); + } + } + + // build docx file + // Write dynamic files + $objZip->addFromString('[Content_Types].xml', $this->getWriterPart('contenttypes')->writeContentTypes($this->_imageTypes, $this->_objectTypes, $_cHdrs, $_cFtrs)); + $objZip->addFromString('_rels/.rels', $this->getWriterPart('rels')->writeRelationships($this->_document)); + $objZip->addFromString('docProps/app.xml', $this->getWriterPart('docprops')->writeDocPropsApp($this->_document)); + $objZip->addFromString('docProps/core.xml', $this->getWriterPart('docprops')->writeDocPropsCore($this->_document)); + $objZip->addFromString('word/document.xml', $this->getWriterPart('document')->writeDocument($this->_document)); + $objZip->addFromString('word/_rels/document.xml.rels', $this->getWriterPart('documentrels')->writeDocumentRels($sectionElements)); + $objZip->addFromString('word/styles.xml', $this->getWriterPart('styles')->writeStyles($this->_document)); + + // Write static files + $objZip->addFile(PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/numbering.xml', 'word/numbering.xml'); + $objZip->addFile(PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/settings.xml', 'word/settings.xml'); + $objZip->addFile(PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/theme1.xml', 'word/theme/theme1.xml'); + $objZip->addFile(PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/webSettings.xml', 'word/webSettings.xml'); + $objZip->addFile(PHPWORD_BASE_PATH . 'PHPWord/_staticDocParts/fontTable.xml', 'word/fontTable.xml'); + + + // Close file + if($objZip->close() === false) { + throw new Exception("Could not close zip file $pFilename."); + } + + // If a temporary file was used, copy it to the correct file stream + if($originalFilename != $pFilename) { + if (copy($pFilename, $originalFilename) === false) { + throw new Exception("Could not copy temporary zip file $pFilename to $originalFilename."); + } + @unlink($pFilename); + } + } else { + throw new Exception("PHPWord object unassigned."); + } + } + + private function _chkContentTypes($src) { + $srcInfo = pathinfo($src); + $extension = strtolower($srcInfo['extension']); + if(substr($extension, 0, 3) == 'php') { + $extension = 'php'; + } + $_supportedImageTypes = array('jpg', 'jpeg', 'gif', 'png', 'bmp', 'tif', 'tiff', 'php'); + + if(in_array($extension, $_supportedImageTypes)) { + $imagedata = getimagesize($src); + $imagetype = image_type_to_mime_type($imagedata[2]); + $imageext = image_type_to_extension($imagedata[2]); + $imageext = str_replace('.', '', $imageext); + if($imageext == 'jpeg') $imageext = 'jpg'; + + if(!in_array($imagetype, $this->_imageTypes)) { + $this->_imageTypes[$imageext] = $imagetype; + } + } else { + if(!in_array($extension, $this->_objectTypes)) { + $this->_objectTypes[] = $extension; + } + } + } + + public function getWriterPart($pPartName = '') { + if ($pPartName != '' && isset($this->_writerParts[strtolower($pPartName)])) { + return $this->_writerParts[strtolower($pPartName)]; + } else { + return null; + } + } + + public function getUseDiskCaching() { + return $this->_useDiskCaching; + } + + public function setUseDiskCaching($pValue = false, $pDirectory = null) { + $this->_useDiskCaching = $pValue; + + if (!is_null($pDirectory)) { + if (is_dir($pDirectory)) { + $this->_diskCachingDirectory = $pDirectory; + } else { + throw new Exception("Directory does not exist: $pDirectory"); + } + } + + return $this; + } + + private function _addFileToPackage($objZip, $element) { + if(isset($element['isMemImage']) && $element['isMemImage']) { + $image = call_user_func($element['createfunction'], $element['source']); + ob_start(); + call_user_func($element['imagefunction'], $image); + $imageContents = ob_get_contents(); + ob_end_clean(); + $objZip->addFromString('word/'.$element['target'], $imageContents); + imagedestroy($image); + + $this->_chkContentTypes($element['source']); + } else { + $objZip->addFile($element['source'], 'word/'.$element['target']); + $this->_chkContentTypes($element['source']); + } + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Writer/Word2007/Base.php b/src/PHPWord/Writer/Word2007/Base.php new file mode 100644 index 00000000..1ed5bdee --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Base.php @@ -0,0 +1,706 @@ +getFontStyle(); + + $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false; + + if(!$withoutP) { + $objWriter->startElement('w:p'); + + $styleParagraph = $text->getParagraphStyle(); + $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false; + + if($SpIsObject) { + $this->_writeParagraphStyle($objWriter, $styleParagraph); + } elseif(!$SpIsObject && !is_null($styleParagraph)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleParagraph); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $strText = htmlspecialchars($text->getText()); + $strText = PHPWord_Shared_String::ControlCharacterPHP2OOXML($strText); + + $objWriter->startElement('w:r'); + + if($SfIsObject) { + $this->_writeTextStyle($objWriter, $styleFont); + } elseif(!$SfIsObject && !is_null($styleFont)) { + $objWriter->startElement('w:rPr'); + $objWriter->startElement('w:rStyle'); + $objWriter->writeAttribute('w:val', $styleFont); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:t'); + $objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text + $objWriter->writeRaw($strText); + $objWriter->endElement(); + + $objWriter->endElement(); // w:r + + if(!$withoutP) { + $objWriter->endElement(); // w:p + } + } + + protected function _writeTextRun(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_TextRun $textrun) { + $elements = $textrun->getElements(); + $styleParagraph = $textrun->getParagraphStyle(); + + $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false; + + $objWriter->startElement('w:p'); + + if($SpIsObject) { + $this->_writeParagraphStyle($objWriter, $styleParagraph); + } elseif(!$SpIsObject && !is_null($styleParagraph)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleParagraph); + $objWriter->endElement(); + $objWriter->endElement(); + } + + if(count($elements) > 0) { + foreach($elements as $element) { + if($element instanceof PHPWord_Section_Text) { + $this->_writeText($objWriter, $element, true); + } elseif($element instanceof PHPWord_Section_Link) { + $this->_writeLink($objWriter, $element, true); + } + } + } + + $objWriter->endElement(); + } + + protected function _writeParagraphStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Paragraph $style, $withoutPPR = false) { + $align = $style->getAlign(); + $spaceBefore = $style->getSpaceBefore(); + $spaceAfter = $style->getSpaceAfter(); + $spacing = $style->getSpacing(); + + + if(!is_null($align) || !is_null($spacing) || !is_null($spaceBefore) || !is_null($spaceAfter)) { + + if(!$withoutPPR) { + $objWriter->startElement('w:pPr'); + } + + if(!is_null($align)) { + $objWriter->startElement('w:jc'); + $objWriter->writeAttribute('w:val', $align); + $objWriter->endElement(); + } + + if(!is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($spacing)) { + + $objWriter->startElement('w:spacing'); + + if(!is_null($spaceBefore)) { + $objWriter->writeAttribute('w:before', $spaceBefore); + } + if(!is_null($spaceAfter)) { + $objWriter->writeAttribute('w:after', $spaceAfter); + } + if(!is_null($spacing)) { + $objWriter->writeAttribute('w:line', $spacing); + $objWriter->writeAttribute('w:lineRule', 'auto'); + } + + $objWriter->endElement(); + } + + if(!$withoutPPR) { + $objWriter->endElement(); // w:pPr + } + } + } + + protected function _writeLink(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Link $link, $withoutP = false) { + $rID = $link->getRelationId(); + $linkName = $link->getLinkName(); + if(is_null($linkName)) { + $linkName = $link->getLinkSrc(); + } + + $styleFont = $link->getFontStyle(); + $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false; + + if(!$withoutP) { + $objWriter->startElement('w:p'); + + $styleParagraph = $link->getParagraphStyle(); + $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false; + + if($SpIsObject) { + $this->_writeParagraphStyle($objWriter, $styleParagraph); + } elseif(!$SpIsObject && !is_null($styleParagraph)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleParagraph); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $objWriter->startElement('w:hyperlink'); + $objWriter->writeAttribute('r:id', 'rId'.$rID); + $objWriter->writeAttribute('w:history', '1'); + + $objWriter->startElement('w:r'); + if($SfIsObject) { + $this->_writeTextStyle($objWriter, $styleFont); + } elseif(!$SfIsObject && !is_null($styleFont)) { + $objWriter->startElement('w:rPr'); + $objWriter->startElement('w:rStyle'); + $objWriter->writeAttribute('w:val', $styleFont); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:t'); + $objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text + $objWriter->writeRaw($linkName); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + + if(!$withoutP) { + $objWriter->endElement(); // w:p + } + } + + protected function _writePreserveText(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Footer_PreserveText $textrun) { + $styleFont = $textrun->getFontStyle(); + $styleParagraph = $textrun->getParagraphStyle(); + + $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false; + $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false; + + $arrText = $textrun->getText(); + + $objWriter->startElement('w:p'); + + if($SpIsObject) { + $this->_writeParagraphStyle($objWriter, $styleParagraph); + } elseif(!$SpIsObject && !is_null($styleParagraph)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleParagraph); + $objWriter->endElement(); + $objWriter->endElement(); + } + + foreach($arrText as $text) { + + if(substr($text, 0, 1) == '{') { + $text = substr($text, 1, -1); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'begin'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + + if($SfIsObject) { + $this->_writeTextStyle($objWriter, $styleFont); + } elseif(!$SfIsObject && !is_null($styleFont)) { + $objWriter->startElement('w:rPr'); + $objWriter->startElement('w:rStyle'); + $objWriter->writeAttribute('w:val', $styleFont); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:instrText'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRaw($text); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'separate'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'end'); + $objWriter->endElement(); + $objWriter->endElement(); + } else { + $text = htmlspecialchars($text); + $text = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text); + + $objWriter->startElement('w:r'); + + if($SfIsObject) { + $this->_writeTextStyle($objWriter, $styleFont); + } elseif(!$SfIsObject && !is_null($styleFont)) { + $objWriter->startElement('w:rPr'); + $objWriter->startElement('w:rStyle'); + $objWriter->writeAttribute('w:val', $styleFont); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:t'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRaw($text); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); // p + } + + protected function _writeTextStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Font $style) { + $font = $style->getName(); + $bold = $style->getBold(); + $italic = $style->getItalic(); + $color = $style->getColor(); + $size = $style->getSize(); + $fgColor = $style->getFgColor(); + $striketrough = $style->getStrikethrough(); + $underline = $style->getUnderline(); + + $objWriter->startElement('w:rPr'); + + // Font + if($font != 'Arial') { + $objWriter->startElement('w:rFonts'); + $objWriter->writeAttribute('w:ascii', $font); + $objWriter->writeAttribute('w:hAnsi', $font); + $objWriter->writeAttribute('w:cs', $font); + $objWriter->endElement(); + } + + // Color + if($color != '000000') { + $objWriter->startElement('w:color'); + $objWriter->writeAttribute('w:val', $color); + $objWriter->endElement(); + } + + // Size + if($size != 20) { + $objWriter->startElement('w:sz'); + $objWriter->writeAttribute('w:val', $size); + $objWriter->endElement(); + $objWriter->startElement('w:szCs'); + $objWriter->writeAttribute('w:val', $size); + $objWriter->endElement(); + } + + // Bold + if($bold) { + $objWriter->writeElement('w:b', null); + } + + // Italic + if($italic) { + $objWriter->writeElement('w:i', null); + $objWriter->writeElement('w:iCs', null); + } + + // Underline + if(!is_null($underline) && $underline != 'none') { + $objWriter->startElement('w:u'); + $objWriter->writeAttribute('w:val', $underline); + $objWriter->endElement(); + } + + // Striketrough + if($striketrough) { + $objWriter->writeElement('w:strike', null); + } + + // Foreground-Color + if(!is_null($fgColor)) { + $objWriter->startElement('w:highlight'); + $objWriter->writeAttribute('w:val', $fgColor); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + protected function _writeTextBreak(PHPWord_Shared_XMLWriter $objWriter = null) { + $objWriter->writeElement('w:p', null); + } + + protected function _writeTable(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Table $table) { + $_rows = $table->getRows(); + $_cRows = count($_rows); + + if($_cRows > 0) { + $objWriter->startElement('w:tbl'); + $tblStyle = $table->getStyle(); + if($tblStyle instanceof PHPWord_Style_Table) { + $this->_writeTableStyle($objWriter, $tblStyle); + } else { + if(!empty($tblStyle)) { + $objWriter->startElement('w:tblPr'); + $objWriter->startElement('w:tblStyle'); + $objWriter->writeAttribute('w:val', $tblStyle); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $_heights = $table->getRowHeights(); + for($i=0; $i<$_cRows; $i++) { + $row = $_rows[$i]; + $height = $_heights[$i]; + + $objWriter->startElement('w:tr'); + + if(!is_null($height)) { + $objWriter->startElement('w:trPr'); + $objWriter->startElement('w:trHeight'); + $objWriter->writeAttribute('w:val', $height); + $objWriter->endElement(); + $objWriter->endElement(); + } + + foreach($row as $cell) { + $objWriter->startElement('w:tc'); + + $cellStyle = $cell->getStyle(); + $width = $cell->getWidth(); + + $objWriter->startElement('w:tcPr'); + $objWriter->startElement('w:tcW'); + $objWriter->writeAttribute('w:w', $width); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + + if($cellStyle instanceof PHPWord_Style_Cell) { + $this->_writeCellStyle($objWriter, $cellStyle); + } + + $objWriter->endElement(); + + $_elements = $cell->getElements(); + if(count($_elements) > 0) { + foreach($_elements as $element) { + if($element instanceof PHPWord_Section_Text) { + $this->_writeText($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextRun) { + $this->_writeTextRun($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Link) { + $this->_writeLink($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextBreak) { + $this->_writeTextBreak($objWriter); + } elseif($element instanceof PHPWord_Section_ListItem) { + $this->_writeListItem($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Image || + $element instanceof PHPWord_Section_MemoryImage) { + $this->_writeImage($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Object) { + $this->_writeObject($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Footer_PreserveText) { + $this->_writePreserveText($objWriter, $element); + } + } + } else { + $this->_writeTextBreak($objWriter); + } + + $objWriter->endElement(); + } + $objWriter->endElement(); + } + $objWriter->endElement(); + } + } + + protected function _writeTableStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Table $style = null) { + $margins = $style->getCellMargin(); + $mTop = (!is_null($margins[0])) ? true : false; + $mLeft = (!is_null($margins[1])) ? true : false; + $mRight = (!is_null($margins[2])) ? true : false; + $mBottom = (!is_null($margins[3])) ? true : false; + + if($mTop || $mLeft || $mRight || $mBottom) { + $objWriter->startElement('w:tblPr'); + $objWriter->startElement('w:tblCellMar'); + + if($mTop) { + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:w', $margins[0]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + + if($mLeft) { + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:w', $margins[1]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + + if($mRight) { + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:w', $margins[2]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + + if($mBottom) { + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:w', $margins[3]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + protected function _writeCellStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Cell $style = null) { + $bgColor = $style->getBgColor(); + $valign = $style->getVAlign(); + $textDir = $style->getTextDirection(); + $brdSz = $style->getBorderSize(); + $brdCol = $style->getBorderColor(); + + $bTop = (!is_null($brdSz[0])) ? true : false; + $bLeft = (!is_null($brdSz[1])) ? true : false; + $bRight = (!is_null($brdSz[2])) ? true : false; + $bBottom = (!is_null($brdSz[3])) ? true : false; + $borders = ($bTop || $bLeft || $bRight || $bBottom) ? true : false; + + $styles = (!is_null($bgColor) || !is_null($valign) || !is_null($textDir) || $borders) ? true : false; + + if($styles) { + if(!is_null($textDir)) { + $objWriter->startElement('w:textDirection'); + $objWriter->writeAttribute('w:val', $textDir); + $objWriter->endElement(); + } + + if(!is_null($bgColor)) { + $objWriter->startElement('w:shd'); + $objWriter->writeAttribute('w:val', 'clear'); + $objWriter->writeAttribute('w:color', 'auto'); + $objWriter->writeAttribute('w:fill', $bgColor); + $objWriter->endElement(); + } + + if(!is_null($valign)) { + $objWriter->startElement('w:vAlign'); + $objWriter->writeAttribute('w:val', $valign); + $objWriter->endElement(); + } + + if($borders) { + $_defaultColor = $style->getDefaultBorderColor(); + + $objWriter->startElement('w:tcBorders'); + if($bTop) { + if(is_null($brdCol[0])) { $brdCol[0] = $_defaultColor; } + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[0]); + $objWriter->writeAttribute('w:color', $brdCol[0]); + $objWriter->endElement(); + } + + if($bLeft) { + if(is_null($brdCol[1])) { $brdCol[1] = $_defaultColor; } + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[1]); + $objWriter->writeAttribute('w:color', $brdCol[1]); + $objWriter->endElement(); + } + + if($bRight) { + if(is_null($brdCol[2])) { $brdCol[2] = $_defaultColor; } + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[2]); + $objWriter->writeAttribute('w:color', $brdCol[2]); + $objWriter->endElement(); + } + + if($bBottom) { + if(is_null($brdCol[3])) { $brdCol[3] = $_defaultColor; } + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[3]); + $objWriter->writeAttribute('w:color', $brdCol[3]); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + } + + protected function _writeImage(PHPWord_Shared_XMLWriter $objWriter = null, $image) { + $rId = $image->getRelationId(); + + $style = $image->getStyle(); + $width = $style->getWidth(); + $height = $style->getHeight(); + $align = $style->getAlign(); + + $objWriter->startElement('w:p'); + + if(!is_null($align)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:jc'); + $objWriter->writeAttribute('w:val', $align); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:r'); + + $objWriter->startElement('w:pict'); + + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('type', '#_x0000_t75'); + $objWriter->writeAttribute('style', 'width:'.$width.'px;height:'.$height.'px'); + + $objWriter->startElement('v:imagedata'); + $objWriter->writeAttribute('r:id', 'rId'.$rId); + $objWriter->writeAttribute('o:title', ''); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + protected function _writeWatermark(PHPWord_Shared_XMLWriter $objWriter = null, $image) { + $rId = $image->getRelationId(); + + $style = $image->getStyle(); + $width = $style->getWidth(); + $height = $style->getHeight(); + $marginLeft = $style->getMarginLeft(); + $marginTop = $style->getMarginTop(); + + $objWriter->startElement('w:p'); + + $objWriter->startElement('w:r'); + + $objWriter->startElement('w:pict'); + + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('type', '#_x0000_t75'); + + $strStyle = 'position:absolute;'; + $strStyle .= ' width:'.$width.'px;'; + $strStyle .= ' height:'.$height.'px;'; + if(!is_null($marginTop)) { + $strStyle .= ' margin-top:'.$marginTop.'px;'; + } + if(!is_null($marginLeft)) { + $strStyle .= ' margin-left:'.$marginLeft.'px;'; + } + + $objWriter->writeAttribute('style', $strStyle); + + $objWriter->startElement('v:imagedata'); + $objWriter->writeAttribute('r:id', 'rId'.$rId); + $objWriter->writeAttribute('o:title', ''); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + protected function _writeTitle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Title $title) { + $text = htmlspecialchars($title->getText()); + $text = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text); + $anchor = $title->getAnchor(); + $bookmarkId = $title->getBookmarkId(); + $style = $title->getStyle(); + + $objWriter->startElement('w:p'); + + if(!empty($style)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $style); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'end'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:bookmarkStart'); + $objWriter->writeAttribute('w:id', $bookmarkId); + $objWriter->writeAttribute('w:name', $anchor); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:t'); + $objWriter->writeRaw($text); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:bookmarkEnd'); + $objWriter->writeAttribute('w:id', $bookmarkId); + $objWriter->endElement(); + + $objWriter->endElement(); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Writer/Word2007/ContentTypes.php b/src/PHPWord/Writer/Word2007/ContentTypes.php new file mode 100644 index 00000000..0bc04603 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/ContentTypes.php @@ -0,0 +1,185 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Types + $objWriter->startElement('Types'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); + + // Rels + $this->_writeDefaultContentType( + $objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml' + ); + + // XML + $this->_writeDefaultContentType( + $objWriter, 'xml', 'application/xml' + ); + + // Add media content-types + foreach($_imageTypes as $key => $value) { + $this->_writeDefaultContentType($objWriter, $key, $value); + } + + // Add embedding content-types + if(count($_objectTypes) > 0) { + $this->_writeDefaultContentType($objWriter, 'bin', 'application/vnd.openxmlformats-officedocument.oleObject'); + } + + // DocProps + $this->_writeOverrideContentType( + $objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml' + ); + + $this->_writeOverrideContentType( + $objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml' + ); + + // Document + $this->_writeOverrideContentType( + $objWriter, '/word/document.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml' + ); + + // Styles + $this->_writeOverrideContentType( + $objWriter, '/word/styles.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml' + ); + + // Numbering + $this->_writeOverrideContentType( + $objWriter, '/word/numbering.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml' + ); + + // Settings + $this->_writeOverrideContentType( + $objWriter, '/word/settings.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml' + ); + + // Theme1 + $this->_writeOverrideContentType( + $objWriter, '/word/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml' + ); + + // WebSettings + $this->_writeOverrideContentType( + $objWriter, '/word/webSettings.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml' + ); + + // Font Table + $this->_writeOverrideContentType( + $objWriter, '/word/fontTable.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml' + ); + + for($i=1; $i<=$_cHdrs; $i++) { + $this->_writeOverrideContentType( + $objWriter, '/word/header'.$i.'.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml' + ); + } + + for($i=1; $i<=$_cFtrs; $i++) { + $this->_writeOverrideContentType( + $objWriter, '/word/footer'.$i.'.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml' + ); + } + + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Get image mime type + * + * @param string $pFile Filename + * @return string Mime Type + * @throws Exception + */ + private function _getImageMimeType($pFile = '') { + if(PHPWord_Shared_File::file_exists($pFile)) { + $image = getimagesize($pFile); + return image_type_to_mime_type($image[2]); + } else { + throw new Exception("File $pFile does not exist"); + } + } + + /** + * Write Default content type + * + * @param PHPWord_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws Exception + */ + private function _writeDefaultContentType(PHPWord_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') { + if($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Default'); + $objWriter->writeAttribute('Extension', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } + + /** + * Write Override content type + * + * @param PHPPowerPoint_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws Exception + */ + private function _writeOverrideContentType(PHPWord_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') { + if($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Override'); + $objWriter->writeAttribute('PartName', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } +} diff --git a/src/PHPWord/Writer/Word2007/DocProps.php b/src/PHPWord/Writer/Word2007/DocProps.php new file mode 100644 index 00000000..1b917596 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/DocProps.php @@ -0,0 +1,180 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Properties + $objWriter->startElement('Properties'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); + $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + + // Application + $objWriter->writeElement('Application', 'Microsoft Office Word'); + + // ScaleCrop + $objWriter->writeElement('ScaleCrop', 'false'); + + // HeadingPairs + $objWriter->startElement('HeadingPairs'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', '4'); + $objWriter->writeAttribute('baseType', 'variant'); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:lpstr', 'Theme'); + $objWriter->endElement(); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:i4', '1'); + $objWriter->endElement(); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:lpstr', 'Slide Titles'); + $objWriter->endElement(); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:i4', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // TitlesOfParts + $objWriter->startElement('TitlesOfParts'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', '1'); + $objWriter->writeAttribute('baseType', 'lpstr'); + + $objWriter->writeElement('vt:lpstr', 'Office Theme'); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // Company + $objWriter->writeElement('Company', $pPHPWord->getProperties()->getCompany()); + + // LinksUpToDate + $objWriter->writeElement('LinksUpToDate', 'false'); + + // SharedDoc + $objWriter->writeElement('SharedDoc', 'false'); + + // HyperlinksChanged + $objWriter->writeElement('HyperlinksChanged', 'false'); + + // AppVersion + $objWriter->writeElement('AppVersion', '12.0000'); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + + public function writeDocPropsCore(PHPWord $pPHPWord = null) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // cp:coreProperties + $objWriter->startElement('cp:coreProperties'); + $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); + $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); + $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + + // dc:creator + $objWriter->writeElement('dc:creator', $pPHPWord->getProperties()->getCreator()); + + // cp:lastModifiedBy + $objWriter->writeElement('cp:lastModifiedBy', $pPHPWord->getProperties()->getLastModifiedBy()); + + // dcterms:created + $objWriter->startElement('dcterms:created'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRaw(date(DATE_W3C, $pPHPWord->getProperties()->getCreated())); + $objWriter->endElement(); + + // dcterms:modified + $objWriter->startElement('dcterms:modified'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRaw(date(DATE_W3C, $pPHPWord->getProperties()->getModified())); + $objWriter->endElement(); + + // dc:title + $objWriter->writeElement('dc:title', $pPHPWord->getProperties()->getTitle()); + + // dc:description + $objWriter->writeElement('dc:description', $pPHPWord->getProperties()->getDescription()); + + // dc:subject + $objWriter->writeElement('dc:subject', $pPHPWord->getProperties()->getSubject()); + + // cp:keywords + $objWriter->writeElement('cp:keywords', $pPHPWord->getProperties()->getKeywords()); + + // cp:category + $objWriter->writeElement('cp:category', $pPHPWord->getProperties()->getCategory()); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } +} diff --git a/src/PHPWord/Writer/Word2007/Document.php b/src/PHPWord/Writer/Word2007/Document.php new file mode 100644 index 00000000..b07e2698 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Document.php @@ -0,0 +1,453 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // w:document + $objWriter->startElement('w:document'); + + $objWriter->writeAttribute('xmlns:ve', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); + $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('xmlns:m', 'http://schemas.openxmlformats.org/officeDocument/2006/math'); + $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:wp', 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'); + $objWriter->writeAttribute('xmlns:w10', 'urn:schemas-microsoft-com:office:word'); + $objWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'); + $objWriter->writeAttribute('xmlns:wne', 'http://schemas.microsoft.com/office/word/2006/wordml'); + + $objWriter->startElement('w:body'); + + $_sections = $pPHPWord->getSections(); + $countSections = count($_sections); + $pSection = 0; + + if($countSections > 0) { + foreach($_sections as $section) { + $pSection++; + + $_elements = $section->getElements(); + + foreach($_elements as $element) { + if($element instanceof PHPWord_Section_Text) { + $this->_writeText($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextRun) { + $this->_writeTextRun($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Link) { + $this->_writeLink($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Title) { + $this->_writeTitle($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextBreak) { + $this->_writeTextBreak($objWriter); + } elseif($element instanceof PHPWord_Section_PageBreak) { + $this->_writePageBreak($objWriter); + } elseif($element instanceof PHPWord_Section_Table) { + $this->_writeTable($objWriter, $element); + } elseif($element instanceof PHPWord_Section_ListItem) { + $this->_writeListItem($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Image || + $element instanceof PHPWord_Section_MemoryImage) { + $this->_writeImage($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Object) { + $this->_writeObject($objWriter, $element); + } elseif($element instanceof PHPWord_TOC) { + $this->_writeTOC($objWriter); + } + } + + if($pSection == $countSections) { + $this->_writeEndSection($objWriter, $section); + } else { + $this->_writeSection($objWriter, $section); + } + } + } + + $objWriter->endElement(); // End w:body + $objWriter->endElement(); // End w:document + + // Return + return $objWriter->getData(); + } + + private function _writeSection(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section $section) { + $objWriter->startElement('w:p'); + $objWriter->startElement('w:pPr'); + $this->_writeEndSection($objWriter, $section, 3); + $objWriter->endElement(); + $objWriter->endElement(); + } + + private function _writeEndSection(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section $section) { + $_settings = $section->getSettings(); + $_header = $section->getHeader(); + $_footer = $section->getFooter(); + $pgSzW = $_settings->getPageSizeW(); + $pgSzH = $_settings->getPageSizeH(); + $orientation = $_settings->getOrientation(); + + $marginTop = $_settings->getMarginTop(); + $marginLeft = $_settings->getMarginLeft(); + $marginRight = $_settings->getMarginRight(); + $marginBottom = $_settings->getMarginBottom(); + + $borders = $_settings->getBorderSize(); + + $objWriter->startElement('w:sectPr'); + + if(!is_null($_header)) { + $rId = $_header->getRelationId(); + $objWriter->startElement('w:headerReference'); + $objWriter->writeAttribute('w:type', 'default'); + $objWriter->writeAttribute('r:id', 'rId'.$rId); + $objWriter->endElement(); + } + + if(!is_null($_footer)) { + $rId = $_footer->getRelationId(); + $objWriter->startElement('w:footerReference'); + $objWriter->writeAttribute('w:type', 'default'); + $objWriter->writeAttribute('r:id', 'rId'.$rId); + $objWriter->endElement(); + } + + $objWriter->startElement('w:pgSz'); + $objWriter->writeAttribute('w:w', $pgSzW); + $objWriter->writeAttribute('w:h', $pgSzH); + + if(!is_null($orientation) && strtolower($orientation) != 'portrait') { + $objWriter->writeAttribute('w:orient', $orientation); + } + + $objWriter->endElement(); + + $objWriter->startElement('w:pgMar'); + $objWriter->writeAttribute('w:top', $marginTop); + $objWriter->writeAttribute('w:right', $marginRight); + $objWriter->writeAttribute('w:bottom', $marginBottom); + $objWriter->writeAttribute('w:left', $marginLeft); + $objWriter->writeAttribute('w:header', '720'); + $objWriter->writeAttribute('w:footer', '720'); + $objWriter->writeAttribute('w:gutter', '0'); + $objWriter->endElement(); + + + if(!is_null($borders[0]) || !is_null($borders[1]) || !is_null($borders[2]) || !is_null($borders[3])) { + $borderColor = $_settings->getBorderColor(); + + $objWriter->startElement('w:pgBorders'); + $objWriter->writeAttribute('w:offsetFrom', 'page'); + + if(!is_null($borders[0])) { + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $borders[0]); + $objWriter->writeAttribute('w:space', '24'); + $objWriter->writeAttribute('w:color', $borderColor[0]); + $objWriter->endElement(); + } + + if(!is_null($borders[1])) { + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $borders[1]); + $objWriter->writeAttribute('w:space', '24'); + $objWriter->writeAttribute('w:color', $borderColor[1]); + $objWriter->endElement(); + } + + if(!is_null($borders[2])) { + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $borders[2]); + $objWriter->writeAttribute('w:space', '24'); + $objWriter->writeAttribute('w:color', $borderColor[2]); + $objWriter->endElement(); + } + + if(!is_null($borders[3])) { + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $borders[3]); + $objWriter->writeAttribute('w:space', '24'); + $objWriter->writeAttribute('w:color', $borderColor[3]); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + + + $objWriter->startElement('w:cols'); + $objWriter->writeAttribute('w:space', '720'); + $objWriter->endElement(); + + + $objWriter->endElement(); + } + + private function _writePageBreak(PHPWord_Shared_XMLWriter $objWriter = null) { + $objWriter->startElement('w:p'); + $objWriter->startElement('w:r'); + $objWriter->startElement('w:br'); + $objWriter->writeAttribute('w:type', 'page'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + private function _writeListItem(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_ListItem $listItem) { + $textObject = $listItem->getTextObject(); + $text = $textObject->getText(); + $styleParagraph = $textObject->getParagraphStyle(); + $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false; + + $depth = $listItem->getDepth(); + $listType = $listItem->getStyle()->getListType(); + + $objWriter->startElement('w:p'); + $objWriter->startElement('w:pPr'); + + if($SpIsObject) { + $this->_writeParagraphStyle($objWriter, $styleParagraph, true); + } elseif(!$SpIsObject && !is_null($styleParagraph)) { + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleParagraph); + $objWriter->endElement(); + } + + $objWriter->startElement('w:numPr'); + + $objWriter->startElement('w:ilvl'); + $objWriter->writeAttribute('w:val', $depth); + $objWriter->endElement(); + + $objWriter->startElement('w:numId'); + $objWriter->writeAttribute('w:val', $listType); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + + $this->_writeText($objWriter, $textObject, true); + + $objWriter->endElement(); + } + + protected function _writeObject(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Object $object) { + $rIdObject = $object->getRelationId(); + $rIdImage = $object->getImageRelationId(); + $shapeId = md5($rIdObject.'_'.$rIdImage); + + $objectId = $object->getObjectId(); + + $style = $object->getStyle(); + $width = $style->getWidth(); + $height = $style->getHeight(); + $align = $style->getAlign(); + + + $objWriter->startElement('w:p'); + + if(!is_null($align)) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:jc'); + $objWriter->writeAttribute('w:val', $align); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:r'); + + $objWriter->startElement('w:object'); + $objWriter->writeAttribute('w:dxaOrig', '249'); + $objWriter->writeAttribute('w:dyaOrig', '160'); + + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('id', $shapeId); + $objWriter->writeAttribute('type', '#_x0000_t75'); + $objWriter->writeAttribute('style', 'width:104px;height:67px'); + $objWriter->writeAttribute('o:ole', ''); + + $objWriter->startElement('v:imagedata'); + $objWriter->writeAttribute('r:id', 'rId'.$rIdImage); + $objWriter->writeAttribute('o:title', ''); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->startElement('o:OLEObject'); + $objWriter->writeAttribute('Type', 'Embed'); + $objWriter->writeAttribute('ProgID', 'Package'); + $objWriter->writeAttribute('ShapeID', $shapeId); + $objWriter->writeAttribute('DrawAspect', 'Icon'); + $objWriter->writeAttribute('ObjectID', '_'.$objectId); + $objWriter->writeAttribute('r:id', 'rId'.$rIdObject); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); // w:r + + $objWriter->endElement(); // w:p + } + + private function _writeTOC(PHPWord_Shared_XMLWriter $objWriter = null) { + $titles = PHPWord_TOC::getTitles(); + $styleFont = PHPWord_TOC::getStyleFont(); + + $styleTOC = PHPWord_TOC::getStyleTOC(); + $fIndent = $styleTOC->getIndent(); + $tabLeader = $styleTOC->getTabLeader(); + $tabPos = $styleTOC->getTabPos(); + + $isObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false; + + for($i=0; $istartElement('w:p'); + + $objWriter->startElement('w:pPr'); + + if($isObject && !is_null($styleFont->getParagraphStyle())) { + $this->_writeParagraphStyle($objWriter, $styleFont->getParagraphStyle()); + } + + if($indent > 0) { + $objWriter->startElement('w:ind'); + $objWriter->writeAttribute('w:left', $indent); + $objWriter->endElement(); + } + + if(!empty($styleFont) && !$isObject) { + $objWriter->startElement('w:pPr'); + $objWriter->startElement('w:pStyle'); + $objWriter->writeAttribute('w:val', $styleFont); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:tabs'); + $objWriter->startElement('w:tab'); + $objWriter->writeAttribute('w:val', 'right'); + if(!empty($tabLeader)) { + $objWriter->writeAttribute('w:leader', $tabLeader); + } + $objWriter->writeAttribute('w:pos', $tabPos); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); // w:pPr + + + if($i == 0) { + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'begin'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:instrText'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRaw('TOC \o "1-9" \h \z \u'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'separate'); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('w:hyperlink'); + $objWriter->writeAttribute('w:anchor', $title['anchor']); + $objWriter->writeAttribute('w:history', '1'); + + $objWriter->startElement('w:r'); + + if($isObject) { + $this->_writeTextStyle($objWriter, $styleFont); + } + + $objWriter->startElement('w:t'); + $objWriter->writeRaw($title['text']); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->writeElement('w:tab', null); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'begin'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:instrText'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRaw('PAGEREF '.$title['anchor'].' \h'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'end'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); // w:hyperlink + + $objWriter->endElement(); // w:p + } + + $objWriter->startElement('w:p'); + $objWriter->startElement('w:r'); + $objWriter->startElement('w:fldChar'); + $objWriter->writeAttribute('w:fldCharType', 'end'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } +} diff --git a/src/PHPWord/Writer/Word2007/DocumentRels.php b/src/PHPWord/Writer/Word2007/DocumentRels.php new file mode 100644 index 00000000..b5b5bd0c --- /dev/null +++ b/src/PHPWord/Writer/Word2007/DocumentRels.php @@ -0,0 +1,177 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Relationship word/document.xml + $this->_writeRelationship( + $objWriter, + 1, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + 'styles.xml' + ); + + // Relationship word/numbering.xml + $this->_writeRelationship( + $objWriter, + 2, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering', + 'numbering.xml' + ); + + // Relationship word/settings.xml + $this->_writeRelationship( + $objWriter, + 3, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings', + 'settings.xml' + ); + + // Relationship word/settings.xml + $this->_writeRelationship( + $objWriter, + 4, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + 'theme/theme1.xml' + ); + + // Relationship word/settings.xml + $this->_writeRelationship( + $objWriter, + 5, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings', + 'webSettings.xml' + ); + + // Relationship word/settings.xml + $this->_writeRelationship( + $objWriter, + 6, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable', + 'fontTable.xml' + ); + + // Relationships to Images / Embeddings / Headers / Footers + foreach($_relsCollection as $relation) { + $relationType = $relation['type']; + $relationName = $relation['target']; + $relationId = $relation['rID']; + $targetMode = ($relationType == 'hyperlink') ? 'External' : ''; + + $this->_writeRelationship( + $objWriter, + $relationId, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/'.$relationType, + $relationName, + $targetMode + ); + } + + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + public function writeHeaderFooterRels($_relsCollection) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Relationships to Images / Embeddings / Headers / Footers + foreach($_relsCollection as $relation) { + $relationType = $relation['type']; + $relationName = $relation['target']; + $relationId = $relation['rID']; + + $this->_writeRelationship( + $objWriter, + $relationId, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/'.$relationType, + $relationName + ); + } + + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + private function _writeRelationship(PHPWord_Shared_XMLWriter $objWriter = null, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '') { + if($pType != '' && $pTarget != '') { + if(strpos($pId, 'rId') === false) { + $pId = 'rId' . $pId; + } + + // Write relationship + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', $pId); + $objWriter->writeAttribute('Type', $pType); + $objWriter->writeAttribute('Target', $pTarget); + + if($pTargetMode != '') { + $objWriter->writeAttribute('TargetMode', $pTargetMode); + } + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Writer/Word2007/Footer.php b/src/PHPWord/Writer/Word2007/Footer.php new file mode 100644 index 00000000..8508b867 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Footer.php @@ -0,0 +1,79 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + $objWriter->startElement('w:ftr'); + $objWriter->writeAttribute('xmlns:ve','http://schemas.openxmlformats.org/markup-compatibility/2006'); + $objWriter->writeAttribute('xmlns:o','urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:r','http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('xmlns:m','http://schemas.openxmlformats.org/officeDocument/2006/math'); + $objWriter->writeAttribute('xmlns:v','urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:wp','http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'); + $objWriter->writeAttribute('xmlns:w10','urn:schemas-microsoft-com:office:word'); + $objWriter->writeAttribute('xmlns:w','http://schemas.openxmlformats.org/wordprocessingml/2006/main'); + $objWriter->writeAttribute('xmlns:wne','http://schemas.microsoft.com/office/word/2006/wordml'); + + $_elements = $footer->getElements(); + + foreach($_elements as $element) { + if($element instanceof PHPWord_Section_Text) { + $this->_writeText($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextRun) { + $this->_writeTextRun($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextBreak) { + $this->_writeTextBreak($objWriter); + } elseif($element instanceof PHPWord_Section_Table) { + $this->_writeTable($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Image || + $element instanceof PHPWord_Section_MemoryImage) { + $this->_writeImage($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Footer_PreserveText) { + $this->_writePreserveText($objWriter, $element); + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } +} +?> diff --git a/src/PHPWord/Writer/Word2007/Header.php b/src/PHPWord/Writer/Word2007/Header.php new file mode 100644 index 00000000..f677899c --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Header.php @@ -0,0 +1,83 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + $objWriter->startElement('w:hdr'); + $objWriter->writeAttribute('xmlns:ve','http://schemas.openxmlformats.org/markup-compatibility/2006'); + $objWriter->writeAttribute('xmlns:o','urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:r','http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('xmlns:m','http://schemas.openxmlformats.org/officeDocument/2006/math'); + $objWriter->writeAttribute('xmlns:v','urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:wp','http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'); + $objWriter->writeAttribute('xmlns:w10','urn:schemas-microsoft-com:office:word'); + $objWriter->writeAttribute('xmlns:w','http://schemas.openxmlformats.org/wordprocessingml/2006/main'); + $objWriter->writeAttribute('xmlns:wne','http://schemas.microsoft.com/office/word/2006/wordml'); + + + $_elements = $header->getElements(); + + foreach($_elements as $element) { + if($element instanceof PHPWord_Section_Text) { + $this->_writeText($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextRun) { + $this->_writeTextRun($objWriter, $element); + } elseif($element instanceof PHPWord_Section_TextBreak) { + $this->_writeTextBreak($objWriter); + } elseif($element instanceof PHPWord_Section_Table) { + $this->_writeTable($objWriter, $element); + } elseif($element instanceof PHPWord_Section_Image || + $element instanceof PHPWord_Section_MemoryImage) { + if(!$element->getIsWatermark()) { + $this->_writeImage($objWriter, $element); + } else { + $this->_writeWatermark($objWriter, $element); + } + } elseif($element instanceof PHPWord_Section_Footer_PreserveText) { + $this->_writePreserveText($objWriter, $element); + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } +} +?> diff --git a/src/PHPWord/Writer/Word2007/Rels.php b/src/PHPWord/Writer/Word2007/Rels.php new file mode 100644 index 00000000..1811e8b5 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Rels.php @@ -0,0 +1,110 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + $relationId = 1; + + // Relationship word/document.xml + $this->_writeRelationship( + $objWriter, + $relationId, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + 'word/document.xml' + ); + + // Relationship docProps/core.xml + $this->_writeRelationship( + $objWriter, + ++$relationId, + 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + 'docProps/core.xml' + ); + + // Relationship docProps/app.xml + $this->_writeRelationship( + $objWriter, + ++$relationId, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + 'docProps/app.xml' + ); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Override content type + * + * @param PHPWord_Shared_XMLWriter $objWriter XML Writer + * @param int $pId Relationship ID. rId will be prepended! + * @param string $pType Relationship type + * @param string $pTarget Relationship target + * @param string $pTargetMode Relationship target mode + * @throws Exception + */ + private function _writeRelationship(PHPWord_Shared_XMLWriter $objWriter = null, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '') { + if($pType != '' && $pTarget != '') { + if(strpos($pId, 'rId') === false) { + $pId = 'rId' . $pId; + } + + // Write relationship + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', $pId); + $objWriter->writeAttribute('Type', $pType); + $objWriter->writeAttribute('Target', $pTarget); + + if($pTargetMode != '') { + $objWriter->writeAttribute('TargetMode', $pTargetMode); + } + + $objWriter->endElement(); + } else { + throw new Exception("Invalid parameters passed."); + } + } +} diff --git a/src/PHPWord/Writer/Word2007/Styles.php b/src/PHPWord/Writer/Word2007/Styles.php new file mode 100644 index 00000000..602b2bee --- /dev/null +++ b/src/PHPWord/Writer/Word2007/Styles.php @@ -0,0 +1,346 @@ +getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY); + } + + $this->_document = $pPHPWord; + + // XML header + $objWriter->startDocument('1.0','UTF-8','yes'); + + $objWriter->startElement('w:styles'); + + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'); + + // Write DocDefaults + $this->_writeDocDefaults($objWriter); + + + // Write Style Definitions + $styles = PHPWord_Style::getStyles(); + if(count($styles) > 0) { + foreach($styles as $styleName => $style) { + if($style instanceof PHPWord_Style_Font) { + + $paragraphStyle = $style->getParagraphStyle(); + $styleType = $style->getStyleType(); + + $type = ($styleType == 'title') ? 'paragraph' : 'character'; + + if(!is_null($paragraphStyle)) { + $type = 'paragraph'; + } + + $objWriter->startElement('w:style'); + $objWriter->writeAttribute('w:type', $type); + + if($styleType == 'title') { + $arrStyle = explode('_', $styleName); + $styleId = 'Heading'.$arrStyle[1]; + $styleName = 'heading '.$arrStyle[1]; + $styleLink = 'Heading'.$arrStyle[1].'Char'; + $objWriter->writeAttribute('w:styleId', $styleId); + + $objWriter->startElement('w:link'); + $objWriter->writeAttribute('w:val', $styleLink); + $objWriter->endElement(); + } + + $objWriter->startElement('w:name'); + $objWriter->writeAttribute('w:val', $styleName); + $objWriter->endElement(); + + if(!is_null($paragraphStyle)) { + $this->_writeParagraphStyle($objWriter, $paragraphStyle); + } + + $this->_writeTextStyle($objWriter, $style); + + $objWriter->endElement(); + + } elseif($style instanceof PHPWord_Style_Paragraph) { + $objWriter->startElement('w:style'); + $objWriter->writeAttribute('w:type', 'paragraph'); + $objWriter->writeAttribute('w:customStyle', '1'); + $objWriter->writeAttribute('w:styleId', $styleName); + + $objWriter->startElement('w:name'); + $objWriter->writeAttribute('w:val', $styleName); + $objWriter->endElement(); + + $this->_writeParagraphStyle($objWriter, $style); + $objWriter->endElement(); + + } elseif($style instanceof PHPWord_Style_TableFull) { + $objWriter->startElement('w:style'); + $objWriter->writeAttribute('w:type', 'table'); + $objWriter->writeAttribute('w:customStyle', '1'); + $objWriter->writeAttribute('w:styleId', $styleName); + + $objWriter->startElement('w:name'); + $objWriter->writeAttribute('w:val', $styleName); + $objWriter->endElement(); + + $objWriter->startElement('w:uiPriority'); + $objWriter->writeAttribute('w:val', '99'); + $objWriter->endElement(); + + $this->_writeFullTableStyle($objWriter, $style); + + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); // w:styles + + // Return + return $objWriter->getData(); + } + + private function _writeFullTableStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_TableFull $style) { + + $brdSz = $style->getBorderSize(); + $brdCol = $style->getBorderColor(); + $bgColor = $style->getBgColor(); + $cellMargin = $style->getCellMargin(); + + $bTop = (!is_null($brdSz[0])) ? true : false; + $bLeft = (!is_null($brdSz[1])) ? true : false; + $bRight = (!is_null($brdSz[2])) ? true : false; + $bBottom = (!is_null($brdSz[3])) ? true : false; + $bInsH = (!is_null($brdSz[4])) ? true : false; + $bInsV = (!is_null($brdSz[5])) ? true : false; + $borders = ($bTop || $bLeft || $bRight || $bBottom || $bInsH || $bInsV) ? true : false; + + $mTop = (!is_null($cellMargin[0])) ? true : false; + $mLeft = (!is_null($cellMargin[1])) ? true : false; + $mRight = (!is_null($cellMargin[2])) ? true : false; + $mBottom = (!is_null($cellMargin[3])) ? true : false; + $margins = ($mTop || $mLeft || $mRight || $mBottom) ? true : false; + + $objWriter->startElement('w:tblPr'); + + if($margins) { + $objWriter->startElement('w:tblCellMar'); + if($mTop) { + echo $margins[0]; + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:w', $cellMargin[0]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + if($mLeft) { + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:w', $cellMargin[1]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + if($mRight) { + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:w', $cellMargin[2]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + if($mBottom) { + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:w', $cellMargin[3]); + $objWriter->writeAttribute('w:type', 'dxa'); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + + if($borders) { + $objWriter->startElement('w:tblBorders'); + if($bTop) { + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[0]); + $objWriter->writeAttribute('w:color', $brdCol[0]); + $objWriter->endElement(); + } + if($bLeft) { + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[1]); + $objWriter->writeAttribute('w:color', $brdCol[1]); + $objWriter->endElement(); + } + if($bRight) { + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[2]); + $objWriter->writeAttribute('w:color', $brdCol[2]); + $objWriter->endElement(); + } + if($bBottom) { + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[3]); + $objWriter->writeAttribute('w:color', $brdCol[3]); + $objWriter->endElement(); + } + if($bInsH) { + $objWriter->startElement('w:insideH'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[4]); + $objWriter->writeAttribute('w:color', $brdCol[4]); + $objWriter->endElement(); + } + if($bInsV) { + $objWriter->startElement('w:insideV'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[5]); + $objWriter->writeAttribute('w:color', $brdCol[5]); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + + $objWriter->endElement(); + + if(!is_null($bgColor)) { + $objWriter->startElement('w:tcPr'); + $objWriter->startElement('w:shd'); + $objWriter->writeAttribute('w:val', 'clear'); + $objWriter->writeAttribute('w:color', 'auto'); + $objWriter->writeAttribute('w:fill', $bgColor); + $objWriter->endElement(); + $objWriter->endElement(); + } + + + // First Row + $firstRow = $style->getFirstRow(); + if(!is_null($firstRow)) { + $this->_writeRowStyle($objWriter, 'firstRow', $firstRow); + } + } + + private function _writeRowStyle(PHPWord_Shared_XMLWriter $objWriter = null, $type, PHPWord_Style_TableFull $style) { + $brdSz = $style->getBorderSize(); + $brdCol = $style->getBorderColor(); + $bgColor = $style->getBgColor(); + + $bTop = (!is_null($brdSz[0])) ? true : false; + $bLeft = (!is_null($brdSz[1])) ? true : false; + $bRight = (!is_null($brdSz[2])) ? true : false; + $bBottom = (!is_null($brdSz[3])) ? true : false; + $borders = ($bTop || $bLeft || $bRight || $bBottom) ? true : false; + + $objWriter->startElement('w:tblStylePr'); + $objWriter->writeAttribute('w:type', $type); + + $objWriter->startElement('w:tcPr'); + if(!is_null($bgColor)) { + $objWriter->startElement('w:shd'); + $objWriter->writeAttribute('w:val', 'clear'); + $objWriter->writeAttribute('w:color', 'auto'); + $objWriter->writeAttribute('w:fill', $bgColor); + $objWriter->endElement(); + } + + $objWriter->startElement('w:tcBorders'); + if($bTop) { + $objWriter->startElement('w:top'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[0]); + $objWriter->writeAttribute('w:color', $brdCol[0]); + $objWriter->endElement(); + } + if($bLeft) { + $objWriter->startElement('w:left'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[1]); + $objWriter->writeAttribute('w:color', $brdCol[1]); + $objWriter->endElement(); + } + if($bRight) { + $objWriter->startElement('w:right'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[2]); + $objWriter->writeAttribute('w:color', $brdCol[2]); + $objWriter->endElement(); + } + if($bBottom) { + $objWriter->startElement('w:bottom'); + $objWriter->writeAttribute('w:val', 'single'); + $objWriter->writeAttribute('w:sz', $brdSz[3]); + $objWriter->writeAttribute('w:color', $brdCol[3]); + $objWriter->endElement(); + } + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + + private function _writeDocDefaults(PHPWord_Shared_XMLWriter $objWriter = null) { + $fontName = $this->_document->getDefaultFontName(); + $fontSize = $this->_document->getDefaultFontSize(); + + $objWriter->startElement('w:docDefaults'); + $objWriter->startElement('w:rPrDefault'); + $objWriter->startElement('w:rPr'); + + $objWriter->startElement('w:rFonts'); + $objWriter->writeAttribute('w:ascii', $fontName); + $objWriter->writeAttribute('w:hAnsi', $fontName); + $objWriter->writeAttribute('w:eastAsia', $fontName); + $objWriter->writeAttribute('w:cs', $fontName); + $objWriter->endElement(); + + $objWriter->startElement('w:sz'); + $objWriter->writeAttribute('w:val', $fontSize); + $objWriter->endElement(); + + $objWriter->startElement('w:szCs'); + $objWriter->writeAttribute('w:val', $fontSize); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } +} +?> \ No newline at end of file diff --git a/src/PHPWord/Writer/Word2007/WriterPart.php b/src/PHPWord/Writer/Word2007/WriterPart.php new file mode 100644 index 00000000..1556a6f5 --- /dev/null +++ b/src/PHPWord/Writer/Word2007/WriterPart.php @@ -0,0 +1,43 @@ +_parentWriter = $pWriter; + } + + public function getParentWriter() { + if (!is_null($this->_parentWriter)) { + return $this->_parentWriter; + } else { + throw new Exception("No parent PHPWord_Writer_IWriter assigned."); + } + } +} diff --git a/src/PHPWord/_staticDocParts/_doc.png b/src/PHPWord/_staticDocParts/_doc.png new file mode 100644 index 00000000..3128a803 Binary files /dev/null and b/src/PHPWord/_staticDocParts/_doc.png differ diff --git a/src/PHPWord/_staticDocParts/_ppt.png b/src/PHPWord/_staticDocParts/_ppt.png new file mode 100644 index 00000000..3e925f50 Binary files /dev/null and b/src/PHPWord/_staticDocParts/_ppt.png differ diff --git a/src/PHPWord/_staticDocParts/_xls.png b/src/PHPWord/_staticDocParts/_xls.png new file mode 100644 index 00000000..a7d7697f Binary files /dev/null and b/src/PHPWord/_staticDocParts/_xls.png differ diff --git a/src/PHPWord/_staticDocParts/fontTable.xml b/src/PHPWord/_staticDocParts/fontTable.xml new file mode 100644 index 00000000..a2e183c4 --- /dev/null +++ b/src/PHPWord/_staticDocParts/fontTable.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/PHPWord/_staticDocParts/numbering.xml b/src/PHPWord/_staticDocParts/numbering.xml new file mode 100644 index 00000000..ac229f40 --- /dev/null +++ b/src/PHPWord/_staticDocParts/numbering.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/PHPWord/_staticDocParts/settings.xml b/src/PHPWord/_staticDocParts/settings.xml new file mode 100644 index 00000000..5eb22891 --- /dev/null +++ b/src/PHPWord/_staticDocParts/settings.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/PHPWord/_staticDocParts/theme1.xml b/src/PHPWord/_staticDocParts/theme1.xml new file mode 100644 index 00000000..4fab507b --- /dev/null +++ b/src/PHPWord/_staticDocParts/theme1.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/PHPWord/_staticDocParts/webSettings.xml b/src/PHPWord/_staticDocParts/webSettings.xml new file mode 100644 index 00000000..72d28307 --- /dev/null +++ b/src/PHPWord/_staticDocParts/webSettings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file