 |
[PHP]
PHP PDF Benchmark mpdf, tcpdf, dompdf |
|
 |
|
|
 |
 |
|
คือผมสงสัยว่าจะเอาตัวสร้าง PDF ตัวไหนดี ไปอ่านๆคนนั้นก็บอกตัวนั้น คนโน้นก็บอกตัวโน้น มันไม่มีใครทำทดสอบมาให้เห็นจะจะเลยสักที เลยเขียนทดสอบเองแม่มเลย  
สเป็ค:
ต้องสร้าง PDF จาก HTML ได้เท่านั้น เพราะจะต้องทำหน้า editor ให้แก้ไขได้ ซึ่งไม่มีวิธีอื่น.
PDF library ที่ทดสอบ Mpdf, TCPDF, DomPDF
ติดตั้งโดยใช้ Composer
ทดสอบครั้งที่ 1
ทดสอบโดยใช้การกำหนดค่าต่างๆให้น้อยที่สุดแต่จะต้องแสดงภาษาไทย, อังกฤษ, ตาราง ได้ด้วย.
Code
{
"require": {
"mpdf/mpdf": "^8.0",
"tecnickcom/tcpdf": "^6.3",
"dompdf/dompdf": "^0.8.3"
}
}
composer.json
Code (PHP)
01. <?php
02.
03.
04. require_once 'vendor/autoload.php' ;
05.
06.
07. $htmlcontent = <<< EOD
08. <p>ก็ภาษาไทยอะแหละ + English ใช้ตัว generator หรือคัดลอกจากเว็บข่าวที่ไหนก็ได้สักแห่งเอาละกัน เอาตารางมาลงทดลองด้วย</p>
09. EOD;
10.
template-content.php
Code (PHP)
01. <?php
02.
03. use Mpdf\Mpdf;
04.
05. require 'template-content.php' ;
06.
07.
08. $defaultConfig = ( new \Mpdf\Config\ConfigVariables())->getDefaults();
09. $fontDirs = $defaultConfig [ 'fontDir' ];
10.
11. $defaultFontConfig = ( new \Mpdf\Config\FontVariables())->getDefaults();
12. $fontData = $defaultFontConfig [ 'fontdata' ];
13.
14. $Mpdf = new Mpdf([
15. 'fontDir' => array_merge ( $fontDirs , [
16. __DIR__ . '/fonts' ,
17. ]),
18. 'fontdata' => $fontData + [
19. 'thsarabun' => [
20. 'R' => 'THSarabunNew.ttf' ,
21. 'I' => 'THSarabunNew Italic.ttf' ,
22. 'B' => 'THSarabunNew Bold.ttf' ,
23. ]
24. ],
25. 'mode' => 'utf-8' ,
26. 'default_font' => 'thsarabun' ,
27. 'default_font_size' => 12,
28. ]);
29. $Mpdf ->writeHTML( $htmlcontent );
30. $Mpdf ->Output( __FILE__ . '.pdf' , 'F' );
31.
32.
33. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
34. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
35. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test02-mpdf.php
Code (PHP)
01. <?php
02.
03. require 'template-content.php' ;
04.
05.
06. $TCPDF = new TCPDF();
07. $TCPDF ->AddPage();
08. $TCPDF ->SetFont( 'thsarabun' , '' , 12);
09. $TCPDF ->writeHTML( $htmlcontent );
10. $TCPDF ->Output( __FILE__ . '.pdf' , 'F' );
11.
12.
13. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
14. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
15. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test03-tcpdf.php
Code (PHP)
01. <?php
02.
03. use Dompdf\Dompdf;
04.
05. require 'template-content.php' ;
06.
07.
08. $Dompdf = new Dompdf();
09. $Dompdf ->loadHtml( '<meta charset="utf-8"><style>@font-face {font-family: \'thsarabun\'; src: url(fonts/THSarabunNew.ttf) format(\'truetype\');}* {font-family: thsarabun; font-size: 12pt;}</style>' . $htmlcontent );
10. $Dompdf ->render();
11. $pdfContent = $Dompdf ->output();
12. file_put_contents ( __FILE__ . '.pdf' , $pdfContent );
13.
14.
15. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
16. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
17. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test04-dompdf.php
ผลการทดสอบ
test02-mpdf.php ใช้เวลาประมาณ 0.99347114562988 วินาที, ความจำประมาณ 14771320 ไบต์
test03-tcpdf.php ใช้เวลาประมาณ 1.5527780056 วินาที, ความจำประมาณ 9036680 ไบต์
test04-dompdf.php ใช้เวลาประมาณ 1.2879600524902 วินาที, ความจำประมาณ 6538728 ไบต์
ทดสอบครั้งที่ 2
รอบที่สองนี้จะเป็นการวัดประสิทธิภาพสำหรับการสร้างเอกสารจำนวนหน้ามากๆ.
Code
{
"require": {
"mpdf/mpdf": "^8.0",
"tecnickcom/tcpdf": "^6.3",
"dompdf/dompdf": "^0.8.3"
}
}
composer.json
Code (PHP)
01. <?php
02.
03.
04. require_once 'vendor/autoload.php' ;
05.
06.
07. $htmlcontent = <<< EOD
08. <!DOCTYPE html>
09. <html>
10. <head>
11. <meta charset= "utf-8" >
12. <style>
13. @font-face {
14. font-family: 'thsarabun' ;
15. src: url(fonts/THSarabunNew.ttf) format(\ 'truetype\' );
16. }
17. body {
18. font-family: 'thsarabun' ;
19. font-size: 12pt;
20. }
21. h1, h2, h3, h4, h5, h6 {
22. margin-top: 0;
23. margin-bottom: 10px;
24. }
25. table {
26. border: 1px solid #999;
27. border-collapse: collapse;
28. }
29. table td,
30. table th {
31. border: 1px solid #999;
32. text-align: left;
33. }
34. </style>
35. </head>
36. <body>
37. {body}
38. </body>
39. </html>
40. EOD;
41.
42. $bodycontent = <<< EOD
43. <h1>Demo PDF</h1>
44. ใส่ตาราง table เอานะตรงนี้ ไม่อยากก๊อปมามันเยอะ กระทู้จะยาวโดยไม่จำเป็น.
45. {page}
46. EOD;
47.
template-content-multipages.php
Code (PHP)
01. <?php
02.
03. use Mpdf\Mpdf;
04.
05. require 'template-content-multipages.php' ;
06.
07.
08. $defaultConfig = ( new \Mpdf\Config\ConfigVariables())->getDefaults();
09. $fontDirs = $defaultConfig [ 'fontDir' ];
10.
11. $defaultFontConfig = ( new \Mpdf\Config\FontVariables())->getDefaults();
12. $fontData = $defaultFontConfig [ 'fontdata' ];
13.
14. $Mpdf = new Mpdf([
15. 'fontDir' => array_merge ( $fontDirs , [
16. __DIR__ . '/fonts' ,
17. ]),
18. 'fontdata' => $fontData + [
19. 'thsarabun' => [
20. 'R' => 'THSarabunNew.ttf' ,
21. ]
22. ],
23. 'mode' => 'utf-8' ,
24. 'format' => [203.2, 139.7],
25. 'margin_bottom' => 4,
26. 'margin_left' => 4,
27. 'margin_right' => 4,
28. 'margin_top' => 4,
29. 'orientation' => 'P' ,
30. 'default_font' => 'thsarabun' ,
31. 'default_font_size' => 12,
32. ]);
33. for ( $i = 1; $i <= 100; $i ++) {
34. $Mpdf ->AddPage();
35. $Mpdf ->writeHTML( str_replace ( '{page}' , $i , str_replace ( '{body}' , $bodycontent , $htmlcontent )));
36. }
37. $Mpdf ->Output( __FILE__ . '.pdf' , 'F' );
38.
39.
40. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
41. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
42. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test06-mpdf-multiple.php
Code (PHP)
01. <?php
02.
03. require 'template-content-multipages.php' ;
04.
05.
06. $TCPDF = new TCPDF( '' , 'in' , [8, 5.5]);
07. $fontname = TCPDF_FONTS::addTTFfont(__DIR__ . '/fonts/THSarabunNew.ttf' , 'thsarabun' , '' , 96);
08. $TCPDF ->SetFont( $fontname , '' , 12);
09. $TCPDF ->setPrintFooter(false);
10. $TCPDF ->setPrintHeader(false);
11. $TCPDF ->SetMargins(0.15, 0.15, 0.15);
12. $TCPDF ->SetAutoPageBreak(true, 0.15);
13. for ( $i = 1; $i <= 100; $i ++) {
14. $TCPDF ->AddPage();
15. $TCPDF ->writeHTML( str_replace ( '{page}' , $i , str_replace ( '{body}' , $bodycontent , $htmlcontent )));
16. }
17. $TCPDF ->Output( __FILE__ . '.pdf' , 'F' );
18.
19.
20. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
21. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
22. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test07-tcpdf-multiple.php
Code (PHP)
01. <?php
02. ini_set ( 'memory_limit' , '64M' );
03. ini_set ( 'max_execution_time' , '300' );
04.
05. use Dompdf\Css\Style;
06. use Dompdf\Css\Stylesheet;
07. use Dompdf\Dompdf;
08.
09. require 'template-content-multipages.php' ;
10.
11.
12. $Dompdf = new Dompdf();
13. $Dompdf ->setPaper([0, 0, 576, 396]);
14. $Stylesheet = new Stylesheet( $Dompdf );
15. $Style = new Style( $Stylesheet );
16. $Style ->set_margin( '10.8pt' );
17. $Stylesheet ->add_style( 'html' , $Style );
18. unset( $Style );
19. $Style = new Style( $Stylesheet );
20. $Style ->set_page_break_before( 'always' );
21. $Stylesheet ->add_style( '.body-page' , $Style );
22. $Dompdf ->setCss( $Stylesheet );
23. $bodyPages = '' ;
24. for ( $i = 1; $i <= 100; $i ++) {
25. $bodyPages .= '<div' . ( $i > 1 ? ' class="body-page"' : '' ) . '>' . str_replace ( '{page}' , $i , $bodycontent ) . '</div>' ;
26. }
27. $Dompdf ->loadHtml( str_replace ( '{body}' , $bodyPages , $htmlcontent ));
28. $Dompdf ->render();
29. $pdfContent = $Dompdf ->output();
30. file_put_contents ( __FILE__ . '.pdf' , $pdfContent );
31.
32.
33. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
34. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
35. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
test08-dompdf-multiple.php
ผลการทดสอบ
mPDF ใช้เวลาประมาณ 21.168452978134 วินาที หน่วยความจำประมาณ 15691296 ไบต์
TCPDF ใช้เวลาประมาณ 18.786734104156 วินาที หน่วยความจำประมาณ 10454648 ไบต์
Dompdf ใช้เวลาประมาณ 39.982146978378 วินาที หน่วยความจำประมาณ 37230408 ไบต์
สรุป
TCPDF มีอิสระในการกำหนดขนาดของหน่วยต่างๆ เช่น ขนาดกระดาษ, ขนาดขอบกระดาษ แม้เรื่องของขอบกระดาษจากโค้ดที่ใช้ทดสอบนี้จะมีพื้นที่ว่างด้านบนมากจนเกินไป แต่แก้ไขได้โดยกำหนด method setHtmlVSpace() หรือใช้ HTML แค่เฉพาะที่อยู่ภายใน body และแท็ก style เท่านั้น. แต่ TCPDF ก็ไม่ค่อยรองรับการใช้งาน style sheet มากนักจากตัวอย่างปัญหาเรื่องพื้นที่ว่างด้านบนของแท็ก h1 ซึ่งต้องใช้การแก้ผ่านการกำหนด method ทั้งที่ใน style sheet ก็กำหนดไว้อยู่แล้ว.
mPDF กำหนดหน่วยขนาดได้เพียง"มิลลิเมตร"เท่านั้น ซึ่งจะต้องมาแปลงค่าอีกวุ่นวายพอสมควร แต่ว่า mPDF นั้นรองรับการทำงานของ style sheet ได้ดีกว่ากันมาก อีกทั้งยังสามารถใช้ HTML ได้เต็มตั้งแต่ doctype ลงมา. ดู HTML ที่รองรับเพิ่มเติมได้ที่เว็บของ mPDF.
ดูเพิ่มเติม https://rundiz.com/?p=622
Tag : PHP, PDF
|
ประวัติการแก้ไข 2019-12-17 21:27:25 2019-12-18 22:12:36
|
 |
 |
 |
 |
Date :
2019-12-17 17:29:21 |
By :
mr.v |
View :
4734 |
Reply :
3 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ควรลงบทความเป็นอย่างยิ่งครับ 
แต่ส่วนตัวแล้วเคยใช้ DOM ใน MVC Laravel 5.0-5.8 แล้วเกิดปัญหากับ Bootstrap เลยเปลี่ยนมาใช้ TCPDF ซึ่งใช้งานได้ดีพอสมควรเลย
|
 |
 |
 |
 |
Date :
2019-12-17 19:40:42 |
By :
Genesis™ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เข้ามาอัพเดทการทดสอบวัดประสิทธิภาพรอบ 2 โดยทดสอบจำนวน 100 หน้า ผลที่ได้กลับกันคนละเรื่องกลับการทดสอบแบบง่ายๆเลยครับ.
แล้วก็มาเพิ่มเติมตัวอย่างโค้ดทดสอบการกำหนด CSS แบบง่ายๆเพื่อทดลองดูปัญหาพื้นที่ว่างของ <h1> ใน TCPDF ด้วย.
Code (PHP)
01. <?php
02.
03. use Mpdf\Mpdf;
04.
05. require 'vendor/autoload.php' ;
06.
07. $htmlcontent = <<< EOD
08. <!DOCTYPE html>
09. <html>
10. <head>
11. <meta charset= "utf-8" >
12. <style>
13. html {
14. background-color: green;
15. }
16. body {
17. background-color: teal;
18. }
19. h1 {
20. background-color: red;
21. border-bottom: 1px solid #000;
22. margin: 0px;
23. padding: 0px;
24. }
25. p {
26. background-color: yellow;
27. margin: 0px;
28. padding: 0px;
29. }
30. </style>
31. </head>
32. <body>
33. <h1>Hello</h1>
34. <p>World</p>
35. </body>
36. </html>
37. EOD;
38.
39.
40. $defaultConfig = ( new \Mpdf\Config\ConfigVariables())->getDefaults();
41. $fontDirs = $defaultConfig [ 'fontDir' ];
42.
43. $defaultFontConfig = ( new \Mpdf\Config\FontVariables())->getDefaults();
44. $fontData = $defaultFontConfig [ 'fontdata' ];
45.
46. $Mpdf = new Mpdf([
47. 'fontDir' => array_merge ( $fontDirs , [
48. __DIR__ . '/fonts' ,
49. ]),
50. 'fontdata' => $fontData + [
51. 'thsarabun' => [
52. 'R' => 'THSarabunNew.ttf' ,
53. ]
54. ],
55. 'mode' => 'utf-8' ,
56. 'format' => [203.2, 139.7],
57. 'margin_bottom' => 4,
58. 'margin_left' => 4,
59. 'margin_right' => 4,
60. 'margin_top' => 4,
61. 'orientation' => 'P' ,
62. 'default_font' => 'thsarabun' ,
63. 'default_font_size' => 12,
64. ]);
65. $Mpdf ->AddPage();
66. $Mpdf ->writeHTML( $htmlcontent );
67. $Mpdf ->Output( __FILE__ . '.pdf' , 'F' );
68.
69.
70. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
71. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
72. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
73. echo '<a href="' . basename ( __FILE__ ) . '.pdf">view generated PDF</a><br>' . PHP_EOL;
ตัวอย่างโค้ดการกำหนด style sheet และ HTML แบบเต็มบน mPDF
ผลลัพธ์

Code (PHP)
01. <?php
02.
03. require 'vendor/autoload.php' ;
04.
05. $htmlcontent = <<< EOD
06. <style>
07. html {
08. background-color: green;
09. }
10. body {
11. background-color: teal;
12. }
13. h1 {
14. background-color: red;
15. border-bottom: 1px solid #000;
16. margin: 0px;
17. padding: 0px;
18. }
19. p {
20. background-color: yellow;
21. margin: 0px;
22. padding: 0px;
23. }
24. </style>
25. <h1>Hello</h1>
26. <p>World</p>
27. EOD;
28.
29.
30. $TCPDF = new TCPDF( '' , 'in' , [8, 5.5]);
31. $fontname = TCPDF_FONTS::addTTFfont(__DIR__ . '/fonts/THSarabunNew.ttf' , 'thsarabun' , '' , 96);
32. $TCPDF ->SetFont( $fontname , '' , 12);
33. $TCPDF ->setPrintFooter(false);
34. $TCPDF ->setPrintHeader(false);
35. $TCPDF ->SetMargins(0.15, 0.15, 0.15);
36. $TCPDF ->SetAutoPageBreak(true, 0.15);
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50. $TCPDF ->AddPage();
51. $TCPDF ->writeHTML( $htmlcontent );
52. $TCPDF ->Output( __FILE__ . '.pdf' , 'F' );
53.
54.
55. $executionTime = microtime(true) - $_SERVER [ "REQUEST_TIME_FLOAT" ];
56. echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
57. echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;
58. echo '<a href="' . basename ( __FILE__ ) . '.pdf">view generated PDF</a><br>' . PHP_EOL;
ตัวอย่างการกำหนด style sheet สำหรับ TCPDF ซึ่งดูแล้ว HTML ที่จะใช้ได้โดยไม่ให้แสดงผลพื้นที่ว่างของแท็ก <h1> ต่างกันมากนัก มันต้องใช้แบบนี้... ก็ดูพิกลพิกาลดี 
ผลลัพธ์

|
 |
 |
 |
 |
Date :
2019-12-18 22:21:00 |
By :
mr.v |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|