Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,038

HOME > PHP > PHP Forum > PHP PDF Benchmark mpdf, tcpdf, dompdf


[PHP] PHP PDF Benchmark mpdf, tcpdf, dompdf

 
Topic : 134655



โพสกระทู้ ( 4,765 )
บทความ ( 8 )



สถานะออฟไลน์



คือผมสงสัยว่าจะเอาตัวสร้าง 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.// ต้องมีเว้นวรรคบรรทัดล่างด้วย 1 บรรทัด

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.// ต้องมีเว้นวรรคบรรทัดล่างด้วย 1 บรรทัด

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],//8.0*5.5 inch
25.    'margin_bottom' => 4,// 0.15 inch
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
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2019-12-17 17:29:21 By : mr.v View : 4734 Reply : 3
 

 

No. 2



โพสกระทู้ ( 4,170 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ควรลงบทความเป็นอย่างยิ่งครับ
แต่ส่วนตัวแล้วเคยใช้ DOM ใน MVC Laravel 5.0-5.8 แล้วเกิดปัญหากับ Bootstrap เลยเปลี่ยนมาใช้ TCPDF ซึ่งใช้งานได้ดีพอสมควรเลย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-17 19:40:42 By : Genesis™
 

 

No. 3



โพสกระทู้ ( 4,765 )
บทความ ( 8 )



สถานะออฟไลน์


บทความเรียบโร้ย https://rundiz.com/?p=622
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-17 21:27:42 By : mr.v
 

 

No. 4



โพสกระทู้ ( 4,765 )
บทความ ( 8 )



สถานะออฟไลน์


เข้ามาอัพเดทการทดสอบวัดประสิทธิภาพรอบ 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],//8.0*5.5 inch
57.    'margin_bottom' => 4,// 0.15 inch
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

ผลลัพธ์
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./*$tagvs = array(
38.    'h1' => array(
39.        0 => array(
40.            'h' => '',
41.            'n' => 0
42.        ),
43.        1 => array(
44.            'h' => 'px',
45.            'n' => 1
46.        )
47.    )
48.);*/
49.//$TCPDF->setHtmlVSpace($tagvs);
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> ต่างกันมากนัก มันต้องใช้แบบนี้... ก็ดูพิกลพิกาลดี

ผลลัพธ์
tcpdf
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-18 22:21:00 By : mr.v
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : PHP PDF Benchmark mpdf, tcpdf, dompdf
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)





ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2025 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่