CRM-17608 - Only unzip file once
authorColeman Watts <coleman@civicrm.org>
Thu, 14 Jul 2016 16:54:55 +0000 (12:54 -0400)
committerdeb.monish <monish.deb@webaccessglobal.com>
Thu, 14 Jul 2016 18:05:43 +0000 (23:35 +0530)
CRM/Contact/Form/Task/PDFLetterCommon.php
CRM/Utils/PDF/Document.php

index e10478bfba904663d16bd27b46f70a2185d202ef..bb2755d1b7cc76350c501269c07c355c3db4ec9d 100644 (file)
@@ -349,7 +349,7 @@ class CRM_Contact_Form_Task_PDFLetterCommon {
     }
 
     if (!empty($formValues['document_file_path'])) {
-      $html_message = CRM_Utils_PDF_Document::doc2Text($formValues['document_file_path'], $formValues['document_type']);
+      list($html_message, $zip) = CRM_Utils_PDF_Document::unzipDoc($formValues['document_file_path'], $formValues['document_type']);
     }
 
     foreach ($form->_contactIds as $item => $contactId) {
@@ -391,7 +391,7 @@ class CRM_Contact_Form_Task_PDFLetterCommon {
       CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", FALSE, $formValues);
     }
     elseif (!empty($formValues['document_file_path'])) {
-      CRM_Utils_PDF_Document::printDocuments($formValues['document_file_path'], $html, $type);
+      CRM_Utils_PDF_Document::printDocuments($formValues['document_file_path'], $html, $type, $zip);
     }
     else {
       CRM_Utils_PDF_Document::html2doc($html, "CiviLetter.$type", $formValues);
index e20ae652422d70f3cd80e5e0cebf99964fa669cf..5d2c8d6231c0f6f76c6582f0ac5b211dbd18f06b 100644 (file)
@@ -35,6 +35,22 @@ require_once 'TbsZip/tbszip.php';
 
 class CRM_Utils_PDF_Document {
 
+  public static $ooxmlMap = array(
+    'docx' => array(
+      'dataFile' => 'word/document.xml',
+      'startTag' => '<w:body>',
+      // TODO need to provide proper ooxml tag for pagebreak
+      'pageBreak' => '<w:pgMar></w:pgMar>',
+      'endTag' => '</w:body></w:document>',
+    ),
+    'odt' => array(
+      'dataFile' => 'content.xml',
+      'startTag' => '<office:body>',
+      'pageBreak' => '<text:p text:style-name="Standard"></text:p>',
+      'endTag' => '</office:body></office:document-content>',
+    ),
+  );
+
   /**
    * @param array $pages
    * @param string $fileName
@@ -150,56 +166,40 @@ class CRM_Utils_PDF_Document {
   }
 
   /**
-   * Extract content of docx/odt file as text and later used for token replacement
+   * Extract content of docx/odt file
+   *
    * @param string $filePath  Document file path
    * @param string $docType  File type of document
-   * @param bool $returnZipObj  Return clsTbsZip object along with content?
    *
-   * @return string|array
-   *   File content of document as text or array of content and clsTbsZip object
+   * @return array
+   *   [string, clsTbsZip]
    */
-  public static function doc2Text($filePath, $docType, $returnZipObj = FALSE) {
-    $dataFile = ($docType == 'docx') ? 'word/document.xml' : 'content.xml';
+  public static function unzipDoc($filePath, $docType) {
+    $dataFile = SELF::$ooxmlMap[$docType]['dataFile'];
 
     $zip = new clsTbsZip();
     $zip->Open($filePath);
     $content = $zip->FileRead($dataFile);
 
-    if ($returnZipObj) {
-      return array($content, $zip);
-    }
-
-    return $content;
+    return array($content, $zip);
   }
 
   /**
    * Modify contents of docx/odt file(s) and later merged into one final document
    *
-   * @param string $filePath Document file path
-   * @param array $contents content of formatted/token-replaced document
-   * @param string $docType Document type e.g. odt/docx
+   * @param string $filePath
+   *   Document file path
+   * @param array $contents
+   *   Content of formatted/token-replaced document
+   * @param string $docType
+   *   Document type e.g. odt/docx
+   * @param clsTbsZip $zip
+   *   Zip archive
    */
-  public static function printDocuments($filePath, $contents, $docType) {
-    $ooxmlMap = array(
-      'docx' => array(
-        'dataFile' => 'word/document.xml',
-        'startTag' => '<w:body>',
-        // TODO need to provide proper ooxml tag for pagebreak
-        'pageBreak' => '<w:pgMar></w:pgMar>',
-        'endTag' => '</w:body></w:document>',
-      ),
-      'odt' => array(
-        'dataFile' => 'content.xml',
-        'startTag' => '<office:body>',
-        'pageBreak' => '<text:p text:style-name="Standard"></text:p>',
-        'endTag' => '</office:body></office:document-content>',
-      ),
-    );
-
-    $dataMap = $ooxmlMap[$docType];
+  public static function printDocuments($filePath, $contents, $docType, $zip) {
+    $dataMap = SELF::$ooxmlMap[$docType];
 
-    /* @var clsTbsZip $zip */
-    list($finalContent, $zip) = self::doc2Text($filePath, $docType, TRUE);
+    $finalContent = $zip->FileRead($dataMap['dataFile']);
 
     // token-replaced document contents of each contact will be merged into final document
     foreach ($contents as $key => $content) {