{"record":{"id":"4729c05eefbad924","repo":"Stirling-Tools/Stirling-PDF","slug":"pdfium-failed-to-create-new-document","errorCode":null,"errorMessage":"PDFium: failed to create new document","messagePattern":"PDFium: failed to create new document","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"frontend/editor/src/core/services/pdfiumService.ts","lineNumber":1113,"sourceCode":"      });\n\n      m.FPDFPage_CloseAnnot(annotPtr);\n    }\n\n    m.FPDF_ClosePage(pagePtr);\n    return { links, pageWidth, pageHeight };\n  } finally {\n    closeDocAndFreeBuffer(m, docPtr);\n  }\n}\n\n/**\n * Create a new empty PDF document, returning its raw data.\n */\nexport async function createEmptyDocument(): Promise<ArrayBuffer> {\n  const m = await getPdfiumModule();\n  const docPtr = m.FPDF_CreateNewDocument();\n  if (!docPtr) throw new Error(\"PDFium: failed to create new document\");\n  const writerPtr = m.PDFiumExt_OpenFileWriter();\n  m.PDFiumExt_SaveAsCopy(docPtr, writerPtr);\n  const size = m.PDFiumExt_GetFileWriterSize(writerPtr);\n  const outBuf = m.pdfium.wasmExports.malloc(size);\n  m.PDFiumExt_GetFileWriterData(writerPtr, outBuf, size);\n  const result = new ArrayBuffer(size);\n  const view = new Uint8Array(result);\n  for (let i = 0; i < size; i++) {\n    view[i] = m.pdfium.getValue(outBuf + i, \"i8\") & 0xff;\n  }\n  m.pdfium.wasmExports.free(outBuf);\n  m.PDFiumExt_CloseFileWriter(writerPtr);\n  closeDocAndFreeBuffer(m, docPtr);\n  return result;\n}\n\n/**\n * Save a raw document pointer to an ArrayBuffer.","sourceCodeStart":1095,"sourceCodeEnd":1131,"githubUrl":"https://github.com/Stirling-Tools/Stirling-PDF/blob/9ef20dcab80b85041912f045e17a6aea1d08f969/frontend/editor/src/core/services/pdfiumService.ts#L1095-L1131","documentation":"`createEmptyDocument` calls `FPDF_CreateNewDocument()` to mint a blank PDF, then immediately saves it via `PDFiumExt_SaveAsCopy`. A null doc pointer means PDFium couldn't allocate — same heap-exhaustion/ corrupted-module root cause as errors 28/29/30, just on the empty-document factory path.","triggerScenarios":"Creating an empty PDF after heavy prior PDFium usage filled the WASM heap; the module is in a bad state after an unhandled pointer error; `PDFiumExt_Init` failed during init (swallowed) leaving extensions unavailable.","commonSituations":"Starting a new document in a long session; Safari WASM ceiling; a leak accumulating document handles.","solutions":["Retry once after `resetPdfiumModule()`.","Ensure `PDFiumExt_Init` succeeded (its failure is silently swallowed in `initPdfiumModule`) before relying on the extension save APIs.","Close all open documents before minting a new empty one.","Track and bound the number of live PDFium documents."],"exampleFix":"// before\nconst docPtr = m.FPDF_CreateNewDocument();\nif (!docPtr) throw new Error(\"PDFium: failed to create new document\");\n\n// after\nlet docPtr = m.FPDF_CreateNewDocument();\nif (!docPtr) {\n  resetPdfiumModule();\n  const m2 = await getPdfiumModule();\n  docPtr = m2.FPDF_CreateNewDocument();\n}\nif (!docPtr) throw new Error(\"PDFium: failed to create new document\");","handlingStrategy":"retry","validationCode":"// Confirm extensions are present before relying on createEmptyDocument + save\nconst m = await getPdfiumModule();\nif (typeof m.PDFiumExt_SaveAsCopy !== \"function\") {\n  throw new Error(\"PDFium save extensions unavailable\");\n}","typeGuard":null,"tryCatchPattern":"async function emptyDocWithRetry(): Promise<ArrayBuffer> {\n  try { return await createEmptyDocument(); }\n  catch (e) {\n    if (e instanceof Error && e.message.includes(\"failed to create new document\")) {\n      resetPdfiumModule();\n      return await createEmptyDocument();\n    }\n    throw e;\n  }\n}","preventionTips":["Retry once via resetPdfiumModule() on allocation failure.","Ensure PDFiumExt_Init succeeded (its failure is swallowed) before using extension save APIs.","Close all open documents before minting a new empty one.","Bound live document-handle counts."],"tags":["pdfium","wasm","memory","document"],"backgroundTag":null,"analyzedSha":"9ef20dcab80b85041912f045e17a6aea1d08f969","analyzedAt":"2026-08-13T22:11:39.827Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}