{"id":1148,"date":"2025-06-12T14:14:49","date_gmt":"2025-06-12T06:14:49","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1148.html"},"modified":"2025-06-12T14:14:49","modified_gmt":"2025-06-12T06:14:49","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8symfony%e4%b8%ad%e8%bf%94%e5%9b%9epdf%e6%96%87%e4%bb%b6","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1148.html","title":{"rendered":"\u5982\u4f55\u5728Symfony\u4e2d\u8fd4\u56dePDF\u6587\u4ef6"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312;Symfony&#20013;&#36820;&#22238;PDF&#25991;&#20214;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;<code>SymfonyComponentHttpFoundationResponse<\/code>&#31867;&#26469;&#21019;&#24314;&#21644;&#21457;&#36865;PDF&#25991;&#20214;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#29983;&#25104;&#24182;&#36820;&#22238;&#19968;&#20010;PDF&#25991;&#20214;&#12290;<\/p>\n<h3>1. &#23433;&#35013;&#24517;&#35201;&#30340;&#21253;<\/h3>\n<p>&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#24050;&#32463;&#23433;&#35013;&#20102;<code>KnpSnappyBundle<\/code>&#65292;&#23427;&#21487;&#20197;&#24110;&#21161;&#20320;&#22312; Symfony &#20013;&#29983;&#25104; PDF &#25991;&#20214;&#12290;<\/p>\n<pre><code class=\"language-bash\">composer require knplabs\/knpsnappy-bundle<\/code><\/pre>\n<p>&#28982;&#21518;&#65292;&#37197;&#32622; <code>KnpSnappyBundle<\/code>&#65306;<\/p>\n<pre><code class=\"language-yaml\"># config\/packages\/knpsnappy.yaml\nknpsnappy:\n    pdf: ~\n    image: ~<\/code><\/pre>\n<h3>2. &#21019;&#24314;&#19968;&#20010;&#25511;&#21046;&#22120;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702;&#29983;&#25104;PDF&#25991;&#20214;&#30340;&#35831;&#27714;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Controller\/PdfController.php\nnamespace AppController;\n\nuse KnpSnappyPdf;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\n\nclass PdfController extends AbstractController\n{\n    private $pdf;\n\n    public function __construct(Pdf $pdf)\n    {\n        $this-&gt;pdf = $pdf;\n    }\n\n    public function generatePdf(Request $request): Response\n    {\n        \/\/ &#27169;&#26495;&#36335;&#24452;\n        $templatePath = 'path\/to\/your\/template.html.twig';\n\n        \/\/ &#25968;&#25454;\n        $data = [\n            'title' =&gt; 'Example PDF',\n            'content' =&gt; 'This is a sample content for the PDF.',\n        ];\n\n        \/\/ &#29983;&#25104;PDF\n        $pdfContent = $this-&gt;renderView($templatePath, $data);\n\n        \/\/ &#35774;&#32622;&#21709;&#24212;&#22836;\n        $response = new Response();\n        $response-&gt;headers-&gt;set('Content-Type', 'application\/pdf');\n        $response-&gt;headers-&gt;set('Content-Disposition', 'attachment; filename=\"example.pdf\"');\n\n        \/\/ &#20889;&#20837;PDF&#20869;&#23481;&#21040;&#21709;&#24212;\n        $response-&gt;setContent($pdfContent);\n\n        return $response;\n    }\n}<\/code><\/pre>\n<h3>3. &#37197;&#32622;&#36335;&#30001;<\/h3>\n<p>&#22312; <code>config\/routes.yaml<\/code> &#20013;&#37197;&#32622;&#36335;&#30001;&#20197;&#35775;&#38382;&#36825;&#20010;&#25511;&#21046;&#22120;&#30340;&#26041;&#27861;&#12290;<\/p>\n<pre><code class=\"language-yaml\"># config\/routes.yaml\napp_pdf:\n    path: \/generate-pdf\n    controller: AppControllerPdfController::generatePdf<\/code><\/pre>\n<h3>4. &#20351;&#29992;&#27169;&#26495;<\/h3>\n<p>&#30830;&#20445;&#20320;&#26377;&#19968;&#20010; Twig &#27169;&#26495;&#26469;&#29983;&#25104; PDF &#20869;&#23481;&#12290;&#20363;&#22914;&#65292;<code>src\/Resources\/views\/pdf\/example.html.twig<\/code>&#65306;<\/p>\n<pre><code class=\"language-twig\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;{{ title }}&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;{{ title }}&lt;\/h1&gt;\n    &lt;p&gt;{{ content }}&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<h3>5. &#27979;&#35797;<\/h3>\n<p>&#21551;&#21160;&#20320;&#30340; Symfony &#24212;&#29992;&#31243;&#24207;&#65292;&#24182;&#36890;&#36807;&#27983;&#35272;&#22120;&#35775;&#38382; <code>\/generate-pdf<\/code> &#36335;&#24452;&#12290;&#20320;&#24212;&#35813;&#20250;&#19979;&#36733;&#19968;&#20010;&#21517;&#20026; <code>example.pdf<\/code> &#30340;&#25991;&#20214;&#12290;<\/p>\n<p>&#24076;&#26395;&#36825;&#20010;&#31034;&#20363;&#33021;&#24110;&#21161;&#20320;&#22312; Symfony &#20013;&#25104;&#21151;&#36820;&#22238;PDF&#25991;&#20214;&#65281;&#22914;&#26524;&#26377;&#20219;&#20309;&#38382;&#39064;&#65292;&#35831;&#38543;&#26102;&#25552;&#38382;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#27010;&#35272;<\/h2><p>&#22312;Web&#24212;&#29992;&#31243;&#24207;&#30340;&#19990;&#30028;&#37324;&#65292;&#32463;&#24120;&#38656;&#35201;&#29983;&#25104;&#21644;&#20132;&#20184;&#21508;&#31181;&#26684;&#24335;&#30340;&#25991;&#20214;&#65307;&#24120;&#35265;&#30340;&#26684;&#24335;&#20043;&#19968;&#23601;&#26159;PDF&#12290;Symfony&#65292;&#20316;&#20026;PHP&#26500;&#24314;Web&#24212;&#29992;&#30340;&#24378;&#22823;&#26694;&#26550;&#65292;&#25552;&#20379;&#20102;&#22810;&#31181;&#22788;&#29702;&#36825;&#31181;&#38656;&#27714;&#30340;&#26041;&#27861;&#12290;&#22312;&#36825;&#31687;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;&#22914;&#20309;&#22312;Symfony&#24212;&#29992;&#20013;&#36820;&#22238;PDF&#25991;&#20214;&#20316;&#20026;&#21709;&#24212;&#30340;&#26041;&#24335;&#12290;<\/p><h2>Symfony&#30340;Response&#31867;&#20171;&#32461;<\/h2><p>Symfony&#30340;HTTPFoundation&#32452;&#20214;&#25552;&#20379;&#20102;&#22788;&#29702;HTTP&#35831;&#27714;&#21644;&#21709;&#24212;&#30340;&#24378;&#22823;&#25277;&#35937;&#12290;&#38500;&#27492;&#20043;&#22806;&#65292;&#23427;&#36824;&#20801;&#35768;&#20320;&#21019;&#24314;&#21508;&#31181;&#31867;&#22411;&#30340;&#21709;&#24212;&#65292;&#21253;&#25324;&#36866;&#21512;PDF&#25991;&#20214;&#30340;&#20108;&#36827;&#21046;&#25991;&#20214;&#21709;&#24212;&#12290;&#36820;&#22238;&#25991;&#20214;&#30340;&#26368;&#31616;&#21333;&#26041;&#27861;&#26159;&#20351;&#29992;&#12290;<code>BinaryFileResponse<\/code>&#23545;&#19981;&#36215;&#65292;&#25105;&#19981;&#22826;&#26126;&#30333;&#24744;&#30340;&#24847;&#24605;&#12290;&#24744;&#33021;&#21542;&#25552;&#20379;&#26356;&#22810;&#35814;&#32454;&#20449;&#24687;&#25110;&#37325;&#26032;&#25551;&#36848;&#24744;&#30340;&#38382;&#39064;&#65311;<\/p><h2>&#27491;&#22312;&#20026;&#24744;&#29983;&#25104;PDF&#25991;&#20214;&#12290;&#35831;&#31245;&#31561;&#29255;&#21051;&#12290;<\/h2><p>&#22312;&#36820;&#22238;&#19968;&#20010;PDF&#20043;&#21069;&#65292;&#24744;&#38656;&#35201;&#29983;&#25104;&#19968;&#20010;&#12290;&#24744;&#21487;&#20197;&#20351;&#29992;&#22914;TCPDF&#25110;FPDF&#36825;&#26679;&#30340;&#24211;&#20174;&#22836;&#24320;&#22987;&#21019;&#24314;&#19968;&#20010;PDF&#12290;&#24403;&#22788;&#29702;HTML&#27169;&#26495;&#26102;&#65292;&#29305;&#21035;&#26159;&#24403;&#19982;Dompdf&#25110;&#20854;&#20182;HTML&#21040;PDF&#36716;&#25442;&#22120;&#24211;&#32467;&#21512;&#20351;&#29992;&#26102;&#65292;&#26356;&#23454;&#29992;&#30340;&#26041;&#27861;&#12290;&#19968;&#26086;&#23558;&#36873;&#25321;&#30340;PDF&#29983;&#25104;&#24211;&#28155;&#21152;&#21040;&#24744;&#30340;&#39033;&#30446;&#20013;&#65292;&#36890;&#36807;Composer&#23558;&#20854;&#28155;&#21152;&#21040;&#39033;&#30446;&#20013;&#21518;&#65292;&#24744;&#23601;&#21487;&#20197;&#24320;&#22987;&#21019;&#24314;&#24744;&#30340;PDF&#20102;&#12290;<\/p><p>&#20197;&#19979;&#26159;&#20351;&#29992;KnpSnappyBundle&#29983;&#25104;PDF&#30340;&#31034;&#20363;&#65306;<\/p><pre><code>use KnpSnappyPdf;\n\n$snappy = new Pdf('\/usr\/local\/bin\/wkhtmltopdf');\n\n\/\/ You can pass previously rendered HTML to this method\n$html = $this-&gt;renderView('your_template.html.twig', ['some' =&gt; 'data']);\n$pdfContent = $snappy-&gt;getOutputFromHtml($html);\n\/\/ Now you have your PDF content in $pdfContent variable\n<\/code><\/pre><h2>&#36820;&#22238;&#19968;&#20010;PDF&#21709;&#24212;&#12290;<\/h2><p>&#19968;&#26086;&#29983;&#25104;&#20102;PDF&#65292;&#36820;&#22238;&#20316;&#20026;&#21709;&#24212;&#20063;&#38750;&#24120;&#31616;&#21333;&#65306;<\/p><pre><code>use SymfonyComponentHttpFoundationBinaryFileResponse;\n\npublic function downloadPdfAction()\n{\n    \/\/ Assuming you've saved the PDF at $pdfPath\n    $pdfPath = $this-&gt;getParameter('pdf_directory').'\/file.pdf';\n\n    return new BinaryFileResponse($pdfPath);\n}\n<\/code><\/pre><h3>&#35774;&#32622;Content-Disposition&#22836;&#12290;<\/h3><p>&#20026;&#20102;&#24378;&#21046;&#27983;&#35272;&#22120;&#19979;&#36733;PDF&#25991;&#20214;&#32780;&#19981;&#26159;&#26174;&#31034;&#23427;&#65292;&#20320;&#38656;&#35201;&#35774;&#32622;Content-Disposition&#22836;&#37096;&#20026;&lsquo;attachment&rsquo;&#12290;<\/p><pre><code>use SymfonyComponentHttpFoundationBinaryFileResponse;\nuse SymfonyComponentHttpFoundationResponseHeaderBag;\n\npublic function downloadPdfAction()\n{\n    $pdfPath = $this-&gt;getParameter('pdf_directory').'\/file.pdf';\n    $response = new BinaryFileResponse($pdfPath);\n    $response-&gt;setContentDisposition(\n        ResponseHeaderBag::DISPOSITION_ATTACHMENT,\n        'filename.pdf'\n    );\n\n    return $response;\n}\n<\/code><\/pre><p>&#19978;&#36848;&#20195;&#30721;&#65292;&#24403;&#29992;&#25143;&#35775;&#38382;&#30456;&#20851;URL&#26102;&#65292;&#20250;&#24377;&#20986;&#19968;&#20010;&#19979;&#36733;&#31383;&#21475;&#65292;&#25991;&#20214;&#21517;&#20026;&ldquo;filename.pdf&rdquo;&#12290;<\/p><h2>&#28857;&#25773;&#22238;&#24212;<\/h2><p>&#22914;&#26524;&#29992;&#25143;&#22312;&#19979;&#36733;PDF&#26102;&#38656;&#35201;&#23454;&#26102;&#29983;&#25104;&#65292;Symfony&#26377;&#19968;&#20010;&#21151;&#33021;&#21487;&#20197;&#23454;&#29616;&#36825;&#19968;&#28857;&#12290;<code>StreamedResponse<\/code>&#36825;&#23588;&#20854;&#36866;&#29992;&#20110;&#22823;&#22411;&#25991;&#20214;&#25110;&#24403;PDF&#29983;&#25104;&#36807;&#31243;&#36164;&#28304;&#28040;&#32791;&#36739;&#22823;&#26102;&#12290;<\/p><pre><code>use SymfonyComponentHttpFoundationStreamedResponse;\n\npublic function streamPdfAction()\n{\n    $response = new StreamedResponse(function () {\n        \/\/ This is where the PDF generation logic goes\n        \/\/ You can echo the PDF content here\n        \/\/ This example uses the KnpSnappyBundle\n        $snappy = new Pdf('\/usr\/local\/bin\/wkhtmltopdf');\n        $html = $this-&gt;renderView('your_template.html.twig', ['some' =&gt; 'data']);\n        $pdfContent = $snappy-&gt;getOutputFromHtml($html);\n        echo $pdfContent;\n    });\n\n    $response-&gt;setStatusCode(Response::HTTP_OK);\n    $response-&gt;headers-&gt;set('Content-Type', 'application\/pdf');\n    \/\/ This will suggest saving the PDF as 'filename.pdf'\n    $response-&gt;headers-&gt;set('Content-Disposition', 'attachment; filename=\"filename.pdf\"');\n\n    return $response;\n}\n<\/code><\/pre><h2>&#32467;&#35770;&#12290;<\/h2><p>&#26412;&#25351;&#21335;&#23637;&#31034;&#20102;&#22312;Symfony&#24212;&#29992;&#20013;&#36820;&#22238;PDF&#25991;&#20214;&#30340;&#22810;&#31181;&#26041;&#27861;&#65292;&#26080;&#35770;&#26159;&#21542;&#39044;&#20808;&#29983;&#25104;&#24182;&#20445;&#23384;&#22312;&#26381;&#21153;&#22120;&#19978;&#65292;&#36824;&#26159;&#26681;&#25454;&#35831;&#27714;&#21160;&#24577;&#29983;&#25104;&#12290;&#22312;&#26381;&#21153;&#25991;&#20214;&#26102;&#65292;&#35831;&#22987;&#32456;&#32771;&#34385;&#23433;&#20840;&#24615;&#38382;&#39064;&#65292;&#24182;&#36866;&#24403;&#39564;&#35777;&#26435;&#38480;&#20197;&#38450;&#27490;&#26410;&#32463;&#25480;&#26435;&#35775;&#38382;&#25991;&#20214;&#12290;<\/p><p>&#35760;&#24471;&#21033;&#29992;Symfony&#30340;&#29305;&#24615;&#26469;&#32467;&#26500;&#21270;&#20195;&#30721;&#65292;&#20351;&#20854;&#26082;&#39640;&#25928;&#21448;&#26131;&#20110;&#38405;&#35835;&#12290;&#20511;&#21161;&#21512;&#36866;&#30340;PDF&#29983;&#25104;&#24211;&#21644;Symfony&#30340;HTTPFoundation&#32452;&#20214;&#65292;&#20320;&#21487;&#20197;&#20026;&#24212;&#29992;&#26500;&#24314;&#19968;&#20010;&#24378;&#22823;&#30340;&#25991;&#20214;&#19979;&#36733;&#35299;&#20915;&#26041;&#26696;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#35201;&#22312;Symfony&#20013;&#29983;&#25104;&#21644;&#36820;&#22238;PDF&#25991;&#20214;&#65292;&#20320;&#38656;&#35201;&#20351;&#29992;<code>SwiftMailer<\/code>&#26469;&#21457;&#36865;&#37038;&#20214;&#65292;&#24182;&#21033;&#29992;<code>DOMDocument<\/code>&#26469;&#21019;&#24314;PDF&#25991;&#26723;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#22522;&#26412;&#30340;&#27493;&#39588;&#25351;&#21335;&#65306;<\/p>\n<h3>&#27493;&#39588; 1: &#23433;&#35013;&#24517;&#35201;&#30340;&#24211;<\/h3>\n<p>&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#22312;&#39033;&#30446;&#20013;&#23433;&#35013;&#20102;&#20197;&#19979;&#20004;&#20010;&#20381;&#36182;&#39033;&#65306;<\/p>\n<ul>\n<li><code>swiftmailer<\/code>: &#20351;&#29992;&#23427;&#26469;&#21457;&#36865;&#30005;&#23376;&#37038;&#20214;&#12290;<\/li>\n<li><code>dompdf<\/code>: &#20351;&#29992;&#23427;&#26469;&#21019;&#24314;PDF&#12290;<\/li>\n<\/ul>\n<p>&#20320;&#21487;&#20197;&#36890;&#36807;Composer&#36827;&#34892;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require swiftmailer\/swiftmailer dompdf\/dompdf<\/code><\/pre>\n<h3>&#27493;&#39588; 2: &#21019;&#24314;&#19968;&#20010;&#31616;&#21333;&#30340;PHP&#25511;&#21046;&#22120;<\/h3>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026;<code>MyController.php<\/code>&#30340;&#25511;&#21046;&#22120;&#65292;&#29992;&#20110;&#22788;&#29702;PDF&#35831;&#27714;&#12290;&#25105;&#20204;&#23558;&#21019;&#24314;&#19968;&#20010;&#26041;&#27861;&#26469;&#29983;&#25104;PDF&#24182;&#21457;&#36865;&#21040;&#23458;&#25143;&#31471;&#12290;<\/p>\n<pre><code class=\"language-php\">&lt;?php\nnamespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationResponse;\nuse Swift_Mailer;\nuse DompdfDompdf;\n\nclass MyController extends AbstractController\n{\n    public function pdfAction()\n    {\n        $mail = new Swift_Mailer($this-&gt;getContainer());\n        $document = new Dompdf();\n\n        \/\/ &#35774;&#32622;&#23383;&#20307;&#26679;&#24335;&#31561;&#36873;&#39033;\n        $document-&gt;setOptions(['isHtml5ParserEnabled' =&gt; true, 'enableCoreMathJax' =&gt; true]);\n\n        \/\/ &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#39029;&#38754;\n        $page = $document-&gt;createPage(0);\n        $page-&gt;setScale(3.0);\n\n        \/\/ &#28155;&#21152;&#25991;&#26412;\n        $text = '&lt;h1&gt;Hello World!&lt;\/h1&gt;';\n        $paragraphs = explode(\"n\", $text);\n        foreach ($paragraphs as $paragraph) {\n            $page-&gt;addText($paragraph);\n        }\n\n        \/\/ &#36755;&#20986;PDF\n        return $document-&gt;render();\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#39318;&#20808;&#20174;SwiftMailer&#20013;&#33719;&#21462;&#20102;&#19968;&#20010;&#23454;&#20363;&#65292;&#28982;&#21518;&#21019;&#24314;&#20102;&#19968;&#20010;&#26032;&#30340;Dompdf&#23545;&#35937;&#12290;&#25509;&#30528;&#65292;&#25105;&#20204;&#35774;&#32622;&#20102;&#23383;&#20307;&#26679;&#24335;&#21644;&#20854;&#20182;&#36873;&#39033;&#65288;&#22914;HTML&#35299;&#26512;&#22120;&#21644;&#25968;&#23398;jax&#25903;&#25345;&#65289;&#12290;&#28982;&#21518;&#65292;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;&#26032;&#30340;&#39029;&#38754;&#65292;&#28155;&#21152;&#20102;&#19968;&#20123;&#25991;&#26412;&#65292;&#26368;&#21518;&#23558;&#39029;&#38754;&#28210;&#26579;&#20026;PDF&#24182;&#23558;&#20854;&#36820;&#22238;&#12290;<\/p>\n<h3>&#27493;&#39588; 3: &#20351;&#29992;SwiftMailer&#21457;&#36865;PDF<\/h3>\n<p>&#20026;&#20102;&#21457;&#36865;PDF&#65292;&#25105;&#20204;&#21487;&#20197;&#20351;&#29992;SwiftMailer&#20013;&#30340;<code>send()<\/code>&#26041;&#27861;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#25105;&#20204;&#35201;&#21457;&#36865;&#32473;&#29305;&#23450;&#30340;&#25910;&#20214;&#20154;&#65292;&#21487;&#20197;&#36825;&#26679;&#20570;&#65306;<\/p>\n<pre><code class=\"language-php\">$mail-&gt;send(new Swift_Message('Hello world!'), function (Swift_Message $message) use ($document) {\n    $message\n        -&gt;setSubject('SwiftMailer PDF Example')\n        -&gt;setFrom(['sender@example.com'])\n        -&gt;setTo(['receiver@example.com']);\n    $message-&gt;attach($document);\n});<\/code><\/pre>\n<p>&#36825;&#23558;&#21457;&#36865;&#19968;&#23553;&#24102;&#26377;&#38468;&#20214;&#65288;&#21363;&#25105;&#20204;&#30340;PDF&#65289;&#30340;&#30005;&#23376;&#37038;&#20214;&#12290;<\/p>\n<h3>&#27493;&#39588; 4: &#23558;PDF&#25554;&#20837;&#35270;&#22270;<\/h3>\n<p>&#22914;&#26524;&#20320;&#38656;&#35201;&#22312;&#27169;&#26495;&#20013;&#26174;&#31034;PDF&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#25805;&#20316;&#65306;<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;title&gt;Title of the Document&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;?php echo $content; ?&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;<code>$content<\/code>&#26159;&#25105;&#20204;&#22312;&#20043;&#21069;&#29983;&#25104;&#30340;PDF&#30340;&#20869;&#23481;&#12290;<\/p>\n<p>&#24635;&#32467;&#19968;&#19979;&#65292;&#20197;&#19978;&#23601;&#26159;&#20351;&#29992;SwiftMailer&#21644;Dompdf&#22312;Symfony&#20013;&#29983;&#25104;&#21644;&#36820;&#22238;PDF&#25991;&#20214;&#30340;&#22522;&#26412;&#27493;&#39588;&#12290;&#26681;&#25454;&#20855;&#20307;&#38656;&#27714;&#65292;&#20320;&#21487;&#33021;&#38656;&#35201;&#35843;&#25972;&#36825;&#20123;&#35774;&#32622;&#20197;&#28385;&#36275;&#20320;&#30340;&#24212;&#29992;&#35201;&#27714;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312;Symfony&#20013;&#36820;&#22238;PDF&#25991;&#20214;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;SymfonyComponentHttpFounda..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1148","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1148"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1148"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1148"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}