{"record":{"id":"a208985f5f2828a1","repo":"docusealco/docuseal","slug":"failed-to-remove-page-object","errorCode":null,"errorMessage":"Failed to remove page object","messagePattern":"Failed to remove page object","errorType":"exception","errorClass":"Pdfium::PdfiumError","httpStatus":null,"severity":"error","filePath":"lib/pdfium.rb","lineNumber":1396,"sourceCode":"                                         char[:origin_x], char[:origin_y]])\n\n        Pdfium.FPDFPageObj_SetMatrix(new_object, matrix_ptr)\n        Pdfium.FPDFPage_InsertObject(@page_ptr, new_object)\n      end\n    end\n\n    def reset_memoization\n      remove_instance_variable(:@text) if defined?(@text)\n\n      @text_nodes = nil\n      @text_objects = nil\n      @line_nodes = nil\n      @annotations = nil\n      @objects = nil\n    end\n\n    def remove_page_object(object_ptr)\n      raise PdfiumError, 'Failed to remove page object' if Pdfium.FPDFPage_RemoveObject(@page_ptr, object_ptr).zero?\n\n      Pdfium.FPDFPageObj_Destroy(object_ptr)\n    end\n\n    def draw_redaction_rects(rect_bounds)\n      rect_bounds.each do |left, bottom, right, top, color|\n        next if color == 'white'\n\n        rect_object = Pdfium.FPDFPageObj_CreateNewRect(left, bottom, right - left, top - bottom)\n\n        raise PdfiumError, 'Failed to create redaction rect' if rect_object.null?\n\n        Pdfium.FPDFPageObj_SetFillColor(rect_object, 0, 0, 0, 255)\n        Pdfium.FPDFPath_SetDrawMode(rect_object, 1, 0)\n        Pdfium.FPDFPage_InsertObject(@page_ptr, rect_object)\n      end\n    end\n","sourceCodeStart":1378,"sourceCodeEnd":1414,"githubUrl":"https://github.com/docusealco/docuseal/blob/004a22c1c88109c7ba0b567df011a8cb13894001/lib/pdfium.rb#L1378-L1414","documentation":"Raised by remove_page_object when FPDFPage_RemoveObject returns 0: pdfium declined to detach the object from the page, which happens when the object is not owned by that page, was already removed, or the page's object list is in an unexpected state. It is reached from the redaction paths (remove_redacted_chars, remove_blank_text_objects, unwrap_form_objects) that collected object pointers before other edits may have invalidated them.","triggerScenarios":"An object pointer collected in an earlier pass is removed again after the page changed; objects shared or cloned across pages after form unwrapping; a stale pointer following a failed FPDFPage_GenerateContent.","commonSituations":"Redacting pages where one text object overlaps multiple redaction rects; multi-step edits where earlier steps already restructured the object list.","solutions":["Re-open the original document and apply the redaction in a single pass","Merge overlapping/adjacent redaction rects for the same region before calling redact","Update libpdfium","If patching call sites, skip already-removed objects instead of failing the page"],"exampleFix":"# before\nrects = raw_rects # overlapping rects hit the same text objects twice\npage.redact(rects)\n\n# after - merge overlaps first to avoid double-removal of objects\nmerged = merge_overlaps(raw_rects)\npage.redact(merged)","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"begin\n  page.redact(rects)\nrescue Pdfium::PdfiumError => e\n  raise unless e.message == 'Failed to remove page object'\n  merged = merge_overlapping_rects(rects)\n  Pdfium::Document.open_bytes(@original_bytes) { |d| d.get_page(page.page_index).redact(merged) }\nend","preventionTips":["Merge overlapping redaction rects before calling redact so objects are not targeted twice","Apply all redactions to a page in one pass; do not re-redact an edited page object","Retry from original bytes when object-level edits fail midway"],"tags":["pdfium","redaction","pdf-objects","ruby"],"backgroundTag":"pdf-object-manipulation-failed","analyzedSha":"004a22c1c88109c7ba0b567df011a8cb13894001","analyzedAt":"2026-08-21T13:38:23.343Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}