Change Weasyprint to use css page styles
authorBenjamin Bock <bb@users.noreply.github.com>
Mon, 18 Dec 2023 16:49:39 +0000 (17:49 +0100)
committerBenjamin Bock <bb@users.noreply.github.com>
Tue, 19 Dec 2023 08:07:37 +0000 (09:07 +0100)
CRM/Utils/PDF/Utils.php

index 53cdf3b0ed8ec9f7e12be9b59dbb5e2fe72af85e..2088228efd41793013fbfa995d72cd9240be49d6 100644 (file)
@@ -56,6 +56,22 @@ class CRM_Utils_PDF_Utils {
     // dompdf requires dimensions in points
     $paper_size = [0, 0, $paper_width, $paper_height];
     $orientation = CRM_Core_BAO_PdfFormat::getValue('orientation', $format);
+
+    if (\Civi::settings()->get('weasyprint_path')) {
+      if ($orientation == 'landscape') {
+        $css_pdf_width = $paperSize['height'];
+        $css_pdf_height = $paperSize['width'];
+      }
+      else {
+        $css_pdf_width = $paperSize['width'];
+        $css_pdf_height = $paperSize['height'];
+      }
+      $css_page_size = " size: {$css_pdf_width}{$paperSize['metric']} {$css_pdf_height}{$paperSize['metric']};";
+    }
+    else {
+      $css_page_size = "";
+    }
+
     $metric = CRM_Core_BAO_PdfFormat::getValue('metric', $format);
     $t = CRM_Core_BAO_PdfFormat::getValue('margin_top', $format);
     $r = CRM_Core_BAO_PdfFormat::getValue('margin_right', $format);
@@ -72,7 +88,7 @@ class CRM_Utils_PDF_Utils {
 <html>
   <head>
     <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
-    <style>@page { margin: {$t}{$metric} {$r}{$metric} {$b}{$metric} {$l}{$metric}; }</style>
+    <style>@page { margin: {$t}{$metric} {$r}{$metric} {$b}{$metric} {$l}{$metric};$css_page_size }</style>
     <style type=\"text/css\">@import url(" . CRM_Core_Config::singleton()->userFrameworkResourceURL . "css/print.css);</style>
     {$htmlHeader}
   </head>
@@ -102,7 +118,7 @@ class CRM_Utils_PDF_Utils {
   </body>
 </html>";
     if (\Civi::settings()->get('weasyprint_path')) {
-      return self::_html2pdf_weasyprint($paper_size, $orientation, $margins, $html, $output, $fileName);
+      return self::_html2pdf_weasyprint($html, $output, $fileName);
     }
     elseif (\Civi::settings()->get('wkhtmltopdfPath')) {
       return self::_html2pdf_wkhtmltopdf($paper_size, $orientation, $margins, $html, $output, $fileName);
@@ -146,22 +162,12 @@ class CRM_Utils_PDF_Utils {
   }
 
   /**
-   * @param float|int[] $paper_size
-   * @param string $orientation
-   * @param array $margins
    * @param string $html
    * @param bool $output
    * @param string $fileName
    */
-  public static function _html2pdf_weasyprint($paper_size, $orientation, $margins, $html, $output, $fileName) {
+  public static function _html2pdf_weasyprint($html, $output, $fileName) {
     $weasyprint = new Pontedilana\PhpWeasyPrint\Pdf(\Civi::settings()->get('weasyprint_path'));
-    $weasyprint->setOption("page-width", $paper_size[2] . "pt");
-    $weasyprint->setOption("page-height", $paper_size[3] . "pt");
-    $weasyprint->setOption("orientation", $orientation);
-    $weasyprint->setOption("margin-top", $margins[1] . $margins[0]);
-    $weasyprint->setOption("margin-right", $margins[2] . $margins[0]);
-    $weasyprint->setOption("margin-bottom", $margins[3] . $margins[0]);
-    $weasyprint->setOption("margin-left", $margins[4] . $margins[0]);
     $pdf = $weasyprint->getOutputFromHtml($html);
     if ($output) {
       return $pdf;