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

使用MuhammaraJS修改PDF,非链式调用报错求助

问题原因及解决方案

错误原因

你代码中的核心问题是同一页面多次开启编辑会话但未正确结束前一次:第一次调用.editPage(1)后仅执行了.polygon(),没有调用.endPage()关闭该页面的编辑上下文,随后再次调用.editPage(1)会导致Muhammara内部PDF状态混乱,最终触发"未注册对象"的结束错误。

正确实现方式

针对你的映射结构(键为页码,值为多边形顶点数组),只需对每个页码开启一次编辑会话,在会话内完成所有多边形绘制后再关闭会话即可,无需强制链式调用:

const Recipe = require("muhammara").Recipe;
const pdfDoc = new Recipe(inputFile, outputFile);

// 假设你的多边形参数映射结构如下
const polygonsMap = {
  "2": [
    [{x:5.593,y:3.401},{x:6.385,y:3.401},{x:6.385,y:3.54},{x:5.593,y:3.54}],
    [{x:5.58,y:2.488},{x:6.379,y:2.488},{x:6.379,y:2.627},{x:5.58,y:2.627}]
  ],
  "1": [
    [[400.459, 86.998], [457.166, 86.998], [457.166, 98.412], [400.459, 98.412]],
    [[399.528, 63.643], [456.736, 63.643], [456.736, 73.031], [399.528, 73.031]]
  ]
};

// 遍历映射,批量处理每个页码的多边形
Object.entries(polygonsMap).forEach(([pageStr, polygons]) => {
  const pageNum = parseInt(pageStr);
  // 开启当前页码的编辑会话
  let pageEditor = pdfDoc.editPage(pageNum);
  
  // 逐个绘制当前页面的所有多边形
  polygons.forEach(polygon => {
    // 若顶点是对象格式,先转为[x,y]数组(如果原始是数组则跳过此步)
    const vertices = polygon.map(point => typeof point === 'object' ? [point.x, point.y] : point);
    pageEditor.polygon(vertices, { stroke: [150, 0, 0], lineWidth: 1 });
  });
  
  // 必须结束当前页面的编辑会话
  pageEditor.endPage();
});

// 完成所有编辑后结束PDF
pdfDoc.endPDF(() => { console.log('done') });

关键说明

  • 每个页码仅调用一次.editPage(),在该会话内完成所有图形绘制,确保PDF内部状态一致。
  • 无论是否使用链式调用,每个.editPage()必须对应一个.endPage(),否则会导致PDF结构损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:43:14