changeset 3798:e008197e2215 yworks-svg2pdf

client: improve pdf generation * Use generatePDF() from HydrologicalConditions.vue to unify code. * Split out formatting of gaugeInfo, used from Waterlevel.vue and HydrologicalConditions.vue. * Make paper width and size setting in generatePDF() more readable by grouping the conditions more logically.
author Bernhard Reiter <bernhard@intevation.de>
date Thu, 04 Jul 2019 10:15:46 +0200
parents 20c1ac8ab8a2
children f4deb4aae485
files client/src/components/gauge/HydrologicalConditions.vue client/src/components/gauge/Waterlevel.vue client/src/lib/mixins.js
diffstat 3 files changed, 32 insertions(+), 125 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/gauge/HydrologicalConditions.vue	Thu Jul 04 10:12:19 2019 +0200
+++ b/client/src/components/gauge/HydrologicalConditions.vue	Thu Jul 04 10:15:46 2019 +0200
@@ -108,7 +108,6 @@
 import * as d3 from "d3";
 import debounce from "debounce";
 import { startOfYear, endOfYear } from "date-fns";
-import jsPDF from "jspdf-yworks";
 import canvg from "canvg";
 import { pdfgen } from "@/lib/mixins";
 import { HTTP } from "@/lib/http";
@@ -237,119 +236,16 @@
       );
     },
     downloadPDF() {
-      if (this.templateData) {
-        this.pdf.doc = new jsPDF(
-          "l",
-          "mm",
-          this.templateData.properties.paperSize
-        );
-        // pdf width and height in millimeter (landscape)
-        this.pdf.width =
-          this.templateData.properties.paperSize === "a3" ? 420 : 297;
-        this.pdf.height =
-          this.templateData.properties.paperSize === "a3" ? 297 : 210;
-        // default values if some are missing in template
-        let defaultFontSize = 11,
-          defaultColor = "black",
-          defaultWidth = 70,
-          defaultTextColor = "black",
-          defaultBorderColor = "white",
-          defaultBgColor = "white",
-          defaultRounding = 2,
-          defaultPadding = 2,
-          defaultOffset = { x: 0, y: 0 };
-        this.templateData.elements.forEach(e => {
-          switch (e.type) {
-            case "diagram": {
-              this.addDiagram(
-                e.position,
-                e.offset || defaultOffset,
-                e.width,
-                e.height
-              );
-              break;
-            }
-            case "diagramtitle": {
-              let gaugeInfo =
-                this.selectedGauge.properties.objname +
-                " (" +
-                this.selectedGauge.id
-                  .split(".")[1]
-                  .replace(/[()]/g, "")
-                  .split(",")[3] +
-                "): Hydrological Conditions " +
-                this.longtermInterval.join(" - ");
-              this.addDiagramTitle(
-                e.position,
-                e.offset || defaultOffset,
-                e.fontsize || defaultFontSize,
-                e.color || defaultColor,
-                gaugeInfo
-              );
-              break;
-            }
-            case "diagramlegend": {
-              this.addDiagramLegend(
-                e.position,
-                e.offset || defaultOffset,
-                e.color || defaultColor
-              );
-              break;
-            }
-            case "image": {
-              this.addImage(
-                e.url,
-                e.format || "",
-                e.position,
-                e.offset || defaultOffset,
-                e.width || 90,
-                e.height || 60
-              );
-              break;
-            }
-            case "text": {
-              this.addText(
-                e.position,
-                e.offset || defaultOffset,
-                e.width || defaultWidth,
-                e.fontsize || defaultFontSize,
-                e.color || defaultTextColor,
-                e.text || ""
-              );
-              break;
-            }
-            case "box": {
-              this.addBox(
-                e.position,
-                e.offset || defaultOffset,
-                e.width || 90,
-                e.height || 60,
-                e.rounding === 0 || e.rounding ? e.rounding : defaultRounding,
-                e.color || defaultBgColor,
-                e.brcolor || defaultBorderColor
-              );
+      let diagramTitle =
+        this.gaugeInfo(this.selectedGauge) +
+        ": Hydrological Conditions " +
+        this.longtermInterval.join(" - ");
 
-              break;
-            }
-            case "textbox": {
-              this.addTextBox(
-                e.position,
-                e.offset || defaultOffset,
-                e.width,
-                e.height,
-                e.rounding === 0 || e.rounding ? e.rounding : defaultRounding,
-                e.padding || defaultPadding,
-                e.fontsize || defaultFontSize,
-                e.color || defaultTextColor,
-                e.background || defaultBgColor,
-                e.text || "",
-                e.brcolor || defaultBorderColor
-              );
-              break;
-            }
-          }
-        });
-      }
+      this.generatePDF({
+        templateData: this.templateData,
+        diagramTitle: diagramTitle
+      });
+
       this.pdf.doc.save(
         this.selectedGauge.properties.objname +
           " Hydrological-condition Diagram.pdf"
--- a/client/src/components/gauge/Waterlevel.vue	Thu Jul 04 10:12:19 2019 +0200
+++ b/client/src/components/gauge/Waterlevel.vue	Thu Jul 04 10:15:46 2019 +0200
@@ -249,22 +249,16 @@
       saveAs(blog, filename);
     },
     downloadPDF() {
-      let gaugeInfo =
-        this.selectedGauge.properties.objname +
-        " (" +
-        this.selectedGauge.id
-          .split(".")[1]
-          .replace(/[()]/g, "")
-          .split(",")[3] +
-        "):" +
-        " Waterlevel " +
+      let diagramTitle =
+        this.gaugeInfo(this.selectedGauge) +
+        ": Waterlevel " +
         this.dateFrom.toLocaleDateString() +
         " - " +
         this.dateTo.toLocaleDateString();
 
       this.generatePDF({
         templateData: this.templateData,
-        diagramTitle: gaugeInfo
+        diagramTitle: diagramTitle
       });
 
       this.pdf.doc.save(
--- a/client/src/lib/mixins.js	Thu Jul 04 10:12:19 2019 +0200
+++ b/client/src/lib/mixins.js	Thu Jul 04 10:15:46 2019 +0200
@@ -70,6 +70,18 @@
     ...mapState("user", ["user"])
   },
   methods: {
+    gaugeInfo(selectedGauge) {
+      // returns string with formatted gauge info
+      return (
+        selectedGauge.properties.objname +
+        " (" +
+        selectedGauge.id
+          .split(".")[1]
+          .replace(/[()]/g, "")
+          .split(",")[3] +
+        ")"
+      );
+    },
     generatePDF(params) {
       // creates a new jsPDF object into this.pdf.doc
       let templateData = params["templateData"];
@@ -81,8 +93,13 @@
         this.templateData.properties.paperSize
       );
       // pdf width and height in millimeter (landscape)
-      this.pdf.width = templateData.properties.paperSize === "a3" ? 420 : 297;
-      this.pdf.height = templateData.properties.paperSize === "a4" ? 297 : 210;
+      if (templateData.properties.paperSize === "a3") {
+        this.pdf.width = 420;
+        this.pdf.height = 297;
+      } else {
+        this.pdf.width = 297;
+        this.pdf.height = 210;
+      }
       // check the template elements
       if (templateData) {
         let defaultFontSize = 11,