OrgChart icon indicating copy to clipboard operation
OrgChart copied to clipboard

Better sharpness when export image

Open CODEheures opened this issue 5 years ago • 3 comments

Export image for printing with a better sharpness can be done with a transform scale3d with a sharpness Factor (72dpi to 300dpi => 4 factor) I change export function to use transform scale, html2canvas v1.0.0, and toBlob instead toDataURL :

export: function (exportFilename, exportFileextension) {
      var that = this;
      exportFilename = (typeof exportFilename !== 'undefined') ?  exportFilename : this.options.exportFilename;
      exportFileextension = (typeof exportFileextension !== 'undefined') ?  exportFileextension : this.options.exportFileextension;
      if ($(this).children('.spinner').length) {
        return false;
      }
      var $chartContainer = this.$chartContainer;
      var $mask = $chartContainer.find('.mask');
      if (!$mask.length) {
        $chartContainer.append('<div class="mask"><i class="fa fa-circle-o-notch fa-spin spinner"></i></div>');
      } else {
        $mask.removeClass('hidden');
      }
      //var sourceChart = $chartContainer.addClass('canvasContainer').find('.orgchart:not(".hidden")').get(0);
      var sourceChart = $chartContainer.children('.orgchart').first().children('table');
      var flag = that.options.direction === 'l2r' || that.options.direction === 'r2l';
      var sharpnessFactor = 4;
      sourceChart.css({
        'transform-origin': 'top left',
        'transform': 'scale3d('+sharpnessFactor+', '+sharpnessFactor+', 1)'
      });
      var canvasWidth  = sourceChart.width()*sharpnessFactor;
      var canvasHeight  = sourceChart.height()*sharpnessFactor;
      html2canvas(sourceChart.get(0), {
        //'width': flag ? sourceChart.clientHeight : sourceChart.clientWidth,
        //'height': flag ? sourceChart.clientWidth : sourceChart.clientHeight,
        'width': flag ? canvasHeight : canvasWidth,
        'height': flag ? canvasWidth : canvasHeight,
        'onclone': function (cloneDoc) {
          //$(cloneDoc).find('.canvasContainer').css('overflow', 'visible')
            //.find('.orgchart:not(".hidden"):first').css('transform', '');
        }
      })
      .then((canvas) => {
        sourceChart.css({
          'transform-origin': '',
          'transform': ''
        });
        $chartContainer.find('.mask').addClass('hidden');
        if (exportFileextension.toLowerCase() === 'pdf') {
          var doc = {};
          var docWidth = Math.floor(canvas.width * 0.2646);
          var docHeight = Math.floor(canvas.height * 0.2646);
          if (docWidth > docHeight) {
            doc = new jsPDF('l', 'mm', [docWidth, docHeight]);
          } else {
            doc = new jsPDF('p', 'mm', [docHeight, docWidth]);
          }
          doc.addImage(canvas.toDataURL(), 'png', 0, 0);
          doc.save(exportFilename + '.pdf');
        } else {
          var isWebkit = 'WebkitAppearance' in document.documentElement.style;
          var isFf = !!window.sidebar;
          var isEdge = navigator.appName === 'Microsoft Internet Explorer' || (navigator.appName === "Netscape" && navigator.appVersion.indexOf('Edge') > -1);

          if ((!isWebkit && !isFf) || isEdge) {
            window.navigator.msSaveBlob(canvas.msToBlob(), exportFilename + '.png');
          } else {
            var selector = '.oc-download-btn' + (that.options.chartClass !== '' ? '.' + that.options.chartClass : '');
            if (!$chartContainer.find(selector).length) {
              $chartContainer.append('<a class="oc-download-btn' + (that.options.chartClass !== '' ? ' ' + that.options.chartClass : '') + '"'
                  + ' download="' + exportFilename + '.png"></a>');
            }
            // $chartContainer.find(selector).attr('href', canvas.toDataURL())[0].click();
            canvas.toBlob(function (blob) {
              $chartContainer.find(selector).attr('href', URL.createObjectURL(blob))
              $chartContainer.find(selector)[0].click()
            }, 'image/png')

          }
        }
        $chartContainer.removeClass('canvasContainer');
      }, function () {
        $chartContainer.removeClass('canvasContainer');
      });
    }

CODEheures avatar Apr 23 '19 12:04 CODEheures

Doesn't work for me. I replaced export: function (exportFilename, exportFileextension) function in jquery.orgchart.js with your function, and even image is not showed :(

RafaelLinux avatar Aug 30 '19 09:08 RafaelLinux

Doesn't work for me. I replaced export: function (exportFilename, exportFileextension) function in jquery.orgchart.js with your function, and even image is not showed :(

Do you insert script for html2canvas in version 1.0.0? It is important because promise (.then((canvas) => ...) don't run on html2canvas v0.5

CODEheures avatar Aug 30 '19 22:08 CODEheures

You just need to set the scale when calling html2canvas, this will double the quality:

html2canvas(sourceChart, { 'scale': 2, 'width': flag ? sourceChart.clientHeight : sourceChart.clientWidth, 'height': flag ? sourceChart.clientWidth : sourceChart.clientHeight, 'onclone': function (cloneDoc) { $(cloneDoc).find('.canvasContainer').css('overflow', 'visible') .find('.orgchart:not(".hidden"):first').css('transform', ''); } })

Source:https://stackoverflow.com/questions/22803825/html2canvas-generates-blurry-images

stevenrlp avatar Apr 05 '21 19:04 stevenrlp