web/Zend/Service/LiveDocx/MailMerge.php
changeset 0 4eba9c11703f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/Zend/Service/LiveDocx/MailMerge.php	Mon Dec 13 18:29:26 2010 +0100
@@ -0,0 +1,1138 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Service
+ * @subpackage LiveDocx
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: MailMerge.php 23022 2010-10-05 15:30:55Z jonathan_maron $
+ */
+
+/** Zend_Date **/
+require_once 'Zend/Date.php';
+
+/** Zend_Service_LiveDocx **/
+require_once 'Zend/Service/LiveDocx.php';
+
+/**
+ * @category   Zend
+ * @package    Zend_Service
+ * @subpackage LiveDocx
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @since      LiveDocx 1.0 
+ */
+class Zend_Service_LiveDocx_MailMerge extends Zend_Service_LiveDocx
+{
+    /**
+     * URI of LiveDocx.MailMerge WSDL
+     * @since LiveDocx 1.0 
+     */
+    //const WSDL = 'https://api.livedocx.com/1.2/mailmerge.asmx?WSDL';
+    const WSDL = 'https://api.livedocx.com/2.0/mailmerge.asmx?WSDL';
+
+    /**
+     * Field values
+     *
+     * @var   array
+     * @since LiveDocx 1.0
+     */
+    protected $_fieldValues;
+
+    /**
+     * Block field values
+     *
+     * @var   array
+     * @since LiveDocx 1.0
+     */
+    protected $_blockFieldValues;
+
+    /**
+     * Constructor (LiveDocx.MailMerge SOAP Service)
+     *
+     * @return void
+     * @return throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function __construct($options = null)
+    {
+        $this->_wsdl             = self::WSDL;
+        $this->_fieldValues      = array();
+        $this->_blockFieldValues = array();
+        
+        parent::__construct($options);
+    }
+
+    /**
+     * Set the filename of a LOCAL template
+     * (i.e. a template stored locally on YOUR server)
+     *
+     * @param  string $filename
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function setLocalTemplate($filename)
+    {
+        if (!is_readable($filename)) {
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot read local template from disk.'
+            );
+        }
+
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->SetLocalTemplate(array(
+                'template' => base64_encode(file_get_contents($filename)),
+                'format'   => self::getFormat($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set local template', 0, $e
+            );
+        }
+
+        return $this;
+    }
+
+    /**
+     * Set the filename of a REMOTE template
+     * (i.e. a template stored remotely on the LIVEDOCX server)
+     *
+     * @param  string $filename
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function setRemoteTemplate($filename)
+    {
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->SetRemoteTemplate(array(
+                'filename' => $filename,
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set remote template', 0, $e
+            );
+        }
+
+        return $this;
+    }
+
+    /**
+     * Set an associative or multi-associative array of keys and values pairs
+     *
+     * @param  array $values
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function setFieldValues($values)
+    {
+        $this->logIn();
+        
+        foreach ($values as $value) {
+            if (is_array($value)) {
+                $method = 'multiAssocArrayToArrayOfArrayOfString';
+            } else {
+                $method = 'assocArrayToArrayOfArrayOfString';
+            }
+            break;
+        }
+        
+        try {
+            $this->getSoapClient()->SetFieldValues(array(
+                'fieldValues' => self::$method($values),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set field values', 0, $e
+            );
+        }
+
+        return $this;
+    }
+
+    /**
+     * Set an array of key and value or array of values
+     *
+     * @param string $field
+     * @param array|string $value
+     *
+     * @throws Zend_Service_LiveDocx_Exception
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @since  LiveDocx 1.0
+     */
+    public function setFieldValue($field, $value)
+    {
+        $this->_fieldValues[$field] = $value;
+        
+        return $this;
+    }
+
+    /**
+     * Set block field values
+     *
+     * @param string $blockName
+     * @param array $blockFieldValues
+     *
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function setBlockFieldValues($blockName, $blockFieldValues)
+    {
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->SetBlockFieldValues(array(
+                'blockName'        => $blockName,
+                'blockFieldValues' => self::multiAssocArrayToArrayOfArrayOfString($blockFieldValues)
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set block field values', 0, $e
+            );
+        }
+
+        return $this;
+    }
+
+    /**
+     * Assign values to template fields
+     *
+     * @param array|string $field
+     * @param array|string $value
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function assign($field, $value = null)
+    {
+        try {
+            if (is_array($field) && (null === $value)) {
+                foreach ($field as $fieldName => $fieldValue) {
+                    $this->setFieldValue($fieldName, $fieldValue);
+                }
+            } elseif (is_array($value)) {
+                $this->setBlockFieldValues($field, $value);
+            } else {
+                $this->setFieldValue($field, $value);
+            }
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot assign data to template', 0, $e
+            );
+        }
+
+        return $this;
+    }
+
+    /**
+     * Set a password to open to document
+     * 
+     * This method can only be used for PDF documents
+     * 
+     * @param  string  $password
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.2 Premium
+     */
+    public function setDocumentPassword($password)
+    {
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->SetDocumentPassword(array(
+                'password' => $password
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set document password. This method can be used on PDF files only.', 0, $e
+            );
+        }
+        
+        return $this;        
+    }
+    
+    /**
+     * Set a master password for document and determine which security features
+     * are accessible without using the master password.
+     * 
+     * As default, nothing is allowed. To allow a security setting,
+     * explicatively set it using one of he DOCUMENT_ACCESS_PERMISSION_* class
+     * constants. 
+     * 
+     * {code}
+     * $phpLiveDocx->setDocumentAccessPermissions(
+     *     array (
+     *         Zend_Service_LiveDocx_MailMerge::DOCUMENT_ACCESS_PERMISSION_ALLOW_PRINTING_HIGH_LEVEL,
+     *         Zend_Service_LiveDocx_MailMerge::DOCUMENT_ACCESS_PERMISSION_ALLOW_EXTRACT_CONTENTS
+     *     ),
+     *     'myDocumentAccessPassword'
+     * );
+     * {code}
+     * 
+     * This method can only be used for PDF documents
+     * 
+     * @param  array  $permissions 
+     * @param  string $password
+     * @return Zend_Service_LiveDocx_MailMerge
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.2 Premium
+     */
+    public function setDocumentAccessPermissions($permissions, $password)
+    {
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->SetDocumentAccessPermissions(array(
+                'permissions' => $permissions,
+                'password'    => $password
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot set document access permissions', 0, $e
+            );
+        }
+        
+        return $this;        
+    }    
+    
+    /**
+     * Merge assigned data with template to generate document
+     *
+     * @throws Zend_Service_LiveDocx_Excpetion
+     * @return void
+     * @since  LiveDocx 1.0
+     */
+    public function createDocument()
+    {
+        $this->logIn();
+        
+        if (count($this->_fieldValues) > 0) {
+            $this->setFieldValues($this->_fieldValues);
+        }
+
+        $this->_fieldValues      = array();
+        $this->_blockFieldValues = array();
+
+        try {
+            $this->getSoapClient()->CreateDocument();
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot create document', 0, $e
+            );
+        }
+    }
+
+    /**
+     * Retrieve document in specified format
+     *
+     * @param string $format
+     *
+     * @throws Zend_Service_LiveDocx_Exception
+     * @return binary
+     * @since  LiveDocx 1.0
+     */
+    public function retrieveDocument($format)
+    {
+        $this->logIn();
+        
+        $format = strtolower($format);
+        
+        try {
+            $result = $this->getSoapClient()->RetrieveDocument(array(
+                'format' => $format,
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot retrieve document - call setLocalTemplate() or setRemoteTemplate() first', 0, $e
+            );
+        }
+
+        return base64_decode($result->RetrieveDocumentResult);
+    }
+
+    /**
+     * Return WMF (aka Windows metafile) data for specified page range of created document
+     * Return array contains WMF data (binary) - array key is page number
+     *
+     * @param  integer $fromPage
+     * @param  integer $toPage
+     * @return array
+     * @since  LiveDocx 1.2
+     */
+    public function getMetafiles($fromPage, $toPage)
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetMetafiles(array(
+            'fromPage' => (integer) $fromPage,
+            'toPage'   => (integer) $toPage,
+        ));
+
+        if (isset($result->GetMetafilesResult->string)) {
+            $pageCounter = (integer) $fromPage;
+            if (is_array($result->GetMetafilesResult->string)) {
+                foreach ($result->GetMetafilesResult->string as $string) {
+                    $ret[$pageCounter] = base64_decode($string);
+                    $pageCounter++;
+                }
+            } else {
+               $ret[$pageCounter] = base64_decode($result->GetMetafilesResult->string);
+            }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return WMF (aka Windows metafile) data for pages of created document
+     * Return array contains WMF data (binary) - array key is page number
+     *
+     * @return array
+     * @since  LiveDocx 1.2
+     */
+    public function getAllMetafiles()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetAllMetafiles();
+
+        if (isset($result->GetAllMetafilesResult->string)) {
+            $pageCounter = 1;
+            if (is_array($result->GetAllMetafilesResult->string)) {
+                foreach ($result->GetAllMetafilesResult->string as $string) {
+                    $ret[$pageCounter] = base64_decode($string);
+                    $pageCounter++;
+                }
+            } else {
+               $ret[$pageCounter] = base64_decode($result->GetAllMetafilesResult->string);
+            }
+        }
+
+        return $ret;
+    }    
+    
+    /**
+     * Return graphical bitmap data for specified page range of created document
+     * Return array contains bitmap data (binary) - array key is page number
+     *
+     * @param  integer $fromPage
+     * @param  integer $toPage
+     * @param  integer $zoomFactor
+     * @param  string  $format
+     * @return array
+     * @since  LiveDocx 1.2
+     */    
+    public function getBitmaps($fromPage, $toPage, $zoomFactor, $format)
+    {
+        $this->logIn();
+        
+        $ret = array();
+        
+        $result = $this->getSoapClient()->GetBitmaps(array(
+            'fromPage'   => (integer) $fromPage,
+            'toPage'     => (integer) $toPage,
+            'zoomFactor' => (integer) $zoomFactor,
+            'format'     => (string)  $format,
+        ));
+
+        if (isset($result->GetBitmapsResult->string)) {
+            $pageCounter = (integer) $fromPage;
+            if (is_array($result->GetBitmapsResult->string)) {
+                foreach ($result->GetBitmapsResult->string as $string) {
+                    $ret[$pageCounter] = base64_decode($string);
+                    $pageCounter++;
+                }
+            } else {
+               $ret[$pageCounter] = base64_decode($result->GetBitmapsResult->string);
+            }
+        }
+
+        return $ret;        
+    }
+    
+    /**
+     * Return graphical bitmap data for all pages of created document
+     * Return array contains bitmap data (binary) - array key is page number
+     *
+     * @param  integer $zoomFactor
+     * @param  string  $format
+     * @return array
+     * @since  LiveDocx 1.2
+     */    
+    public function getAllBitmaps($zoomFactor, $format)
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetAllBitmaps(array(
+            'zoomFactor' => (integer) $zoomFactor,
+            'format'     => (string)  $format,
+        ));
+
+        if (isset($result->GetAllBitmapsResult->string)) {
+            $pageCounter = 1;
+            if (is_array($result->GetAllBitmapsResult->string)) {
+                foreach ($result->GetAllBitmapsResult->string as $string) {
+                    $ret[$pageCounter] = base64_decode($string);
+                    $pageCounter++;
+                }
+            } else {
+               $ret[$pageCounter] = base64_decode($result->GetAllBitmapsResult->string);
+            }
+        }
+
+        return $ret;        
+    }    
+
+    /**
+     * Return all the fields in the template
+     *
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public function getFieldNames()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetFieldNames();
+
+        if (isset($result->GetFieldNamesResult->string)) {
+            if (is_array($result->GetFieldNamesResult->string)) {
+                $ret = $result->GetFieldNamesResult->string;
+            } else {
+                $ret[] = $result->GetFieldNamesResult->string;
+            }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return all the block fields in the template
+     *
+     * @param  string $blockName
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public function getBlockFieldNames($blockName)
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetBlockFieldNames(array(
+            'blockName' => $blockName
+        ));
+
+        if (isset($result->GetBlockFieldNamesResult->string)) {
+            if (is_array($result->GetBlockFieldNamesResult->string)) {
+                $ret = $result->GetBlockFieldNamesResult->string;
+            } else {
+                $ret[] = $result->GetBlockFieldNamesResult->string;
+            }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return all the block fields in the template
+     *
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public function getBlockNames()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetBlockNames();
+
+        if (isset($result->GetBlockNamesResult->string)) {
+            if (is_array($result->GetBlockNamesResult->string)) {
+                $ret = $result->GetBlockNamesResult->string;
+            } else {
+                $ret[] = $result->GetBlockNamesResult->string;
+            }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Upload a template file to LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function uploadTemplate($filename)
+    {
+        $this->logIn();
+        
+        try {
+            $this->getSoapClient()->UploadTemplate(array(
+                'template' => base64_encode(file_get_contents($filename)),
+                'filename' => basename($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot upload template', 0, $e
+            );
+        }
+    }
+
+    /**
+     * Download template file from LiveDocx service
+     *
+     * @param  string $filename
+     * @return binary
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function downloadTemplate($filename)
+    {
+        $this->logIn();
+        
+        try {
+            $result = $this->getSoapClient()->DownloadTemplate(array(
+                'filename' => basename($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot download template', 0, $e
+            );
+        }
+
+        return base64_decode($result->DownloadTemplateResult);
+    }
+
+    /**
+     * Delete a template file from LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function deleteTemplate($filename)
+    {
+        $this->logIn();
+        
+        $this->getSoapClient()->DeleteTemplate(array(
+            'filename' => basename($filename),
+        ));
+    }
+
+    /**
+     * List all templates stored on LiveDocx service
+     *
+     * @return array
+     * @since  LiveDocx 1.0 
+     */
+    public function listTemplates()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->ListTemplates();
+
+        if (isset($result->ListTemplatesResult)) {
+            $ret = $this->_backendListArrayToMultiAssocArray($result->ListTemplatesResult);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Check whether a template file is available on LiveDocx service
+     *
+     * @param  string $filename
+     * @return boolean
+     * @since  LiveDocx 1.0
+     */
+    public function templateExists($filename)
+    {
+        $this->logIn();
+        
+        $result = $this->getSoapClient()->TemplateExists(array(
+            'filename' => basename($filename),
+        ));
+
+        return (boolean) $result->TemplateExistsResult;
+    }
+
+    /**
+     * Share a document - i.e. the document is available to all over the Internet
+     *
+     * @return string
+     * @since  LiveDocx 1.0
+     */
+    public function shareDocument()
+    {
+        $this->logIn();
+        
+        $ret    = null;
+        $result = $this->getSoapClient()->ShareDocument();
+
+        if (isset($result->ShareDocumentResult)) {
+            $ret = (string) $result->ShareDocumentResult;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * List all shared documents stored on LiveDocx service
+     *
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public function listSharedDocuments()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->ListSharedDocuments();
+
+        if (isset($result->ListSharedDocumentsResult)) {
+            $ret = $this->_backendListArrayToMultiAssocArray(
+                $result->ListSharedDocumentsResult
+            );
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Delete a shared document from LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @since  LiveDocx 1.0
+     */
+    public function deleteSharedDocument($filename)
+    {
+        $this->logIn();
+        
+        $this->getSoapClient()->DeleteSharedDocument(array(
+            'filename' => basename($filename),
+        ));
+    }
+
+    /*
+     * Download a shared document from LiveDocx service
+     *
+     * @param  string $filename
+     * @return binary
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 1.0
+     */
+    public function downloadSharedDocument($filename)
+    {
+        $this->logIn();
+        
+        try {
+            $result = $this->getSoapClient()->DownloadSharedDocument(array(
+                'filename' => basename($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot download shared document', 0, $e
+            );
+        }
+
+        return base64_decode($result->DownloadSharedDocumentResult);
+    }
+
+    /**
+     * Check whether a shared document is available on LiveDocx service
+     *
+     * @param  string $filename
+     * @return boolean
+     * @since  LiveDocx 1.0
+     */
+    public function sharedDocumentExists($filename)
+    {
+        $this->logIn();
+        
+        $ret             = false;
+        $sharedDocuments = $this->listSharedDocuments();
+        foreach ($sharedDocuments as $shareDocument) {
+            if (isset($shareDocument['filename']) 
+                && (basename($filename) === $shareDocument['filename'])
+            ) {
+                $ret = true;
+                break;
+            }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return supported template formats (lowercase)
+     *
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public function getTemplateFormats()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetTemplateFormats();
+
+        if (isset($result->GetTemplateFormatsResult->string)) {
+            $ret = $result->GetTemplateFormatsResult->string;
+            $ret = array_map('strtolower', $ret);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return supported document formats (lowercase)
+     *
+     * @return array
+     * @since  LiveDocx 1.1
+     */
+    public function getDocumentFormats()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetDocumentFormats();
+
+        if (isset($result->GetDocumentFormatsResult->string)) {
+            $ret = $result->GetDocumentFormatsResult->string;
+            $ret = array_map('strtolower', $ret);
+        }
+
+        return $ret;
+    }
+        
+    /**
+     * Return the names of all fonts that are installed on backend server
+     *
+     * @return array
+     * @since  LiveDocx 1.2
+     */
+    public function getFontNames()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetFontNames();
+
+        if (isset($result->GetFontNamesResult->string)) {
+            $ret = $result->GetFontNamesResult->string;
+        }
+
+        return $ret;
+    }    
+    
+    /**
+     * Return supported document access options
+     *
+     * @return array
+     * @since  LiveDocx 1.2 Premium
+     */
+    public function getDocumentAccessOptions()
+    {
+        $this->logIn();
+        
+        $ret    = array();
+        $result = $this->getSoapClient()->GetDocumentAccessOptions();
+
+        if (isset($result->GetDocumentAccessOptionsResult->string)) {
+            $ret = $result->GetDocumentAccessOptionsResult->string;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return supported image formats from which can be imported (lowercase)
+     *
+     * @return array
+     * @since  LiveDocx 2.0
+     */
+    public function getImageImportFormats()
+    {
+        $this->logIn();
+
+        $ret    = array();
+        $result = $this->getSoapClient()->GetImageImportFormats();
+
+        if (isset($result->GetImageImportFormatsResult->string)) {
+            $ret = $result->GetImageImportFormatsResult->string;
+            $ret = array_map('strtolower', $ret);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Return supported image formats to which can be exported (lowercase)
+     *
+     * @return array
+     * @since  LiveDocx 2.0
+     */
+    public function getImageExportFormats()
+    {
+        $this->logIn();
+
+        $ret    = array();
+        $result = $this->getSoapClient()->GetImageExportFormats();
+
+        if (isset($result->GetImageExportFormatsResult->string)) {
+            $ret = $result->GetImageExportFormatsResult->string;
+            $ret = array_map('strtolower', $ret);
+        }
+
+        return $ret;
+    }
+
+    /*
+     * Return supported image formats (lowercase)
+     *
+     * @return array
+     * @since  LiveDocx 1.2
+     * @deprecated since LiveDocx 2.0
+     */
+    public function getImageFormats()
+    {
+        $replacement = 'getImageExportFormats';
+
+        /*
+        $errorMessage = sprintf(
+                        "%s::%s is deprecated as of LiveDocx 2.0. "
+                      . "It has been replaced by %s::%s() (drop in replacement)",
+                        __CLASS__, __FUNCTION__, __CLASS__, $replacement);
+
+        trigger_error($errorMessage, E_USER_NOTICE);
+        */
+        
+        return $this->$replacement();
+    }
+
+    /**
+     * Upload an image file to LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 2.0
+     */
+    public function uploadImage($filename)
+    {
+        $this->logIn();
+
+        try {
+            $this->getSoapClient()->UploadImage(array(
+                'image'    => base64_encode(file_get_contents($filename)),
+                'filename' => basename($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot upload image', 0, $e
+            );
+        }
+    }
+
+    /**
+     * Download an image file from LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 2.0
+     */
+    public function downloadImage($filename)
+    {
+        $this->logIn();
+
+        try {
+            $result = $this->getSoapClient()->DownloadImage(array(
+                'filename' => basename($filename),
+            ));
+        } catch (Exception $e) {
+            require_once 'Zend/Service/LiveDocx/Exception.php';
+            throw new Zend_Service_LiveDocx_Exception(
+                'Cannot download image', 0, $e
+            );
+        }
+
+        return base64_decode($result->DownloadImageResult);
+    }
+
+    /**
+     * List all images stored on LiveDocx service
+     *
+     * @return array
+     * @since  LiveDocx 2.0
+     */
+    public function listImages()
+    {
+        $this->logIn();
+
+        $ret    = array();
+        $result = $this->getSoapClient()->ListImages();
+
+        if (isset($result->ListImagesResult)) {
+            $ret = $this->_backendListArrayToMultiAssocArray($result->ListImagesResult);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Delete an image file from LiveDocx service
+     *
+     * @param  string $filename
+     * @return void
+     * @throws Zend_Service_LiveDocx_Exception
+     * @since  LiveDocx 2.0
+     */
+    public function deleteImage($filename)
+    {
+        $this->logIn();
+
+        $this->getSoapClient()->DeleteImage(array(
+            'filename' => basename($filename),
+        ));
+    }
+
+    /**
+     * Check whether an image file is available on LiveDocx service
+     *
+     * @param  string $filename
+     * @return boolean
+     * @since  LiveDocx 2.0
+     */
+    public function imageExists($filename)
+    {
+        $this->logIn();
+
+        $result = $this->getSoapClient()->ImageExists(array(
+            'filename' => basename($filename),
+        ));
+
+        return (boolean) $result->ImageExistsResult;
+    }
+
+    /**
+     * Convert LiveDocx service return value from list methods to consistent PHP array
+     *
+     * @param  array $list
+     * @return array
+     * @since  LiveDocx 1.0 
+     */
+    protected function _backendListArrayToMultiAssocArray($list)
+    {
+        $this->logIn();
+        
+        $ret = array();
+        if (isset($list->ArrayOfString)) {
+           foreach ($list->ArrayOfString as $a) {
+               if (is_array($a)) {      // 1 template only
+                   $o = new stdClass();
+                   $o->string = $a;
+               } else {                 // 2 or more templates
+                   $o = $a;
+               }
+               unset($a);
+
+               if (isset($o->string)) {
+                   $date1 = new Zend_Date($o->string[3], Zend_Date::RFC_1123);
+                   $date2 = new Zend_Date($o->string[1], Zend_Date::RFC_1123);
+
+                   $ret[] = array (
+                        'filename'   => $o->string[0],
+                        'fileSize'   => (integer) $o->string[2],
+                        'createTime' => (integer) $date1->get(Zend_Date::TIMESTAMP),
+                        'modifyTime' => (integer) $date2->get(Zend_Date::TIMESTAMP),
+                   );
+               }
+           }
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Convert assoc array to required SOAP type
+     *
+     * @param array $assoc
+     *
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public static function assocArrayToArrayOfArrayOfString($assoc)
+    {
+        $arrayKeys   = array_keys($assoc);
+        $arrayValues = array_values($assoc);
+        
+        return array($arrayKeys, $arrayValues);
+    }
+
+    /**
+     * Convert multi assoc array to required SOAP type
+     *
+     * @param  array $multi
+     * @return array
+     * @since  LiveDocx 1.0
+     */
+    public static function multiAssocArrayToArrayOfArrayOfString($multi)
+    {
+        $arrayKeys   = array_keys($multi[0]);
+        $arrayValues = array();
+
+        foreach ($multi as $v) {
+            $arrayValues[] = array_values($v);
+        }
+
+        $arrayKeys = array($arrayKeys);
+
+        return array_merge($arrayKeys, $arrayValues);
+    }
+
+    // -------------------------------------------------------------------------
+
+}
\ No newline at end of file