You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ApexCharts生成PDF用图表文件时出错,寻求解决方案

问题:ApexCharts环形图生成PDF用base64时抛出画布占用错误

我在尝试生成用于PDF的图表文件时遇到错误,每次调用获取base64的方法都会抛出画布已被占用的错误,错误提示为:

Uncaught (in promise) Error: Canvas is already in use. Chart with ID 'donutChart' must be destroyed first.

环形图配置代码

const donutOptions: ApexOptions = {
    labels: names,
    dataLabels: {
      enabled: false,
    },
    chart: {
      type: 'donut',
      id: 'donutChart',
      width: '350px',
      height: 160,
      events: {
        dataPointSelection: (chart, options, value) => {
          const selected = {
            percentage: value.w.config.series[value.selectedDataPoints[0]],
            name: value.w.config.labels[value.selectedDataPoints[0]],
          };
          setValue(selected as SelectedValuesType);
        },
        dataPointMouseEnter: (event, cc, value) => {
          const percentage = value.w.config.series[value.dataPointIndex] as number;
          const name = value.w.config.labels[value.dataPointIndex];
          setCurrentHover({ percentage, name });
        },
        dataPointMouseLeave: () => {
          setCurrentHover({} as { percentage: number; name: string });
        },
      },
    },
    responsive: [
      {
        breakpoint: 500,
        options: {
          chart: {
            width: '300px',
            height: 160,
          },
        },
      },
    ],
    plotOptions: {
      pie: {
        expandOnClick: false,
        donut: {
          size: '70%',
        },
      },
    },
    colors: colors as string[],
    states: {
      active: {
        allowMultipleDataPointsSelection: true,
        filter: {
          type: 'darken',
          value: 0.35,
        },
      },
    },
    tooltip: {
      enabled: false,
      theme: 'dark',
      style: {
        fontSize: '12px',
        fontFamily: 'Poppins, sans-serif',
      },
      y: {
        formatter: (value) => `<span class="text-black">${value.toFixed(1)}%</span`,
      },
    },
    legend: {
      show: false,
    },
  };

初始获取base64的getURI函数

const getURI = async () => {
    await ApexCharts.exec('donutChart', 'render', []);
    ApexCharts.exec('donutChart', 'dataURI', []).then((res: any) => console.log(res));
  };

尝试修改后的getURI函数

const getURI = async () => {
    await ApexCharts.exec('donutChart', 'render', donutOptions);
    ApexCharts.exec('donutChart', 'dataURI', donutOptions).then((res: any) => console.log(res));
  };

已尝试的排查操作

  • 将图表的width和height分别设置为字符串或数值类型
  • 将配置对象作为第三个参数传入ApexCharts.exec方法

内容的提问来源于stack exchange,提问作者Werthis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:13:16