ProcessingTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <?php
  2. /**
  3. * @package Zend_Pdf
  4. * @subpackage UnitTests
  5. */
  6. /** Zend_Pdf */
  7. require_once 'Zend/Pdf.php';
  8. /** PHPUnit Test Case */
  9. require_once 'PHPUnit/Framework/TestCase.php';
  10. /**
  11. * @package Zend_Pdf
  12. * @subpackage UnitTests
  13. */
  14. class Zend_Pdf_ProcessingTest extends PHPUnit_Framework_TestCase
  15. {
  16. public function setUp()
  17. {
  18. date_default_timezone_set('GMT');
  19. }
  20. public function testCreate()
  21. {
  22. $pdf = new Zend_Pdf();
  23. // Add new page generated by Zend_Pdf object (page is attached to the specified the document)
  24. $pdf->pages[] = ($page1 = $pdf->newPage('A4'));
  25. // Add new page generated by Zend_Pdf_Page object (page is not attached to the document)
  26. $pdf->pages[] = ($page2 = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE));
  27. // Create new font
  28. $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
  29. // Apply font and draw text
  30. $page1->setFont($font, 36)
  31. ->setFillColor(Zend_Pdf_Color_Html::color('#9999cc'))
  32. ->drawText('Helvetica 36 text string', 60, 500);
  33. // Use font object for another page
  34. $page2->setFont($font, 24)
  35. ->drawText('Helvetica 24 text string', 60, 500);
  36. // Use another font
  37. $page2->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES), 32)
  38. ->drawText('Times-Roman 32 text string', 60, 450);
  39. // Draw rectangle
  40. $page2->setFillColor(new Zend_Pdf_Color_GrayScale(0.8))
  41. ->setLineColor(new Zend_Pdf_Color_GrayScale(0.2))
  42. ->setLineDashingPattern(array(3, 2, 3, 4), 1.6)
  43. ->drawRectangle(60, 400, 400, 350);
  44. // Draw circle
  45. $page2->setLineDashingPattern(Zend_Pdf_Page::LINE_DASHING_SOLID)
  46. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 0))
  47. ->drawCircle(85, 375, 25);
  48. // Draw sectors
  49. $page2->drawCircle(200, 375, 25, 2*M_PI/3, -M_PI/6)
  50. ->setFillColor(new Zend_Pdf_Color_Cmyk(1, 0, 0, 0))
  51. ->drawCircle(200, 375, 25, M_PI/6, 2*M_PI/3)
  52. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 1, 0))
  53. ->drawCircle(200, 375, 25, -M_PI/6, M_PI/6);
  54. // Draw ellipse
  55. $page2->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 0))
  56. ->drawEllipse(250, 400, 400, 350)
  57. ->setFillColor(new Zend_Pdf_Color_Cmyk(1, 0, 0, 0))
  58. ->drawEllipse(250, 400, 400, 350, M_PI/6, 2*M_PI/3)
  59. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 1, 0))
  60. ->drawEllipse(250, 400, 400, 350, -M_PI/6, M_PI/6);
  61. // Draw and fill polygon
  62. $page2->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 1));
  63. $x = array();
  64. $y = array();
  65. for ($count = 0; $count < 8; $count++) {
  66. $x[] = 140 + 25*cos(3*M_PI_4*$count);
  67. $y[] = 375 + 25*sin(3*M_PI_4*$count);
  68. }
  69. $page2->drawPolygon($x, $y,
  70. Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
  71. Zend_Pdf_Page::FILL_METHOD_EVEN_ODD);
  72. // Draw line
  73. $page2->setLineWidth(0.5)
  74. ->drawLine(60, 375, 400, 375);
  75. $pdf->save(dirname(__FILE__) . '/_files/output.pdf');
  76. unset($pdf);
  77. $pdf1 = Zend_Pdf::load(dirname(__FILE__) . '/_files/output.pdf');
  78. $this->assertTrue($pdf1 instanceof Zend_Pdf);
  79. unset($pdf1);
  80. unlink(dirname(__FILE__) . '/_files/output.pdf');
  81. }
  82. public function testModify()
  83. {
  84. $pdf = Zend_Pdf::load(dirname(__FILE__) . '/_files/pdfarchiving.pdf');
  85. // Reverse page order
  86. $pdf->pages = array_reverse($pdf->pages);
  87. // Mark page as modified
  88. foreach ($pdf->pages as $page){
  89. $page->saveGS();
  90. // Create new Style
  91. $page->setFillColor(new Zend_Pdf_Color_Rgb(0, 0, 0.9))
  92. ->setLineColor(new Zend_Pdf_Color_GrayScale(0.2))
  93. ->setLineWidth(3)
  94. ->setLineDashingPattern(array(3, 2, 3, 4), 1.6)
  95. ->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD), 32);
  96. $page->rotate(0, 0, M_PI_2/3)
  97. ->drawText('Modified by Zend Framework!', 150, 0)
  98. ->restoreGS();
  99. }
  100. // Add new page generated by Zend_Pdf object (page is attached to the specified the document)
  101. $pdf->pages[] = ($page1 = $pdf->newPage('A4'));
  102. // Add new page generated by Zend_Pdf_Page object (page is not attached to the document)
  103. $pdf->pages[] = ($page2 = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE));
  104. // Create new font
  105. $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
  106. // Apply font and draw text
  107. $page1->setFont($font, 36)
  108. ->setFillColor(Zend_Pdf_Color_Html::color('#9999cc'))
  109. ->drawText('Helvetica 36 text string', 60, 500);
  110. // Use font object for another page
  111. $page2->setFont($font, 24)
  112. ->drawText('Helvetica 24 text string', 60, 500);
  113. // Use another font
  114. $page2->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES), 32)
  115. ->drawText('Times-Roman 32 text string', 60, 450);
  116. // Draw rectangle
  117. $page2->setFillColor(new Zend_Pdf_Color_GrayScale(0.8))
  118. ->setLineColor(new Zend_Pdf_Color_GrayScale(0.2))
  119. ->setLineDashingPattern(array(3, 2, 3, 4), 1.6)
  120. ->drawRectangle(60, 400, 400, 350);
  121. // Draw circle
  122. $page2->setLineDashingPattern(Zend_Pdf_Page::LINE_DASHING_SOLID)
  123. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 0))
  124. ->drawCircle(85, 375, 25);
  125. // Draw sectors
  126. $page2->drawCircle(200, 375, 25, 2*M_PI/3, -M_PI/6)
  127. ->setFillColor(new Zend_Pdf_Color_Cmyk(1, 0, 0, 0))
  128. ->drawCircle(200, 375, 25, M_PI/6, 2*M_PI/3)
  129. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 1, 0))
  130. ->drawCircle(200, 375, 25, -M_PI/6, M_PI/6);
  131. // Draw ellipse
  132. $page2->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 0))
  133. ->drawEllipse(250, 400, 400, 350)
  134. ->setFillColor(new Zend_Pdf_Color_Cmyk(1, 0, 0, 0))
  135. ->drawEllipse(250, 400, 400, 350, M_PI/6, 2*M_PI/3)
  136. ->setFillColor(new Zend_Pdf_Color_Rgb(1, 1, 0))
  137. ->drawEllipse(250, 400, 400, 350, -M_PI/6, M_PI/6);
  138. // Draw and fill polygon
  139. $page2->setFillColor(new Zend_Pdf_Color_Rgb(1, 0, 1));
  140. $x = array();
  141. $y = array();
  142. for ($count = 0; $count < 8; $count++) {
  143. $x[] = 140 + 25*cos(3*M_PI_4*$count);
  144. $y[] = 375 + 25*sin(3*M_PI_4*$count);
  145. }
  146. $page2->drawPolygon($x, $y,
  147. Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
  148. Zend_Pdf_Page::FILL_METHOD_EVEN_ODD);
  149. // Draw line
  150. $page2->setLineWidth(0.5)
  151. ->drawLine(60, 375, 400, 375);
  152. $pdf->save(dirname(__FILE__) . '/_files/output.pdf');
  153. unset($pdf);
  154. $pdf1 = Zend_Pdf::load(dirname(__FILE__) . '/_files/output.pdf');
  155. $this->assertTrue($pdf1 instanceof Zend_Pdf);
  156. unset($pdf1);
  157. unlink(dirname(__FILE__) . '/_files/output.pdf');
  158. }
  159. public function testInfoProcessing()
  160. {
  161. $pdf = Zend_Pdf::load(dirname(__FILE__) . '/_files/pdfarchiving.pdf');
  162. $this->assertEquals($pdf->properties['Title'], 'PDF as a Standard for Archiving');
  163. $this->assertEquals($pdf->properties['Author'], 'Adobe Systems Incorporated');
  164. $metadata = $pdf->getMetadata();
  165. $metadataDOM = new DOMDocument();
  166. $metadataDOM->loadXML($metadata);
  167. $xpath = new DOMXPath($metadataDOM);
  168. $pdfPreffixNamespaceURI = $xpath->query('/rdf:RDF/rdf:Description')->item(0)->lookupNamespaceURI('pdf');
  169. $xpath->registerNamespace('pdf', $pdfPreffixNamespaceURI);
  170. $titleNodeset = $xpath->query('/rdf:RDF/rdf:Description/pdf:Title');
  171. $titleNode = $titleNodeset->item(0);
  172. $this->assertEquals($titleNode->nodeValue, 'PDF as a Standard for Archiving');
  173. $pdf->properties['Title'] .= ' (modified)';
  174. $pdf->properties['New_Property'] = 'New property';
  175. $titleNode->nodeValue .= ' (modified using RDF data)';
  176. $pdf->setMetadata($metadataDOM->saveXML());
  177. $pdf->save(dirname(__FILE__) . '/_files/output.pdf');
  178. unset($pdf);
  179. $pdf1 = Zend_Pdf::load(dirname(__FILE__) . '/_files/output.pdf');
  180. $this->assertEquals($pdf1->properties['Title'], 'PDF as a Standard for Archiving (modified)');
  181. $this->assertEquals($pdf1->properties['Author'], 'Adobe Systems Incorporated');
  182. $this->assertEquals($pdf1->properties['New_Property'], 'New property');
  183. $metadataDOM1 = new DOMDocument();
  184. $metadataDOM1->loadXML($metadata);
  185. $xpath1 = new DOMXPath($metadataDOM);
  186. $pdfPreffixNamespaceURI1 = $xpath1->query('/rdf:RDF/rdf:Description')->item(0)->lookupNamespaceURI('pdf');
  187. $xpath1->registerNamespace('pdf', $pdfPreffixNamespaceURI1);
  188. $titleNodeset1 = $xpath->query('/rdf:RDF/rdf:Description/pdf:Title');
  189. $titleNode1 = $titleNodeset->item(0);
  190. $this->assertEquals($titleNode1->nodeValue, 'PDF as a Standard for Archiving (modified using RDF data)');
  191. unset($pdf1);
  192. unlink(dirname(__FILE__) . '/_files/output.pdf');
  193. }
  194. public function testPageCloning()
  195. {
  196. $pdf = Zend_Pdf::load(dirname(__FILE__) . '/_files/pdfarchiving.pdf');
  197. $srcPageCount = count($pdf->pages);
  198. try {
  199. $newPage = clone reset($pdf->pages);
  200. } catch (Zend_Pdf_Exception $e) {
  201. if (strpos($e->getMessage(), 'Cloning Zend_Pdf_Page object using \'clone\' keyword is not supported.') !== 0) {
  202. throw $e;
  203. }
  204. // Exception is thrown
  205. }
  206. $outputPageSet = array();
  207. foreach ($pdf->pages as $srcPage){
  208. $page = new Zend_Pdf_Page($srcPage);
  209. $outputPageSet[] = $srcPage;
  210. $outputPageSet[] = $page;
  211. $page->saveGS();
  212. // Create new Style
  213. $page->setFillColor(new Zend_Pdf_Color_Rgb(0, 0, 0.9))
  214. ->setLineColor(new Zend_Pdf_Color_GrayScale(0.2))
  215. ->setLineWidth(3)
  216. ->setLineDashingPattern(array(3, 2, 3, 4), 1.6)
  217. ->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD), 32);
  218. $page->rotate(0, 0, M_PI_2/3);
  219. $page->drawText('Modified by Zend Framework!', 150, 0);
  220. $page->restoreGS();
  221. }
  222. // Add new page generated by Zend_Pdf object (page is attached to the specified the document)
  223. $pdf->pages = $outputPageSet;
  224. $pdf->save(dirname(__FILE__) . '/_files/output.pdf');
  225. unset($pdf);
  226. $pdf1 = Zend_Pdf::load(dirname(__FILE__) . '/_files/output.pdf');
  227. $this->assertTrue($pdf1 instanceof Zend_Pdf);
  228. $this->assertEquals($srcPageCount*2, count($pdf1->pages));
  229. unset($pdf1);
  230. unlink(dirname(__FILE__) . '/_files/output.pdf');
  231. }
  232. /**
  233. * @group ZF-3701
  234. */
  235. public function testZendPdfIsExtendableWithAccessToProperties()
  236. {
  237. $pdf = new ExtendedZendPdf();
  238. // Test accessing protected variables and their default content
  239. $this->assertEquals(array(), $pdf->_originalProperties);
  240. $this->assertEquals(array(), $pdf->_namedTargets);
  241. $pdfpage = new ExtendedZendPdfPage(Zend_Pdf_Page::SIZE_A4);
  242. // Test accessing protected variables and their default content
  243. $this->assertEquals(0, $pdfpage->_saveCount);
  244. }
  245. }
  246. class ExtendedZendPdf extends Zend_Pdf
  247. {
  248. public function __get($name) {
  249. if(isset($this->$name)) {
  250. return $this->$name;
  251. }
  252. }
  253. }
  254. class ExtendedZendPdfPage extends Zend_Pdf_Page
  255. {
  256. public function __get($name) {
  257. if(isset($this->$name)) {
  258. return $this->$name;
  259. }
  260. }
  261. }