{"record":{"id":"4323c25f89926818","repo":"parallax/jsPDF","slug":"exception-while-creating-acroformdictionary","errorCode":null,"errorMessage":"Exception while creating AcroformDictionary","messagePattern":"Exception while creating AcroformDictionary","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/modules/acroform.js","lineNumber":705,"sourceCode":"      }\n      delete fieldArray[key];\n    }\n  }\n};\n\nvar initializeAcroForm = function(scope, formObject) {\n  formObject.scope = scope;\n  if (\n    scope.internal !== undefined &&\n    (scope.internal.acroformPlugin === undefined ||\n      scope.internal.acroformPlugin.isInitialized === false)\n  ) {\n    AcroFormField.FieldNum = 0;\n    scope.internal.acroformPlugin = JSON.parse(\n      JSON.stringify(acroformPluginTemplate)\n    );\n    if (scope.internal.acroformPlugin.acroFormDictionaryRoot) {\n      throw new Error(\"Exception while creating AcroformDictionary\");\n    }\n    scaleFactor = scope.internal.scaleFactor;\n    // The Object Number of the AcroForm Dictionary\n    scope.internal.acroformPlugin.acroFormDictionaryRoot = new AcroFormDictionary();\n    scope.internal.acroformPlugin.acroFormDictionaryRoot.scope = scope;\n\n    // add Callback for creating the AcroForm Dictionary\n    scope.internal.acroformPlugin.acroFormDictionaryRoot._eventID = scope.internal.events.subscribe(\n      \"postPutResources\",\n      function() {\n        AcroFormDictionaryCallback(scope);\n      }\n    );\n\n    scope.internal.events.subscribe(\"buildDocument\", function() {\n      annotReferenceCallback(scope);\n    }); // buildDocument\n","sourceCodeStart":687,"sourceCodeEnd":723,"githubUrl":"https://github.com/parallax/jsPDF/blob/a3930ce03a585a26b2c76d12a0f413ce96f6d1a3/src/modules/acroform.js#L687-L723","documentation":"Thrown by initializeAcroForm when it is asked to initialize the AcroForm plugin but scope.internal.acroformPlugin.acroFormDictionaryRoot already exists. This is a re-initialization guard: the dictionary root should be created exactly once. A second initialize attempt indicates duplicate init or corrupted plugin state.","triggerScenarios":"Adding AcroForm fields in a way that invokes initializeAcroForm twice (e.g. interleaving field creation with manual plugin manipulation), or a stale acroformPlugin object that retained a previous acroFormDictionaryRoot after a soft reset.","commonSituations":"Building forms across multiple code paths that both init forms; a jsPDF instance reused after an AcroForm build; a custom workflow that calls internal init directly.","solutions":["Initialize AcroForm once per document and reuse the existing plugin state.","Check isInitialized / acroFormDictionaryRoot before triggering initialization.","Use a fresh jsPDF instance for each generated form document."],"exampleFix":"// before (two code paths both add fields -> double init)\nbuildFormA(doc); buildFormB(doc); // second init throws\n\n// after\nif (!doc.internal.acroformPlugin || !doc.internal.acroformPlugin.acroFormDictionaryRoot) {\n  buildFormA(doc);\n}\nbuildFormB(doc); // reuses existing plugin state","handlingStrategy":"try-catch","validationCode":"function acroFormNotInitialized(doc) {\n  var p = doc.internal && doc.internal.acroformPlugin;\n  return !p || !p.isInitialized || !p.acroFormDictionaryRoot;\n}\n// only trigger form building when not yet initialized","typeGuard":"function isAcroFormInitialized(doc) {\n  return !!(doc.internal && doc.internal.acroformPlugin &&\n            doc.internal.acroformPlugin.acroFormDictionaryRoot);\n}","tryCatchPattern":"try {\n  initializeOrAddField(doc, field);\n} catch (e) {\n  if (/Exception while creating AcroformDictionary/.test(e.message)) {\n    // already initialized; just add the field to existing plugin\n    doc.addField(field);\n  } else throw e;\n}","preventionTips":["Initialize AcroForm once per document.","Reuse the existing plugin state for additional fields.","Use a fresh jsPDF instance per generated form document."],"tags":["acroform","internal","state","initialization"],"backgroundTag":null,"analyzedSha":"a3930ce03a585a26b2c76d12a0f413ce96f6d1a3","analyzedAt":"2026-08-13T05:33:39.648Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}