Files
dokuwiki-plugins/lib/plugins/odt/ODT/ODTImage.php
Trevor Batley bce7dd054a add contents
2025-10-09 15:04:29 +11:00

276 lines
12 KiB
PHP

<?php
require_once DOKU_PLUGIN . 'odt/ODT/ODTDocument.php';
/**
* ODTImage:
* Class containing static code for handling images.
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*/
class ODTImage
{
/**
* Adds an image $src to the document.
*
* @param string $src The path to the image file
* @param string $width Width of the picture (NULL=original size)
* @param string $height Height of the picture (NULL=original size)
* @param string $align Alignment
* @param string $title Title
* @param string $style Optional "draw:style-name"
* @param boolean $returnonly Only return code
*
* @see ODTImage::addImage for a detailed description
*/
public static function addImage(ODTInternalParams $params, $src, $width = NULL, $height = NULL, $align = NULL, $title = NULL, $style = NULL, $returnonly = false){
static $z = 0;
$encoded = '';
if (file_exists($src)) {
list($ext,$mime) = mimetype($src);
$name = 'Pictures/'.md5($src).'.'.$ext;
$params->document->addFile($name, $mime, io_readfile($src,false));
} else {
$name = $src;
}
// make sure width and height are available
if (!$width && !$height) {
list($width, $height) = ODTUtility::getImageSizeString($src, $width, $height, true, $params->units);
} else {
list($width, $height) = ODTUtility::getImageSizeString($src, $width, $height, false, $params->units);
}
if($align){
$anchor = 'paragraph';
}else{
$anchor = 'as-char';
}
if (empty($style) || !$params->document->styleExists($style)) {
if (!empty($align)) {
$style = $params->document->getStyleName('media '.$align);
} else {
$style = $params->document->getStyleName('media');
}
}
// Open paragraph if necessary
if (!$params->document->state->getInParagraph()) {
$params->document->paragraphOpen();
}
if ($title) {
$encoded .= '<draw:frame draw:style-name="'.$style.'" draw:name="'.$params->document->replaceXMLEntities($title).' Legend"
text:anchor-type="'.$anchor.'" draw:z-index="0" svg:width="'.$width.'">';
$encoded .= '<draw:text-box>';
$encoded .= '<text:p text:style-name="'.$params->document->getStyleName('legend center').'">';
}
if (!empty($title)) {
$encoded .= '<draw:frame draw:style-name="'.$style.'" draw:name="'.$params->document->replaceXMLEntities($title).'"
text:anchor-type="'.$anchor.'" draw:z-index="'.$z.'"
svg:width="'.$width.'" svg:height="'.$height.'" >';
} else {
$encoded .= '<draw:frame draw:style-name="'.$style.'" draw:name="'.$z.'"
text:anchor-type="'.$anchor.'" draw:z-index="'.$z.'"
svg:width="'.$width.'" svg:height="'.$height.'" >';
}
$encoded .= '<draw:image xlink:href="'.$params->document->replaceXMLEntities($name).'"
xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>';
$encoded .= '</draw:frame>';
if ($title) {
$encoded .= $params->document->replaceXMLEntities($title).'</text:p></draw:text-box></draw:frame>';
}
if($returnonly) {
return $encoded;
} else {
$params->content .= $encoded;
}
$z++;
}
/**
* Adds the content of $string as a SVG picture file to the document.
* The link name which can be used for the ODT draw:image xlink:href
* is returned. The caller is responsible for creating the frame and image tag
* but therefore has full control over it. This means he can also set parameters
* in the odt frame and image tag which can not be changed using the function _odtAddImage.
*
* @author LarsDW223
*
* @param string $string SVG code to add
* @return string
*/
public static function addStringAsSVGImageFile(ODTDocument $doc, $string) {
if ( empty($string) ) { return; }
$ext = '.svg';
$mime = '.image/svg+xml';
$name = 'Pictures/'.md5($string).'.'.$ext;
$doc->addFile($name, $mime, $string);
return $name;
}
/**
* Adds the content of $string as a SVG picture to the document.
* The other parameters behave in the same way as in _odtAddImage.
*
* @author LarsDW223
*
* @param string $string
* @param $width
* @param $height
* @param $align
* @param $title
* @param $style
*/
function addStringAsSVGImage(ODTInternalParams $params, $string, $width = NULL, $height = NULL, $align = NULL, $title = NULL, $style = NULL) {
if ( empty($string) ) { return; }
$name = self::addStringAsSVGImageFile($params->document, $string);
// make sure width and height are available
if (!$width || !$height) {
list($width, $height) = ODTUtility::getImageSizeString($string, $width, $height, true, $params->units);
}
if($align){
$anchor = 'paragraph';
}else{
$anchor = 'as-char';
}
if (!$style or !$params->document->styleExists($style)) {
$style = $params->document->getStyleName('media '.$align);
}
// Open paragraph if necessary
if (!$params->document->state->getInParagraph()) {
$params->document->paragraphOpen();
}
if ($title) {
$params->content .= '<draw:frame draw:style-name="'.$style.'" draw:name="'.$params->document->replaceXMLEntities($title).' Legend"
text:anchor-type="'.$anchor.'" draw:z-index="0" svg:width="'.$width.'">';
$params->content .= '<draw:text-box>';
$params->document->paragraphOpen($$params->document->getStyleName('legend center'));
}
$params->content .= '<draw:frame draw:style-name="'.$style.'" draw:name="'.$params->document->replaceXMLEntities($title).'"
text:anchor-type="'.$anchor.'" draw:z-index="0"
svg:width="'.$width.'" svg:height="'.$height.'" >';
$params->content .= '<draw:image xlink:href="'.$params->document->replaceXMLEntities($name).'"
xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>';
$params->content .= '</draw:frame>';
if ($title) {
$params->content .= $params->document->replaceXMLEntities($title);
$params->document->paragraphClose();
$params->content .= '</draw:text-box></draw:frame>';
}
}
/**
* Adds an image $src to the document using the parameters set in $properties.
* The actually supported properties are:
* - width and height
* - title
* - background-color
* - margin-left, margin-right, margin-top, margin-bottom
*
* @param string $src The path to the image file
* @param array $properties Properties (width, height... see ODTImage::addImageUseProperties)
* @param boolean $returnonly Only return code
*/
public static function addImageUseProperties(ODTInternalParams $params, $src, array $properties, $returnonly = false){
static $z = 0;
ODTUtility::adjustValuesForODT ($properties, $params->units);
$width = $properties ['width'];
$height = $properties ['height'];
$title = $properties ['title'];
$bg_color = $properties ['background-color'];
$encoded = '';
if (file_exists($src)) {
list($ext,$mime) = mimetype($src);
$name = 'Pictures/'.md5($src).'.'.$ext;
$params->document->addFile($name, $mime, io_readfile($src,false));
} else {
$name = $src;
}
// make sure width and height are available
if (!$width || !$height) {
list($width, $height) = ODTUtility::getImageSizeString($src, $width, $height, true, $params->units);
} else {
// Adjust values for ODT
$width = $params->document->toPoints($width, 'x').'pt';
$height = $params->document->toPoints($height, 'y').'pt';
}
if($align){
$anchor = 'paragraph';
}else{
$anchor = 'as-char';
}
// Open paragraph if necessary
if (!$params->document->state->getInParagraph()) {
$params->document->paragraphOpen();
}
// Define graphic style for picture
$style_name = ODTStyle::getNewStylename('span_graphic');
$image_style = '<style:style style:name="'.$style_name.'" style:family="graphic" style:parent-style-name="'.$params->document->getStyleName('graphics').'">';
$image_style .= '<style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="from-left" style:horizontal-rel="paragraph" fo:background-color="'.$bg_color.'" style:flow-with-text="true"';
if (!empty($properties ['margin-left'])) {
$image_style .= ' fo:margin-left="'.$properties ['margin-left'].'"';
}
if (!empty($properties ['margin-right'])) {
$image_style .= ' fo:margin-right="'.$properties ['margin-right'].'"';
}
if (!empty($properties ['margin-top'])) {
$image_style .= ' fo:margin-top="'.$properties ['margin-top'].'"';
}
if (!empty($properties ['margin-bottom'])) {
$image_style .= ' fo:margin-bottom="'.$properties ['margin-bottom'].'"';
}
$image_style .= '></style:graphic-properties></style:style>';
// Add style and image to our document
// (as unknown style because style-family graphic is not supported)
$style_obj = ODTUnknownStyle::importODTStyle($image_style);
$params->document->addAutomaticStyle($style_obj);
if ($title) {
$encoded .= '<draw:frame draw:style-name="'.$style_name.'" draw:name="'.$params->document->replaceXMLEntities($title).' Legend"
text:anchor-type="'.$anchor.'" draw:z-index="0" svg:width="'.$width.'">';
$encoded .= '<draw:text-box>';
$encoded .= '<text:p text:style-name="'.$params->document->getStyleName('legend center').'">';
}
if (!empty($title)) {
$encoded .= '<draw:frame draw:style-name="'.$style_name.'" draw:name="'.$params->document->replaceXMLEntities($title).'"
text:anchor-type="'.$anchor.'" draw:z-index="'.$z.'"
svg:width="'.$width.'" svg:height="'.$height.'" >';
} else {
$encoded .= '<draw:frame draw:style-name="'.$style_name.'" draw:name="'.$z.'"
text:anchor-type="'.$anchor.'" draw:z-index="'.$z.'"
svg:width="'.$width.'" svg:height="'.$height.'" >';
}
$encoded .= '<draw:image xlink:href="'.$params->document->replaceXMLEntities($name).'"
xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>';
$encoded .= '</draw:frame>';
if ($title) {
$encoded .= $params->document->replaceXMLEntities($title).'</text:p></draw:text-box></draw:frame>';
}
if($returnonly) {
return $encoded;
} else {
$params->content .= $encoded;
}
$z++;
}
}