Merge pull request #1324 from troosan/parse_drawings
Support reading of w:drawing for documents produced by word 2011+
This commit is contained in:
commit
9ee99d2c45
|
|
@ -37,6 +37,7 @@ v0.15.0 (?? ??? 2018)
|
|||
- Fix colspan and rowspan for tables in HTML Writer @mattbolt #1292
|
||||
- Fix parsing of Heading and Title formating @troosan @gthomas2 #465
|
||||
- Fix Dateformat typo, fix hours casing, add Month-Day-Year formats @ComputerTinker #591
|
||||
- Support reading of w:drawing for documents produced by word 2011+ @gthomas2 #464 #1324
|
||||
- Fix missing column width in ODText writer @potofcoffee #413
|
||||
- Disable entity loader before parsing XML to avoid XXE injection @Tom4t0 #1427
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@
|
|||
"php": "^5.3.3 || ^7.0",
|
||||
"ext-xml": "*",
|
||||
"zendframework/zend-escaper": "^2.2",
|
||||
"phpoffice/common": "^0.2"
|
||||
"phpoffice/common": "^0.2.9"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-zip": "*",
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ namespace PhpOffice\PhpWord\Element;
|
|||
* @method TOC addTOC(mixed $fontStyle = null, mixed $tocStyle = null, int $minDepth = 1, int $maxDepth = 9)
|
||||
* @method PageBreak addPageBreak()
|
||||
* @method Table addTable(mixed $style = null)
|
||||
* @method Image addImage(string $source, mixed $style = null, bool $isWatermark = false)
|
||||
* @method Image addImage(string $source, mixed $style = null, bool $isWatermark = false, $name = null)
|
||||
* @method OLEObject addOLEObject(string $source, mixed $style = null)
|
||||
* @method TextBox addTextBox(mixed $style = null)
|
||||
* @method Field addField(string $type = null, array $properties = array(), array $options = array(), mixed $text = null)
|
||||
|
|
|
|||
|
|
@ -65,6 +65,13 @@ class Image extends AbstractElement
|
|||
*/
|
||||
private $watermark;
|
||||
|
||||
/**
|
||||
* Name of image
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $name;
|
||||
|
||||
/**
|
||||
* Image type
|
||||
*
|
||||
|
|
@ -127,15 +134,17 @@ class Image extends AbstractElement
|
|||
* @param string $source
|
||||
* @param mixed $style
|
||||
* @param bool $watermark
|
||||
* @param string $name
|
||||
*
|
||||
* @throws \PhpOffice\PhpWord\Exception\InvalidImageException
|
||||
* @throws \PhpOffice\PhpWord\Exception\UnsupportedImageTypeException
|
||||
*/
|
||||
public function __construct($source, $style = null, $watermark = false)
|
||||
public function __construct($source, $style = null, $watermark = false, $name = null)
|
||||
{
|
||||
$this->source = $source;
|
||||
$this->setIsWatermark($watermark);
|
||||
$this->style = $this->setNewStyle(new ImageStyle(), $style, true);
|
||||
$this->setIsWatermark($watermark);
|
||||
$this->setName($name);
|
||||
|
||||
$this->checkImage();
|
||||
}
|
||||
|
|
@ -170,6 +179,26 @@ class Image extends AbstractElement
|
|||
return $this->sourceType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the image name
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function setName($value)
|
||||
{
|
||||
$this->name = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get image name
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get image media ID
|
||||
*
|
||||
|
|
|
|||
|
|
@ -261,6 +261,20 @@ abstract class AbstractPart
|
|||
}
|
||||
$parent->addImage($imageSource);
|
||||
}
|
||||
} elseif ($node->nodeName == 'w:drawing') {
|
||||
// Office 2011 Image
|
||||
$xmlReader->registerNamespace('wp', 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing');
|
||||
$xmlReader->registerNamespace('r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
|
||||
$xmlReader->registerNamespace('pic', 'http://schemas.openxmlformats.org/drawingml/2006/picture');
|
||||
$xmlReader->registerNamespace('a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
|
||||
|
||||
$name = $xmlReader->getAttribute('name', $node, 'wp:inline/a:graphic/a:graphicData/pic:pic/pic:nvPicPr/pic:cNvPr');
|
||||
$embedId = $xmlReader->getAttribute('r:embed', $node, 'wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip');
|
||||
$target = $this->getMediaTarget($docPart, $embedId);
|
||||
if (!is_null($target)) {
|
||||
$imageSource = "zip://{$this->docFile}#{$target}";
|
||||
$parent->addImage($imageSource, null, false, $name);
|
||||
}
|
||||
} elseif ($node->nodeName == 'w:object') {
|
||||
// Object
|
||||
$rId = $xmlReader->getAttribute('r:id', $node, 'o:OLEObject');
|
||||
|
|
|
|||
|
|
@ -236,4 +236,40 @@ class ElementTest extends AbstractTestReader
|
|||
$this->assertEquals('Title', $formattedTitle->getStyle());
|
||||
$this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $formattedTitle->getText());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test reading Drawing
|
||||
*/
|
||||
public function testReadDrawing()
|
||||
{
|
||||
$documentXml = '<w:p>
|
||||
<w:r>
|
||||
<w:drawing xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
|
||||
<wp:inline distT="0" distB="0" distL="0" distR="0">
|
||||
<wp:extent cx="5727700" cy="6621145"/>
|
||||
<wp:docPr id="1" name="Picture 1"/>
|
||||
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
|
||||
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||
<pic:nvPicPr>
|
||||
<pic:cNvPr id="1" name="file_name.jpg"/>
|
||||
<pic:cNvPicPr/>
|
||||
</pic:nvPicPr>
|
||||
<pic:blipFill>
|
||||
<a:blip r:embed="rId4" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
</a:blip>
|
||||
</pic:blipFill>
|
||||
</pic:pic>
|
||||
</a:graphicData>
|
||||
</a:graphic>
|
||||
</wp:inline>
|
||||
</w:drawing>
|
||||
</w:r>
|
||||
</w:p>';
|
||||
|
||||
$phpWord = $this->getDocumentFromString(array('document' => $documentXml));
|
||||
|
||||
$elements = $phpWord->getSection(0)->getElements();
|
||||
$this->assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $elements[0]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,4 +64,18 @@ class Word2007Test extends \PHPUnit\Framework\TestCase
|
|||
$doc = TestHelperDOCX::getDocument($phpWord);
|
||||
$this->assertFalse($doc->elementExists('/w:document/w:body/w:p/w:r[w:t/node()="italics"]/w:rPr/w:b'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a Word 2011 file
|
||||
*/
|
||||
public function testLoadWord2011()
|
||||
{
|
||||
$filename = __DIR__ . '/../_files/documents/reader-2011.docx';
|
||||
$phpWord = IOFactory::load($filename);
|
||||
|
||||
$this->assertInstanceOf('PhpOffice\\PhpWord\\PhpWord', $phpWord);
|
||||
|
||||
$doc = TestHelperDOCX::getDocument($phpWord);
|
||||
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p[3]/w:r/w:pict/v:shape/v:imagedata'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in New Issue