{"record":{"id":"8b2d096bdb2d7f40","repo":"parallax/jsPDF","slug":"invalid-argument-passed-to-jspdf-getpageinfo","errorCode":null,"errorMessage":"Invalid argument passed to jsPDF.getPageInfo","messagePattern":"Invalid argument passed to jsPDF\\.getPageInfo","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/jspdf.js","lineNumber":3316,"sourceCode":"  setFileId();\n\n  var getEncryptor = function(objectId) {\n    if (encryptionOptions !== null) {\n      return encryption.encryptor(objectId, 0);\n    }\n    return function(data) {\n      return data;\n    };\n  };\n\n  //---------------------------------------\n  // Public API\n\n  var getPageInfo = (API.__private__.getPageInfo = API.getPageInfo = function(\n    pageNumberOneBased\n  ) {\n    if (isNaN(pageNumberOneBased) || pageNumberOneBased % 1 !== 0) {\n      throw new Error(\"Invalid argument passed to jsPDF.getPageInfo\");\n    }\n    var objId = pagesContext[pageNumberOneBased].objId;\n    return {\n      objId: objId,\n      pageNumber: pageNumberOneBased,\n      pageContext: pagesContext[pageNumberOneBased]\n    };\n  });\n\n  var getPageInfoByObjId = (API.__private__.getPageInfoByObjId = function(\n    objId\n  ) {\n    if (isNaN(objId) || objId % 1 !== 0) {\n      throw new Error(\"Invalid argument passed to jsPDF.getPageInfoByObjId\");\n    }\n    for (var pageNumber in pagesContext) {\n      if (pagesContext[pageNumber].objId === objId) {\n        break;","sourceCodeStart":3298,"sourceCodeEnd":3334,"githubUrl":"https://github.com/parallax/jsPDF/blob/a3930ce03a585a26b2c76d12a0f413ce96f6d1a3/src/jspdf.js#L3298-L3334","documentation":"Thrown by jsPDF.getPageInfo when pageNumberOneBased is NaN or not an integer. The guard is `isNaN(pageNumberOneBased) || pageNumberOneBased % 1 !== 0`, so non-numbers (coerced to NaN), fractional page numbers, Infinity, and undefined all fail. The page number is 1-based and must index an existing page.","triggerScenarios":"Calling getPageInfo(undefined), getPageInfo(1.5), getPageInfo('abc'), getPageInfo(NaN), or getPageInfo(0) where 0 may be out of range; passing a float computed from a division.","commonSituations":"Off-by-one errors (0-based loop fed to a 1-based API); passing a string from user input without parsing; floats from average/ratio calculations; forgetting getPageInfo is 1-based.","solutions":["Pass a 1-based integer within the existing page range: getPageInfo(pageNumber).","Coerce and validate before calling: `const n = Number(x); if (Number.isInteger(n) && n >= 1 && n <= doc.getNumberOfPages()) ...`.","Double-check you are not passing a 0-based index from an array loop."],"exampleFix":"// before\nconst info = doc.getPageInfo(i); // i comes from a 0-based loop, may be 0\n// after\nconst info = doc.getPageInfo(i + 1); // 1-based","handlingStrategy":"validation","validationCode":"function safeGetPageInfo(doc, pageNumber) {\n  const n = Number(pageNumber);\n  if (!Number.isInteger(n) || n < 1 || n > doc.getNumberOfPages()) {\n    throw new Error('page number must be a 1-based integer in range');\n  }\n  return doc.getPageInfo(n);\n}","typeGuard":"function isPositiveInteger(v) { return Number.isInteger(v) && v >= 1; }","tryCatchPattern":null,"preventionTips":["Remember getPageInfo is 1-based.","Validate integer-and-range before calling.","Do not pass floats or strings from user input unchecked."],"tags":["validation","page","integer","api"],"backgroundTag":null,"analyzedSha":"a3930ce03a585a26b2c76d12a0f413ce96f6d1a3","analyzedAt":"2026-08-13T05:33:39.648Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}