D3 组织结构图导出为 PDF 时非常模糊?

问题描述 投票:0回答:1

我想将 D3 组织结构图导出为 A0 中的 PDF - 这基本上可以工作,只是 PDF 中的图像非常模糊......

我正在使用这个脚本,似乎改变 dpi 并没有真正做任何事情。知道为什么它很模糊吗?那么我应该导出为 SVG 吗?使用不同的方法?

我还添加了用于创建实际图表的代码,因为这似乎是必需的信息。

<script>
  var chart = null;
  d3.csv(
    'data.csv'
  ).then((data) => {
    chart = new d3.OrgChart()
      .nodeHeight((d) => 85 + 25)
      .nodeWidth((d) => 220 + 2)
      .childrenMargin((d) => 50)
      .compactMarginBetween((d) => 35)
      .compactMarginPair((d) => 30)
      .neighbourMargin((a, b) => 20)
      .compactMarginBetween(node => 150)
      .nodeContent(function (d, i, arr, state) {
        const color = '#FFFFFF';
        const imageDiffVert = 25 + 2;
        return `
                <div style='width:${d.width} px;height:${d.data.height} px;padding-top:${imageDiffVert - 2}px;padding-left:1px;padding-right:1px'>
                    <div style="font-family: 'Inter', sans-serif;background-color:${color};  margin-left:-1px;width:${d.width - 2}px;height:${d.data.height - imageDiffVert}px;border-radius:10px;border: 1px solid #E4E2E9">
                        <div style="display:flex;justify-content:flex-end;margin-top:5px;margin-right:8px"><br/> 
                        </div>                      
                        <div style="background-color:${color};margin-top:${-imageDiffVert - 20}px;margin-left:${15}px;border-radius:100px;width:50px;height:50px;" ></div>
                        <div style="margin-top:${-imageDiffVert - 20
          }px;">   <img src=" ${d.data.image}" style="margin-left:${20}px;border-radius:100px;width:40px;height:40px;" /></div>
                        <div style="font-size:15px;color:#08011E;margin-left:20px;margin-top:10px">  ${d.data.name
          } </div>
                        <div style="color:#716E7B;margin-left:20px;margin-top:3px;font-size:10px;"> ${d.data.position
          } </div>

                    </div>
                </div>
                            `;
      })
      .container('.chart-container')
      .data(data)
      .render();

  });
</script>

<script>
  function downloadPdf(chart) {
    var dpi = 300;

    chart.exportImg({
      save: false,
      full: true,
      pixelRatio: dpi / 300,
      onLoad: (base64) => {
        var pdf = new jspdf.jsPDF('landscape', 'mm', 'a0');
        var img = new Image();
        img.src = base64;
        img.onload = function () {
          var widthInInches = img.width / dpi;
          var heightInInches = img.height / dpi;

          var aspectRatio = img.height / img.width;

          var pdfWidth = 1189;
          var pdfHeight = pdfWidth * aspectRatio;

          pdf.addImage(
            img,
            'JPEG',
            0,
            0,
            pdfWidth,
            pdfHeight
          );
          pdf.save('chart.pdf');
        };
      },
    });
  }
</script>
javascript d3.js export jspdf
1个回答
0
投票

我能够运行你的代码示例,我可以看到问题不是来自 jsPDF。下次,请提供一个可重现的示例,无需修改即可复制和执行,因为我运行代码花费的时间比识别问题的时间要多。 jsPDF 将图像添加到 pdf 文件中,而不对其进行压缩或更改质量。我下载了exportImg方法生成的图像,发现质量不好。为了接收质量更好的图像,我将“pixelRatio:dpi / 300”更改为“scale:10”。我想说的是,10是我脑海中第一个出现的数字。 ExportImg 方法没有名为“pixelRatio”的参数。然后我收到了质量更好的图像,它与 pdf 文件中的质量相同。

我会触摸创建 pdf 的函数,但我认为这不是主题。

© www.soinside.com 2019 - 2024. All rights reserved.