From 76cab1866712105bf03f47cebdf568c0cc674a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Sat, 31 Jan 2026 20:31:44 +0100 Subject: [PATCH] Delete all referenced objects deleted by libgourou during PDF DRM removal --- src/libgourou.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/libgourou.cpp b/src/libgourou.cpp index d9b15ce..6607afd 100644 --- a/src/libgourou.cpp +++ b/src/libgourou.cpp @@ -1342,7 +1342,7 @@ namespace gourou uPDFParser::Integer* ebxVersion; std::vector objects = parser.objects(); - std::vector::iterator it; + std::vector::iterator it, ebxIt; std::vector::reverse_iterator rIt; std::vector ebxObjects; unsigned char decryptedKey[16]; @@ -1513,10 +1513,34 @@ namespace gourou } } + /* Delete objects that reference EBX objects, except in trailer */ + for(it = objects.begin(); it != objects.end(); it++) + { + uPDFParser::Object* object = *it; + + if (object->hasKey("Encrypt") && (*object)["Encrypt"]->type() == uPDFParser::DataType::REFERENCE) + { + uPDFParser::Reference* encrypt = (uPDFParser::Reference*)(*object)["Encrypt"]; + + /* Delete EBX objects */ + for(ebxIt = ebxObjects.begin(); ebxIt != ebxObjects.end(); ebxIt++) + { + if (encrypt->value() == (*ebxIt)->objectId()) + { + GOUROU_LOG(ERROR, "Delete stream id " << object->objectId()); + + parser.removeObject(object); + break; + } + } + } + } + + /* Delete EBX objects */ for(it = ebxObjects.begin(); it != ebxObjects.end(); it++) parser.removeObject(*it); - uPDFParser::Object& trailer = parser.getTrailer(); + uPDFParser::Object& trailer = parser.getTrailer(); trailer.deleteKey("Encrypt"); parser.write(filenameOut);