1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28: 29: 30:
31: class PHPWord_Writer_Word2007_Document extends PHPWord_Writer_Word2007_Base
32: {
33:
34: public function writeDocument(PHPWord $pPHPWord = null)
35: {
36:
37:
38: if ($this->getParentWriter()->getUseDiskCaching()) {
39: $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
40: } else {
41: $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY);
42: }
43:
44:
45: $objWriter->startDocument('1.0', 'UTF-8', 'yes');
46:
47:
48: $objWriter->startElement('w:document');
49:
50: $objWriter->writeAttribute('xmlns:ve', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
51: $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office');
52: $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
53: $objWriter->writeAttribute('xmlns:m', 'http://schemas.openxmlformats.org/officeDocument/2006/math');
54: $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
55: $objWriter->writeAttribute('xmlns:wp', 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing');
56: $objWriter->writeAttribute('xmlns:w10', 'urn:schemas-microsoft-com:office:word');
57: $objWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
58: $objWriter->writeAttribute('xmlns:wne', 'http://schemas.microsoft.com/office/word/2006/wordml');
59:
60: $objWriter->startElement('w:body');
61:
62: $_sections = $pPHPWord->getSections();
63: $countSections = count($_sections);
64: $pSection = 0;
65:
66: if ($countSections > 0) {
67: foreach ($_sections as $section) {
68: $pSection++;
69:
70: $_elements = $section->getElements();
71:
72: foreach ($_elements as $element) {
73: if ($element instanceof PHPWord_Section_Text) {
74: $this->_writeText($objWriter, $element);
75: } elseif ($element instanceof PHPWord_Section_TextRun) {
76: $this->_writeTextRun($objWriter, $element);
77: } elseif ($element instanceof PHPWord_Section_Link) {
78: $this->_writeLink($objWriter, $element);
79: } elseif ($element instanceof PHPWord_Section_Title) {
80: $this->_writeTitle($objWriter, $element);
81: } elseif ($element instanceof PHPWord_Section_TextBreak) {
82: $this->_writeTextBreak($objWriter);
83: } elseif ($element instanceof PHPWord_Section_PageBreak) {
84: $this->_writePageBreak($objWriter);
85: } elseif ($element instanceof PHPWord_Section_Table) {
86: $this->_writeTable($objWriter, $element);
87: } elseif ($element instanceof PHPWord_Section_ListItem) {
88: $this->_writeListItem($objWriter, $element);
89: } elseif ($element instanceof PHPWord_Section_Image ||
90: $element instanceof PHPWord_Section_MemoryImage
91: ) {
92: $this->_writeImage($objWriter, $element);
93: } elseif ($element instanceof PHPWord_Section_Object) {
94: $this->_writeObject($objWriter, $element);
95: } elseif ($element instanceof PHPWord_TOC) {
96: $this->_writeTOC($objWriter);
97: }
98: }
99:
100: if ($pSection == $countSections) {
101: $this->_writeEndSection($objWriter, $section);
102: } else {
103: $this->_writeSection($objWriter, $section);
104: }
105: }
106: }
107:
108: $objWriter->endElement();
109: $objWriter->endElement();
110:
111:
112: return $objWriter->getData();
113: }
114:
115: private function _writeSection(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section $section)
116: {
117: $objWriter->startElement('w:p');
118: $objWriter->startElement('w:pPr');
119: $this->_writeEndSection($objWriter, $section, 3);
120: $objWriter->endElement();
121: $objWriter->endElement();
122: }
123:
124: private function _writeEndSection(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section $section)
125: {
126: $_settings = $section->getSettings();
127: $_headers = $section->getHeaders();
128: $_footer = $section->getFooter();
129: $pgSzW = $_settings->getPageSizeW();
130: $pgSzH = $_settings->getPageSizeH();
131: $orientation = $_settings->getOrientation();
132:
133: $marginTop = $_settings->getMarginTop();
134: $marginLeft = $_settings->getMarginLeft();
135: $marginRight = $_settings->getMarginRight();
136: $marginBottom = $_settings->getMarginBottom();
137:
138: $borders = $_settings->getBorderSize();
139:
140: $colsNum = $_settings->getColsNum();
141: $colsSpace = $_settings->getColsSpace();
142: $breakType = $_settings->getBreakType();
143:
144: $objWriter->startElement('w:sectPr');
145:
146: foreach ($_headers as &$_header) {
147: $rId = $_header->getRelationId();
148: $objWriter->startElement('w:headerReference');
149: $objWriter->writeAttribute('w:type', $_header->getType());
150: $objWriter->writeAttribute('r:id', 'rId' . $rId);
151: $objWriter->endElement();
152: }
153:
154: if ($section->hasDifferentFirstPage()) {
155: $objWriter->startElement('w:titlePg');
156: $objWriter->endElement();
157: }
158:
159:
160: if (!is_null($breakType)) {
161: $objWriter->startElement('w:type');
162: $objWriter->writeAttribute('w:val', $breakType);
163: $objWriter->endElement();
164: }
165:
166: if (!is_null($_footer)) {
167: $rId = $_footer->getRelationId();
168: $objWriter->startElement('w:footerReference');
169: $objWriter->writeAttribute('w:type', 'default');
170: $objWriter->writeAttribute('r:id', 'rId' . $rId);
171: $objWriter->endElement();
172: }
173:
174: $objWriter->startElement('w:pgSz');
175: $objWriter->writeAttribute('w:w', $pgSzW);
176: $objWriter->writeAttribute('w:h', $pgSzH);
177:
178: if (!is_null($orientation) && strtolower($orientation) != 'portrait') {
179: $objWriter->writeAttribute('w:orient', $orientation);
180: }
181:
182: $objWriter->endElement();
183:
184: $objWriter->startElement('w:pgMar');
185: $objWriter->writeAttribute('w:top', $marginTop);
186: $objWriter->writeAttribute('w:right', $marginRight);
187: $objWriter->writeAttribute('w:bottom', $marginBottom);
188: $objWriter->writeAttribute('w:left', $marginLeft);
189: $objWriter->writeAttribute('w:header', '720');
190: $objWriter->writeAttribute('w:footer', '720');
191: $objWriter->writeAttribute('w:gutter', '0');
192: $objWriter->endElement();
193:
194:
195: if (!is_null($borders[0]) || !is_null($borders[1]) || !is_null($borders[2]) || !is_null($borders[3])) {
196: $borderColor = $_settings->getBorderColor();
197:
198: $objWriter->startElement('w:pgBorders');
199: $objWriter->writeAttribute('w:offsetFrom', 'page');
200:
201: if (!is_null($borders[0])) {
202: $objWriter->startElement('w:top');
203: $objWriter->writeAttribute('w:val', 'single');
204: $objWriter->writeAttribute('w:sz', $borders[0]);
205: $objWriter->writeAttribute('w:space', '24');
206: $objWriter->writeAttribute('w:color', $borderColor[0]);
207: $objWriter->endElement();
208: }
209:
210: if (!is_null($borders[1])) {
211: $objWriter->startElement('w:left');
212: $objWriter->writeAttribute('w:val', 'single');
213: $objWriter->writeAttribute('w:sz', $borders[1]);
214: $objWriter->writeAttribute('w:space', '24');
215: $objWriter->writeAttribute('w:color', $borderColor[1]);
216: $objWriter->endElement();
217: }
218:
219: if (!is_null($borders[2])) {
220: $objWriter->startElement('w:right');
221: $objWriter->writeAttribute('w:val', 'single');
222: $objWriter->writeAttribute('w:sz', $borders[2]);
223: $objWriter->writeAttribute('w:space', '24');
224: $objWriter->writeAttribute('w:color', $borderColor[2]);
225: $objWriter->endElement();
226: }
227:
228: if (!is_null($borders[3])) {
229: $objWriter->startElement('w:bottom');
230: $objWriter->writeAttribute('w:val', 'single');
231: $objWriter->writeAttribute('w:sz', $borders[3]);
232: $objWriter->writeAttribute('w:space', '24');
233: $objWriter->writeAttribute('w:color', $borderColor[3]);
234: $objWriter->endElement();
235: }
236: $objWriter->endElement();
237: }
238:
239:
240: $objWriter->startElement('w:cols');
241: if($colsNum > 1){
242: $objWriter->writeAttribute('w:num', $colsNum);
243: $objWriter->writeAttribute('w:space', $colsSpace);
244: } else {
245: $objWriter->writeAttribute('w:space', '720');
246: }
247: $objWriter->endElement();
248:
249:
250: $objWriter->endElement();
251: }
252:
253: private function _writePageBreak(PHPWord_Shared_XMLWriter $objWriter = null)
254: {
255: $objWriter->startElement('w:p');
256: $objWriter->startElement('w:r');
257: $objWriter->startElement('w:br');
258: $objWriter->writeAttribute('w:type', 'page');
259: $objWriter->endElement();
260: $objWriter->endElement();
261: $objWriter->endElement();
262: }
263:
264: private function _writeListItem(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_ListItem $listItem)
265: {
266: $textObject = $listItem->getTextObject();
267: $text = $textObject->getText();
268: $styleParagraph = $textObject->getParagraphStyle();
269: $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
270:
271: $depth = $listItem->getDepth();
272: $listType = $listItem->getStyle()->getListType();
273:
274: $objWriter->startElement('w:p');
275: $objWriter->startElement('w:pPr');
276:
277: if ($SpIsObject) {
278: $this->_writeParagraphStyle($objWriter, $styleParagraph, true);
279: } elseif (!$SpIsObject && !is_null($styleParagraph)) {
280: $objWriter->startElement('w:pStyle');
281: $objWriter->writeAttribute('w:val', $styleParagraph);
282: $objWriter->endElement();
283: }
284:
285: $objWriter->startElement('w:numPr');
286:
287: $objWriter->startElement('w:ilvl');
288: $objWriter->writeAttribute('w:val', $depth);
289: $objWriter->endElement();
290:
291: $objWriter->startElement('w:numId');
292: $objWriter->writeAttribute('w:val', $listType);
293: $objWriter->endElement();
294:
295: $objWriter->endElement();
296: $objWriter->endElement();
297:
298: $this->_writeText($objWriter, $textObject, true);
299:
300: $objWriter->endElement();
301: }
302:
303: protected function _writeObject(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Object $object)
304: {
305: $rIdObject = $object->getRelationId();
306: $rIdImage = $object->getImageRelationId();
307: $shapeId = md5($rIdObject . '_' . $rIdImage);
308:
309: $objectId = $object->getObjectId();
310:
311: $style = $object->getStyle();
312: $width = $style->getWidth();
313: $height = $style->getHeight();
314: $align = $style->getAlign();
315:
316:
317: $objWriter->startElement('w:p');
318:
319: if (!is_null($align)) {
320: $objWriter->startElement('w:pPr');
321: $objWriter->startElement('w:jc');
322: $objWriter->writeAttribute('w:val', $align);
323: $objWriter->endElement();
324: $objWriter->endElement();
325: }
326:
327: $objWriter->startElement('w:r');
328:
329: $objWriter->startElement('w:object');
330: $objWriter->writeAttribute('w:dxaOrig', '249');
331: $objWriter->writeAttribute('w:dyaOrig', '160');
332:
333: $objWriter->startElement('v:shape');
334: $objWriter->writeAttribute('id', $shapeId);
335: $objWriter->writeAttribute('type', '#_x0000_t75');
336: $objWriter->writeAttribute('style', 'width:104px;height:67px');
337: $objWriter->writeAttribute('o:ole', '');
338:
339: $objWriter->startElement('v:imagedata');
340: $objWriter->writeAttribute('r:id', 'rId' . $rIdImage);
341: $objWriter->writeAttribute('o:title', '');
342: $objWriter->endElement();
343:
344: $objWriter->endElement();
345:
346: $objWriter->startElement('o:OLEObject');
347: $objWriter->writeAttribute('Type', 'Embed');
348: $objWriter->writeAttribute('ProgID', 'Package');
349: $objWriter->writeAttribute('ShapeID', $shapeId);
350: $objWriter->writeAttribute('DrawAspect', 'Icon');
351: $objWriter->writeAttribute('ObjectID', '_' . $objectId);
352: $objWriter->writeAttribute('r:id', 'rId' . $rIdObject);
353: $objWriter->endElement();
354:
355: $objWriter->endElement();
356:
357: $objWriter->endElement();
358:
359: $objWriter->endElement();
360: }
361:
362: private function _writeTOC(PHPWord_Shared_XMLWriter $objWriter = null)
363: {
364: $titles = PHPWord_TOC::getTitles();
365: $styleFont = PHPWord_TOC::getStyleFont();
366:
367: $styleTOC = PHPWord_TOC::getStyleTOC();
368: $fIndent = $styleTOC->getIndent();
369: $tabLeader = $styleTOC->getTabLeader();
370: $tabPos = $styleTOC->getTabPos();
371:
372: $isObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
373:
374: for ($i = 0; $i < count($titles); $i++) {
375: $title = $titles[$i];
376: $indent = ($title['depth'] - 1) * $fIndent;
377:
378: $objWriter->startElement('w:p');
379:
380: $objWriter->startElement('w:pPr');
381:
382: if ($isObject && !is_null($styleFont->getParagraphStyle())) {
383: $this->_writeParagraphStyle($objWriter, $styleFont->getParagraphStyle());
384: }
385:
386: if ($indent > 0) {
387: $objWriter->startElement('w:ind');
388: $objWriter->writeAttribute('w:left', $indent);
389: $objWriter->endElement();
390: }
391:
392: if (!empty($styleFont) && !$isObject) {
393: $objWriter->startElement('w:pPr');
394: $objWriter->startElement('w:pStyle');
395: $objWriter->writeAttribute('w:val', $styleFont);
396: $objWriter->endElement();
397: $objWriter->endElement();
398: }
399:
400: $objWriter->startElement('w:tabs');
401: $objWriter->startElement('w:tab');
402: $objWriter->writeAttribute('w:val', 'right');
403: if (!empty($tabLeader)) {
404: $objWriter->writeAttribute('w:leader', $tabLeader);
405: }
406: $objWriter->writeAttribute('w:pos', $tabPos);
407: $objWriter->endElement();
408: $objWriter->endElement();
409:
410: $objWriter->endElement();
411:
412:
413: if ($i == 0) {
414: $objWriter->startElement('w:r');
415: $objWriter->startElement('w:fldChar');
416: $objWriter->writeAttribute('w:fldCharType', 'begin');
417: $objWriter->endElement();
418: $objWriter->endElement();
419:
420: $objWriter->startElement('w:r');
421: $objWriter->startElement('w:instrText');
422: $objWriter->writeAttribute('xml:space', 'preserve');
423: $objWriter->writeRaw('TOC \o "1-9" \h \z \u');
424: $objWriter->endElement();
425: $objWriter->endElement();
426:
427: $objWriter->startElement('w:r');
428: $objWriter->startElement('w:fldChar');
429: $objWriter->writeAttribute('w:fldCharType', 'separate');
430: $objWriter->endElement();
431: $objWriter->endElement();
432: }
433:
434: $objWriter->startElement('w:hyperlink');
435: $objWriter->writeAttribute('w:anchor', $title['anchor']);
436: $objWriter->writeAttribute('w:history', '1');
437:
438: $objWriter->startElement('w:r');
439:
440: if ($isObject) {
441: $this->_writeTextStyle($objWriter, $styleFont);
442: }
443:
444: $objWriter->startElement('w:t');
445: $objWriter->writeRaw($title['text']);
446: $objWriter->endElement();
447: $objWriter->endElement();
448:
449: $objWriter->startElement('w:r');
450: $objWriter->writeElement('w:tab', null);
451: $objWriter->endElement();
452:
453: $objWriter->startElement('w:r');
454: $objWriter->startElement('w:fldChar');
455: $objWriter->writeAttribute('w:fldCharType', 'begin');
456: $objWriter->endElement();
457: $objWriter->endElement();
458:
459: $objWriter->startElement('w:r');
460: $objWriter->startElement('w:instrText');
461: $objWriter->writeAttribute('xml:space', 'preserve');
462: $objWriter->writeRaw('PAGEREF ' . $title['anchor'] . ' \h');
463: $objWriter->endElement();
464: $objWriter->endElement();
465:
466: $objWriter->startElement('w:r');
467: $objWriter->startElement('w:fldChar');
468: $objWriter->writeAttribute('w:fldCharType', 'end');
469: $objWriter->endElement();
470: $objWriter->endElement();
471:
472: $objWriter->endElement();
473:
474: $objWriter->endElement();
475: }
476:
477: $objWriter->startElement('w:p');
478: $objWriter->startElement('w:r');
479: $objWriter->startElement('w:fldChar');
480: $objWriter->writeAttribute('w:fldCharType', 'end');
481: $objWriter->endElement();
482: $objWriter->endElement();
483: $objWriter->endElement();
484: }
485: }
486: