From 94383feb181fbeb54171877a9f25a15be1bda480 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 8 May 2026 23:07:07 +0300 Subject: [PATCH 01/56] Read-only walks to const accessors across content parsing --- core/fpdfapi/font/cpdf_type3font.cpp | 14 +- core/fpdfapi/page/cpdf_contentparser.cpp | 21 +- core/fpdfapi/page/cpdf_form.cpp | 18 +- .../fpdfapi/page/cpdf_streamcontentparser.cpp | 39 +- core/fpdfapi/page/cpdf_streamcontentparser.h | 6 +- core/fpdfapi/parser/BUILD.gn | 3 + .../parser/cpdf_read_only_graph_guard.cpp | 25 + .../parser/cpdf_read_only_graph_guard.h | 30 + .../cpdf_read_only_graph_guard_unittest.cpp | 30 + core/fpdfdoc/cpdf_annot.cpp | 57 +- core/fpdfdoc/cpdf_linklist.cpp | 15 +- core/fpdfdoc/cpdf_linklist.h | 5 +- fpdfsdk/fpdf_annot.cpp | 1591 ++++++++++------- fpdfsdk/fpdf_doc.cpp | 114 +- 14 files changed, 1222 insertions(+), 746 deletions(-) create mode 100644 core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp create mode 100644 core/fpdfapi/parser/cpdf_read_only_graph_guard.h create mode 100644 core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp index 00d95298c8..44b8ca7d03 100644 --- a/core/fpdfapi/font/cpdf_type3font.cpp +++ b/core/fpdfapi/font/cpdf_type3font.cpp @@ -60,7 +60,10 @@ void CPDF_Type3Font::WillBeDestroyed() { } bool CPDF_Type3Font::Load() { - font_resources_ = font_dict_->GetMutableDictFor("Resources"); + RetainPtr font_resources = + font_dict_->GetDictFor("Resources"); + font_resources_ = + pdfium::WrapRetain(const_cast(font_resources.Get())); RetainPtr pMatrix = font_dict_->GetArrayFor("FontMatrix"); float xscale = 1.0f; float yscale = 1.0f; @@ -93,7 +96,10 @@ bool CPDF_Type3Font::Load() { } } } - char_procs_ = font_dict_->GetMutableDictFor("CharProcs"); + RetainPtr char_procs = + font_dict_->GetDictFor("CharProcs"); + char_procs_ = + pdfium::WrapRetain(const_cast(char_procs.Get())); if (font_dict_->GetDirectObjectFor("Encoding")) { LoadPDFEncoding(false, false); } @@ -125,8 +131,10 @@ CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode) { return nullptr; } + RetainPtr const_stream = + ToStream(char_procs_->GetDirectObjectFor(name)); RetainPtr pStream = - ToStream(char_procs_->GetMutableDirectObjectFor(name)); + pdfium::WrapRetain(const_cast(const_stream.Get())); if (!pStream) { return nullptr; } diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index 1d6bd7b678..4e74180fcf 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp @@ -36,9 +36,8 @@ CPDF_ContentParser::CPDF_ContentParser(CPDF_Page* pPage) return; } - RetainPtr pContent = - pPage->GetMutableDict()->GetMutableDirectObjectFor( - pdfium::page_object::kContents); + RetainPtr pContent = + pPage->GetDict()->GetDirectObjectFor(pdfium::page_object::kContents); if (!pContent) { HandlePageContentFailure(); return; @@ -94,14 +93,15 @@ CPDF_ContentParser::CPDF_ContentParser( } } - RetainPtr pResources = - page_object_holder_->GetMutableDict()->GetMutableDictFor("Resources"); + RetainPtr pResources = + page_object_holder_->GetDict()->GetDictFor("Resources"); parser_ = std::make_unique( page_object_holder_->GetDocument(), page_object_holder_->GetMutablePageResources(), page_object_holder_->GetMutableResources(), pParentMatrix, - page_object_holder_, std::move(pResources), form_bbox, pGraphicStates, - recursion_state); + page_object_holder_, + pdfium::WrapRetain(const_cast(pResources.Get())), + form_bbox, pGraphicStates, recursion_state); parser_->GetCurStates()->set_current_transformation_matrix(form_matrix); parser_->GetCurStates()->set_parent_matrix(form_matrix); if (ClipPath.HasRef()) { @@ -214,8 +214,11 @@ CPDF_ContentParser::Stage CPDF_ContentParser::Parse() { recursion_state_.parsed_set.clear(); parser_ = std::make_unique( page_object_holder_->GetDocument(), - page_object_holder_->GetMutablePageResources(), nullptr, nullptr, - page_object_holder_, page_object_holder_->GetMutableResources(), + pdfium::WrapRetain(const_cast( + page_object_holder_->GetPageResources().Get())), + nullptr, nullptr, page_object_holder_, + pdfium::WrapRetain(const_cast( + page_object_holder_->GetResources().Get())), page_object_holder_->GetBBox(), nullptr, &recursion_state_); parser_->GetCurStates()->mutable_color_state().SetDefault(); } diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp index 2f55ac308c..c363862ace 100644 --- a/core/fpdfapi/page/cpdf_form.cpp +++ b/core/fpdfapi/page/cpdf_form.cpp @@ -45,15 +45,15 @@ CPDF_Form::CPDF_Form(CPDF_Document* doc, RetainPtr pPageResources, RetainPtr pFormStream, CPDF_Dictionary* pParentResources) - : CPDF_PageObjectHolder(doc, - pFormStream->GetMutableDict(), - pPageResources, - pdfium::WrapRetain(ChooseResourcesDict( - pFormStream->GetMutableDict() - ->GetMutableDictFor("Resources") - .Get(), - pParentResources, - pPageResources.Get()))), + : CPDF_PageObjectHolder( + doc, + pFormStream->GetMutableDict(), + pPageResources, + pdfium::WrapRetain(ChooseResourcesDict( + const_cast( + pFormStream->GetDict()->GetDictFor("Resources").Get()), + pParentResources, + pPageResources.Get()))), form_stream_(std::move(pFormStream)) { LoadTransparencyInfo(); } diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index e503fbf164..35cac51d74 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -624,7 +624,10 @@ void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { if (pProperty->IsName()) { ByteString property_name = pProperty->GetString(); - RetainPtr pHolder = FindResourceHolder("Properties"); + RetainPtr const_holder = + FindResourceHolder("Properties"); + RetainPtr pHolder = + pdfium::WrapRetain(const_cast(const_holder.Get())); if (!pHolder || !pHolder->GetDictFor(property_name.AsStringView())) { return; } @@ -779,7 +782,10 @@ void CPDF_StreamContentParser::Handle_ExecuteXObject() { return; } - RetainPtr pXObject(ToStream(FindResourceObj("XObject", name))); + RetainPtr const_xobject = + ToStream(FindResourceObj("XObject", name)); + RetainPtr pXObject = + pdfium::WrapRetain(const_cast(const_xobject.Get())); if (!pXObject) { return; } @@ -946,8 +952,10 @@ void CPDF_StreamContentParser::Handle_SetGray_Stroke() { void CPDF_StreamContentParser::Handle_SetExtendGraphState() { ByteString name = GetString(0); - RetainPtr pGS = + RetainPtr const_gs = ToDictionary(FindResourceObj("ExtGState", name)); + RetainPtr pGS = + pdfium::WrapRetain(const_cast(const_gs.Get())); if (!pGS) { return; } @@ -1196,13 +1204,13 @@ void CPDF_StreamContentParser::Handle_SetFont() { } } -RetainPtr CPDF_StreamContentParser::FindResourceHolder( +RetainPtr CPDF_StreamContentParser::FindResourceHolder( ByteStringView type) { if (!resources_) { return nullptr; } - RetainPtr dict = resources_->GetMutableDictFor(type); + RetainPtr dict = resources_->GetDictFor(type); if (dict) { return dict; } @@ -1211,21 +1219,22 @@ RetainPtr CPDF_StreamContentParser::FindResourceHolder( return nullptr; } - return page_resources_->GetMutableDictFor(type); + return page_resources_->GetDictFor(type); } -RetainPtr CPDF_StreamContentParser::FindResourceObj( +RetainPtr CPDF_StreamContentParser::FindResourceObj( ByteStringView type, const ByteString& name) { - RetainPtr pHolder = FindResourceHolder(type); - return pHolder ? pHolder->GetMutableDirectObjectFor(name.AsStringView()) - : nullptr; + RetainPtr pHolder = FindResourceHolder(type); + return pHolder ? pHolder->GetDirectObjectFor(name.AsStringView()) : nullptr; } RetainPtr CPDF_StreamContentParser::FindFont( const ByteString& name) { - RetainPtr font_dict( + RetainPtr const_font_dict( ToDictionary(FindResourceObj("Font", name))); + RetainPtr font_dict = + pdfium::WrapRetain(const_cast(const_font_dict.Get())); if (!font_dict) { return CPDF_Font::GetStockFont(document_, CFX_Font::kDefaultAnsiFontName); } @@ -1284,7 +1293,9 @@ RetainPtr CPDF_StreamContentParser::FindColorSpace( RetainPtr CPDF_StreamContentParser::FindPattern( const ByteString& name) { - RetainPtr pPattern = FindResourceObj("Pattern", name); + RetainPtr const_pattern = FindResourceObj("Pattern", name); + RetainPtr pPattern = + pdfium::WrapRetain(const_cast(const_pattern.Get())); if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) { return nullptr; } @@ -1294,7 +1305,9 @@ RetainPtr CPDF_StreamContentParser::FindPattern( RetainPtr CPDF_StreamContentParser::FindShading( const ByteString& name) { - RetainPtr pPattern = FindResourceObj("Shading", name); + RetainPtr const_pattern = FindResourceObj("Shading", name); + RetainPtr pPattern = + pdfium::WrapRetain(const_cast(const_pattern.Get())); if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) { return nullptr; } diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h index 38e9977c20..91f4575364 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.h +++ b/core/fpdfapi/page/cpdf_streamcontentparser.h @@ -125,9 +125,9 @@ class CPDF_StreamContentParser { RetainPtr FindColorSpace(const ByteString& name); RetainPtr FindPattern(const ByteString& name); RetainPtr FindShading(const ByteString& name); - RetainPtr FindResourceHolder(ByteStringView type); - RetainPtr FindResourceObj(ByteStringView type, - const ByteString& name); + RetainPtr FindResourceHolder(ByteStringView type); + RetainPtr FindResourceObj(ByteStringView type, + const ByteString& name); // Takes ownership of |pImageObj|, returns unowned pointer to it. CPDF_ImageObject* AddImageObject(std::unique_ptr pImageObj); diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn index 94ab93ee7b..475c093aa0 100644 --- a/core/fpdfapi/parser/BUILD.gn +++ b/core/fpdfapi/parser/BUILD.gn @@ -53,6 +53,8 @@ source_set("parser") { "cpdf_page_object_avail.h", "cpdf_parser.cpp", "cpdf_parser.h", + "cpdf_read_only_graph_guard.cpp", + "cpdf_read_only_graph_guard.h", "cpdf_read_validator.cpp", "cpdf_read_validator.h", "cpdf_reference.cpp", @@ -128,6 +130,7 @@ pdfium_unittest_source_set("unittests") { "cpdf_object_walker_unittest.cpp", "cpdf_page_object_avail_unittest.cpp", "cpdf_parser_unittest.cpp", + "cpdf_read_only_graph_guard_unittest.cpp", "cpdf_read_validator_unittest.cpp", "cpdf_simple_parser_unittest.cpp", "cpdf_stream_acc_unittest.cpp", diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp b/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp new file mode 100644 index 0000000000..607bc3bf85 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp @@ -0,0 +1,25 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" + +namespace { + +thread_local bool g_read_only_graph_guard_active = false; + +} // namespace + +CPDF_ReadOnlyGraphGuard::CPDF_ReadOnlyGraphGuard() + : previous_(g_read_only_graph_guard_active) { + g_read_only_graph_guard_active = true; +} + +CPDF_ReadOnlyGraphGuard::~CPDF_ReadOnlyGraphGuard() { + g_read_only_graph_guard_active = previous_; +} + +// static +bool CPDF_ReadOnlyGraphGuard::IsActive() { + return g_read_only_graph_guard_active; +} diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard.h b/core/fpdfapi/parser/cpdf_read_only_graph_guard.h new file mode 100644 index 0000000000..64e1630af6 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard.h @@ -0,0 +1,30 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_READ_ONLY_GRAPH_GUARD_H_ +#define CORE_FPDFAPI_PARSER_CPDF_READ_ONLY_GRAPH_GUARD_H_ + +#include "core/fxcrt/check.h" + +class CPDF_ReadOnlyGraphGuard { + public: + CPDF_ReadOnlyGraphGuard(); + ~CPDF_ReadOnlyGraphGuard(); + + static bool IsActive(); + + private: + const bool previous_; +}; + +#if DCHECK_IS_ON() +#define DCHECK_PDF_GRAPH_MUTABLE_FOR(obj) \ + DCHECK(!CPDF_ReadOnlyGraphGuard::IsActive() || (obj)->GetObjNum() == 0) +#define DCHECK_PDF_HOLDER_MUTABLE() DCHECK(!CPDF_ReadOnlyGraphGuard::IsActive()) +#else +#define DCHECK_PDF_GRAPH_MUTABLE_FOR(obj) ((void)0) +#define DCHECK_PDF_HOLDER_MUTABLE() ((void)0) +#endif + +#endif // CORE_FPDFAPI_PARSER_CPDF_READ_ONLY_GRAPH_GUARD_H_ diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp b/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp new file mode 100644 index 0000000000..2a87202f86 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp @@ -0,0 +1,30 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(CPDFReadOnlyGraphGuardTest, ActiveStateStacks) { + EXPECT_FALSE(CPDF_ReadOnlyGraphGuard::IsActive()); + { + CPDF_ReadOnlyGraphGuard guard; + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsActive()); + { + CPDF_ReadOnlyGraphGuard nested_guard; + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsActive()); + } + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsActive()); + } + EXPECT_FALSE(CPDF_ReadOnlyGraphGuard::IsActive()); +} + +TEST(CPDFReadOnlyGraphGuardTest, AllowsInlineObjects) { + auto dict = pdfium::MakeRetain(); + ASSERT_EQ(0u, dict->GetObjNum()); + + CPDF_ReadOnlyGraphGuard guard; + DCHECK_PDF_GRAPH_MUTABLE_FOR(dict.Get()); +} diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index 1d40c9e63d..18a455617d 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp @@ -75,11 +75,11 @@ CPDF_Form* AnnotGetMatrix(CPDF_Page* pPage, return pForm; } -RetainPtr GetAnnotAPInternal(CPDF_Dictionary* pAnnotDict, +RetainPtr GetAnnotAPInternal(const CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode eMode, bool bFallbackToNormal) { - RetainPtr pAP = - pAnnotDict->GetMutableDictFor(pdfium::annotation::kAP); + RetainPtr pAP = + pAnnotDict->GetDictFor(pdfium::annotation::kAP); if (!pAP) { return nullptr; } @@ -94,17 +94,17 @@ RetainPtr GetAnnotAPInternal(CPDF_Dictionary* pAnnotDict, ap_entry = "N"; } - RetainPtr psub = pAP->GetMutableDirectObjectFor(ap_entry); + RetainPtr psub = pAP->GetDirectObjectFor(ap_entry); if (!psub) { return nullptr; } - RetainPtr pStream(psub->AsMutableStream()); + RetainPtr pStream(psub->AsStream()); if (pStream) { - return pStream; + return pdfium::WrapRetain(const_cast(pStream.Get())); } - CPDF_Dictionary* dict = psub->AsMutableDictionary(); + const CPDF_Dictionary* dict = psub->AsDictionary(); if (!dict) { return nullptr; } @@ -120,7 +120,8 @@ RetainPtr GetAnnotAPInternal(CPDF_Dictionary* pAnnotDict, as = (!value.IsEmpty() && dict->KeyExist(value.AsStringView())) ? value : "Off"; } - return dict->GetMutableStreamFor(as.AsStringView()); + RetainPtr stream = dict->GetStreamFor(as.AsStringView()); + return pdfium::WrapRetain(const_cast(stream.Get())); } } // namespace @@ -574,8 +575,9 @@ CPDF_Annot::Icon CPDF_Annot::StringToIcon(const ByteString& name) { ByteString prefix = name.First(2); if (prefix == "SB" || prefix == "SH") { Icon result = StringToIcon(name.Substr(2)); - if (result != Icon::kUnknown && result != Icon::kStamp_Custom) + if (result != Icon::kUnknown && result != Icon::kStamp_Custom) { return result; + } } } return Icon::kStamp_Custom; @@ -700,17 +702,17 @@ ByteString CPDF_Annot::LineEndingToString(CPDF_Annot::LineEnding le) { return "Circle"; case LineEnding::kDiamond: return "Diamond"; - case LineEnding::kOpenArrow: + case LineEnding::kOpenArrow: return "OpenArrow"; - case LineEnding::kClosedArrow: + case LineEnding::kClosedArrow: return "ClosedArrow"; - case LineEnding::kButt: + case LineEnding::kButt: return "Butt"; - case LineEnding::kROpenArrow: + case LineEnding::kROpenArrow: return "ROpenArrow"; - case LineEnding::kRClosedArrow: + case LineEnding::kRClosedArrow: return "RClosedArrow"; - case LineEnding::kSlash: + case LineEnding::kSlash: return "Slash"; case LineEnding::kUnknown: break; @@ -752,7 +754,8 @@ CPDF_Annot::LineEnding CPDF_Annot::StringToLineEnding(const ByteString& n) { return LineEnding::kUnknown; } -CPDF_Annot::StandardFont CPDF_Annot::StringToStandardFont(const ByteString& name) { +CPDF_Annot::StandardFont CPDF_Annot::StringToStandardFont( + const ByteString& name) { // Full canonical names (PDF Reference, Table 5.17) if (name == "Courier" || name == "Cour") { return StandardFont::kCourier; @@ -805,7 +808,7 @@ ByteString CPDF_Annot::StandardFontToString(CPDF_Annot::StandardFont font) { return "Courier"; case StandardFont::kCourier_Bold: return "Courier-Bold"; - case StandardFont::kCourier_BoldOblique: + case StandardFont::kCourier_BoldOblique: return "Courier-BoldOblique"; case StandardFont::kCourier_Oblique: return "Courier-Oblique"; @@ -838,11 +841,21 @@ ByteString CPDF_Annot::StandardFontToString(CPDF_Annot::StandardFont font) { // static CPDF_Annot::BorderStyle CPDF_Annot::StringToBorderStyle( const ByteString& sStyle) { - if (sStyle == "S") return CPDF_Annot::BorderStyle::kSolid; - if (sStyle == "D") return CPDF_Annot::BorderStyle::kDashed; - if (sStyle == "B") return CPDF_Annot::BorderStyle::kBeveled; - if (sStyle == "I") return CPDF_Annot::BorderStyle::kInset; - if (sStyle == "U") return CPDF_Annot::BorderStyle::kUnderline; + if (sStyle == "S") { + return CPDF_Annot::BorderStyle::kSolid; + } + if (sStyle == "D") { + return CPDF_Annot::BorderStyle::kDashed; + } + if (sStyle == "B") { + return CPDF_Annot::BorderStyle::kBeveled; + } + if (sStyle == "I") { + return CPDF_Annot::BorderStyle::kInset; + } + if (sStyle == "U") { + return CPDF_Annot::BorderStyle::kUnderline; + } return CPDF_Annot::BorderStyle::kUnknown; } diff --git a/core/fpdfdoc/cpdf_linklist.cpp b/core/fpdfdoc/cpdf_linklist.cpp index c80270e7fb..a7296bc7c9 100644 --- a/core/fpdfdoc/cpdf_linklist.cpp +++ b/core/fpdfdoc/cpdf_linklist.cpp @@ -20,7 +20,7 @@ CPDF_LinkList::~CPDF_LinkList() = default; CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, const CFX_PointF& point, int* z_order) { - const std::vector>* pPageLinkList = + const std::vector>* pPageLinkList = GetPageLinks(pPage); if (!pPageLinkList) { return CPDF_Link(); @@ -28,12 +28,13 @@ CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, for (size_t i = pPageLinkList->size(); i > 0; --i) { size_t annot_index = i - 1; - RetainPtr pAnnot = (*pPageLinkList)[annot_index]; + RetainPtr pAnnot = (*pPageLinkList)[annot_index]; if (!pAnnot) { continue; } - CPDF_Link link(std::move(pAnnot)); + CPDF_Link link( + pdfium::WrapRetain(const_cast(pAnnot.Get()))); if (!link.GetRect().Contains(point)) { continue; } @@ -46,8 +47,8 @@ CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, return CPDF_Link(); } -const std::vector>* CPDF_LinkList::GetPageLinks( - CPDF_Page* pPage) { +const std::vector>* +CPDF_LinkList::GetPageLinks(CPDF_Page* pPage) { uint32_t objnum = pPage->GetDict()->GetObjNum(); if (objnum == 0) { return nullptr; @@ -60,13 +61,13 @@ const std::vector>* CPDF_LinkList::GetPageLinks( // std::map::operator[] forces the creation of a map entry. auto* page_link_list = &page_map_[objnum]; - RetainPtr pAnnotList = pPage->GetMutableAnnotsArray(); + RetainPtr pAnnotList = pPage->GetAnnotsArray(); if (!pAnnotList) { return page_link_list; } for (size_t i = 0; i < pAnnotList->size(); ++i) { - RetainPtr pAnnot = pAnnotList->GetMutableDictAt(i); + RetainPtr pAnnot = pAnnotList->GetDictAt(i); bool add_link = (pAnnot && pAnnot->GetByteStringFor("Subtype") == "Link"); // Add non-links as nullptrs to preserve z-order. page_link_list->emplace_back(add_link ? pAnnot : nullptr); diff --git a/core/fpdfdoc/cpdf_linklist.h b/core/fpdfdoc/cpdf_linklist.h index b259aaf88a..d9d1257741 100644 --- a/core/fpdfdoc/cpdf_linklist.h +++ b/core/fpdfdoc/cpdf_linklist.h @@ -29,9 +29,10 @@ class CPDF_LinkList final : public CPDF_Document::LinkListIface { int* z_order); private: - const std::vector>* GetPageLinks(CPDF_Page* pPage); + const std::vector>* GetPageLinks( + CPDF_Page* pPage); - std::map>> page_map_; + std::map>> page_map_; }; #endif // CORE_FPDFDOC_CPDF_LINKLIST_H_ diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 5603622e10..3d262c6a3b 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -15,14 +15,14 @@ #include "constants/annotation_common.h" #include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" -#include "core/fpdfapi/edit/cpdf_pageorganizer.h" #include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h" +#include "core/fpdfapi/edit/cpdf_pageorganizer.h" #include "core/fpdfapi/edit/cpdf_text_redactor.h" #include "core/fpdfapi/page/cpdf_annotcontext.h" -#include "core/fpdfapi/page/cpdf_formobject.h" #include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_image.h" #include "core/fpdfapi/page/cpdf_imageobject.h" -#include "core/fpdfapi/page/cpdf_image.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pageobject.h" #include "core/fpdfapi/parser/cpdf_array.h" @@ -213,57 +213,51 @@ static_assert(static_cast(CPDF_Annot::BorderStyle::kUnknown) == FPDF_ANNOT_BS_UNKNOWN, "CPDF_Annot::BorderStyle::kUnknown value mismatch"); -// These checks ensure the consistency of blend mode values across core/ and public. -static_assert(static_cast(BlendMode::kNormal) == - FPDF_BLENDMODE_Normal, +// These checks ensure the consistency of blend mode values across core/ and +// public. +static_assert(static_cast(BlendMode::kNormal) == FPDF_BLENDMODE_Normal, "BlendMode::kNormal value mismatch"); -static_assert(static_cast(BlendMode::kMultiply) == - FPDF_BLENDMODE_Multiply, +static_assert(static_cast(BlendMode::kMultiply) == FPDF_BLENDMODE_Multiply, "BlendMode::kMultiply value mismatch"); -static_assert(static_cast(BlendMode::kScreen) == - FPDF_BLENDMODE_Screen, +static_assert(static_cast(BlendMode::kScreen) == FPDF_BLENDMODE_Screen, "BlendMode::kScreen value mismatch"); -static_assert(static_cast(BlendMode::kOverlay) == - FPDF_BLENDMODE_Overlay, +static_assert(static_cast(BlendMode::kOverlay) == FPDF_BLENDMODE_Overlay, "BlendMode::kOverlay value mismatch"); -static_assert(static_cast(BlendMode::kDarken) == - FPDF_BLENDMODE_Darken, +static_assert(static_cast(BlendMode::kDarken) == FPDF_BLENDMODE_Darken, "BlendMode::kDarken value mismatch"); -static_assert(static_cast(BlendMode::kLighten) == - FPDF_BLENDMODE_Lighten, +static_assert(static_cast(BlendMode::kLighten) == FPDF_BLENDMODE_Lighten, "BlendMode::kLighten value mismatch"); -static_assert(static_cast(BlendMode::kColorDodge) == - FPDF_BLENDMODE_ColorDodge, +static_assert(static_cast(BlendMode::kColorDodge) == + FPDF_BLENDMODE_ColorDodge, "BlendMode::kColorDodge value mismatch"); -static_assert(static_cast(BlendMode::kColorBurn) == - FPDF_BLENDMODE_ColorBurn, +static_assert(static_cast(BlendMode::kColorBurn) == + FPDF_BLENDMODE_ColorBurn, "BlendMode::kColorBurn value mismatch"); -static_assert(static_cast(BlendMode::kHardLight) == - FPDF_BLENDMODE_HardLight, - "BlendMode::kHardLight value mismatch"); -static_assert(static_cast(BlendMode::kSoftLight) == - FPDF_BLENDMODE_SoftLight, +static_assert(static_cast(BlendMode::kHardLight) == + FPDF_BLENDMODE_HardLight, + "BlendMode::kHardLight value mismatch"); +static_assert(static_cast(BlendMode::kSoftLight) == + FPDF_BLENDMODE_SoftLight, "BlendMode::kSoftLight value mismatch"); -static_assert(static_cast(BlendMode::kDifference) == - FPDF_BLENDMODE_Difference, +static_assert(static_cast(BlendMode::kDifference) == + FPDF_BLENDMODE_Difference, "BlendMode::kDifference value mismatch"); -static_assert(static_cast(BlendMode::kExclusion) == - FPDF_BLENDMODE_Exclusion, +static_assert(static_cast(BlendMode::kExclusion) == + FPDF_BLENDMODE_Exclusion, "BlendMode::kExclusion value mismatch"); -static_assert(static_cast(BlendMode::kHue) == - FPDF_BLENDMODE_Hue, - "BlendMode::kHue value mismatch"); -static_assert(static_cast(BlendMode::kSaturation) == - FPDF_BLENDMODE_Saturation, +static_assert(static_cast(BlendMode::kHue) == FPDF_BLENDMODE_Hue, + "BlendMode::kHue value mismatch"); +static_assert(static_cast(BlendMode::kSaturation) == + FPDF_BLENDMODE_Saturation, "BlendMode::kSaturation value mismatch"); -static_assert(static_cast(BlendMode::kColor) == - FPDF_BLENDMODE_Color, +static_assert(static_cast(BlendMode::kColor) == FPDF_BLENDMODE_Color, "BlendMode::kColor value mismatch"); -static_assert(static_cast(BlendMode::kLuminosity) == - FPDF_BLENDMODE_Luminosity, +static_assert(static_cast(BlendMode::kLuminosity) == + FPDF_BLENDMODE_Luminosity, "BlendMode::kLuminosity value mismatch"); -// These checks ensure the consistency of line ending values across core/ and public. +// These checks ensure the consistency of line ending values across core/ and +// public. static_assert(static_cast(CPDF_Annot::LineEnding::kNone) == FPDF_ANNOT_LE_None, "LineEnding::kNone mismatch"); @@ -298,159 +292,163 @@ static_assert(static_cast(CPDF_Annot::LineEnding::kUnknown) == FPDF_ANNOT_LE_Unknown, "LineEnding::kUnknown mismatch"); -// These checks ensure the consistency of standard font values across core/ and public. -static_assert(static_cast(CPDF_Annot::StandardFont::kCourier) == - FPDF_FONT_COURIER, +// These checks ensure the consistency of standard font values across core/ and +// public. +static_assert(static_cast(CPDF_Annot::StandardFont::kCourier) == + FPDF_FONT_COURIER, "CPDF_Annot::StandardFont::kCourier mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kCourier_Bold) == - FPDF_FONT_COURIER_BOLD, +static_assert(static_cast(CPDF_Annot::StandardFont::kCourier_Bold) == + FPDF_FONT_COURIER_BOLD, "CPDF_Annot::StandardFont::kCourier_Bold mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kCourier_BoldOblique) == - FPDF_FONT_COURIER_BOLDITALIC, - "CPDF_Annot::StandardFont::kCourier_BoldOblique mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kCourier_Oblique) == - FPDF_FONT_COURIER_ITALIC, +static_assert( + static_cast(CPDF_Annot::StandardFont::kCourier_BoldOblique) == + FPDF_FONT_COURIER_BOLDITALIC, + "CPDF_Annot::StandardFont::kCourier_BoldOblique mismatch"); +static_assert(static_cast(CPDF_Annot::StandardFont::kCourier_Oblique) == + FPDF_FONT_COURIER_ITALIC, "CPDF_Annot::StandardFont::kCourier_Oblique mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica) == - FPDF_FONT_HELVETICA, +static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica) == + FPDF_FONT_HELVETICA, "CPDF_Annot::StandardFont::kHelvetica mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica_Bold) == - FPDF_FONT_HELVETICA_BOLD, +static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica_Bold) == + FPDF_FONT_HELVETICA_BOLD, "CPDF_Annot::StandardFont::kHelvetica_Bold mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica_BoldOblique) == - FPDF_FONT_HELVETICA_BOLDITALIC, - "CPDF_Annot::StandardFont::kHelvetica_BoldOblique mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica_Oblique) == - FPDF_FONT_HELVETICA_ITALIC, +static_assert( + static_cast(CPDF_Annot::StandardFont::kHelvetica_BoldOblique) == + FPDF_FONT_HELVETICA_BOLDITALIC, + "CPDF_Annot::StandardFont::kHelvetica_BoldOblique mismatch"); +static_assert(static_cast(CPDF_Annot::StandardFont::kHelvetica_Oblique) == + FPDF_FONT_HELVETICA_ITALIC, "CPDF_Annot::StandardFont::kHelvetica_Oblique mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Roman) == - FPDF_FONT_TIMES_ROMAN, +static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Roman) == + FPDF_FONT_TIMES_ROMAN, "CPDF_Annot::StandardFont::kTimes_Roman mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Bold) == - FPDF_FONT_TIMES_BOLD, +static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Bold) == + FPDF_FONT_TIMES_BOLD, "CPDF_Annot::StandardFont::kTimes_Bold mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_BoldItalic) == - FPDF_FONT_TIMES_BOLDITALIC, +static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_BoldItalic) == + FPDF_FONT_TIMES_BOLDITALIC, "CPDF_Annot::StandardFont::kTimes_BoldItalic mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Italic) == - FPDF_FONT_TIMES_ITALIC, +static_assert(static_cast(CPDF_Annot::StandardFont::kTimes_Italic) == + FPDF_FONT_TIMES_ITALIC, "CPDF_Annot::StandardFont::kTimes_Italic mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kSymbol) == - FPDF_FONT_SYMBOL, +static_assert(static_cast(CPDF_Annot::StandardFont::kSymbol) == + FPDF_FONT_SYMBOL, "CPDF_Annot::StandardFont::kSymbol mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kZapfDingbats) == - FPDF_FONT_ZAPFDINGBATS, +static_assert(static_cast(CPDF_Annot::StandardFont::kZapfDingbats) == + FPDF_FONT_ZAPFDINGBATS, "CPDF_Annot::StandardFont::kZapfDingbats mismatch"); -static_assert(static_cast(CPDF_Annot::StandardFont::kUnknown) == - FPDF_FONT_UNKNOWN, +static_assert(static_cast(CPDF_Annot::StandardFont::kUnknown) == + FPDF_FONT_UNKNOWN, "CPDF_Annot::StandardFont::kUnknown mismatch"); // These checks ensure consistency between the public API and internal enums. -static_assert(static_cast(CPDF_Annot::TextAlignment::kLeft) == - FPDF_TEXT_ALIGNMENT_LEFT, +static_assert(static_cast(CPDF_Annot::TextAlignment::kLeft) == + FPDF_TEXT_ALIGNMENT_LEFT, "CPDF_Annot::TextAlignment::kLeft mismatch"); -static_assert(static_cast(CPDF_Annot::TextAlignment::kCenter) == - FPDF_TEXT_ALIGNMENT_CENTER, +static_assert(static_cast(CPDF_Annot::TextAlignment::kCenter) == + FPDF_TEXT_ALIGNMENT_CENTER, "CPDF_Annot::TextAlignment::kCenter mismatch"); -static_assert(static_cast(CPDF_Annot::TextAlignment::kRight) == - FPDF_TEXT_ALIGNMENT_RIGHT, +static_assert(static_cast(CPDF_Annot::TextAlignment::kRight) == + FPDF_TEXT_ALIGNMENT_RIGHT, "CPDF_Annot::TextAlignment::kRight mismatch"); -// These checks ensure the consistency of vertical alignment values across core/ and public. -static_assert(static_cast(CPDF_Annot::VerticalAlignment::kTop) == - FPDF_VERTICAL_ALIGNMENT_TOP, +// These checks ensure the consistency of vertical alignment values across core/ +// and public. +static_assert(static_cast(CPDF_Annot::VerticalAlignment::kTop) == + FPDF_VERTICAL_ALIGNMENT_TOP, "CPDF_Annot::VerticalAlignment::kTop mismatch"); -static_assert(static_cast(CPDF_Annot::VerticalAlignment::kMiddle) == - FPDF_VERTICAL_ALIGNMENT_MIDDLE, +static_assert(static_cast(CPDF_Annot::VerticalAlignment::kMiddle) == + FPDF_VERTICAL_ALIGNMENT_MIDDLE, "CPDF_Annot::VerticalAlignment::kMiddle mismatch"); -static_assert(static_cast(CPDF_Annot::VerticalAlignment::kBottom) == - FPDF_VERTICAL_ALIGNMENT_BOTTOM, +static_assert(static_cast(CPDF_Annot::VerticalAlignment::kBottom) == + FPDF_VERTICAL_ALIGNMENT_BOTTOM, "CPDF_Annot::VerticalAlignment::kBottom mismatch"); // These checks ensure the consistency of icon values across core/ and public. static_assert(static_cast(CPDF_Annot::Icon::kUnknown) == - FPDF_ANNOT_NAME_UNKNOWN, + FPDF_ANNOT_NAME_UNKNOWN, "Icon::kUnknown mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Comment) == - FPDF_ANNOT_NAME_Text_Comment, +static_assert(static_cast(CPDF_Annot::Icon::kText_Comment) == + FPDF_ANNOT_NAME_Text_Comment, "Icon::kText_Comment mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Key) == - FPDF_ANNOT_NAME_Text_Key, +static_assert(static_cast(CPDF_Annot::Icon::kText_Key) == + FPDF_ANNOT_NAME_Text_Key, "Icon::kText_Key mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Note) == - FPDF_ANNOT_NAME_Text_Note, +static_assert(static_cast(CPDF_Annot::Icon::kText_Note) == + FPDF_ANNOT_NAME_Text_Note, "Icon::kText_Note mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Help) == - FPDF_ANNOT_NAME_Text_Help, +static_assert(static_cast(CPDF_Annot::Icon::kText_Help) == + FPDF_ANNOT_NAME_Text_Help, "Icon::kText_Help mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_NewParagraph) == - FPDF_ANNOT_NAME_Text_NewParagraph, +static_assert(static_cast(CPDF_Annot::Icon::kText_NewParagraph) == + FPDF_ANNOT_NAME_Text_NewParagraph, "Icon::kText_NewParagraph mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Paragraph) == - FPDF_ANNOT_NAME_Text_Paragraph, +static_assert(static_cast(CPDF_Annot::Icon::kText_Paragraph) == + FPDF_ANNOT_NAME_Text_Paragraph, "Icon::kText_Paragraph mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kText_Insert) == - FPDF_ANNOT_NAME_Text_Insert, +static_assert(static_cast(CPDF_Annot::Icon::kText_Insert) == + FPDF_ANNOT_NAME_Text_Insert, "Icon::kText_Insert mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kFile_Graph) == - FPDF_ANNOT_NAME_File_Graph, +static_assert(static_cast(CPDF_Annot::Icon::kFile_Graph) == + FPDF_ANNOT_NAME_File_Graph, "Icon::kFile_Graph mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kFile_PushPin) == - FPDF_ANNOT_NAME_File_PushPin, +static_assert(static_cast(CPDF_Annot::Icon::kFile_PushPin) == + FPDF_ANNOT_NAME_File_PushPin, "Icon::kFile_PushPin mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kFile_Paperclip) == - FPDF_ANNOT_NAME_File_Paperclip, +static_assert(static_cast(CPDF_Annot::Icon::kFile_Paperclip) == + FPDF_ANNOT_NAME_File_Paperclip, "Icon::kFile_Paperclip mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kFile_Tag) == - FPDF_ANNOT_NAME_File_Tag, +static_assert(static_cast(CPDF_Annot::Icon::kFile_Tag) == + FPDF_ANNOT_NAME_File_Tag, "Icon::kFile_Tag mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kSound_Speaker) == - FPDF_ANNOT_NAME_Sound_Speaker, +static_assert(static_cast(CPDF_Annot::Icon::kSound_Speaker) == + FPDF_ANNOT_NAME_Sound_Speaker, "Icon::kSound_Speaker mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kSound_Mic) == - FPDF_ANNOT_NAME_Sound_Mic, +static_assert(static_cast(CPDF_Annot::Icon::kSound_Mic) == + FPDF_ANNOT_NAME_Sound_Mic, "Icon::kSound_Mic mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Approved) == - FPDF_ANNOT_NAME_Stamp_Approved, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Approved) == + FPDF_ANNOT_NAME_Stamp_Approved, "Icon::kStamp_Approved mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Experimental) == - FPDF_ANNOT_NAME_Stamp_Experimental, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Experimental) == + FPDF_ANNOT_NAME_Stamp_Experimental, "Icon::kStamp_Experimental mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_NotApproved) == - FPDF_ANNOT_NAME_Stamp_NotApproved, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_NotApproved) == + FPDF_ANNOT_NAME_Stamp_NotApproved, "Icon::kStamp_NotApproved mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_AsIs) == - FPDF_ANNOT_NAME_Stamp_AsIs, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_AsIs) == + FPDF_ANNOT_NAME_Stamp_AsIs, "Icon::kStamp_AsIs mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Expired) == - FPDF_ANNOT_NAME_Stamp_Expired, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Expired) == + FPDF_ANNOT_NAME_Stamp_Expired, "Icon::kStamp_Expired mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_NotForPublicRelease) == - FPDF_ANNOT_NAME_Stamp_NotForPublicRelease, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_NotForPublicRelease) == + FPDF_ANNOT_NAME_Stamp_NotForPublicRelease, "Icon::kStamp_NotForPublicRelease mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Confidential) == - FPDF_ANNOT_NAME_Stamp_Confidential, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Confidential) == + FPDF_ANNOT_NAME_Stamp_Confidential, "Icon::kStamp_Confidential mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Final) == - FPDF_ANNOT_NAME_Stamp_Final, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Final) == + FPDF_ANNOT_NAME_Stamp_Final, "Icon::kStamp_Final mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Sold) == - FPDF_ANNOT_NAME_Stamp_Sold, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Sold) == + FPDF_ANNOT_NAME_Stamp_Sold, "Icon::kStamp_Sold mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Departmental) == - FPDF_ANNOT_NAME_Stamp_Departmental, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Departmental) == + FPDF_ANNOT_NAME_Stamp_Departmental, "Icon::kStamp_Departmental mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_ForComment) == - FPDF_ANNOT_NAME_Stamp_ForComment, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_ForComment) == + FPDF_ANNOT_NAME_Stamp_ForComment, "Icon::kStamp_ForComment mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_TopSecret) == - FPDF_ANNOT_NAME_Stamp_TopSecret, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_TopSecret) == + FPDF_ANNOT_NAME_Stamp_TopSecret, "Icon::kStamp_TopSecret mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_Draft) == - FPDF_ANNOT_NAME_Stamp_Draft, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_Draft) == + FPDF_ANNOT_NAME_Stamp_Draft, "Icon::kStamp_Draft mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kStamp_ForPublicRelease) == - FPDF_ANNOT_NAME_Stamp_ForPublicRelease, +static_assert(static_cast(CPDF_Annot::Icon::kStamp_ForPublicRelease) == + FPDF_ANNOT_NAME_Stamp_ForPublicRelease, "Icon::kStamp_ForPublicRelease mismatch"); static_assert(static_cast(CPDF_Annot::Icon::kStamp_Completed) == FPDF_ANNOT_NAME_Stamp_Completed, @@ -485,11 +483,11 @@ static_assert(static_cast(CPDF_Annot::Icon::kStamp_Custom) == static_assert(static_cast(CPDF_Annot::Icon::kStamp_Image) == FPDF_ANNOT_NAME_Stamp_Image, "Icon::kStamp_Image mismatch"); -static_assert(static_cast(CPDF_Annot::Icon::kLast) == - FPDF_ANNOT_NAME_LAST, +static_assert(static_cast(CPDF_Annot::Icon::kLast) == FPDF_ANNOT_NAME_LAST, "Icon::kLast mismatch"); -// These checks ensure the consistency of reply type values across core/ and public. +// These checks ensure the consistency of reply type values across core/ and +// public. static_assert(static_cast(CPDF_Annot::ReplyType::kUnknown) == FPDF_ANNOT_RT_UNKNOWN, "ReplyType::kUnknown mismatch"); @@ -501,39 +499,44 @@ static_assert(static_cast(CPDF_Annot::ReplyType::kGroup) == "ReplyType::kGroup mismatch"); class RawAnnotContext final : public CPDF_AnnotContext { - public: - // Takes ownership of |unparsed_page| by value (RetainPtr). - RawAnnotContext(RetainPtr dict, - RetainPtr unparsed_page) - : CPDF_AnnotContext(dict, unparsed_page.Get()), - owned_page_(std::move(unparsed_page)) {} - - private: - // Keeps the page alive as long as the annot context lives. - const RetainPtr owned_page_; - }; + public: + // Takes ownership of |unparsed_page| by value (RetainPtr). + RawAnnotContext(RetainPtr dict, + RetainPtr unparsed_page) + : CPDF_AnnotContext(dict, unparsed_page.Get()), + owned_page_(std::move(unparsed_page)) {} + + private: + // Keeps the page alive as long as the annot context lives. + const RetainPtr owned_page_; +}; class AnnotAppearanceExporter final : public CPDF_PageOrganizer { public: AnnotAppearanceExporter(CPDF_Document* dest_doc, CPDF_Document* src_doc) : CPDF_PageOrganizer(dest_doc, src_doc) {} - RetainPtr ExportFormXObject(RetainPtr src_stream) { - if (!src_stream || !Init()) + RetainPtr ExportFormXObject( + RetainPtr src_stream) { + if (!src_stream || !Init()) { return nullptr; + } RetainPtr cloned_object = src_stream->Clone(); RetainPtr cloned_stream = ToStream(cloned_object); - if (!cloned_stream) + if (!cloned_stream) { return nullptr; + } const uint32_t src_obj_num = src_stream->GetObjNum(); const uint32_t dest_obj_num = dest()->AddIndirectObject(cloned_object); - if (src_obj_num) + if (src_obj_num) { AddObjectMapping(src_obj_num, dest_obj_num); + } - if (!UpdateReference(cloned_object)) + if (!UpdateReference(cloned_object)) { return nullptr; + } return cloned_stream; } @@ -631,12 +634,14 @@ void UpdateBBox(CPDF_Dictionary* annot_dict) { } BlendMode GetEffectiveAnnotBlendMode(CPDF_AnnotContext* ctx) { - if (!ctx) + if (!ctx) { return BlendMode::kNormal; + } RetainPtr annot_dict = ctx->GetMutableAnnotDict(); - if (!annot_dict) + if (!annot_dict) { return BlendMode::kNormal; + } // Get (or detect absence of) normal appearance stream. RetainPtr ap_stream = @@ -645,27 +650,32 @@ BlendMode GetEffectiveAnnotBlendMode(CPDF_AnnotContext* ctx) { // Heuristic: highlight annotations without AP are effectively Multiply. const CPDF_Annot::Subtype subtype = CPDF_Annot::StringToAnnotSubtype( annot_dict->GetNameFor(pdfium::annotation::kSubtype)); - if (subtype == CPDF_Annot::Subtype::HIGHLIGHT) + if (subtype == CPDF_Annot::Subtype::HIGHLIGHT) { return BlendMode::kMultiply; + } return BlendMode::kNormal; } // Ensure form is parsed. - if (!ctx->HasForm()) + if (!ctx->HasForm()) { ctx->SetForm(ap_stream); + } CPDF_Form* form = ctx->GetForm(); - if (!form) + if (!form) { return BlendMode::kNormal; + } // Iterate objects in creation order; pick first non-Normal encountered. for (const auto& obj : *form) { - if (!obj) + if (!obj) { continue; + } const CPDF_GeneralState& gs = obj->general_state(); BlendMode bm = gs.GetBlendType(); - if (bm != BlendMode::kNormal) + if (bm != BlendMode::kNormal) { return bm; + } } return BlendMode::kNormal; } @@ -685,8 +695,9 @@ RetainPtr GetMutableAnnotDictFromFPDFAnnotation( static uint32_t EnsureIndirect(CPDF_Document* doc, RetainPtr dict) { uint32_t objnum = dict->GetObjNum(); - if (objnum == 0) + if (objnum == 0) { objnum = doc->AddIndirectObject(dict); + } return objnum; } @@ -853,19 +864,28 @@ enum class EPDFStampFitCpp { kContain = 0, kCover = 1, kStretch = 2 }; inline EPDFStampFitCpp ToCpp(EPDF_STAMP_FIT v) { switch (v) { - case EPDF_STAMP_FIT_COVER: return EPDFStampFitCpp::kCover; - case EPDF_STAMP_FIT_STRETCH: return EPDFStampFitCpp::kStretch; - case EPDF_STAMP_FIT_CONTAIN: return EPDFStampFitCpp::kContain; + case EPDF_STAMP_FIT_COVER: + return EPDFStampFitCpp::kCover; + case EPDF_STAMP_FIT_STRETCH: + return EPDFStampFitCpp::kStretch; + case EPDF_STAMP_FIT_CONTAIN: + return EPDFStampFitCpp::kContain; } return EPDFStampFitCpp::kContain; } -static bool FitImageIntoBox(float box_w, float box_h, - float img_w, float img_h, +static bool FitImageIntoBox(float box_w, + float box_h, + float img_w, + float img_h, EPDFStampFitCpp fit, - float* out_drawn_w, float* out_drawn_h, - float* out_dx, float* out_dy) { - if (box_w <= 0 || box_h <= 0 || img_w <= 0 || img_h <= 0) return false; + float* out_drawn_w, + float* out_drawn_h, + float* out_dx, + float* out_dy) { + if (box_w <= 0 || box_h <= 0 || img_w <= 0 || img_h <= 0) { + return false; + } const float sx = box_w / img_w; const float sy = box_h / img_h; @@ -902,13 +922,16 @@ static bool FitImageIntoBox(float box_w, float box_h, // CalcBoundingBox() already returns bounds in the post-Matrix display space. // We therefore must NOT apply the Matrix again here. // Falls back to the raw /BBox if the form has no parseable page objects. -static CFX_FloatRect GetPaintedFormBounds(CPDF_Document* doc, CPDF_Stream* stream) { - if (!doc || !stream) +static CFX_FloatRect GetPaintedFormBounds(CPDF_Document* doc, + CPDF_Stream* stream) { + if (!doc || !stream) { return CFX_FloatRect(); + } RetainPtr stream_dict = stream->GetMutableDict(); - if (!stream_dict) + if (!stream_dict) { return CFX_FloatRect(); + } auto form = std::make_unique( doc, stream_dict->GetMutableDictFor("Resources"), @@ -921,8 +944,9 @@ static CFX_FloatRect GetPaintedFormBounds(CPDF_Document* doc, CPDF_Stream* strea bounds = stream_dict->GetRectFor("BBox"); bounds.Normalize(); } - if (bounds.IsEmpty()) + if (bounds.IsEmpty()) { return CFX_FloatRect(); + } return bounds; } @@ -930,13 +954,15 @@ static CFX_FloatRect GetPaintedFormBounds(CPDF_Document* doc, CPDF_Stream* strea // has no parseable page objects, or all objects are outside the BBox clip). // Computes the display box by applying the stream's /Matrix to its /BBox. static CFX_FloatRect GetFormDisplayBox(const CPDF_Dictionary* stream_dict) { - if (!stream_dict) + if (!stream_dict) { return CFX_FloatRect(); + } CFX_FloatRect bbox = stream_dict->GetRectFor("BBox"); bbox.Normalize(); - if (bbox.IsEmpty()) + if (bbox.IsEmpty()) { return CFX_FloatRect(); + } CFX_Matrix matrix = stream_dict->GetMatrixFor("Matrix"); if (!matrix.IsIdentity()) { @@ -950,12 +976,11 @@ static CFX_FloatRect GetFormDisplayBox(const CPDF_Dictionary* stream_dict) { // Resources/XObject/EPDFWRAP, so the outer AP content can be a simple // "q ... cm /EPDFWRAP Do Q" that handles all scaling. Returns false on // failure; on success the caller must write the new wrapper content stream. -static bool WrapAPContentIntoFormXObject( - CPDF_Stream* ap, - CPDF_Document* doc) { +static bool WrapAPContentIntoFormXObject(CPDF_Stream* ap, CPDF_Document* doc) { RetainPtr ap_dict = ap->GetMutableDict(); - if (!ap_dict) + if (!ap_dict) { return false; + } // Build the child Form XObject dictionary. auto child_dict = doc->New(); @@ -967,17 +992,20 @@ static bool WrapAPContentIntoFormXObject( // Fallback to Matrix-transformed BBox if the raw BBox is missing/empty. CFX_FloatRect bbox = ap_dict->GetRectFor("BBox"); bbox.Normalize(); - if (bbox.IsEmpty()) + if (bbox.IsEmpty()) { bbox = GetFormDisplayBox(ap_dict.Get()); - if (bbox.IsEmpty()) + } + if (bbox.IsEmpty()) { return false; + } child_dict->SetRectFor("BBox", bbox); CFX_Matrix child_matrix = ap_dict->GetMatrixFor("Matrix"); - if (!child_matrix.IsIdentity()) + if (!child_matrix.IsIdentity()) { child_dict->SetMatrixFor("Matrix", child_matrix); - else + } else { child_dict->RemoveFor("Matrix"); + } // Move Resources to the child (avoids deep-clone cost). RetainPtr res = ap_dict->GetMutableDictFor("Resources"); @@ -1000,8 +1028,7 @@ static bool WrapAPContentIntoFormXObject( ap_dict->SetNewFor("Resources"); RetainPtr xobj = new_res->SetNewFor("XObject"); - xobj->SetNewFor("EPDFWRAP", doc, - child_stream->GetObjNum()); + xobj->SetNewFor("EPDFWRAP", doc, child_stream->GetObjNum()); return true; } } // namespace @@ -1068,18 +1095,20 @@ FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetAnnotCount(FPDF_PAGE page) { FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page, int index) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage || index < 0) { return nullptr; } - RetainPtr pAnnots = pPage->GetMutableAnnotsArray(); + RetainPtr pAnnots = pPage->GetAnnotsArray(); if (!pAnnots || static_cast(index) >= pAnnots->size()) { return nullptr; } + RetainPtr const_dict = + ToDictionary(pAnnots->GetDirectObjectAt(index)); RetainPtr dict = - ToDictionary(pAnnots->GetMutableDirectObjectAt(index)); + pdfium::WrapRetain(const_cast(const_dict.Get())); if (!dict) { return nullptr; } @@ -2369,26 +2398,31 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_SetURI(FPDF_ANNOTATION annot, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetAction(FPDF_ANNOTATION annot, FPDF_ACTION action) { - if (!action || FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_LINK) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAction(FPDF_ANNOTATION annot, + FPDF_ACTION action) { + if (!action || FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_LINK) { return false; + } CPDF_AnnotContext* pAnnotContext = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!pAnnotContext) + if (!pAnnotContext) { return false; + } RetainPtr annot_dict = pAnnotContext->GetMutableAnnotDict(); - if (!annot_dict) + if (!annot_dict) { return false; + } CPDF_Dictionary* act_dict = CPDFDictionaryFromFPDFAction(action); - if (!act_dict) + if (!act_dict) { return false; + } // Require the action to be indirect so we can reference it. - if (act_dict->GetObjNum() == 0) + if (act_dict->GetObjNum() == 0) { return false; + } CPDF_Document* pDoc = pAnnotContext->GetPage()->GetDocument(); @@ -2456,15 +2490,16 @@ static ByteString GetColorKeyForType(FPDFANNOT_COLORTYPE type) { return "C"; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetColor(FPDF_ANNOTATION annot, - FPDFANNOT_COLORTYPE type, - unsigned int R, - unsigned int G, - unsigned int B) { - RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict || R > 255 || G > 255 || B > 255) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetColor(FPDF_ANNOTATION annot, + FPDFANNOT_COLORTYPE type, + unsigned int R, + unsigned int G, + unsigned int B) { + RetainPtr pAnnotDict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!pAnnotDict || R > 255 || G > 255 || B > 255) { return false; + } // OverlayColor (OC) is only valid for Redact annotations. if (type == FPDFANNOT_COLORTYPE_OverlayColor && @@ -2473,7 +2508,8 @@ EPDFAnnot_SetColor(FPDF_ANNOTATION annot, } ByteString key = GetColorKeyForType(type); - RetainPtr pColor = pAnnotDict->GetMutableArrayFor(key.AsStringView()); + RetainPtr pColor = + pAnnotDict->GetMutableArrayFor(key.AsStringView()); if (pColor) { pColor->Clear(); } else { @@ -2487,18 +2523,19 @@ EPDFAnnot_SetColor(FPDF_ANNOTATION annot, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetColor(FPDF_ANNOTATION annot, - FPDFANNOT_COLORTYPE type, - unsigned int* R, - unsigned int* G, - unsigned int* B) { - if (!R || !G || !B) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetColor(FPDF_ANNOTATION annot, + FPDFANNOT_COLORTYPE type, + unsigned int* R, + unsigned int* G, + unsigned int* B) { + if (!R || !G || !B) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // OverlayColor (OC) is only valid for Redact annotations. if (type == FPDFANNOT_COLORTYPE_OverlayColor && @@ -2508,8 +2545,9 @@ EPDFAnnot_GetColor(FPDF_ANNOTATION annot, ByteString key = GetColorKeyForType(type); RetainPtr pColor = dict->GetArrayFor(key.AsStringView()); - if (!pColor) - return false; // "no colour set" + if (!pColor) { + return false; // "no colour set" + } CFX_Color color = fpdfdoc::CFXColorFromArray(*pColor); switch (color.nColorType) { @@ -2521,7 +2559,7 @@ EPDFAnnot_GetColor(FPDF_ANNOTATION annot, case CFX_Color::Type::kGray: *R = *G = *B = color.fColor1 * 255.f; break; - case CFX_Color::Type::kCMYK: // convert roughly + case CFX_Color::Type::kCMYK: // convert roughly *R = 255.f * (1 - color.fColor1) * (1 - color.fColor4); *G = 255.f * (1 - color.fColor2) * (1 - color.fColor4); *B = 255.f * (1 - color.fColor3) * (1 - color.fColor4); @@ -2534,9 +2572,11 @@ EPDFAnnot_GetColor(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ClearColor(FPDF_ANNOTATION annot, FPDFANNOT_COLORTYPE type) { - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } // OverlayColor (OC) is only valid for Redact annotations. if (type == FPDFANNOT_COLORTYPE_OverlayColor && @@ -2550,11 +2590,13 @@ EPDFAnnot_ClearColor(FPDF_ANNOTATION annot, FPDFANNOT_COLORTYPE type) { return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetOpacity(FPDF_ANNOTATION annot, unsigned int alpha) { - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict || alpha > 255) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetOpacity(FPDF_ANNOTATION annot, + unsigned int alpha) { + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict || alpha > 255) { return false; + } if (alpha == 255) { dict->RemoveFor("CA"); @@ -2564,13 +2606,15 @@ EPDFAnnot_SetOpacity(FPDF_ANNOTATION annot, unsigned int alpha) { return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetOpacity(FPDF_ANNOTATION annot, unsigned int* alpha) { - if (!alpha) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetOpacity(FPDF_ANNOTATION annot, + unsigned int* alpha) { + if (!alpha) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } float ca = dict->KeyExist("CA") ? dict->GetFloatFor("CA") : 1.0f; *alpha = std::clamp(ca, 0.f, 1.f) * 255.f + 0.5f; @@ -2597,14 +2641,14 @@ EPDFAnnot_GetBorderEffect(FPDF_ANNOTATION annot, float* intensity) { // The style must be 'Cloudy' for the intensity to be meaningful. if (pBEDict->GetNameFor("S") != "C") { - return false; + return false; } // The intensity is in the /I key. Default is 1 if not present. if (pBEDict->KeyExist("I")) { *intensity = pBEDict->GetFloatFor("I"); } else { - *intensity = 1.0f; // Default intensity for cloudy border + *intensity = 1.0f; // Default intensity for cloudy border } return true; @@ -2623,7 +2667,8 @@ EPDFAnnot_SetBorderEffect(FPDF_ANNOTATION annot, float intensity) { return false; } - RetainPtr pBEDict = pAnnotDict->SetNewFor("BE"); + RetainPtr pBEDict = + pAnnotDict->SetNewFor("BE"); pBEDict->SetNewFor("S", "C"); pBEDict->SetNewFor("I", intensity); @@ -2640,8 +2685,9 @@ EPDFAnnot_ClearBorderEffect(FPDF_ANNOTATION annot) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } pAnnotDict->RemoveFor("BE"); return true; @@ -2688,10 +2734,10 @@ EPDFAnnot_GetRectangleDifferences(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetRectangleDifferences(FPDF_ANNOTATION annot, - float left, - float bottom, - float right, - float top) { + float left, + float bottom, + float right, + float top) { FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); if (subtype != FPDF_ANNOT_SQUARE && subtype != FPDF_ANNOT_CIRCLE && subtype != FPDF_ANNOT_CARET && subtype != FPDF_ANNOT_FREETEXT && @@ -2724,8 +2770,9 @@ EPDFAnnot_ClearRectangleDifferences(FPDF_ANNOTATION annot) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } pAnnotDict->RemoveFor("RD"); return true; @@ -2743,10 +2790,10 @@ EPDFAnnot_GetBorderDashPatternCount(FPDF_ANNOTATION annot) { if (!pBSDict) { return 0; } - + // The border style must be dashed. if (pBSDict->GetNameFor("S") != "D") { - return 0; + return 0; } // The dash pattern is defined by the /D array. @@ -2788,25 +2835,29 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetBorderDashPattern(FPDF_ANNOTATION annot, const float* dash_array, unsigned long count) { - if (!annot) + if (!annot) { return false; + } RetainPtr annot_dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) + if (!annot_dict) { return false; + } RetainPtr bs_dict = annot_dict->GetMutableDictFor("BS"); - if (!bs_dict) + if (!bs_dict) { bs_dict = annot_dict->SetNewFor("BS"); + } // --- Removal branch (PDFium style) --- if (!dash_array || count == 0) { bs_dict->RemoveFor("D"); // Optional: if style was dashed only because of the array, you can revert. // Leaving it unchanged matches PDFium's permissive style. - if (bs_dict->size() == 0) + if (bs_dict->size() == 0) { annot_dict->RemoveFor("BS"); + } return true; } @@ -2814,14 +2865,16 @@ EPDFAnnot_SetBorderDashPattern(FPDF_ANNOTATION annot, bs_dict->SetNewFor("S", "D"); RetainPtr d_array = bs_dict->GetMutableArrayFor("D"); - if (d_array) + if (d_array) { d_array->Clear(); - else + } else { d_array = bs_dict->SetNewFor("D"); + } // SAFETY: caller guarantees `dash_array` has `count` elements. - for (unsigned long i = 0; i < count; ++i) + for (unsigned long i = 0; i < count; ++i) { d_array->AppendNew(dash_array[i]); + } return true; } @@ -2830,7 +2883,9 @@ FPDF_EXPORT FPDF_ANNOT_BORDER_STYLE FPDF_CALLCONV EPDFAnnot_GetBorderStyle(FPDF_ANNOTATION annot, float* width) { const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); if (!pAnnotDict) { - if (width) *width = 0; + if (width) { + *width = 0; + } return FPDF_ANNOT_BS_UNKNOWN; } @@ -2843,8 +2898,10 @@ EPDFAnnot_GetBorderStyle(FPDF_ANNOTATION annot, float* width) { return static_cast( CPDF_Annot::StringToBorderStyle(pBSDict->GetNameFor("S"))); } - - if (width) *width = 0; + + if (width) { + *width = 0; + } return FPDF_ANNOT_BS_UNKNOWN; } @@ -2915,16 +2972,19 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GenerateAppearanceWithBlend(FPDF_ANNOTATION annot, FPDF_BLENDMODE blend) { CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!ctx) + if (!ctx) { return false; + } RetainPtr annot_dict = ctx->GetMutableAnnotDict(); - if (!annot_dict) + if (!annot_dict) { return false; + } CPDF_Document* doc = ctx->GetPage()->GetDocument(); - if (!doc) + if (!doc) { return false; + } const CPDF_Annot::Subtype subtype = CPDF_Annot::StringToAnnotSubtype( annot_dict->GetNameFor(pdfium::annotation::kSubtype)); @@ -2939,8 +2999,9 @@ EPDFAnnot_GenerateAppearanceWithBlend(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_BLENDMODE FPDF_CALLCONV EPDFAnnot_GetBlendMode(FPDF_ANNOTATION annot) { CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!ctx) + if (!ctx) { return FPDF_BLENDMODE_Normal; + } BlendMode bm = GetEffectiveAnnotBlendMode(ctx); // Safe cast due to static_asserts above. @@ -2949,20 +3010,24 @@ EPDFAnnot_GetBlendMode(FPDF_ANNOTATION annot) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetIntent(FPDF_ANNOTATION annot, FPDF_BYTESTRING intent) { - if (!annot || !intent || !*intent) + if (!annot || !intent || !*intent) { return false; + } RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // Allow leading slash from caller; strip it. - if (intent[0] == '/') + if (intent[0] == '/') { ++intent; + } - if (!*intent) + if (!*intent) { return false; + } // Minimal validation (PDFium typically trusts caller). Could reject spaces / // delimiters (),<>[]{}/%# if you want to be stricter. Keeping permissive. @@ -2975,12 +3040,14 @@ EPDFAnnot_GetIntent(FPDF_ANNOTATION annot, FPDF_WCHAR* buffer, unsigned long buflen) { const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return 0; + } ByteString name = dict->GetNameFor("IT"); - if (name.IsEmpty()) + if (name.IsEmpty()) { return 0; + } // Name objects are ASCII (or PDF name syntax). For normal ASCII we can // construct a WideString directly. (If you later want to decode #XX escapes @@ -2997,21 +3064,23 @@ EPDFAnnot_GetRichContent(FPDF_ANNOTATION annot, FPDF_WCHAR* buffer, unsigned long buflen) { const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return 0; + } // /RC may be a text string or a stream (PDF 2.0 §12.5.6.5). RetainPtr rc_obj = dict->GetObjectFor("RC"); - if (!rc_obj) + if (!rc_obj) { return 0; + } WideString ws; if (rc_obj->IsString() || rc_obj->IsName()) { - ws = rc_obj->GetUnicodeText(); // handles PDFDocEncoding / UTF‑16BE + ws = rc_obj->GetUnicodeText(); // handles PDFDocEncoding / UTF‑16BE } else if (rc_obj->IsStream()) { ws = rc_obj->AsStream()->GetUnicodeText(); } else { - return 0; // some exotic type we don't handle + return 0; // some exotic type we don't handle } // SAFETY: same pattern as other getters. @@ -3025,12 +3094,15 @@ EPDFAnnot_SetLineEndings(FPDF_ANNOTATION annot, FPDF_ANNOT_LINE_END end_style) { FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); if (subtype != FPDF_ANNOT_LINE && subtype != FPDF_ANNOT_POLYLINE && - subtype != FPDF_ANNOT_FREETEXT) + subtype != FPDF_ANNOT_FREETEXT) { return false; + } - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } auto to_core = [](FPDF_ANNOT_LINE_END v) { return static_cast(v); @@ -3049,23 +3121,27 @@ EPDFAnnot_SetLineEndings(FPDF_ANNOTATION annot, if (subtype == FPDF_ANNOT_FREETEXT) { // FreeText uses a single name for /LE (Acrobat convention). ByteString e_name = CPDF_Annot::LineEndingToString(e); - if (e_name.IsEmpty()) + if (e_name.IsEmpty()) { e_name = "None"; + } dict->SetNewFor("LE", e_name); } else { ByteString s_name = CPDF_Annot::LineEndingToString(s); ByteString e_name = CPDF_Annot::LineEndingToString(e); - if (s_name.IsEmpty()) + if (s_name.IsEmpty()) { s_name = "None"; - if (e_name.IsEmpty()) + } + if (e_name.IsEmpty()) { e_name = "None"; + } RetainPtr le = dict->GetMutableArrayFor("LE"); - if (le) + if (le) { le->Clear(); - else + } else { le = dict->SetNewFor("LE"); + } le->AppendNew(s_name); le->AppendNew(e_name); @@ -3076,33 +3152,39 @@ EPDFAnnot_SetLineEndings(FPDF_ANNOTATION annot, static ByteString ReadLineEndingToken(const CPDF_Array* le, size_t idx) { RetainPtr obj = le->GetDirectObjectAt(idx); - if (!obj) + if (!obj) { return ByteString(); + } - if (const CPDF_Name* n = obj->AsName()) - return n->GetString(); // e.g. "OpenArrow" + if (const CPDF_Name* n = obj->AsName()) { + return n->GetString(); // e.g. "OpenArrow" + } - if (const CPDF_String* s = obj->AsString()) - return s->GetString(); // tolerate a stray string + if (const CPDF_String* s = obj->AsString()) { + return s->GetString(); // tolerate a stray string + } - return ByteString(); // anything else -> empty + return ByteString(); // anything else -> empty } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetLineEndings(FPDF_ANNOTATION annot, FPDF_ANNOT_LINE_END* start_style, FPDF_ANNOT_LINE_END* end_style) { - if (!start_style || !end_style) + if (!start_style || !end_style) { return false; + } FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); if (subtype != FPDF_ANNOT_LINE && subtype != FPDF_ANNOT_POLYLINE && - subtype != FPDF_ANNOT_FREETEXT) + subtype != FPDF_ANNOT_FREETEXT) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // Try reading as a 2-element array first (spec-compliant for all types). RetainPtr le = dict->GetArrayFor("LE"); @@ -3116,18 +3198,19 @@ EPDFAnnot_GetLineEndings(FPDF_ANNOTATION annot, CPDF_Annot::StringToLineEnding(e_name.IsEmpty() ? "None" : e_name); *start_style = static_cast(s); - *end_style = static_cast(e); + *end_style = static_cast(e); return true; } // Fall back to single name (Acrobat FreeText convention). ByteString name = dict->GetNameFor("LE"); - if (name.IsEmpty()) + if (name.IsEmpty()) { return false; + } *start_style = FPDF_ANNOT_LE_None; - *end_style = static_cast( - CPDF_Annot::StringToLineEnding(name)); + *end_style = + static_cast(CPDF_Annot::StringToLineEnding(name)); return true; } @@ -3137,12 +3220,15 @@ EPDFAnnot_SetVertices(FPDF_ANNOTATION annot, unsigned long count) { // Accept only Polygon / Polyline annotations. FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); - if (subtype != FPDF_ANNOT_POLYGON && subtype != FPDF_ANNOT_POLYLINE) + if (subtype != FPDF_ANNOT_POLYGON && subtype != FPDF_ANNOT_POLYLINE) { return false; + } - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } // ───── Removal branch ──────────────────────────────────────────────── // If caller passes nullptr or zero, delete the /Vertices array. @@ -3154,10 +3240,11 @@ EPDFAnnot_SetVertices(FPDF_ANNOTATION annot, // ───── Replacement branch ─────────────────────────────────────────── RetainPtr verts = dict->GetMutableArrayFor(pdfium::annotation::kVertices); - if (verts) + if (verts) { verts->Clear(); - else + } else { verts = dict->SetNewFor(pdfium::annotation::kVertices); + } // SAFETY: caller guarantees |points| has |count| entries. auto pts = UNSAFE_BUFFERS(pdfium::span(points, count)); @@ -3169,28 +3256,31 @@ EPDFAnnot_SetVertices(FPDF_ANNOTATION annot, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetLine(FPDF_ANNOTATION annot, - const FS_POINTF* start, - const FS_POINTF* end) { - if (!annot || !start || !end) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetLine(FPDF_ANNOTATION annot, + const FS_POINTF* start, + const FS_POINTF* end) { + if (!annot || !start || !end) { return false; + } - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_LINE) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_LINE) { return false; + } RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // (Re‑)create the /L array: [ x1 y1 x2 y2 ] RetainPtr line_arr = dict->GetMutableArrayFor(pdfium::annotation::kL); - if (line_arr) + if (line_arr) { line_arr->Clear(); - else + } else { line_arr = dict->SetNewFor(pdfium::annotation::kL); + } line_arr->AppendNew(start->x); line_arr->AppendNew(start->y); @@ -3217,10 +3307,10 @@ EPDFAnnot_SetDefaultAppearance(FPDF_ANNOTATION annot, return false; } - // Allow FREETEXT, WIDGET, and REDACT annotations (all use DA for text styling) + // Allow FREETEXT, WIDGET, and REDACT annotations (all use DA for text + // styling) FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); - if (subtype != FPDF_ANNOT_FREETEXT && - subtype != FPDF_ANNOT_WIDGET && + if (subtype != FPDF_ANNOT_FREETEXT && subtype != FPDF_ANNOT_WIDGET && subtype != FPDF_ANNOT_REDACT) { return false; } @@ -3230,7 +3320,8 @@ EPDFAnnot_SetDefaultAppearance(FPDF_ANNOTATION annot, return false; } - // Validate parameters. Allow FPDF_FONT_UNKNOWN to preserve non-standard fonts. + // Validate parameters. Allow FPDF_FONT_UNKNOWN to preserve non-standard + // fonts. if (font != FPDF_FONT_UNKNOWN && (font < FPDF_FONT_COURIER || font > FPDF_FONT_ZAPFDINGBATS)) { return false; @@ -3264,10 +3355,10 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, return false; } - // Allow FREETEXT, WIDGET, and REDACT annotations (all use DA for text styling) + // Allow FREETEXT, WIDGET, and REDACT annotations (all use DA for text + // styling) FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); - if (subtype != FPDF_ANNOT_FREETEXT && - subtype != FPDF_ANNOT_WIDGET && + if (subtype != FPDF_ANNOT_FREETEXT && subtype != FPDF_ANNOT_WIDGET && subtype != FPDF_ANNOT_REDACT) { return false; } @@ -3286,9 +3377,10 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, CPDF_DefaultAppearance da(annot_dict.Get(), acroform_dict.Get()); // Get Font and Font Size - std::optional font_info = da.GetFont(); + std::optional font_info = + da.GetFont(); if (!font_info.has_value()) { - return false; // Hard fail: /DA string must specify a font. + return false; // Hard fail: /DA string must specify a font. } *font_size = font_info.value().size; ByteString font_name = font_info.value().name; @@ -3319,7 +3411,8 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, FPDF_TEXT_ALIGNMENT alignment) { +EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, + FPDF_TEXT_ALIGNMENT alignment) { RetainPtr annot_dict = GetMutableAnnotDictFromFPDFAnnotation(annot); if (!annot_dict) { @@ -3333,11 +3426,13 @@ EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, FPDF_TEXT_ALIGNMENT alignment) } // Validate the enum range to ensure a valid value is passed. - if (alignment < FPDF_TEXT_ALIGNMENT_LEFT || alignment > FPDF_TEXT_ALIGNMENT_RIGHT) { + if (alignment < FPDF_TEXT_ALIGNMENT_LEFT || + alignment > FPDF_TEXT_ALIGNMENT_RIGHT) { return false; } - // Set the /Q key in the annotation dictionary to the integer value of the enum. + // Set the /Q key in the annotation dictionary to the integer value of the + // enum. annot_dict->SetNewFor("Q", static_cast(alignment)); return true; @@ -3373,7 +3468,8 @@ EPDFAnnot_GetTextAlignment(FPDF_ANNOTATION annot) { } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, FPDF_VERTICAL_ALIGNMENT alignment) { +EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, + FPDF_VERTICAL_ALIGNMENT alignment) { RetainPtr annot_dict = GetMutableAnnotDictFromFPDFAnnotation(annot); if (!annot_dict) { @@ -3386,12 +3482,15 @@ EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, FPDF_VERTICAL_ALIGNMENT al } // Validate the enum range to ensure a valid value is passed. - if (alignment < FPDF_VERTICAL_ALIGNMENT_TOP || alignment > FPDF_VERTICAL_ALIGNMENT_BOTTOM) { + if (alignment < FPDF_VERTICAL_ALIGNMENT_TOP || + alignment > FPDF_VERTICAL_ALIGNMENT_BOTTOM) { return false; } - // Set the /EPDF:VerticalAlignment key in the annotation dictionary to the integer value of the enum. - annot_dict->SetNewFor("EPDF:VerticalAlignment", static_cast(alignment)); + // Set the /EPDF:VerticalAlignment key in the annotation dictionary to the + // integer value of the enum. + annot_dict->SetNewFor("EPDF:VerticalAlignment", + static_cast(alignment)); return true; } @@ -3424,18 +3523,26 @@ EPDFAnnot_GetVerticalAlignment(FPDF_ANNOTATION annot) { FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { - if (!page || !nm || !*nm) return nullptr; - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) return nullptr; + if (!page || !nm || !*nm) { + return nullptr; + } + const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) { + return nullptr; + } - RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots) return nullptr; + RetainPtr annots = pPage->GetAnnotsArray(); + if (!annots) { + return nullptr; + } WideString target = UNSAFE_BUFFERS(WideStringFromFPDFWideString(nm)); for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr const_dict = + ToDictionary(annots->GetDirectObjectAt(i)); RetainPtr d = - ToDictionary(annots->GetMutableDirectObjectAt(i)); + pdfium::WrapRetain(const_cast(const_dict.Get())); if (d && d->GetUnicodeTextFor("NM") == target) { auto ctx = std::make_unique( std::move(d), IPDFPageFromFPDFPage(page)); @@ -3447,16 +3554,19 @@ EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { - if (!page || !nm || !*nm) + if (!page || !nm || !*nm) { return false; + } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots) + if (!annots) { return false; + } WideString target = UNSAFE_BUFFERS(WideStringFromFPDFWideString(nm)); @@ -3467,8 +3577,9 @@ EPDFPage_RemoveAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { // Resolve to a dictionary to compare /NM. RetainPtr dict = ToDictionary(entry ? entry->GetMutableDirect() : nullptr); - if (!dict || dict->GetUnicodeTextFor("NM") != target) + if (!dict || dict->GetUnicodeTextFor("NM") != target) { continue; + } // Determine indirect object number, if any. uint32_t objnum = 0; @@ -3484,8 +3595,9 @@ EPDFPage_RemoveAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { annots->RemoveAt(i); // If it was indirect, delete the object to avoid leaving an orphan. - if (objnum) + if (objnum) { pPage->GetDocument()->DeleteIndirectObject(objnum); + } return true; } @@ -3496,45 +3608,66 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetLinkedAnnot(FPDF_ANNOTATION annot, FPDF_BYTESTRING key, FPDF_ANNOTATION linked_annot) { - if (!annot || !key) return false; + if (!annot || !key) { + return false; + } CPDF_AnnotContext* src = CPDFAnnotContextFromFPDFAnnotation(annot); CPDF_AnnotContext* dst = CPDFAnnotContextFromFPDFAnnotation(linked_annot); - if (!src) return false; + if (!src) { + return false; + } RetainPtr src_dict = src->GetMutableAnnotDict(); - if (!src_dict) return false; + if (!src_dict) { + return false; + } - if (!linked_annot) { src_dict->RemoveFor(key); return true; } + if (!linked_annot) { + src_dict->RemoveFor(key); + return true; + } - if (!dst) return false; + if (!dst) { + return false; + } IPDF_Page* sp = src->GetPage(); IPDF_Page* dp = dst->GetPage(); - if (!sp || !dp) return false; + if (!sp || !dp) { + return false; + } CPDF_Document* doc = sp->GetDocument(); - if (doc != dp->GetDocument()) return false; + if (doc != dp->GetDocument()) { + return false; + } RetainPtr dst_dict = dst->GetMutableAnnotDict(); - if (!dst_dict) return false; + if (!dst_dict) { + return false; + } const uint32_t objnum = EnsureIndirect(doc, dst_dict); - if (objnum == 0) return false; + if (objnum == 0) { + return false; + } src_dict->SetNewFor(key, doc, objnum); return true; } -FPDF_EXPORT int FPDF_CALLCONV -EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, int page_index) { +FPDF_EXPORT int FPDF_CALLCONV EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, + int page_index) { CPDF_Document* pdf = CPDFDocumentFromFPDFDocument(doc); - if (!pdf || page_index < 0 || page_index >= pdf->GetPageCount()) + if (!pdf || page_index < 0 || page_index >= pdf->GetPageCount()) { return 0; + } RetainPtr page_dict = pdf->GetPageDictionary(page_index); - if (!page_dict) + if (!page_dict) { return 0; + } RetainPtr annots = page_dict->GetArrayFor("Annots"); return annots ? fxcrt::CollectionSize(*annots) : 0; } @@ -3547,19 +3680,23 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { return nullptr; } + RetainPtr const_page_dict = + pdf->GetPageDictionary(page_index); RetainPtr page_dict = - pdf->GetMutablePageDictionary(page_index); + pdfium::WrapRetain(const_cast(const_page_dict.Get())); if (!page_dict) { return nullptr; } - RetainPtr annots = page_dict->GetMutableArrayFor("Annots"); + RetainPtr annots = page_dict->GetArrayFor("Annots"); if (!annots || static_cast(index) >= annots->size()) { return nullptr; } + RetainPtr const_annot_dict = + ToDictionary(annots->GetDirectObjectAt(index)); RetainPtr annot_dict = - ToDictionary(annots->GetMutableDirectObjectAt(index)); + pdfium::WrapRetain(const_cast(const_annot_dict.Get())); if (!annot_dict) { return nullptr; } @@ -3569,25 +3706,32 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { auto page = pdfium::MakeRetain(pdf, page_dict); // Create the context, which now takes the RetainPtr directly. - auto ctx = std::make_unique(std::move(annot_dict), std::move(page)); + auto ctx = + std::make_unique(std::move(annot_dict), std::move(page)); // The lifetime is now perfectly managed by smart pointers. return FPDFAnnotationFromCPDFAnnotContext(ctx.release()); } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, + int page_index, + int index) { CPDF_Document* pdf = CPDFDocumentFromFPDFDocument(doc); - if (!pdf || page_index < 0 || page_index >= pdf->GetPageCount() || index < 0) + if (!pdf || page_index < 0 || page_index >= pdf->GetPageCount() || + index < 0) { return false; + } - RetainPtr page_dict = pdf->GetMutablePageDictionary(page_index); - if (!page_dict) + RetainPtr page_dict = + pdf->GetMutablePageDictionary(page_index); + if (!page_dict) { return false; + } RetainPtr annots = page_dict->GetMutableArrayFor("Annots"); - if (!annots || static_cast(index) >= annots->size()) + if (!annots || static_cast(index) >= annots->size()) { return false; + } // Keep original entry so we can determine if it was indirect. RetainPtr entry = annots->GetMutableObjectAt(index); @@ -3607,14 +3751,15 @@ EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { annots->RemoveAt(index); // If it was indirect, delete the annot object to avoid leaving orphans. - if (objnum) + if (objnum) { pdf->DeleteIndirectObject(objnum); + } return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetName(FPDF_ANNOTATION annot, FPDF_ANNOT_NAME name) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetName(FPDF_ANNOTATION annot, + FPDF_ANNOT_NAME name) { RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); if (!dict) { @@ -3672,15 +3817,18 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { EPDFStampFitCpp fit_cpp = ToCpp(fit); CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!ctx) + if (!ctx) { return false; + } - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_STAMP) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_STAMP) { return false; + } RetainPtr ad = ctx->GetMutableAnnotDict(); - if (!ad) + if (!ad) { return false; + } // 1) Check for EPDFRotate + EPDFUnrotatedRect first. float rotate_deg = ad->GetFloatFor("EPDFRotate"); @@ -3691,11 +3839,13 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { bool use_rotation = has_rotation && !unrotated.IsEmpty(); // Use unrotated rect for image fitting when rotated, otherwise /Rect. - CFX_FloatRect rect = use_rotation ? unrotated : ad->GetRectFor(pdfium::annotation::kRect); + CFX_FloatRect rect = + use_rotation ? unrotated : ad->GetRectFor(pdfium::annotation::kRect); const float box_w = std::max(0.f, rect.Width()); const float box_h = std::max(0.f, rect.Height()); - if (box_w <= 0 || box_h <= 0) + if (box_w <= 0 || box_h <= 0) { return false; + } // 2) Fetch/create AP(N). RetainPtr ap = @@ -3703,18 +3853,21 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { if (!ap) { CPDF_GenerateAP::GenerateEmptyAP(ctx->GetPage()->GetDocument(), ad.Get()); ap = GetAnnotAP(ad.Get(), CPDF_Annot::AppearanceMode::kNormal); - if (!ap) + if (!ap) { return false; + } } // 3) Get the AP dict. RetainPtr ap_dict = ap->GetMutableDict(); - if (!ap_dict) + if (!ap_dict) { return false; + } CPDF_Document* doc = ctx->GetPage()->GetDocument(); - if (!doc) + if (!doc) { return false; + } // 4) On first call, wrap the original AP content into a child Form XObject // and record the painted content rect in EPDFOrigContentRect. This rect @@ -3724,37 +3877,40 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { CFX_FloatRect content_rect = ap_dict->GetRectFor("EPDFOrigContentRect"); if (content_rect.IsEmpty()) { content_rect = GetFormDisplayBox(ap_dict.Get()); - if (content_rect.IsEmpty()) + if (content_rect.IsEmpty()) { content_rect = GetPaintedFormBounds(doc, ap.Get()); + } content_rect.Normalize(); - if (content_rect.IsEmpty() || - content_rect.Width() <= 0 || content_rect.Height() <= 0) { + if (content_rect.IsEmpty() || content_rect.Width() <= 0 || + content_rect.Height() <= 0) { return false; } ap_dict->SetRectFor("EPDFOrigContentRect", content_rect); - if (!WrapAPContentIntoFormXObject(ap.Get(), doc)) + if (!WrapAPContentIntoFormXObject(ap.Get(), doc)) { return false; + } } const float orig_w = content_rect.Width(); const float orig_h = content_rect.Height(); - if (orig_w <= 0 || orig_h <= 0) + if (orig_w <= 0 || orig_h <= 0) { return false; + } // 5) Compute placement matrix using the same fit logic as before. float drawn_w, drawn_h, dx, dy; - if (!FitImageIntoBox(box_w, box_h, orig_w, orig_h, fit_cpp, - &drawn_w, &drawn_h, &dx, &dy)) { + if (!FitImageIntoBox(box_w, box_h, orig_w, orig_h, fit_cpp, &drawn_w, + &drawn_h, &dx, &dy)) { return false; } // 6) Write the wrapper content stream: q sx 0 0 sy tx ty cm /EPDFWRAP Do Q // Form XObjects render in their own coordinate space. content_rect.left // and .bottom are the offset of the painted content within the child form, - // so the translation compensates for that offset after scaling to align the - // visible content's origin with the target placement box. + // so the translation compensates for that offset after scaling to align + // the visible content's origin with the target placement box. { const float sx = drawn_w / orig_w; const float sy = drawn_h / orig_h; @@ -3780,10 +3936,10 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { const float cx = (unrotated.left + unrotated.right) / 2.0f; const float cy = (unrotated.bottom + unrotated.top) / 2.0f; // M = T(cx,cy) * R(theta) * T(-cx,-cy) - ap_dict->SetMatrixFor("Matrix", CFX_Matrix( - cos_t, sin_t, -sin_t, cos_t, - cx * (1.0f - cos_t) + cy * sin_t, - cy * (1.0f - cos_t) - cx * sin_t)); + ap_dict->SetMatrixFor("Matrix", + CFX_Matrix(cos_t, sin_t, -sin_t, cos_t, + cx * (1.0f - cos_t) + cy * sin_t, + cy * (1.0f - cos_t) - cx * sin_t)); } else { ap_dict->RemoveFor("Matrix"); } @@ -3794,32 +3950,36 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_CreateAnnot(FPDF_PAGE page, FPDF_ANNOTATION_SUBTYPE subtype) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || !FPDFAnnot_IsSupportedSubtype(subtype)) + if (!pPage || !FPDFAnnot_IsSupportedSubtype(subtype)) { return nullptr; + } CPDF_Document* doc = pPage->GetDocument(); // Create the annotation dictionary as an INDIRECT object RetainPtr dict = doc->NewIndirect(); dict->SetNewFor(pdfium::annotation::kType, "Annot"); - dict->SetNewFor( - pdfium::annotation::kSubtype, - CPDF_Annot::AnnotSubtypeToString(static_cast(subtype))); + dict->SetNewFor(pdfium::annotation::kSubtype, + CPDF_Annot::AnnotSubtypeToString( + static_cast(subtype))); // Append a REFERENCE to /Annots instead of the direct dict RetainPtr annots = pPage->GetOrCreateAnnotsArray(); annots->AppendNew(doc, dict->GetObjNum()); // Build the public handle - auto ctx = std::make_unique(dict, IPDFPageFromFPDFPage(page)); + auto ctx = + std::make_unique(dict, IPDFPageFromFPDFPage(page)); return FPDFAnnotationFromCPDFAnnotContext(ctx.release()); } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, float rotation) { - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, + float rotation) { + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } if (rotation == 0.0f) { // 0 is the default, so remove the key to keep the PDF clean. @@ -3830,18 +3990,20 @@ EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, float rotation) { return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetRotate(FPDF_ANNOTATION annot, float* rotation) { - if (!rotation) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetRotate(FPDF_ANNOTATION annot, + float* rotation) { + if (!rotation) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } *rotation = dict->GetFloatFor("Rotate"); return true; -} +} FPDF_EXPORT FPDF_ANNOT_REPLY_TYPE FPDF_CALLCONV EPDFAnnot_GetReplyType(FPDF_ANNOTATION annot) { @@ -3859,7 +4021,8 @@ EPDFAnnot_GetReplyType(FPDF_ANNOTATION annot) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetReplyType(FPDF_ANNOTATION annot, FPDF_ANNOT_REPLY_TYPE rt) { - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); if (!dict) { return false; } @@ -3883,12 +4046,15 @@ EPDFAnnot_SetReplyType(FPDF_ANNOTATION annot, FPDF_ANNOT_REPLY_TYPE rt) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetOverlayText(FPDF_ANNOTATION annot, FPDF_WIDESTRING text) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { return false; + } - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } if (!text || !*text) { dict->RemoveFor("OverlayText"); @@ -3905,12 +4071,14 @@ FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetOverlayText(FPDF_ANNOTATION annot, FPDF_WCHAR* buffer, unsigned long buflen) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { return 0; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return 0; + } WideString text = dict->GetUnicodeTextFor("OverlayText"); // SAFETY: required from caller. @@ -3920,12 +4088,15 @@ EPDFAnnot_GetOverlayText(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetOverlayTextRepeat(FPDF_ANNOTATION annot, FPDF_BOOL repeat) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { return false; + } - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } if (repeat) { dict->SetNewFor("Repeat", true); @@ -3937,12 +4108,14 @@ EPDFAnnot_SetOverlayTextRepeat(FPDF_ANNOTATION annot, FPDF_BOOL repeat) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } return dict->GetBooleanFor("Repeat", false); } @@ -3954,8 +4127,9 @@ namespace { std::vector GetRedactRectsFromAnnotDict( const CPDF_Dictionary* annot_dict) { std::vector rects; - if (!annot_dict) + if (!annot_dict) { return rects; + } // Try QuadPoints first (for text-based redactions) RetainPtr quad_points_array = @@ -3965,18 +4139,21 @@ std::vector GetRedactRectsFromAnnotDict( for (size_t i = 0; i < quad_count; ++i) { CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(annot_dict, i); rect.Normalize(); - if (!rect.IsEmpty()) + if (!rect.IsEmpty()) { rects.push_back(rect); + } } - if (!rects.empty()) + if (!rects.empty()) { return rects; + } } // Fall back to Rect (for area-based redactions) CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); rect.Normalize(); - if (!rect.IsEmpty()) + if (!rect.IsEmpty()) { rects.push_back(rect); + } return rects; } @@ -3986,32 +4163,39 @@ std::vector GetRedactRectsFromAnnotDict( void FlattenFormXObjectToPage(CPDF_Page* page, RetainPtr form_stream, const CFX_FloatRect& target_rect) { - if (!page || !form_stream) + if (!page || !form_stream) { return; + } CPDF_Document* doc = page->GetDocument(); - if (!doc) + if (!doc) { return; + } // Get the form dictionary from the stream RetainPtr form_dict = form_stream->GetDict(); - if (!form_dict) + if (!form_dict) { return; + } // Get the BBox from the form stream CFX_FloatRect form_bbox = form_dict->GetRectFor("BBox"); form_bbox.Normalize(); - if (form_bbox.IsEmpty()) + if (form_bbox.IsEmpty()) { form_bbox = target_rect; + } // Calculate the transformation matrix to position the form at the target rect - // The form's content is defined in BBox coordinates, we need to map it to target_rect + // The form's content is defined in BBox coordinates, we need to map it to + // target_rect float scale_x = 1.0f; float scale_y = 1.0f; - if (form_bbox.Width() > 0) + if (form_bbox.Width() > 0) { scale_x = target_rect.Width() / form_bbox.Width(); - if (form_bbox.Height() > 0) + } + if (form_bbox.Height() > 0) { scale_y = target_rect.Height() / form_bbox.Height(); + } CFX_Matrix form_matrix; form_matrix.a = scale_x; @@ -4021,16 +4205,13 @@ void FlattenFormXObjectToPage(CPDF_Page* page, // Create a CPDF_Form from the stream auto form = std::make_unique( - doc, - page->GetMutableResources(), + doc, page->GetMutableResources(), pdfium::WrapRetain(const_cast(form_stream.Get()))); form->ParseContent(); // Create a FormObject that wraps the form auto form_obj = std::make_unique( - CPDF_PageObject::kNoContentStream, - std::move(form), - form_matrix); + CPDF_PageObject::kNoContentStream, std::move(form), form_matrix); form_obj->CalcBoundingBox(); form_obj->SetDirty(true); @@ -4040,17 +4221,21 @@ void FlattenFormXObjectToPage(CPDF_Page* page, // Find the index of an annotation in the page's annotation array. // Returns -1 if not found. -int GetAnnotIndexOnPage(CPDF_Page* page, const CPDF_Dictionary* annot_dict) { - if (!page || !annot_dict) +int GetAnnotIndexOnPage(const CPDF_Page* page, + const CPDF_Dictionary* annot_dict) { + if (!page || !annot_dict) { return -1; + } - RetainPtr annots = page->GetMutableAnnotsArray(); - if (!annots) + RetainPtr annots = page->GetAnnotsArray(); + if (!annots) { return -1; + } for (size_t i = 0; i < annots->size(); ++i) { - if (annots->GetDictAt(i) == annot_dict) + if (annots->GetDictAt(i) == annot_dict) { return static_cast(i); + } } return -1; } @@ -4060,21 +4245,25 @@ int GetAnnotIndexOnPage(CPDF_Page* page, const CPDF_Dictionary* annot_dict) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } // Must be a REDACT annotation - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { return false; + } const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) + if (!annot_dict) { return false; + } // 1. Extract redaction rectangles from QuadPoints or Rect std::vector rects = GetRedactRectsFromAnnotDict(annot_dict); - if (rects.empty()) + if (rects.empty()) { return false; + } // 2. Remove content using existing redactor (no black boxes - we use RO) RedactTextInRects(pPage, pdfium::span(rects), @@ -4084,7 +4273,8 @@ EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { // 3. Flatten RO stream if present RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); if (ro_stream) { - CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + CFX_FloatRect annot_rect = + annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); FlattenFormXObjectToPage(pPage, ro_stream, annot_rect); } @@ -4095,8 +4285,7 @@ EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { if (annot_index >= 0) { RetainPtr annots = pPage->GetMutableAnnotsArray(); if (annots) { - RetainPtr entry = - annots->GetMutableObjectAt(annot_index); + RetainPtr entry = annots->GetMutableObjectAt(annot_index); uint32_t objnum = 0; if (entry && entry->IsReference()) { objnum = entry->AsReference()->GetRefObjNum(); @@ -4104,40 +4293,45 @@ EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { objnum = entry->GetObjNum(); } annots->RemoveAt(annot_index); - if (objnum) + if (objnum) { pPage->GetDocument()->DeleteIndirectObject(objnum); + } } } return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_ApplyRedactions(FPDF_PAGE page) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_ApplyRedactions(FPDF_PAGE page) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } // First pass: collect all redaction areas, RO streams, indices, and objnums std::vector all_rects; - std::vector, CFX_FloatRect>> ro_streams; + std::vector, CFX_FloatRect>> + ro_streams; std::vector> redact_index_objnums; RetainPtr annot_list = pPage->GetMutableAnnotsArray(); - if (!annot_list || annot_list->IsEmpty()) + if (!annot_list || annot_list->IsEmpty()) { return false; + } for (size_t i = 0; i < annot_list->size(); ++i) { RetainPtr entry = annot_list->GetMutableObjectAt(i); RetainPtr annot_dict = ToDictionary(entry ? entry->GetMutableDirect() : nullptr); - if (!annot_dict) + if (!annot_dict) { continue; + } // Check if this is a REDACT annotation ByteString subtype = annot_dict->GetNameFor(pdfium::annotation::kSubtype); - if (subtype != "Redact") + if (subtype != "Redact") { continue; + } // Track index and indirect object number for later removal uint32_t objnum = 0; @@ -4149,7 +4343,8 @@ EPDFPage_ApplyRedactions(FPDF_PAGE page) { redact_index_objnums.push_back({i, objnum}); // Extract rectangles - std::vector rects = GetRedactRectsFromAnnotDict(annot_dict.Get()); + std::vector rects = + GetRedactRectsFromAnnotDict(annot_dict.Get()); for (const auto& rect : rects) { all_rects.push_back(rect); } @@ -4157,14 +4352,16 @@ EPDFPage_ApplyRedactions(FPDF_PAGE page) { // Collect RO stream if present RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); if (ro_stream) { - CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + CFX_FloatRect annot_rect = + annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); ro_streams.push_back({ro_stream, annot_rect}); } } - if (all_rects.empty()) + if (all_rects.empty()) { return false; + } // Remove content for all redaction areas at once RedactTextInRects(pPage, pdfium::span(all_rects), @@ -4178,34 +4375,40 @@ EPDFPage_ApplyRedactions(FPDF_PAGE page) { // Remove all REDACT annotations (in reverse order to maintain indices) // and delete the underlying indirect objects to avoid orphans in the xref. - for (auto it = redact_index_objnums.rbegin(); it != redact_index_objnums.rend(); ++it) { + for (auto it = redact_index_objnums.rbegin(); + it != redact_index_objnums.rend(); ++it) { annot_list->RemoveAt(it->first); - if (it->second) + if (it->second) { pPage->GetDocument()->DeleteIndirectObject(it->second); + } } return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_Flatten(FPDF_PAGE page, FPDF_ANNOTATION annot) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, + FPDF_ANNOTATION annot) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) + if (!annot_dict) { return false; + } // Get the annotation's Normal appearance stream (AP/N) RetainPtr ap_dict = annot_dict->GetDictFor(pdfium::annotation::kAP); - if (!ap_dict) + if (!ap_dict) { return false; + } RetainPtr ap_stream = ap_dict->GetStreamFor("N"); - if (!ap_stream) + if (!ap_stream) { return false; + } CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); @@ -4229,44 +4432,51 @@ EPDFAnnot_SetAppearanceFromPage(FPDF_ANNOTATION annot, FPDF_DOCUMENT src_doc_handle, int page_index) { CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!ctx) + if (!ctx) { return false; + } RetainPtr annot_dict = ctx->GetMutableAnnotDict(); IPDF_Page* annot_page = ctx->GetPage(); CPDF_Document* dest_doc = annot_page ? annot_page->GetDocument() : nullptr; - if (!annot_dict || !dest_doc) + if (!annot_dict || !dest_doc) { return false; + } CPDF_Document* src_doc = CPDFDocumentFromFPDFDocument(src_doc_handle); - if (!src_doc) + if (!src_doc) { return false; + } RetainPtr src_page_dict = src_doc->GetMutablePageDictionary(page_index); - if (!src_page_dict) + if (!src_page_dict) { return false; + } CFX_FloatRect media_box = src_page_dict->GetRectFor("MediaBox"); media_box.Normalize(); - if (media_box.IsEmpty()) + if (media_box.IsEmpty()) { return false; + } // Collect page content bytes (Contents can be a stream or an array of // streams). RetainPtr contents_obj = src_page_dict->GetObjectFor("Contents"); - if (!contents_obj) + if (!contents_obj) { return false; + } DataVector content_data; const CPDF_Object* direct = contents_obj->GetDirect(); - if (!direct) + if (!direct) { return false; + } if (direct->IsStream()) { - auto acc = - pdfium::MakeRetain(pdfium::WrapRetain(direct->AsStream())); + auto acc = pdfium::MakeRetain( + pdfium::WrapRetain(direct->AsStream())); acc->LoadAllDataFiltered(); auto span = acc->GetSpan(); content_data.assign(span.begin(), span.end()); @@ -4274,18 +4484,21 @@ EPDFAnnot_SetAppearanceFromPage(FPDF_ANNOTATION annot, const CPDF_Array* arr = direct->AsArray(); for (size_t i = 0; i < arr->size(); ++i) { RetainPtr stream = arr->GetStreamAt(i); - if (!stream) + if (!stream) { continue; + } auto acc = pdfium::MakeRetain(std::move(stream)); acc->LoadAllDataFiltered(); auto span = acc->GetSpan(); - if (!content_data.empty()) + if (!content_data.empty()) { content_data.push_back(' '); + } content_data.insert(content_data.end(), span.begin(), span.end()); } } - if (content_data.empty()) + if (content_data.empty()) { return false; + } // Build a Form XObject stream in the source document so that // AnnotAppearanceExporter can deep-clone it with all resource dependencies. @@ -4296,47 +4509,49 @@ EPDFAnnot_SetAppearanceFromPage(FPDF_ANNOTATION annot, RetainPtr src_resources = src_page_dict->GetDictFor("Resources"); - if (src_resources) + if (src_resources) { xobj_dict->SetFor("Resources", src_resources->Clone()); + } - auto src_stream = - src_doc->NewIndirect(std::move(xobj_dict)); + auto src_stream = src_doc->NewIndirect(std::move(xobj_dict)); src_stream->SetData(content_data); // Clone the stream (and all its resource references) into dest_doc. AnnotAppearanceExporter exporter(dest_doc, src_doc); - RetainPtr cloned_stream = - exporter.ExportFormXObject(src_stream); + RetainPtr cloned_stream = exporter.ExportFormXObject(src_stream); // Clean up temporary object from source document. src_doc->DeleteIndirectObject(src_stream->GetObjNum()); - if (!cloned_stream) + if (!cloned_stream) { return false; + } RetainPtr cloned_dict = cloned_stream->GetMutableDict(); - if (!cloned_dict) + if (!cloned_dict) { return false; + } // Persist the imported appearance's painted content rect before any later // annotation resize mutates /Rect. This captures where the visible content // lives inside the child form's coordinate space so the wrapper can align it. CFX_FloatRect content_rect = GetFormDisplayBox(cloned_dict.Get()); - if (content_rect.IsEmpty()) + if (content_rect.IsEmpty()) { content_rect = GetPaintedFormBounds(dest_doc, cloned_stream.Get()); + } content_rect.Normalize(); if (!content_rect.IsEmpty()) { cloned_dict->SetRectFor("EPDFOrigContentRect", content_rect); - if (!WrapAPContentIntoFormXObject(cloned_stream.Get(), dest_doc)) + if (!WrapAPContentIntoFormXObject(cloned_stream.Get(), dest_doc)) { return false; + } } // Set cloned stream as AP/N on the annotation. RetainPtr ap_dict = annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); - ap_dict->SetNewFor("N", dest_doc, - cloned_stream->GetObjNum()); + ap_dict->SetNewFor("N", dest_doc, cloned_stream->GetObjNum()); return true; } @@ -4344,19 +4559,22 @@ EPDFAnnot_SetAppearanceFromPage(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!ctx) + if (!ctx) { return nullptr; + } RetainPtr annot_dict = ctx->GetMutableAnnotDict(); IPDF_Page* src_page = ctx->GetPage(); CPDF_Document* src_doc = src_page ? src_page->GetDocument() : nullptr; - if (!annot_dict || !src_doc) + if (!annot_dict || !src_doc) { return nullptr; + } RetainPtr ap_stream = GetAnnotAP(annot_dict.Get(), CPDF_Annot::AppearanceMode::kNormal); - if (!ap_stream) + if (!ap_stream) { return nullptr; + } CFX_FloatRect bbox = ap_stream->GetDict()->GetRectFor("BBox"); bbox.Normalize(); @@ -4364,17 +4582,20 @@ EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { bbox = annot_dict->GetRectFor(pdfium::annotation::kRect); bbox.Normalize(); } - if (bbox.IsEmpty()) + if (bbox.IsEmpty()) { return nullptr; + } const float page_width = bbox.Width(); const float page_height = bbox.Height(); - if (page_width <= 0 || page_height <= 0) + if (page_width <= 0 || page_height <= 0) { return nullptr; + } FPDF_DOCUMENT exported_doc = FPDF_CreateNewDocument(); - if (!exported_doc) + if (!exported_doc) { return nullptr; + } CPDF_Document* dest_doc = CPDFDocumentFromFPDFDocument(exported_doc); if (!dest_doc) { @@ -4389,7 +4610,8 @@ EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { return nullptr; } - FPDF_PAGE exported_page = FPDFPage_New(exported_doc, 0, page_width, page_height); + FPDF_PAGE exported_page = + FPDFPage_New(exported_doc, 0, page_width, page_height); if (!exported_page) { FPDF_CloseDocument(exported_doc); return nullptr; @@ -4404,12 +4626,12 @@ EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { CFX_Matrix form_matrix = cloned_stream->GetDict()->GetMatrixFor("Matrix"); - auto form = std::make_unique(dest_doc, dest_page->GetMutableResources(), - std::move(cloned_stream)); + auto form = std::make_unique( + dest_doc, dest_page->GetMutableResources(), std::move(cloned_stream)); form->ParseContent(); - CFX_PointF mapped_origin = form_matrix.Transform( - CFX_PointF(bbox.left, bbox.bottom)); + CFX_PointF mapped_origin = + form_matrix.Transform(CFX_PointF(bbox.left, bbox.bottom)); auto form_obj = std::make_unique( CPDF_PageObject::kNoContentStream, std::move(form), @@ -4431,18 +4653,21 @@ EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, int annot_count) { - if (!annots || annot_count <= 0) + if (!annots || annot_count <= 0) { return nullptr; + } // Validate first annotation and extract source page/document. CPDF_AnnotContext* first_ctx = CPDFAnnotContextFromFPDFAnnotation(annots[0]); - if (!first_ctx) + if (!first_ctx) { return nullptr; + } IPDF_Page* src_page = first_ctx->GetPage(); CPDF_Document* src_doc = src_page ? src_page->GetDocument() : nullptr; - if (!src_doc) + if (!src_doc) { return nullptr; + } struct AnnotInfo { RetainPtr ap_stream; @@ -4458,22 +4683,26 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, for (int i = 0; i < annot_count; i++) { CPDF_AnnotContext* ctx = CPDFAnnotContextFromFPDFAnnotation(annots[i]); - if (!ctx) + if (!ctx) { return nullptr; + } // All annotations must share the same source document. IPDF_Page* page_i = ctx->GetPage(); - if (!page_i || page_i->GetDocument() != src_doc) + if (!page_i || page_i->GetDocument() != src_doc) { return nullptr; + } RetainPtr annot_dict = ctx->GetMutableAnnotDict(); - if (!annot_dict) + if (!annot_dict) { return nullptr; + } RetainPtr ap_stream = GetAnnotAP(annot_dict.Get(), CPDF_Annot::AppearanceMode::kNormal); - if (!ap_stream) + if (!ap_stream) { return nullptr; + } CFX_FloatRect ap_bbox = ap_stream->GetDict()->GetRectFor("BBox"); ap_bbox.Normalize(); @@ -4481,14 +4710,16 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, ap_bbox = annot_dict->GetRectFor(pdfium::annotation::kRect); ap_bbox.Normalize(); } - if (ap_bbox.IsEmpty()) + if (ap_bbox.IsEmpty()) { return nullptr; + } CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); - if (annot_rect.IsEmpty()) + if (annot_rect.IsEmpty()) { return nullptr; + } if (first) { combined_rect = annot_rect; @@ -4502,12 +4733,14 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, const float page_width = combined_rect.Width(); const float page_height = combined_rect.Height(); - if (page_width <= 0 || page_height <= 0) + if (page_width <= 0 || page_height <= 0) { return nullptr; + } FPDF_DOCUMENT exported_doc = FPDF_CreateNewDocument(); - if (!exported_doc) + if (!exported_doc) { return nullptr; + } CPDF_Document* dest_doc = CPDFDocumentFromFPDFDocument(exported_doc); if (!dest_doc) { @@ -4543,8 +4776,7 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, CFX_Matrix form_matrix = cloned_stream->GetDict()->GetMatrixFor("Matrix"); auto form = std::make_unique( - dest_doc, dest_page->GetMutableResources(), - std::move(cloned_stream)); + dest_doc, dest_page->GetMutableResources(), std::move(cloned_stream)); form->ParseContent(); CFX_PointF mapped_origin = form_matrix.Transform( @@ -4552,10 +4784,10 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, const float sx = info.annot_rect.Width() / info.ap_bbox.Width(); const float sy = info.annot_rect.Height() / info.ap_bbox.Height(); - const float tx = (info.annot_rect.left - combined_rect.left) - - mapped_origin.x * sx; - const float ty = (info.annot_rect.bottom - combined_rect.bottom) - - mapped_origin.y * sy; + const float tx = + (info.annot_rect.left - combined_rect.left) - mapped_origin.x * sx; + const float ty = + (info.annot_rect.bottom - combined_rect.bottom) - mapped_origin.y * sy; auto form_obj = std::make_unique( CPDF_PageObject::kNoContentStream, std::move(form), @@ -4579,8 +4811,9 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetExtendedRotation(FPDF_ANNOTATION annot, float rotation) { RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } if (rotation == 0.0f) { dict->RemoveFor("EPDFRotate"); @@ -4592,12 +4825,14 @@ EPDFAnnot_SetExtendedRotation(FPDF_ANNOTATION annot, float rotation) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetExtendedRotation(FPDF_ANNOTATION annot, float* rotation) { - if (!rotation) + if (!rotation) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } *rotation = dict->GetFloatFor("EPDFRotate"); return true; @@ -4607,8 +4842,9 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetUnrotatedRect(FPDF_ANNOTATION annot, const FS_RECTF* rect) { RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } if (!rect) { dict->RemoveFor("EPDFUnrotatedRect"); @@ -4626,21 +4862,24 @@ EPDFAnnot_SetUnrotatedRect(FPDF_ANNOTATION annot, const FS_RECTF* rect) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetUnrotatedRect(FPDF_ANNOTATION annot, FS_RECTF* rect) { - if (!rect) + if (!rect) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } *rect = FSRectFFromCFXFloatRect(dict->GetRectFor("EPDFUnrotatedRect")); return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetRect(FPDF_ANNOTATION annot, FS_RECTF* rect) { - if (!FPDFAnnot_GetRect(annot, rect)) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetRect(FPDF_ANNOTATION annot, + FS_RECTF* rect) { + if (!FPDFAnnot_GetRect(annot, rect)) { return false; + } // Normalize: upstream FPDFAnnot_GetRect does not normalize the rect read // from the dictionary. PDFs may store Rect as [x1,y1,x2,y2] with y1>y2, @@ -4655,32 +4894,37 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAPMatrix(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode, const FS_MATRIX* matrix) { - if (!matrix) + if (!matrix) { return false; - if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT) + } + if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT) { return false; + } RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // Map mode to AP stream key: N, R, D - static constexpr auto kModeKey = - std::to_array({"N", "R", "D"}); + static constexpr auto kModeKey = std::to_array({"N", "R", "D"}); RetainPtr ap = dict->GetMutableDictFor(pdfium::annotation::kAP); - if (!ap) + if (!ap) { return false; + } RetainPtr stream = ap->GetMutableStreamFor(kModeKey[appearanceMode]); - if (!stream) + if (!stream) { return false; + } RetainPtr stream_dict = stream->GetMutableDict(); - if (!stream_dict) + if (!stream_dict) { return false; + } stream_dict->SetMatrixFor("Matrix", CFXMatrixFromFSMatrix(*matrix)); return true; @@ -4690,31 +4934,36 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetAPMatrix(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode, FS_MATRIX* matrix) { - if (!matrix) + if (!matrix) { return false; - if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT) + } + if (appearanceMode < 0 || appearanceMode >= FPDF_ANNOT_APPEARANCEMODE_COUNT) { return false; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return false; + } // Map mode to AP stream key: N, R, D - static constexpr auto kModeKey = - std::to_array({"N", "R", "D"}); + static constexpr auto kModeKey = std::to_array({"N", "R", "D"}); RetainPtr ap = dict->GetDictFor(pdfium::annotation::kAP); - if (!ap) + if (!ap) { return false; + } RetainPtr stream = ap->GetStreamFor(kModeKey[appearanceMode]); - if (!stream) + if (!stream) { return false; + } RetainPtr stream_dict = stream->GetDict(); - if (!stream_dict) + if (!stream_dict) { return false; + } *matrix = FSMatrixFromCFXMatrix(stream_dict->GetMatrixFor("Matrix")); return true; @@ -4724,21 +4973,26 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFAnnot_GetAvailableAppearanceModes(FPDF_ANNOTATION annot) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return 0; + } RetainPtr pAP = pAnnotDict->GetDictFor(pdfium::annotation::kAP); - if (!pAP) + if (!pAP) { return 0; + } int modes = 0; - if (pAP->KeyExist("N")) + if (pAP->KeyExist("N")) { modes |= 1; // bit 0 = Normal - if (pAP->KeyExist("R")) + } + if (pAP->KeyExist("R")) { modes |= 2; // bit 1 = Rollover - if (pAP->KeyExist("D")) + } + if (pAP->KeyExist("D")) { modes |= 4; // bit 2 = Down + } return modes; } @@ -4747,8 +5001,9 @@ EPDFAnnot_HasAppearanceStream(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } auto mode = static_cast(appearanceMode); return !!GetAnnotAP(pAnnotDict.Get(), mode); @@ -4764,16 +5019,16 @@ static ByteString GetMKColorKey(EPDF_MK_COLORTYPE type) { return "BC"; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, - EPDF_MK_COLORTYPE type, - unsigned int R, - unsigned int G, - unsigned int B) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, + EPDF_MK_COLORTYPE type, + unsigned int R, + unsigned int G, + unsigned int B) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict || R > 255 || G > 255 || B > 255) + if (!pAnnotDict || R > 255 || G > 255 || B > 255) { return false; + } RetainPtr pMK = pAnnotDict->GetOrCreateDictFor("MK"); ByteString key = GetMKColorKey(type); @@ -4792,27 +5047,30 @@ EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetMKColor(FPDF_ANNOTATION annot, - EPDF_MK_COLORTYPE type, - unsigned int* R, - unsigned int* G, - unsigned int* B) { - if (!R || !G || !B) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetMKColor(FPDF_ANNOTATION annot, + EPDF_MK_COLORTYPE type, + unsigned int* R, + unsigned int* G, + unsigned int* B) { + if (!R || !G || !B) { return false; + } const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } RetainPtr pMK = pAnnotDict->GetDictFor("MK"); - if (!pMK) + if (!pMK) { return false; + } ByteString key = GetMKColorKey(type); RetainPtr pColor = pMK->GetArrayFor(key.AsStringView()); - if (!pColor || pColor->size() < 3) + if (!pColor || pColor->size() < 3) { return false; + } *R = static_cast(pColor->GetFloatAt(0) * 255.f + 0.5f); *G = static_cast(pColor->GetFloatAt(1) * 255.f + 0.5f); @@ -4825,12 +5083,14 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ClearMKColor(FPDF_ANNOTATION annot, EPDF_MK_COLORTYPE type) { RetainPtr pAnnotDict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } RetainPtr pMK = pAnnotDict->GetMutableDictFor("MK"); - if (!pMK) + if (!pMK) { return true; + } ByteString key = GetMKColorKey(type); pMK->RemoveFor(key.AsStringView()); @@ -4844,12 +5104,14 @@ EPDFPage_CreateFormField(FPDF_PAGE page, int field_type, FPDF_WIDESTRING field_name) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return nullptr; + } CPDFSDK_InteractiveForm* pSDKForm = FormHandleToInteractiveForm(handle); - if (!pSDKForm) + if (!pSDKForm) { return nullptr; + } // Validate field_type switch (field_type) { @@ -4896,14 +5158,16 @@ EPDFPage_CreateFormField(FPDF_PAGE page, // Create the parent field dictionary (indirect) RetainPtr pFieldDict = pDoc->NewIndirect(); pFieldDict->SetNewFor("FT", ft_value); - if (base_flags != 0) + if (base_flags != 0) { pFieldDict->SetNewFor("Ff", static_cast(base_flags)); + } // Set field name /T if (field_name) { WideString ws_name = WideStringFromFPDFWideString(field_name); - if (!ws_name.IsEmpty()) + if (!ws_name.IsEmpty()) { pFieldDict->SetNewFor("T", ws_name.ToUTF8()); + } } // Create the widget annotation dictionary (indirect) @@ -4912,7 +5176,8 @@ EPDFPage_CreateFormField(FPDF_PAGE page, pAnnotDict->SetNewFor(pdfium::annotation::kSubtype, "Widget"); // Link widget -> parent via /Parent - pAnnotDict->SetNewFor("Parent", pDoc, pFieldDict->GetObjNum()); + pAnnotDict->SetNewFor("Parent", pDoc, + pFieldDict->GetObjNum()); // Link parent -> widget via /Kids RetainPtr pKids = pFieldDict->SetNewFor("Kids"); @@ -4920,8 +5185,9 @@ EPDFPage_CreateFormField(FPDF_PAGE page, // Ensure /AcroForm exists on document root RetainPtr pRoot = pDoc->GetMutableRoot(); - if (!pRoot) + if (!pRoot) { return nullptr; + } RetainPtr pAcroForm = pRoot->GetOrCreateDictFor("AcroForm"); @@ -4946,16 +5212,19 @@ EPDFPage_CreateFormField(FPDF_PAGE page, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GenerateFormFieldAP(FPDF_ANNOTATION annot) { CPDF_AnnotContext* pContext = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!pContext) + if (!pContext) { return false; + } RetainPtr pAnnotDict = pContext->GetMutableAnnotDict(); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } CPDF_Document* pDoc = pContext->GetPage()->GetDocument(); - if (!pDoc) + if (!pDoc) { return false; + } // Look for /FT on this dict or on /Parent ByteString ft; @@ -4969,8 +5238,9 @@ EPDFAnnot_GenerateFormFieldAP(FPDF_ANNOTATION annot) { pLookup = pLookup->GetDictFor("Parent"); } - if (ft.IsEmpty()) + if (ft.IsEmpty()) { return false; + } uint32_t ff = 0; RetainPtr pFfLookup = pAnnotDict; @@ -5017,17 +5287,20 @@ EPDFAnnot_GetButtonExportValue(FPDF_ANNOTATION annot, FPDF_WCHAR* buffer, unsigned long buflen) { const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) + if (!pAnnotDict) { return 0; + } RetainPtr pAP = pAnnotDict->GetDictFor(pdfium::annotation::kAP); - if (!pAP) + if (!pAP) { return 0; + } RetainPtr pN = pAP->GetDictFor("N"); - if (!pN) + if (!pN) { return 0; + } ByteString on_state; CPDF_DictionaryLocker locker(pN); @@ -5038,8 +5311,9 @@ EPDFAnnot_GetButtonExportValue(FPDF_ANNOTATION annot, } } - if (on_state.IsEmpty()) + if (on_state.IsEmpty()) { return 0; + } return Utf16EncodeMaybeCopyAndReturnLength( WideString::FromUTF8(on_state.AsStringView()), @@ -5066,8 +5340,9 @@ EPDFAnnot_SetFormFieldValue(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot, FPDF_WIDESTRING value) { CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) + if (!pFormField) { return false; + } return pFormField->SetValue(WideStringFromFPDFWideString(value), NotificationOption::kDoNotNotify); @@ -5078,14 +5353,15 @@ EPDFAnnot_SetFormFieldName(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot, FPDF_WIDESTRING name) { CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) + if (!pFormField) { return false; + } - RetainPtr pFieldDict = - pdfium::WrapRetain(const_cast( - pFormField->GetFieldDict().Get())); - if (!pFieldDict) + RetainPtr pFieldDict = pdfium::WrapRetain( + const_cast(pFormField->GetFieldDict().Get())); + if (!pFieldDict) { return false; + } WideString ws_name = WideStringFromFPDFWideString(name); pFieldDict->SetNewFor("T", ws_name.ToUTF8()); @@ -5093,8 +5369,10 @@ EPDFAnnot_SetFormFieldName(FPDF_FORMHANDLE handle, } FPDF_EXPORT int FPDF_CALLCONV -EPDFAnnot_GetFormFieldObjectNumber(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot) { - RetainPtr pFieldDict = GetMutableFieldDict(GetFormField(handle, annot)); +EPDFAnnot_GetFormFieldObjectNumber(FPDF_FORMHANDLE handle, + FPDF_ANNOTATION annot) { + RetainPtr pFieldDict = + GetMutableFieldDict(GetFormField(handle, annot)); if (!pFieldDict) { return 0; } @@ -5117,8 +5395,10 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, return false; } - RetainPtr pSourceFieldDict = GetMutableFieldDict(pSourceField); - RetainPtr pTargetFieldDict = GetMutableFieldDict(pTargetField); + RetainPtr pSourceFieldDict = + GetMutableFieldDict(pSourceField); + RetainPtr pTargetFieldDict = + GetMutableFieldDict(pTargetField); if (!pSourceFieldDict || !pTargetFieldDict) { return false; } @@ -5131,8 +5411,10 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, return false; } - CPDF_AnnotContext* pSourceContext = CPDFAnnotContextFromFPDFAnnotation(source_annot); - CPDF_AnnotContext* pTargetContext = CPDFAnnotContextFromFPDFAnnotation(target_annot); + CPDF_AnnotContext* pSourceContext = + CPDFAnnotContextFromFPDFAnnotation(source_annot); + CPDF_AnnotContext* pTargetContext = + CPDFAnnotContextFromFPDFAnnotation(target_annot); if (!pSourceContext || !pTargetContext) { return false; } @@ -5148,8 +5430,10 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, return false; } - RetainPtr pSourceKids = pSourceFieldDict->GetMutableArrayFor("Kids"); - RetainPtr pTargetKids = pTargetFieldDict->GetOrCreateArrayFor("Kids"); + RetainPtr pSourceKids = + pSourceFieldDict->GetMutableArrayFor("Kids"); + RetainPtr pTargetKids = + pTargetFieldDict->GetOrCreateArrayFor("Kids"); if (!pSourceKids || !pTargetKids) { return false; } @@ -5160,9 +5444,11 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, continue; } - pKidDict->SetNewFor("Parent", pDoc, pTargetFieldDict->GetObjNum()); + pKidDict->SetNewFor("Parent", pDoc, + pTargetFieldDict->GetObjNum()); - if (!ArrayContainsDictWithObjNum(pTargetKids.Get(), pKidDict->GetObjNum())) { + if (!ArrayContainsDictWithObjNum(pTargetKids.Get(), + pKidDict->GetObjNum())) { pTargetKids->AppendNew(pDoc, pKidDict->GetObjNum()); } } @@ -5175,7 +5461,8 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, if (pAcroForm) { RetainPtr pFields = pAcroForm->GetMutableArrayFor("Fields"); if (pFields) { - RemoveDictWithObjNumFromArray(pFields.Get(), pSourceFieldDict->GetObjNum()); + RemoveDictWithObjNumFromArray(pFields.Get(), + pSourceFieldDict->GetObjNum()); } } } @@ -5195,23 +5482,28 @@ EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetCalloutLineCount(FPDF_ANNOTATION annot) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { return 0; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return 0; + } RetainPtr cl = dict->GetArrayFor("CL"); - if (!cl) + if (!cl) { return 0; + } // /CL must have 4 (2 points) or 6 (3 points) numbers. const size_t sz = cl->size(); - if (sz == 4) + if (sz == 4) { return 2; - if (sz >= 6) + } + if (sz >= 6) { return 3; + } return 0; } @@ -5219,25 +5511,29 @@ FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetCalloutLine(FPDF_ANNOTATION annot, FS_POINTF* buffer, unsigned long length) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { return 0; + } const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) + if (!dict) { return 0; + } RetainPtr cl = dict->GetArrayFor("CL"); - if (!cl) + if (!cl) { return 0; + } const size_t sz = cl->size(); unsigned long points_len = 0; - if (sz == 4) + if (sz == 4) { points_len = 2; - else if (sz >= 6) + } else if (sz >= 6) { points_len = 3; - else + } else { return 0; + } if (buffer && length >= points_len) { auto buffer_span = UNSAFE_BUFFERS(pdfium::span(buffer, length)); @@ -5253,12 +5549,15 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetCalloutLine(FPDF_ANNOTATION annot, const FS_POINTF* points, unsigned long count) { - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { return false; + } - RetainPtr dict = GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) + RetainPtr dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!dict) { return false; + } if (!points || count == 0) { dict->RemoveFor("CL"); @@ -5266,14 +5565,16 @@ EPDFAnnot_SetCalloutLine(FPDF_ANNOTATION annot, } // /CL must be 2 points (4 numbers) or 3 points (6 numbers). - if (count != 2 && count != 3) + if (count != 2 && count != 3) { return false; + } RetainPtr cl = dict->GetMutableArrayFor("CL"); - if (cl) + if (cl) { cl->Clear(); - else + } else { cl = dict->SetNewFor("CL"); + } auto pts = UNSAFE_BUFFERS(pdfium::span(points, count)); for (unsigned long i = 0; i < count; ++i) { @@ -5289,18 +5590,20 @@ EPDFAnnot_SetFormFieldOptions(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot, const FPDF_WIDESTRING* labels, int count) { - if (count < 0 || (count > 0 && !labels)) + if (count < 0 || (count > 0 && !labels)) { return false; + } CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) + if (!pFormField) { return false; + } - RetainPtr pFieldDict = - pdfium::WrapRetain(const_cast( - pFormField->GetFieldDict().Get())); - if (!pFieldDict) + RetainPtr pFieldDict = pdfium::WrapRetain( + const_cast(pFormField->GetFieldDict().Get())); + if (!pFieldDict) { return false; + } RetainPtr pOpt = pFieldDict->SetNewFor("Opt"); for (int i = 0; i < count; i++) { @@ -5313,30 +5616,37 @@ EPDFAnnot_SetFormFieldOptions(FPDF_FORMHANDLE handle, FPDF_EXPORT unsigned int FPDF_CALLCONV EPDFAnnot_GetObjectNumber(FPDF_ANNOTATION annot) { CPDF_AnnotContext* pCtx = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!pCtx) + if (!pCtx) { return 0; + } const CPDF_Dictionary* dict = pCtx->GetAnnotDict(); - if (!dict) + if (!dict) { return 0; + } return dict->GetObjNum(); } FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_GetAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { - if (!page || obj_num == 0) + if (!page || obj_num == 0) { return nullptr; + } - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) { return nullptr; + } - RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots) + RetainPtr annots = pPage->GetAnnotsArray(); + if (!annots) { return nullptr; + } for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr const_dict = + ToDictionary(annots->GetDirectObjectAt(i)); RetainPtr d = - ToDictionary(annots->GetMutableDirectObjectAt(i)); + pdfium::WrapRetain(const_cast(const_dict.Get())); if (d && d->GetObjNum() == obj_num) { auto ctx = std::make_unique( std::move(d), IPDFPageFromFPDFPage(page)); @@ -5346,15 +5656,17 @@ EPDFPage_GetAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { return nullptr; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_RemoveAnnot(FPDF_PAGE page, int index) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnot(FPDF_PAGE page, + int index) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || index < 0) + if (!pPage || index < 0) { return false; + } RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots || static_cast(index) >= annots->size()) + if (!annots || static_cast(index) >= annots->size()) { return false; + } RetainPtr entry = annots->GetMutableObjectAt(index); RetainPtr dict = @@ -5369,31 +5681,36 @@ EPDFPage_RemoveAnnot(FPDF_PAGE page, int index) { annots->RemoveAt(index); - if (objnum) + if (objnum) { pPage->GetDocument()->DeleteIndirectObject(objnum); + } return true; } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { - if (!page || obj_num == 0) + if (!page || obj_num == 0) { return false; + } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots) + if (!annots) { return false; + } for (size_t i = 0; i < annots->size(); ++i) { RetainPtr entry = annots->GetMutableObjectAt(i); RetainPtr dict = ToDictionary(entry ? entry->GetMutableDirect() : nullptr); - if (!dict) + if (!dict) { continue; + } uint32_t entry_objnum = 0; if (entry && entry->IsReference()) { @@ -5401,13 +5718,15 @@ EPDFPage_RemoveAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { } else { entry_objnum = dict->GetObjNum(); } - if (entry_objnum != obj_num) + if (entry_objnum != obj_num) { continue; + } annots->RemoveAt(i); - if (entry_objnum) + if (entry_objnum) { pPage->GetDocument()->DeleteIndirectObject(entry_objnum); + } return true; } @@ -5428,21 +5747,23 @@ EPDFPage_RemoveAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { // Any failure returns false without touching the array. The indirect // objects backing each annotation are never destroyed, so durable // identity (objectNumber, /NM) is preserved across the move. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_MoveAnnots(FPDF_PAGE page, - const int* from_indices, - int from_indices_len, - int to_index) { - if (!page || !from_indices || from_indices_len <= 0) +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_MoveAnnots(FPDF_PAGE page, + const int* from_indices, + int from_indices_len, + int to_index) { + if (!page || !from_indices || from_indices_len <= 0) { return false; + } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return false; + } RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (!annots) + if (!annots) { return false; + } const int count = static_cast(annots->size()); @@ -5453,17 +5774,20 @@ EPDFPage_MoveAnnots(FPDF_PAGE page, seen.reserve(static_cast(from_indices_len)); for (int i = 0; i < from_indices_len; ++i) { int idx = from_indices[i]; - if (idx < 0 || idx >= count) + if (idx < 0 || idx >= count) { return false; + } for (int s : seen) { - if (s == idx) + if (s == idx) { return false; + } } seen.push_back(idx); } const int post_count = count - from_indices_len; - if (to_index < 0 || to_index > post_count) + if (to_index < 0 || to_index > post_count) { return false; + } // 2. Detach each entry in caller order. RetainPtr keeps the underlying // CPDF_Object alive across the subsequent RemoveAt calls so the @@ -5488,8 +5812,7 @@ EPDFPage_MoveAnnots(FPDF_PAGE page, // a fresh reference to each entry; our local RetainPtr drops at // scope exit. for (int i = 0; i < from_indices_len; ++i) { - annots->InsertAt(static_cast(to_index + i), - std::move(entries[i])); + annots->InsertAt(static_cast(to_index + i), std::move(entries[i])); } return true; } diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index 799c5a592a..f0ba7f4c51 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp @@ -95,26 +95,29 @@ using pdfium::metadata::kNameTrue; using pdfium::metadata::kNameUnknown; constexpr const char* kReservedInfoKeys[] = { - kInfoTitle, kInfoAuthor, kInfoSubject, kInfoKeywords, - kInfoProducer, kInfoCreator, kInfoCreationDate, kInfoModDate, - kInfoTrapped, + kInfoTitle, kInfoAuthor, kInfoSubject, kInfoKeywords, kInfoProducer, + kInfoCreator, kInfoCreationDate, kInfoModDate, kInfoTrapped, }; bool IsReservedInfoKey(ByteStringView key) { for (const char* r : kReservedInfoKeys) { - if (key == r) + if (key == r) { return true; + } } return false; } inline FPDF_TRAPPED_STATUS TrappedNameToStatus(ByteStringView name) { - if (name == kNameTrue) + if (name == kNameTrue) { return PDFTRAPPED_TRUE; - if (name == kNameFalse) + } + if (name == kNameFalse) { return PDFTRAPPED_FALSE; - if (name == kNameUnknown) + } + if (name == kNameUnknown) { return PDFTRAPPED_UNKNOWN; + } // Be forgiving on odd values. return PDFTRAPPED_UNKNOWN; } @@ -455,23 +458,24 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_Enumerate(FPDF_PAGE page, if (!start_pos || !link_annot) { return false; } - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) { return false; } - RetainPtr pAnnots = pPage->GetMutableAnnotsArray(); + RetainPtr pAnnots = pPage->GetAnnotsArray(); if (!pAnnots) { return false; } for (size_t i = *start_pos; i < pAnnots->size(); i++) { - RetainPtr dict = - ToDictionary(pAnnots->GetMutableDirectObjectAt(i)); + RetainPtr dict = + ToDictionary(pAnnots->GetDirectObjectAt(i)); if (!dict) { continue; } if (dict->GetByteStringFor("Subtype") == "Link") { *start_pos = static_cast(i + 1); - *link_annot = FPDFLinkFromCPDFDictionary(dict.Get()); + *link_annot = + FPDFLinkFromCPDFDictionary(const_cast(dict.Get())); return true; } } @@ -633,22 +637,23 @@ FPDF_GetPageLabel(FPDF_DOCUMENT document, str.value(), UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDF_SetMetaText(FPDF_DOCUMENT document, - FPDF_BYTESTRING tag, - FPDF_WIDESTRING value) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_SetMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag, + FPDF_WIDESTRING value) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc || !tag) + if (!pDoc || !tag) { return false; + } // Create /Info if it does not exist. RetainPtr info = pDoc->GetOrCreateInfo(); - if (!info) + if (!info) { return false; + } ByteString key(tag); - WideString wide = - value ? UNSAFE_BUFFERS(WideStringFromFPDFWideString(value)) : WideString(); + WideString wide = value ? UNSAFE_BUFFERS(WideStringFromFPDFWideString(value)) + : WideString(); if (wide.IsEmpty()) { // RemoveFor() expects ByteStringView. @@ -661,42 +666,53 @@ EPDF_SetMetaText(FPDF_DOCUMENT document, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDF_HasMetaText(FPDF_DOCUMENT document, FPDF_BYTESTRING tag) { - if (!tag) return false; +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_HasMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag) { + if (!tag) { + return false; + } CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - - if (!pDoc) return false; + + if (!pDoc) { + return false; + } RetainPtr info = pDoc->GetInfo(); - if (!info) return false; + if (!info) { + return false; + } return info->KeyExist(tag); } FPDF_EXPORT FPDF_TRAPPED_STATUS FPDF_CALLCONV EPDF_GetMetaTrapped(FPDF_DOCUMENT document) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) + if (!pDoc) { return PDFTRAPPED_UNKNOWN; + } RetainPtr info = pDoc->GetInfo(); - if (!info) + if (!info) { return PDFTRAPPED_NOTSET; + } // SetNewFor() wants ByteString keys; RemoveFor() wants ByteStringView. ByteString key_trapped(kInfoTrapped); RetainPtr obj = info->GetDirectObjectFor(key_trapped.AsStringView()); - if (!obj) + if (!obj) { return PDFTRAPPED_NOTSET; + } - if (const CPDF_Name* pName = ToName(obj.Get())) + if (const CPDF_Name* pName = ToName(obj.Get())) { return TrappedNameToStatus(pName->GetString().AsStringView()); + } // Lenient: some PDFs incorrectly store a boolean; read via the dict helper. if (obj->IsBoolean()) { - const bool b = info->GetBooleanFor(key_trapped.AsStringView(), /*bDefault=*/false); + const bool b = + info->GetBooleanFor(key_trapped.AsStringView(), /*bDefault=*/false); return b ? PDFTRAPPED_TRUE : PDFTRAPPED_FALSE; } @@ -706,12 +722,14 @@ EPDF_GetMetaTrapped(FPDF_DOCUMENT document) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_SetMetaTrapped(FPDF_DOCUMENT document, FPDF_TRAPPED_STATUS status) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) + if (!pDoc) { return false; + } RetainPtr info = pDoc->GetOrCreateInfo(); - if (!info) + if (!info) { return false; + } ByteString key_trapped(kInfoTrapped); @@ -721,28 +739,33 @@ EPDF_SetMetaTrapped(FPDF_DOCUMENT document, FPDF_TRAPPED_STATUS status) { } ByteStringView name = StatusToTrappedName(status); - if (name.IsEmpty()) + if (name.IsEmpty()) { return false; // invalid enum + } - info->SetNewFor(key_trapped, ByteString(name)); // expects ByteString key + info->SetNewFor(key_trapped, + ByteString(name)); // expects ByteString key return true; } -FPDF_EXPORT int FPDF_CALLCONV -EPDF_GetMetaKeyCount(FPDF_DOCUMENT document, FPDF_BOOL custom_only) { +FPDF_EXPORT int FPDF_CALLCONV EPDF_GetMetaKeyCount(FPDF_DOCUMENT document, + FPDF_BOOL custom_only) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) + if (!pDoc) { return 0; + } RetainPtr info = pDoc->GetInfo(); - if (!info) + if (!info) { return 0; + } int count = 0; std::vector keys = info->GetKeys(); for (const ByteString& key : keys) { - if (custom_only && IsReservedInfoKey(key.AsStringView())) + if (custom_only && IsReservedInfoKey(key.AsStringView())) { continue; + } ++count; } return count; @@ -755,22 +778,25 @@ EPDF_GetMetaKeyName(FPDF_DOCUMENT document, void* buffer, unsigned long buflen) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc || index < 0) + if (!pDoc || index < 0) { return 0; + } RetainPtr info = pDoc->GetInfo(); - if (!info) + if (!info) { return 0; + } int seen = 0; std::vector keys = info->GetKeys(); for (const ByteString& key : keys) { - if (custom_only && IsReservedInfoKey(key.AsStringView())) + if (custom_only && IsReservedInfoKey(key.AsStringView())) { continue; + } if (seen++ == index) { return NulTerminateMaybeCopyAndReturnLength( key, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } } return 0; -} \ No newline at end of file +} From 7bfcd90d3f99f197c4eb2090ec9d67eaac594b34 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 8 May 2026 23:58:06 +0300 Subject: [PATCH 02/56] AP becomes ephemeral --- core/fpdfdoc/BUILD.gn | 1 + core/fpdfdoc/cpdf_annot.cpp | 81 +- core/fpdfdoc/cpdf_annot.h | 17 +- core/fpdfdoc/cpdf_annot_unittest.cpp | 55 ++ core/fpdfdoc/cpdf_annotlist.cpp | 64 -- core/fpdfdoc/cpdf_generateap.cpp | 1012 ++++++++++++++------- core/fpdfdoc/cpdf_generateap.h | 24 + core/fpdfdoc/cpdf_generateap_unittest.cpp | 276 ++++++ fpdfsdk/cpdfsdk_pageview.cpp | 3 - fpdfsdk/fpdf_annot.cpp | 24 +- 10 files changed, 1123 insertions(+), 434 deletions(-) create mode 100644 core/fpdfdoc/cpdf_generateap_unittest.cpp diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn index 94ad43f0c2..f258efae31 100644 --- a/core/fpdfdoc/BUILD.gn +++ b/core/fpdfdoc/BUILD.gn @@ -106,6 +106,7 @@ pdfium_unittest_source_set("unittests") { "cpdf_dest_unittest.cpp", "cpdf_filespec_unittest.cpp", "cpdf_formfield_unittest.cpp", + "cpdf_generateap_unittest.cpp", "cpdf_interactiveform_unittest.cpp", "cpdf_metadata_unittest.cpp", "cpdf_nametree_unittest.cpp", diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index 18a455617d..8a65fcdbf6 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp @@ -133,8 +133,11 @@ CPDF_Annot::CPDF_Annot(RetainPtr dict, CPDF_Document* document) annot_dict_->GetByteStringFor(pdfium::annotation::kSubtype))), is_text_markup_annotation_(IsTextMarkupAnnotation(subtype_)), has_generated_ap_( - annot_dict_->GetBooleanFor(kPDFiumKey_HasGeneratedAP, false)) { - GenerateAPIfNeeded(); + annot_dict_->GetBooleanFor(kPDFiumKey_HasGeneratedAP, false) || + (CanGenerateEphemeralAP() && ShouldGenerateAP())) { + if (!CanGenerateEphemeralAP()) { + GenerateAPIfNeeded(); + } } CPDF_Annot::~CPDF_Annot() { @@ -166,6 +169,39 @@ bool CPDF_Annot::ShouldGenerateAP() const { return !IsHidden(); } +bool CPDF_Annot::CanGenerateEphemeralAP() const { + return CPDF_GenerateAP::CanGenerateEphemeralAnnotAP(subtype_); +} + +RetainPtr CPDF_Annot::GetOrBuildEphemeralAP(AppearanceMode mode) { + if (mode != AppearanceMode::kNormal || !CanGenerateEphemeralAP()) { + return nullptr; + } + + if (ephemeral_built_) { + return ephemeral_normal_ap_; + } + + ephemeral_built_ = true; + if (!ShouldGenerateAP()) { + return nullptr; + } + + std::optional generated = + CPDF_GenerateAP::GenerateEphemeralAnnotAP(document_, annot_dict_.Get(), + subtype_); + if (!generated.has_value()) { + return nullptr; + } + + ephemeral_normal_ap_ = std::move(generated->normal_stream); + if (subtype_ == CPDF_Annot::Subtype::INK) { + ephemeral_rect_ = ephemeral_normal_ap_->GetDict()->GetRectFor("BBox"); + } + has_generated_ap_ = true; + return ephemeral_normal_ap_; +} + bool CPDF_Annot::ShouldDrawAnnotation() const { if (IsHidden()) { return false; @@ -175,6 +211,12 @@ bool CPDF_Annot::ShouldDrawAnnotation() const { void CPDF_Annot::ClearCachedAP() { ap_map_.clear(); + ephemeral_normal_ap_.Reset(); + ephemeral_rect_.reset(); + ephemeral_built_ = false; + has_generated_ap_ = + annot_dict_->GetBooleanFor(kPDFiumKey_HasGeneratedAP, false) || + (CanGenerateEphemeralAP() && ShouldGenerateAP()); } CPDF_Annot::Subtype CPDF_Annot::GetSubtype() const { @@ -182,6 +224,10 @@ CPDF_Annot::Subtype CPDF_Annot::GetSubtype() const { } CFX_FloatRect CPDF_Annot::RectForDrawing() const { + if (ephemeral_rect_.has_value()) { + return ephemeral_rect_.value(); + } + bool bShouldUseQuadPointsCoords = is_text_markup_annotation_ && has_generated_ap_; if (bShouldUseQuadPointsCoords) { @@ -218,6 +264,9 @@ RetainPtr GetAnnotAPNoFallback(CPDF_Dictionary* pAnnotDict, CPDF_Form* CPDF_Annot::GetAPForm(CPDF_Page* pPage, AppearanceMode mode) { RetainPtr pStream = GetAnnotAP(annot_dict_.Get(), mode); + if (!pStream) { + pStream = GetOrBuildEphemeralAP(mode); + } if (!pStream) { return nullptr; } @@ -890,12 +939,14 @@ bool CPDF_Annot::DrawAppearance(CPDF_Page* pPage, return false; } - // It might happen that by the time this annotation instance was created, - // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided - // to not "generate" its AP. - // If for a reason the object is no longer hidden, but still does not have - // its "AP" generated, generate it now. - GenerateAPIfNeeded(); + if (!CanGenerateEphemeralAP()) { + // It might happen that by the time this annotation instance was created, + // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided + // to not "generate" its AP. + // If for a reason the object is no longer hidden, but still does not have + // its "AP" generated, generate it now. + GenerateAPIfNeeded(); + } CFX_Matrix matrix; CPDF_Form* pForm = AnnotGetMatrix(pPage, this, mode, mtUser2Device, &matrix); @@ -919,12 +970,14 @@ bool CPDF_Annot::DrawInContext(CPDF_Page* pPage, return false; } - // It might happen that by the time this annotation instance was created, - // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided - // to not "generate" its AP. - // If for a reason the object is no longer hidden, but still does not have - // its "AP" generated, generate it now. - GenerateAPIfNeeded(); + if (!CanGenerateEphemeralAP()) { + // It might happen that by the time this annotation instance was created, + // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided + // to not "generate" its AP. + // If for a reason the object is no longer hidden, but still does not have + // its "AP" generated, generate it now. + GenerateAPIfNeeded(); + } CFX_Matrix matrix; CPDF_Form* pForm = AnnotGetMatrix(pPage, this, mode, mtUser2Device, &matrix); diff --git a/core/fpdfdoc/cpdf_annot.h b/core/fpdfdoc/cpdf_annot.h index 1071f28f9b..5a41be69d2 100644 --- a/core/fpdfdoc/cpdf_annot.h +++ b/core/fpdfdoc/cpdf_annot.h @@ -105,17 +105,9 @@ class CPDF_Annot { kZapfDingbats }; - enum class TextAlignment { - kLeft = 0, - kCenter = 1, - kRight = 2 - }; + enum class TextAlignment { kLeft = 0, kCenter = 1, kRight = 2 }; - enum class VerticalAlignment { - kTop = 0, - kMiddle = 1, - kBottom = 2 - }; + enum class VerticalAlignment { kTop = 0, kMiddle = 1, kBottom = 2 }; // -------------------------------------------------------------------- // Built‑in icon (/Name) enumeration – must stay in sync with the public @@ -230,6 +222,8 @@ class CPDF_Annot { private: void GenerateAPIfNeeded(); + RetainPtr GetOrBuildEphemeralAP(AppearanceMode mode); + bool CanGenerateEphemeralAP() const; bool ShouldGenerateAP() const; bool ShouldDrawAnnotation() const; @@ -238,12 +232,15 @@ class CPDF_Annot { RetainPtr const annot_dict_; UnownedPtr const document_; std::map, std::unique_ptr> ap_map_; + RetainPtr ephemeral_normal_ap_; + std::optional ephemeral_rect_; // If non-null, then this is not a popup annotation. UnownedPtr popup_annot_; const Subtype subtype_; const bool is_text_markup_annotation_; // |open_state_| is only set for popup annotations. bool open_state_ = false; + bool ephemeral_built_ = false; bool has_generated_ap_; }; diff --git a/core/fpdfdoc/cpdf_annot_unittest.cpp b/core/fpdfdoc/cpdf_annot_unittest.cpp index 5e2f582b35..547c025ff3 100644 --- a/core/fpdfdoc/cpdf_annot_unittest.cpp +++ b/core/fpdfdoc/cpdf_annot_unittest.cpp @@ -6,9 +6,14 @@ #include +#include "constants/annotation_common.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/test_with_page_module.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_test_document.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -24,6 +29,8 @@ RetainPtr CreateQuadPointArrayFromVector( } // namespace +class CPDFAnnotWithPageModuleTest : public TestWithPageModule {}; + TEST(CPDFAnnotTest, RectFromQuadPointsArray) { RetainPtr array = CreateQuadPointArrayFromVector( {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1}); @@ -136,3 +143,51 @@ TEST(CPDFAnnotTest, QuadPointCount) { } EXPECT_EQ(8u, CPDF_Annot::QuadPointCount(array.Get())); } + +TEST_F(CPDFAnnotWithPageModuleTest, + ConstructorDoesNotPersistEphemeralHighlightAP) { + CPDF_TestDocument doc; + auto annot_dict = pdfium::MakeRetain(); + annot_dict->SetNewFor(pdfium::annotation::kSubtype, "Highlight"); + annot_dict->SetRectFor(pdfium::annotation::kRect, + CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", CreateQuadPointArrayFromVector( + {10, 20, 50, 20, 10, 10, 50, 10})); + + const uint32_t last_obj_num = doc.GetLastObjNum(); + CPDF_Annot annot(annot_dict, &doc); + + EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); + EXPECT_FALSE(annot_dict->KeyExist("PDFIUM_HasGeneratedAP")); + EXPECT_EQ(CFX_FloatRect(10, 10, 50, 20), annot.GetRect()); +} + +TEST_F(CPDFAnnotWithPageModuleTest, + EphemeralInkAPUsesInflatedDrawingRectWithoutPersistingRect) { + CPDF_TestDocument doc; + doc.SetRoot(pdfium::MakeRetain()); + auto page = pdfium::MakeRetain( + &doc, pdfium::MakeRetain()); + + auto annot_dict = pdfium::MakeRetain(); + annot_dict->SetNewFor(pdfium::annotation::kSubtype, "Ink"); + annot_dict->SetRectFor(pdfium::annotation::kRect, + CFX_FloatRect(0, 0, 10, 10)); + auto border_style = annot_dict->SetNewFor("BS"); + border_style->SetNewFor("W", 4); + + auto ink_list = pdfium::MakeRetain(); + ink_list->Append(CreateQuadPointArrayFromVector({1, 1, 9, 9})); + annot_dict->SetFor("InkList", std::move(ink_list)); + + CPDF_Annot annot(annot_dict, &doc); + EXPECT_EQ(CFX_FloatRect(0, 0, 10, 10), + annot_dict->GetRectFor(pdfium::annotation::kRect)); + + ASSERT_TRUE(annot.GetAPForm(page.Get(), CPDF_Annot::AppearanceMode::kNormal)); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); + EXPECT_EQ(CFX_FloatRect(0, 0, 10, 10), + annot_dict->GetRectFor(pdfium::annotation::kRect)); + EXPECT_EQ(CFX_FloatRect(-2, -2, 12, 12), annot.GetRect()); +} diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp index db8be16033..32e7b6aa77 100644 --- a/core/fpdfdoc/cpdf_annotlist.cpp +++ b/core/fpdfdoc/cpdf_annotlist.cpp @@ -13,7 +13,6 @@ #include "constants/annotation_common.h" #include "constants/annotation_flags.h" #include "constants/form_fields.h" -#include "constants/form_flags.h" #include "core/fpdfapi/page/cpdf_occontext.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/parser/cpdf_array.h" @@ -26,9 +25,6 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfapi/render/cpdf_renderoptions.h" #include "core/fpdfdoc/cpdf_annot.h" -#include "core/fpdfdoc/cpdf_formfield.h" -#include "core/fpdfdoc/cpdf_generateap.h" -#include "core/fpdfdoc/cpdf_interactiveform.h" #include "core/fxcrt/check.h" #include "core/fxcrt/containers/unique_ptr_adapters.h" @@ -125,57 +121,6 @@ std::unique_ptr CreatePopupAnnot(CPDF_Document* document, return pPopupAnnot; } -void GenerateAP(CPDF_Document* doc, CPDF_Dictionary* pAnnotDict) { - if (!pAnnotDict || - pAnnotDict->GetByteStringFor(pdfium::annotation::kSubtype) != "Widget") { - return; - } - - RetainPtr pFieldTypeObj = - CPDF_FormField::GetFieldAttrForDict(pAnnotDict, pdfium::form_fields::kFT); - if (!pFieldTypeObj) { - return; - } - - ByteString field_type = pFieldTypeObj->GetString(); - if (field_type == pdfium::form_fields::kTx) { - CPDF_GenerateAP::GenerateFormAP(doc, pAnnotDict, - CPDF_GenerateAP::kTextField); - return; - } - - RetainPtr pFieldFlagsObj = - CPDF_FormField::GetFieldAttrForDict(pAnnotDict, pdfium::form_fields::kFf); - uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0; - if (field_type == pdfium::form_fields::kCh) { - auto type = (flags & pdfium::form_flags::kChoiceCombo) - ? CPDF_GenerateAP::kComboBox - : CPDF_GenerateAP::kListBox; - CPDF_GenerateAP::GenerateFormAP(doc, pAnnotDict, type); - return; - } - - if (field_type != pdfium::form_fields::kBtn) { - return; - } - if (flags & pdfium::form_flags::kButtonPushbutton) { - return; - } - if (pAnnotDict->KeyExist(pdfium::annotation::kAS)) { - return; - } - - RetainPtr pParentDict = - pAnnotDict->GetDictFor(pdfium::form_fields::kParent); - if (!pParentDict || !pParentDict->KeyExist(pdfium::annotation::kAS)) { - return; - } - - pAnnotDict->SetNewFor( - pdfium::annotation::kAS, - pParentDict->GetByteStringFor(pdfium::annotation::kAS)); -} - } // namespace CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) @@ -185,10 +130,6 @@ CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) return; } - const CPDF_Dictionary* pRoot = document_->GetRoot(); - RetainPtr pAcroForm = pRoot->GetDictFor("AcroForm"); - bool bRegenerateAP = - pAcroForm && pAcroForm->GetBooleanFor("NeedAppearances", false); for (size_t i = 0; i < pAnnots->size(); ++i) { RetainPtr dict = ToDictionary(pAnnots->GetMutableDirectObjectAt(i)); @@ -204,11 +145,6 @@ CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) } pAnnots->ConvertToIndirectObjectAt(i, document_); annot_list_.push_back(std::make_unique(dict, document_)); - if (bRegenerateAP && subtype == "Widget" && - CPDF_InteractiveForm::IsUpdateAPEnabled() && - !dict->GetDictFor(pdfium::annotation::kAP)) { - GenerateAP(document_, dict.Get()); - } } annot_count_ = annot_list_.size(); diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index f1c42bd876..23ab5f0773 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,7 @@ #include "constants/appearance.h" #include "constants/font_encodings.h" #include "constants/form_fields.h" +#include "constants/form_flags.h" #include "constants/transparency.h" #include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" #include "core/fpdfapi/font/cpdf_font.h" @@ -41,9 +43,9 @@ #include "core/fpdfdoc/cpvt_variabletext.h" #include "core/fpdfdoc/cpvt_word.h" #include "core/fxcrt/fx_string_wrappers.h" +#include "core/fxcrt/fx_system.h" #include "core/fxcrt/notreached.h" #include "core/fxge/cfx_renderdevice.h" -#include "core/fxcrt/fx_system.h" namespace { @@ -67,45 +69,49 @@ constexpr float kSlashLenFactor = 18.0f; // Return a unit‑length copy of `v`. If the vector has zero length, fall back // to the X axis so that later maths cannot explode. - static CFX_PointF UnitVector(const CFX_PointF& v) { +static CFX_PointF UnitVector(const CFX_PointF& v) { float len = std::hypot(v.x, v.y); - if (len <= 0.0f) + if (len <= 0.0f) { return CFX_PointF(1.0f, 0.0f); + } return CFX_PointF(v.x / len, v.y / len); } // Read one token from a /LE array and return it as a ByteString, accepting // both Name and String objects (some generators are sloppy). - static ByteString ReadLineEndingToken(const CPDF_Array* le, size_t idx) { - if (!le || idx >= le->size()) +static ByteString ReadLineEndingToken(const CPDF_Array* le, size_t idx) { + if (!le || idx >= le->size()) { return ByteString(); + } RetainPtr obj = le->GetDirectObjectAt(idx); - if (!obj) + if (!obj) { return ByteString(); + } - if (const CPDF_Name* n = obj->AsName()) + if (const CPDF_Name* n = obj->AsName()) { return n->GetString(); + } - if (const CPDF_String* s = obj->AsString()) + if (const CPDF_String* s = obj->AsString()) { return s->GetString(); + } - return ByteString(); // unsupported type + return ByteString(); // unsupported type } // Produce “q … Q” wrapper that translates + rotates local path so that: /// • the **tip** of the ending sits at `pos` /// • the **x‑axis** of the local coord points along the segment direction -template void EmitEndingWithAngle(fxcrt::ostringstream& out, - const CFX_PointF& pos, - float final_angle_rad, - const F& emitter) { +template +void EmitEndingWithAngle(fxcrt::ostringstream& out, + const CFX_PointF& pos, + float final_angle_rad, + const F& emitter) { const float cos_a = cos(final_angle_rad); const float sin_a = sin(final_angle_rad); - out << "q " - << cos_a << " " << sin_a << " " - << -sin_a << " " << cos_a << " " + out << "q " << cos_a << " " << sin_a << " " << -sin_a << " " << cos_a << " " << pos.x << " " << pos.y << " cm\n"; emitter(); out << "Q\n"; @@ -118,22 +124,20 @@ static void EmitArrowPath(fxcrt::ostringstream& out, ArrowStyle style, bool do_fill) { const float len = kArrowLenFactor * stroke_w; - const float a = kArrowAngle; // 30° - const float x = -len * std::cos(a); - const float y = len * std::sin(a); + const float a = kArrowAngle; // 30° + const float x = -len * std::cos(a); + const float y = len * std::sin(a); if (style == ArrowStyle::kOpen) { // OpenArrow / ROpenArrow - out << x << " " << y << " m 0 0 l " - << x << " " << -y << " l S\n"; + out << x << " " << y << " m 0 0 l " << x << " " << -y << " l S\n"; return; } // ClosedArrow / RClosedArrow - out << "0 0 m " << x << " " << y << " l " - << x << " " << -y << " l " - << (do_fill ? "b\n" // fill + stroke - : "h S\n"); // just close and stroke (no fill) + out << "0 0 m " << x << " " << y << " l " << x << " " << -y << " l " + << (do_fill ? "b\n" // fill + stroke + : "h S\n"); // just close and stroke (no fill) } void EmitCirclePath(fxcrt::ostringstream& out, float stroke_w, bool filled) { @@ -142,30 +146,23 @@ void EmitCirclePath(fxcrt::ostringstream& out, float stroke_w, bool filled) { constexpr float kL = 0.5523f; const float d = kL * r; - out << r << " 0 m " - << r << " " << d << " " << d << " " << r << " 0 " << r << " c " - << -d << " " << r << " " << -r << " " << d << " " << -r << " 0 c " - << -r << " " << -d << " " << -d << " " << -r << " 0 " << -r << " c " - << d << " " << -r << " " << r << " " << -d << " " << r << " 0 c " + out << r << " 0 m " << r << " " << d << " " << d << " " << r << " 0 " << r + << " c " << -d << " " << r << " " << -r << " " << d << " " << -r + << " 0 c " << -r << " " << -d << " " << -d << " " << -r << " 0 " << -r + << " c " << d << " " << -r << " " << r << " " << -d << " " << r << " 0 c " << (filled ? "B\n" : "S\n"); } void EmitSquarePath(fxcrt::ostringstream& out, float stroke_w, bool filled) { const float h = (stroke_w * 6.0f) / 2.0f; - out << -h << " " << -h << " m " - << h << " " << -h << " l " - << h << " " << h << " l " - << -h << " " << h << " l h " - << (filled ? "B\n" : "S\n"); + out << -h << " " << -h << " m " << h << " " << -h << " l " << h << " " << h + << " l " << -h << " " << h << " l h " << (filled ? "B\n" : "S\n"); } void EmitDiamondPath(fxcrt::ostringstream& out, float stroke_w, bool filled) { const float h = (stroke_w * 6.0f) / 2.0f; - out << "0 " << -h << " m " - << h << " 0 l " - << "0 " << h << " l " - << -h << " 0 l h " - << (filled ? "B\n" : "S\n"); + out << "0 " << -h << " m " << h << " 0 l " + << "0 " << h << " l " << -h << " 0 l h " << (filled ? "B\n" : "S\n"); } void EmitButtOrSlashPath(fxcrt::ostringstream& out, @@ -177,22 +174,38 @@ void EmitButtOrSlashPath(fxcrt::ostringstream& out, ByteString BlendModeToPDFName(BlendMode bm) { switch (bm) { - case BlendMode::kNormal: return ByteString(pdfium::transparency::kNormal); - case BlendMode::kMultiply: return ByteString(pdfium::transparency::kMultiply); - case BlendMode::kScreen: return ByteString(pdfium::transparency::kScreen); - case BlendMode::kOverlay: return ByteString(pdfium::transparency::kOverlay); - case BlendMode::kDarken: return ByteString(pdfium::transparency::kDarken); - case BlendMode::kLighten: return ByteString(pdfium::transparency::kLighten); - case BlendMode::kColorDodge: return ByteString(pdfium::transparency::kColorDodge); - case BlendMode::kColorBurn: return ByteString(pdfium::transparency::kColorBurn); - case BlendMode::kHardLight: return ByteString(pdfium::transparency::kHardLight); - case BlendMode::kSoftLight: return ByteString(pdfium::transparency::kSoftLight); - case BlendMode::kDifference: return ByteString(pdfium::transparency::kDifference); - case BlendMode::kExclusion: return ByteString(pdfium::transparency::kExclusion); - case BlendMode::kHue: return ByteString(pdfium::transparency::kHue); - case BlendMode::kSaturation: return ByteString(pdfium::transparency::kSaturation); - case BlendMode::kColor: return ByteString(pdfium::transparency::kColor); - case BlendMode::kLuminosity: return ByteString(pdfium::transparency::kLuminosity); + case BlendMode::kNormal: + return ByteString(pdfium::transparency::kNormal); + case BlendMode::kMultiply: + return ByteString(pdfium::transparency::kMultiply); + case BlendMode::kScreen: + return ByteString(pdfium::transparency::kScreen); + case BlendMode::kOverlay: + return ByteString(pdfium::transparency::kOverlay); + case BlendMode::kDarken: + return ByteString(pdfium::transparency::kDarken); + case BlendMode::kLighten: + return ByteString(pdfium::transparency::kLighten); + case BlendMode::kColorDodge: + return ByteString(pdfium::transparency::kColorDodge); + case BlendMode::kColorBurn: + return ByteString(pdfium::transparency::kColorBurn); + case BlendMode::kHardLight: + return ByteString(pdfium::transparency::kHardLight); + case BlendMode::kSoftLight: + return ByteString(pdfium::transparency::kSoftLight); + case BlendMode::kDifference: + return ByteString(pdfium::transparency::kDifference); + case BlendMode::kExclusion: + return ByteString(pdfium::transparency::kExclusion); + case BlendMode::kHue: + return ByteString(pdfium::transparency::kHue); + case BlendMode::kSaturation: + return ByteString(pdfium::transparency::kSaturation); + case BlendMode::kColor: + return ByteString(pdfium::transparency::kColor); + case BlendMode::kLuminosity: + return ByteString(pdfium::transparency::kLuminosity); } return ByteString(pdfium::transparency::kNormal); } @@ -206,6 +219,26 @@ static BlendMode DefaultBlendModeFor(CPDF_Annot::Subtype subtype) { } } +bool SupportsEphemeralAnnotAP(CPDF_Annot::Subtype subtype) { + switch (subtype) { + case CPDF_Annot::Subtype::CIRCLE: + case CPDF_Annot::Subtype::FREETEXT: + case CPDF_Annot::Subtype::HIGHLIGHT: + case CPDF_Annot::Subtype::INK: + case CPDF_Annot::Subtype::LINE: + case CPDF_Annot::Subtype::POLYGON: + case CPDF_Annot::Subtype::POLYLINE: + case CPDF_Annot::Subtype::SQUARE: + case CPDF_Annot::Subtype::SQUIGGLY: + case CPDF_Annot::Subtype::STRIKEOUT: + case CPDF_Annot::Subtype::UNDERLINE: + case CPDF_Annot::Subtype::WIDGET: + return true; + default: + return false; + } +} + ByteString GetPDFWordString(IPVT_FontMap* font_map, int32_t font_index, uint16_t word, @@ -406,9 +439,9 @@ AnnotationDimensionsAndColor GetAnnotationDimensionsAndColor( // Rotation info for shape annotations (Square, Circle) using EmbedPDF's // custom /EPDFRotate and /EPDFUnrotatedRect entries. struct ShapeRotationInfo { - CFX_FloatRect bbox; // BBox for the AP stream (unrotated rect in page coords) - CFX_Matrix matrix; // Transforms from local BBox space to page/AABB space - bool is_rotated; // Whether rotation was applied + CFX_FloatRect bbox; // BBox for the AP stream (unrotated rect in page coords) + CFX_Matrix matrix; // Transforms from local BBox space to page/AABB space + bool is_rotated; // Whether rotation was applied }; ShapeRotationInfo GetShapeRotationInfo(const CPDF_Dictionary* annot_dict) { @@ -440,10 +473,9 @@ ShapeRotationInfo GetShapeRotationInfo(const CPDF_Dictionary* annot_dict) { // Matrix: rotate around center of unrotated rect // M = T(cx, cy) * R(theta) * T(-cx, -cy) - info.matrix = CFX_Matrix( - cos_t, sin_t, -sin_t, cos_t, - cx * (1.0f - cos_t) + cy * sin_t, - cy * (1.0f - cos_t) - cx * sin_t); + info.matrix = + CFX_Matrix(cos_t, sin_t, -sin_t, cos_t, cx * (1.0f - cos_t) + cy * sin_t, + cy * (1.0f - cos_t) - cx * sin_t); return info; } @@ -761,7 +793,7 @@ inline CPDF_Annot::VerticalAlignment GetVerticalAlign( annot_dict ? annot_dict->GetIntegerFor("EPDF:VerticalAlignment") : 0; if (v < static_cast(CPDF_Annot::VerticalAlignment::kTop) || v > static_cast(CPDF_Annot::VerticalAlignment::kBottom)) { - return CPDF_Annot::VerticalAlignment::kTop; // fallback + return CPDF_Annot::VerticalAlignment::kTop; // fallback } return static_cast(v); } @@ -828,6 +860,26 @@ RetainPtr GenerateFallbackFontDict(CPDF_Document* doc) { return font_dict; } +RetainPtr GenerateDirectFallbackFontDict() { + auto font_dict = pdfium::MakeRetain(); + font_dict->SetNewFor("Type", "Font"); + font_dict->SetNewFor("Subtype", "Type1"); + font_dict->SetNewFor("BaseFont", CFX_Font::kDefaultAnsiFontName); + font_dict->SetNewFor("Encoding", + pdfium::font_encodings::kWinAnsiEncoding); + return font_dict; +} + +RetainPtr GenerateEphemeralDefaultAcroFormDict() { + auto acroform_dict = pdfium::MakeRetain(); + acroform_dict->SetNewFor("DA", "/Helv 12 Tf 0 g"); + + auto dr_dict = acroform_dict->SetNewFor("DR"); + auto font_dict = dr_dict->SetNewFor("Font"); + font_dict->SetFor("Helv", GenerateDirectFallbackFontDict()); + return acroform_dict; +} + RetainPtr GetFontFromDrFontDictOrGenerateFallback( CPDF_Document* doc, CPDF_Dictionary* dr_font_dict, @@ -844,6 +896,21 @@ RetainPtr GetFontFromDrFontDictOrGenerateFallback( return new_font_dict; } +RetainPtr GetFontFromDrFontDictOrDirectFallback( + const CPDF_Dictionary* dr_font_dict, + const ByteString& font_name) { + RetainPtr font_dict = + dr_font_dict->GetDictFor(font_name.AsStringView()); + if (font_dict) { + // The font loader still takes a mutable dictionary handle. Ephemeral AP + // generation treats this as a read-only boundary and never writes through + // it. + return pdfium::WrapRetain(const_cast(font_dict.Get())); + } + + return GenerateDirectFallbackFontDict(); +} + RetainPtr GenerateResourceFontDict( CPDF_Document* doc, const ByteString& font_name, @@ -854,6 +921,20 @@ RetainPtr GenerateResourceFontDict( return resource_font_dict; } +RetainPtr GenerateResourceFontDict( + CPDF_Document* doc, + const ByteString& font_name, + const CPDF_Dictionary* font_dict) { + auto resource_font_dict = doc->New(); + const uint32_t font_obj_num = font_dict->GetObjNum(); + if (font_obj_num != 0) { + resource_font_dict->SetNewFor(font_name, doc, font_obj_num); + } else { + resource_font_dict->SetFor(font_name, font_dict->Clone()); + } + return resource_font_dict; +} + // Returns a PDF-name-safe alias for |base_font_name|, guaranteed unique inside // /AcroForm/DR/Font. Re-uses any existing alias that already maps to the same // BaseFont, otherwise creates a lean “standard-14” stub (or a fallback font @@ -870,8 +951,9 @@ RetainPtr GenerateResourceFontDict( ByteString EnsureFontInAcroFormDR(CPDF_Document* doc, CPDF_Dictionary* acroform_dict, const ByteString& base_font_name) { - if (!doc || !acroform_dict || base_font_name.IsEmpty()) + if (!doc || !acroform_dict || base_font_name.IsEmpty()) { return ByteString(); + } // /DR /Font RetainPtr dr_dict = acroform_dict->GetOrCreateDictFor("DR"); @@ -883,14 +965,16 @@ ByteString EnsureFontInAcroFormDR(CPDF_Document* doc, for (const auto& kv : locker) { const CPDF_Reference* ref = kv.second ? kv.second->AsReference() : nullptr; - if (!ref) + if (!ref) { continue; + } RetainPtr obj = doc->GetOrParseIndirectObject(ref->GetRefObjNum()); const CPDF_Dictionary* dict = obj ? obj->AsDictionary() : nullptr; - if (dict && dict->GetNameFor("BaseFont") == base_font_name) + if (dict && dict->GetNameFor("BaseFont") == base_font_name) { return kv.first; + } } } @@ -927,8 +1011,9 @@ struct CloudyBorderInfo { CloudyBorderInfo GetCloudyBorderInfo(const CPDF_Dictionary* annot_dict) { CloudyBorderInfo info; RetainPtr be = annot_dict->GetDictFor("BE"); - if (!be || be->GetNameFor("S") != "C") + if (!be || be->GetNameFor("S") != "C") { return info; + } info.is_cloudy = true; info.intensity = be->KeyExist("I") ? be->GetFloatFor("I") : 1.0f; return info; @@ -936,23 +1021,25 @@ CloudyBorderInfo GetCloudyBorderInfo(const CPDF_Dictionary* annot_dict) { CFX_FloatRect GetRectDifferences(const CPDF_Dictionary* annot_dict) { RetainPtr rd = annot_dict->GetArrayFor("RD"); - if (!rd || rd->size() < 4) + if (!rd || rd->size() < 4) { return CFX_FloatRect(); - return CFX_FloatRect(rd->GetFloatAt(0), rd->GetFloatAt(1), - rd->GetFloatAt(2), rd->GetFloatAt(3)); + } + return CFX_FloatRect(rd->GetFloatAt(0), rd->GetFloatAt(1), rd->GetFloatAt(2), + rd->GetFloatAt(3)); } CPDF_Annot::LineEnding ReadCalloutLineEnding( const CPDF_Dictionary* annot_dict) { // Per spec (Table 174), FreeText /LE is a single Name. ByteString name = annot_dict->GetNameFor("LE"); - if (!name.IsEmpty()) + if (!name.IsEmpty()) { return CPDF_Annot::StringToLineEnding(name); + } // Tolerance fallback: some writers store LE as an array. if (RetainPtr le = annot_dict->GetArrayFor("LE"); le) { - if (le->size() >= 1) - return CPDF_Annot::StringToLineEnding( - ReadLineEndingToken(le.Get(), 0)); + if (le->size() >= 1) { + return CPDF_Annot::StringToLineEnding(ReadLineEndingToken(le.Get(), 0)); + } } return CPDF_Annot::LineEnding::kNone; } @@ -969,7 +1056,8 @@ ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect, fill_color = fpdfdoc::CFXColorFromArray(*color_array); } - // Compute luminance-based contrast stroke (matches JS getContrastStrokeColor). + // Compute luminance-based contrast stroke (matches JS + // getContrastStrokeColor). float luminance = 0.299f * fill_color.fColor1 + 0.587f * fill_color.fColor2 + 0.114f * fill_color.fColor3; CFX_Color stroke_color = luminance < 0.45f @@ -1055,72 +1143,129 @@ RetainPtr GenerateResourcesDict( return resources_dict; } -void GenerateAndSetAPDict(CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - fxcrt::ostringstream* app_stream, - RetainPtr resource_dict, - bool is_text_markup_annotation) { +struct APGenerationTarget { + CPDF_Document* const doc; + CPDF_Dictionary* const persistent_annot_dict; + RetainPtr normal_stream; + + bool IsPersistent() const { return !!persistent_annot_dict; } +}; + +RetainPtr BuildAPStreamDict( + const CPDF_Dictionary* annot_dict, + RetainPtr resource_dict, + bool is_text_markup_annotation, + const CFX_Matrix& matrix, + const CFX_FloatRect& bbox_override) { auto stream_dict = pdfium::MakeRetain(); stream_dict->SetNewFor("FormType", 1); stream_dict->SetNewFor("Type", "XObject"); stream_dict->SetNewFor("Subtype", "Form"); - stream_dict->SetMatrixFor("Matrix", CFX_Matrix()); + stream_dict->SetMatrixFor("Matrix", matrix); - CFX_FloatRect rect = is_text_markup_annotation + CFX_FloatRect rect = !bbox_override.IsEmpty() ? bbox_override + : is_text_markup_annotation ? CPDF_Annot::BoundingRectFromQuadPoints(annot_dict) : annot_dict->GetRectFor(pdfium::annotation::kRect); stream_dict->SetRectFor("BBox", rect); stream_dict->SetFor("Resources", std::move(resource_dict)); + return stream_dict; +} + +bool GenerateAPDict(APGenerationTarget* target, + const CPDF_Dictionary* annot_dict, + fxcrt::ostringstream* app_stream, + RetainPtr resource_dict, + bool is_text_markup_annotation, + const CFX_Matrix& matrix, + const CFX_FloatRect& bbox_override) { + RetainPtr stream_dict = + BuildAPStreamDict(annot_dict, std::move(resource_dict), + is_text_markup_annotation, matrix, bbox_override); - auto normal_stream = doc->NewIndirect(std::move(stream_dict)); - normal_stream->SetDataFromStringstream(app_stream); + target->normal_stream = + target->IsPersistent() + ? target->doc->NewIndirect(std::move(stream_dict)) + : pdfium::MakeRetain(std::move(stream_dict)); + target->normal_stream->SetDataFromStringstream(app_stream); + + if (!target->IsPersistent()) { + return true; + } RetainPtr ap_dict = - annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); - ap_dict->SetNewFor("N", doc, normal_stream->GetObjNum()); + target->persistent_annot_dict->GetOrCreateDictFor( + pdfium::annotation::kAP); + ap_dict->SetNewFor("N", target->doc, + target->normal_stream->GetObjNum()); + return true; +} + +bool GenerateAndSetAPDict(APGenerationTarget* target, + const CPDF_Dictionary* annot_dict, + fxcrt::ostringstream* app_stream, + RetainPtr resource_dict, + bool is_text_markup_annotation) { + return GenerateAPDict(target, annot_dict, app_stream, + std::move(resource_dict), is_text_markup_annotation, + CFX_Matrix(), CFX_FloatRect()); } // Overload that accepts explicit Matrix and BBox, used by rotation-aware // shape annotation generators (Square, Circle). -void GenerateAndSetAPDictWithTransform( - CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - fxcrt::ostringstream* app_stream, - RetainPtr resource_dict, - const CFX_Matrix& matrix, - const CFX_FloatRect& bbox) { - auto stream_dict = pdfium::MakeRetain(); - stream_dict->SetNewFor("FormType", 1); - stream_dict->SetNewFor("Type", "XObject"); - stream_dict->SetNewFor("Subtype", "Form"); - stream_dict->SetMatrixFor("Matrix", matrix); - stream_dict->SetRectFor("BBox", bbox); - stream_dict->SetFor("Resources", std::move(resource_dict)); - - auto normal_stream = doc->NewIndirect(std::move(stream_dict)); - normal_stream->SetDataFromStringstream(app_stream); - - RetainPtr ap_dict = - annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); - ap_dict->SetNewFor("N", doc, normal_stream->GetObjNum()); +bool GenerateAndSetAPDictWithTransform(APGenerationTarget* target, + const CPDF_Dictionary* annot_dict, + fxcrt::ostringstream* app_stream, + RetainPtr resource_dict, + const CFX_Matrix& matrix, + const CFX_FloatRect& bbox) { + return GenerateAPDict(target, annot_dict, app_stream, + std::move(resource_dict), + /*is_text_markup_annotation=*/false, matrix, bbox); +} + +bool GenerateAndSetAPDictWithBBox(APGenerationTarget* target, + const CPDF_Dictionary* annot_dict, + fxcrt::ostringstream* app_stream, + RetainPtr resource_dict, + const CFX_FloatRect& bbox) { + return GenerateAPDict( + target, annot_dict, app_stream, std::move(resource_dict), + /*is_text_markup_annotation=*/false, CFX_Matrix(), bbox); +} + +bool GenerateAndSetAPDict(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + fxcrt::ostringstream* app_stream, + RetainPtr resource_dict, + bool is_text_markup_annotation) { + APGenerationTarget target{doc, annot_dict}; + return GenerateAndSetAPDict(&target, annot_dict, app_stream, + std::move(resource_dict), + is_text_markup_annotation); } // This helper encapsulates all logic for drawing the start and end caps. void GenerateLineEndings(fxcrt::ostringstream& ap, const std::vector& points, const CPDF_Dictionary* annot_dict) { - if (points.size() < 2) + if (points.size() < 2) { return; + } // Get ending styles from the /LE array CPDF_Annot::LineEnding start_ending = CPDF_Annot::LineEnding::kNone; CPDF_Annot::LineEnding end_ending = CPDF_Annot::LineEnding::kNone; if (RetainPtr le = annot_dict->GetArrayFor("LE"); le) { - if (le->size() >= 1) - start_ending = CPDF_Annot::StringToLineEnding(ReadLineEndingToken(le.Get(), 0)); - if (le->size() >= 2) - end_ending = CPDF_Annot::StringToLineEnding(ReadLineEndingToken(le.Get(), 1)); + if (le->size() >= 1) { + start_ending = + CPDF_Annot::StringToLineEnding(ReadLineEndingToken(le.Get(), 0)); + } + if (le->size() >= 2) { + end_ending = + CPDF_Annot::StringToLineEnding(ReadLineEndingToken(le.Get(), 1)); + } } if (start_ending == CPDF_Annot::LineEnding::kNone && @@ -1135,11 +1280,11 @@ void GenerateLineEndings(fxcrt::ostringstream& ap, // Lambda to emit a single ending with the correct transformation auto emit_one = [&](const CPDF_Annot::LineEnding ending, - const CFX_PointF& tip, - const CFX_PointF& unit_dir) { + const CFX_PointF& tip, const CFX_PointF& unit_dir) { if (ending == CPDF_Annot::LineEnding::kNone || - ending == CPDF_Annot::LineEnding::kUnknown) + ending == CPDF_Annot::LineEnding::kUnknown) { return; + } const float line_angle = atan2(unit_dir.y, unit_dir.x); float final_angle = line_angle; @@ -1388,7 +1533,9 @@ ByteString GenerateListBoxAP(const CPDF_Dictionary* annot_dict, return ByteString(body_stream); } -bool GenerateCircleAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateCircleAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -1420,11 +1567,12 @@ bool GenerateCircleAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byt if (cloudy_info.is_cloudy) { CFX_FloatRect rd = GetRectDifferences(annot_dict); - GenerateCloudyEllipsePath(app_stream, draw_rect, rd, - cloudy_info.intensity, border_width); + GenerateCloudyEllipsePath(app_stream, draw_rect, rd, cloudy_info.intensity, + border_width); } else { - if (is_stroke_rect) + if (is_stroke_rect) { draw_rect.Deflate(border_width / 2, border_width / 2); + } const float middle_x = (draw_rect.left + draw_rect.right) / 2; const float middle_y = (draw_rect.top + draw_rect.bottom) / 2; @@ -1444,60 +1592,78 @@ bool GenerateCircleAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byt << draw_rect.left << " " << middle_y - delta_y << " " << draw_rect.left << " " << middle_y << " c\n"; app_stream << draw_rect.left << " " << middle_y + delta_y << " " - << middle_x - delta_x << " " << draw_rect.top << " " - << middle_x << " " << draw_rect.top << " c\n"; + << middle_x - delta_x << " " << draw_rect.top << " " << middle_x + << " " << draw_rect.top << " c\n"; } bool is_fill_rect = interior_color && !interior_color->IsEmpty(); app_stream << GetPaintOperatorString(is_stroke_rect, is_fill_rect) << "\n"; auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); if (rot_info.is_rotated) { - GenerateAndSetAPDictWithTransform(doc, annot_dict, &app_stream, - std::move(resources_dict), - rot_info.matrix, rot_info.bbox); + GenerateAndSetAPDictWithTransform(target, annot_dict, &app_stream, + std::move(resources_dict), + rot_info.matrix, rot_info.bbox); } else { - GenerateAndSetAPDict(doc, annot_dict, &app_stream, + GenerateAndSetAPDict(target, annot_dict, &app_stream, std::move(resources_dict), false /*IsTextMarkupAnnotation*/); } return true; } -bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { - RetainPtr root_dict = doc->GetMutableRoot(); +bool GenerateFreeTextAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { + CPDF_Document* const doc = target->doc; + const CPDF_Dictionary* root_dict = doc->GetRoot(); if (!root_dict) { return false; } - RetainPtr form_dict = - root_dict->GetMutableDictFor("AcroForm"); + RetainPtr form_dict = + root_dict->GetDictFor("AcroForm"); + RetainPtr ephemeral_form_dict; if (!form_dict) { - form_dict = CPDF_InteractiveForm::InitAcroFormDict(doc); - CHECK(form_dict); + if (!target->IsPersistent()) { + ephemeral_form_dict = GenerateEphemeralDefaultAcroFormDict(); + form_dict = ephemeral_form_dict; + } else { + form_dict = CPDF_InteractiveForm::InitAcroFormDict(doc); + CHECK(form_dict); + } } std::optional default_appearance_info = - GetDefaultAppearanceInfo(annot_dict, form_dict); + GetDefaultAppearanceInfo(annot_dict, form_dict.Get()); if (!default_appearance_info.has_value()) { return false; } - RetainPtr dr_dict = form_dict->GetMutableDictFor("DR"); + RetainPtr dr_dict = form_dict->GetDictFor("DR"); if (!dr_dict) { return false; } - RetainPtr dr_font_dict = dr_dict->GetMutableDictFor("Font"); + RetainPtr dr_font_dict = dr_dict->GetDictFor("Font"); if (!ValidateFontResourceDict(dr_font_dict.Get())) { return false; } const ByteString& font_name = default_appearance_info.value().font_name; - RetainPtr font_dict = - GetFontFromDrFontDictOrGenerateFallback(doc, dr_font_dict, font_name); + RetainPtr font_dict; + if (target->IsPersistent()) { + font_dict = GetFontFromDrFontDictOrGenerateFallback( + doc, + pdfium::WrapRetain(const_cast(dr_font_dict.Get())), + font_name); + } else { + font_dict = + GetFontFromDrFontDictOrDirectFallback(dr_font_dict.Get(), font_name); + } auto* doc_page_data = CPDF_DocPageData::FromDocument(doc); RetainPtr default_font = doc_page_data->GetFont(font_dict); if (!default_font) { @@ -1522,19 +1688,15 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B CFX_PointF tip(cl->GetFloatAt(0), cl->GetFloatAt(1)); const bool has_knee = (cl->size() == 6); CFX_PointF knee(cl->GetFloatAt(2), cl->GetFloatAt(3)); - CFX_PointF conn = has_knee - ? CFX_PointF(cl->GetFloatAt(4), cl->GetFloatAt(5)) - : knee; + CFX_PointF conn = + has_knee ? CFX_PointF(cl->GetFloatAt(4), cl->GetFloatAt(5)) : knee; // (b) Compute text box from Rect + RD. CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); rect.Normalize(); CFX_FloatRect rd = GetRectDifferences(annot_dict); - CFX_FloatRect text_box( - rect.left + rd.left, - rect.bottom + rd.bottom, - rect.right - rd.right, - rect.top - rd.top); + CFX_FloatRect text_box(rect.left + rd.left, rect.bottom + rd.bottom, + rect.right - rd.right, rect.top - rd.top); // (c) Border width and colors. const float border_w = GetBorderWidth(annot_dict); @@ -1546,8 +1708,9 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B appearance_stream << GenerateColorAP(fill, PaintOperation::kFill); } appearance_stream << GenerateColorAP(da_color, PaintOperation::kStroke); - if (border_w > 0) + if (border_w > 0) { appearance_stream << border_w << " w\n"; + } // (e) Draw callout polyline. // Extend conn along the incoming segment direction by half the border @@ -1560,10 +1723,10 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B conn.y + line_dir.y * half_bw); appearance_stream << tip.x << " " << tip.y << " m\n"; - if (has_knee) + if (has_knee) { appearance_stream << knee.x << " " << knee.y << " l\n"; - appearance_stream << adjusted_conn.x << " " << adjusted_conn.y - << " l S\n"; + } + appearance_stream << adjusted_conn.x << " " << adjusted_conn.y << " l S\n"; // (f) Draw line ending at tip. CPDF_Annot::LineEnding le = ReadCalloutLineEnding(annot_dict); @@ -1682,10 +1845,10 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B // Finalize AP dict. auto graphics_state_dict = GenerateExtGStateDict(*annot_dict, blend_name); auto resource_font_dict = - GenerateResourceFontDict(doc, font_name, font_dict->GetObjNum()); + GenerateResourceFontDict(doc, font_name, font_dict.Get()); auto resource_dict = GenerateResourcesDict( doc, std::move(graphics_state_dict), std::move(resource_font_dict)); - GenerateAndSetAPDict(doc, annot_dict, &appearance_stream, + GenerateAndSetAPDict(target, annot_dict, &appearance_stream, std::move(resource_dict), /*is_text_markup_annotation=*/false); } else { @@ -1761,15 +1924,15 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B auto graphics_state_dict = GenerateExtGStateDict(*annot_dict, blend_name); auto resource_font_dict = - GenerateResourceFontDict(doc, font_name, font_dict->GetObjNum()); + GenerateResourceFontDict(doc, font_name, font_dict.Get()); auto resource_dict = GenerateResourcesDict( doc, std::move(graphics_state_dict), std::move(resource_font_dict)); if (rot_info.is_rotated) { - GenerateAndSetAPDictWithTransform(doc, annot_dict, &appearance_stream, - std::move(resource_dict), - rot_info.matrix, rot_info.bbox); + GenerateAndSetAPDictWithTransform(target, annot_dict, &appearance_stream, + std::move(resource_dict), + rot_info.matrix, rot_info.bbox); } else { - GenerateAndSetAPDict(doc, annot_dict, &appearance_stream, + GenerateAndSetAPDict(target, annot_dict, &appearance_stream, std::move(resource_dict), /*is_text_markup_annotation=*/false); } @@ -1777,7 +1940,9 @@ bool GenerateFreeTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B return true; } -bool GenerateHighlightAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateHighlightAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -1801,35 +1966,36 @@ bool GenerateHighlightAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const } auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &app_stream, + std::move(resources_dict), true /*IsTextMarkupAnnotation*/); return true; } -bool GeneratePolygonAP(CPDF_Document* doc, +bool GeneratePolygonAP(APGenerationTarget* target, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { RetainPtr verts = annot_dict->GetArrayFor(pdfium::annotation::kVertices); // A polygon needs ≥ 3 points (= 6 floats). - if (!verts || verts->size() < 6) + if (!verts || verts->size() < 6) { return false; + } fxcrt::ostringstream app; app << "/" << kGSDictName << " gs "; RetainPtr interior_color = annot_dict->GetArrayFor("IC"); - app << GetColorStringWithDefault( - interior_color.Get(), - CFX_Color(CFX_Color::Type::kTransparent), - PaintOperation::kFill); + app << GetColorStringWithDefault(interior_color.Get(), + CFX_Color(CFX_Color::Type::kTransparent), + PaintOperation::kFill); app << GetColorStringWithDefault( - annot_dict->GetArrayFor(pdfium::annotation::kC).Get(), - CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), - PaintOperation::kStroke); + annot_dict->GetArrayFor(pdfium::annotation::kC).Get(), + CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke); const float border_w = GetBorderWidth(annot_dict); const bool do_stroke = border_w > 0; @@ -1846,32 +2012,37 @@ bool GeneratePolygonAP(CPDF_Document* doc, if (cloudy_info.is_cloudy) { std::vector points; - for (size_t i = 0; i + 1 < verts->size(); i += 2) + for (size_t i = 0; i + 1 < verts->size(); i += 2) { points.push_back({verts->GetFloatAt(i), verts->GetFloatAt(i + 1)}); + } GenerateCloudyPolygonPath(app, points, cloudy_info.intensity, border_w); } else { app << verts->GetFloatAt(0) << " " << verts->GetFloatAt(1) << " m "; - for (size_t i = 2; i + 1 < verts->size(); i += 2) + for (size_t i = 2; i + 1 < verts->size(); i += 2) { app << verts->GetFloatAt(i) << " " << verts->GetFloatAt(i + 1) << " l "; + } app << "h "; } const bool do_fill = interior_color && !interior_color->IsEmpty(); app << GetPaintOperatorString(do_stroke, do_fill) << "\n"; - auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto res_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app, std::move(res_dict), + auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); + auto res_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &app, std::move(res_dict), /*is_text_markup=*/false); return true; } -bool GenerateLineAP(CPDF_Document* doc, +bool GenerateLineAP(APGenerationTarget* target, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { - RetainPtr L = annot_dict->GetArrayFor(pdfium::annotation::kL); - if (!L || L->size() < 4) + RetainPtr L = + annot_dict->GetArrayFor(pdfium::annotation::kL); + if (!L || L->size() < 4) { return false; + } std::vector points; points.push_back({L->GetFloatAt(0), L->GetFloatAt(1)}); @@ -1883,12 +2054,12 @@ bool GenerateLineAP(CPDF_Document* doc, // Set colors and border styles. RetainPtr interior_color = annot_dict->GetArrayFor("IC"); if (interior_color && !interior_color->IsEmpty()) { - ap << GetColorStringWithDefault(interior_color.Get(), {}, PaintOperation::kFill); + ap << GetColorStringWithDefault(interior_color.Get(), {}, + PaintOperation::kFill); } ap << GetColorStringWithDefault( annot_dict->GetArrayFor(pdfium::annotation::kC).Get(), - CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), - PaintOperation::kStroke); + CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke); const float border_w = GetBorderWidth(annot_dict); if (border_w > 0) { @@ -1896,27 +2067,29 @@ bool GenerateLineAP(CPDF_Document* doc, } // Draw the main line segment. - ap << points[0].x << " " << points[0].y << " m " - << points[1].x << " " << points[1].y << " l S\n"; + ap << points[0].x << " " << points[0].y << " m " << points[1].x << " " + << points[1].y << " l S\n"; // Draw the endings. GenerateLineEndings(ap, points, annot_dict); // Finalize and set the Appearance Stream. auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto res_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &ap, std::move(res_dict), + auto res_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &ap, std::move(res_dict), /*is_text_markup=*/false); return true; } -bool GeneratePolyLineAP(CPDF_Document* doc, +bool GeneratePolyLineAP(APGenerationTarget* target, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { RetainPtr verts = annot_dict->GetArrayFor(pdfium::annotation::kVertices); - if (!verts || verts->size() < 4) + if (!verts || verts->size() < 4) { return false; + } std::vector points; for (size_t i = 0; i + 1 < verts->size(); i += 2) { @@ -1929,12 +2102,12 @@ bool GeneratePolyLineAP(CPDF_Document* doc, // Set colors and border styles. RetainPtr interior_color = annot_dict->GetArrayFor("IC"); if (interior_color && !interior_color->IsEmpty()) { - ap << GetColorStringWithDefault(interior_color.Get(), {}, PaintOperation::kFill); + ap << GetColorStringWithDefault(interior_color.Get(), {}, + PaintOperation::kFill); } ap << GetColorStringWithDefault( annot_dict->GetArrayFor(pdfium::annotation::kC).Get(), - CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), - PaintOperation::kStroke); + CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke); const float border_w = GetBorderWidth(annot_dict); if (border_w > 0) { @@ -1953,13 +2126,16 @@ bool GeneratePolyLineAP(CPDF_Document* doc, // Finalize and set the Appearance Stream. auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto res_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &ap, std::move(res_dict), + auto res_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &ap, std::move(res_dict), /*is_text_markup=*/false); return true; } -bool GenerateInkAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateInkAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { RetainPtr ink_list = annot_dict->GetArrayFor("InkList"); if (!ink_list || ink_list->IsEmpty()) { return false; @@ -1988,7 +2164,9 @@ bool GenerateInkAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteSt // width should not be clipped to the original rect. CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); rect.Inflate(border_width / 2, border_width / 2); - annot_dict->SetRectFor(pdfium::annotation::kRect, rect); + if (target->IsPersistent()) { + annot_dict->SetRectFor(pdfium::annotation::kRect, rect); + } for (size_t i = 0; i < ink_list->size(); i++) { RetainPtr coordinates_array = ink_list->GetArrayAt(i); @@ -2011,13 +2189,22 @@ bool GenerateInkAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteSt } auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), - false /*IsTextMarkupAnnotation*/); + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + if (target->IsPersistent()) { + GenerateAndSetAPDict(target, annot_dict, &app_stream, + std::move(resources_dict), + false /*IsTextMarkupAnnotation*/); + } else { + GenerateAndSetAPDictWithBBox(target, annot_dict, &app_stream, + std::move(resources_dict), rect); + } return true; } -bool GenerateTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateTextAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -2036,7 +2223,9 @@ bool GenerateTextAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteS return true; } -bool GenerateUnderlineAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateUnderlineAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -2060,13 +2249,17 @@ bool GenerateUnderlineAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const } auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &app_stream, + std::move(resources_dict), true /*IsTextMarkupAnnotation*/); return true; } -bool GeneratePopupAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GeneratePopupAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs\n"; @@ -2107,7 +2300,9 @@ bool GeneratePopupAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byte return true; } -bool GenerateSquareAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateSquareAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -2142,8 +2337,9 @@ bool GenerateSquareAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byt GenerateCloudyRectanglePath(app_stream, draw_rect, rd, cloudy_info.intensity, border_width); } else { - if (is_stroke_rect) + if (is_stroke_rect) { draw_rect.Deflate(border_width / 2, border_width / 2); + } app_stream << draw_rect.left << " " << draw_rect.bottom << " " << draw_rect.Width() << " " << draw_rect.Height() << " re "; } @@ -2152,21 +2348,24 @@ bool GenerateSquareAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byt app_stream << GetPaintOperatorString(is_stroke_rect, is_fill_rect) << "\n"; auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); if (rot_info.is_rotated) { - GenerateAndSetAPDictWithTransform(doc, annot_dict, &app_stream, - std::move(resources_dict), - rot_info.matrix, rot_info.bbox); + GenerateAndSetAPDictWithTransform(target, annot_dict, &app_stream, + std::move(resources_dict), + rot_info.matrix, rot_info.bbox); } else { - GenerateAndSetAPDict(doc, annot_dict, &app_stream, + GenerateAndSetAPDict(target, annot_dict, &app_stream, std::move(resources_dict), false /*IsTextMarkupAnnotation*/); } return true; } -bool GenerateSquigglyAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateSquigglyAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -2210,13 +2409,17 @@ bool GenerateSquigglyAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const B } auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &app_stream, + std::move(resources_dict), true /*IsTextMarkupAnnotation*/); return true; } -bool GenerateStrikeOutAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateStrikeOutAP(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -2241,8 +2444,10 @@ bool GenerateStrikeOutAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const } auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); - GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), + auto resources_dict = + GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(target, annot_dict, &app_stream, + std::move(resources_dict), true /*IsTextMarkupAnnotation*/); return true; } @@ -2252,8 +2457,9 @@ bool GenerateLinkAP(CPDF_Document* doc, const ByteString& blend_name) { // Get border width - default to 1 if not specified float border_width = GetBorderWidth(annot_dict); - if (border_width <= 0) + if (border_width <= 0) { return true; // No visible border, no AP needed + } CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); rect.Normalize(); @@ -2271,7 +2477,8 @@ bool GenerateLinkAP(CPDF_Document* doc, app_stream << GetDashPatternString(annot_dict); // Determine border style - BorderStyleInfo border_info = GetBorderStyleInfo(annot_dict->GetDictFor("BS")); + BorderStyleInfo border_info = + GetBorderStyleInfo(annot_dict->GetDictFor("BS")); switch (border_info.style) { case BorderStyle::kUnderline: { @@ -2320,7 +2527,7 @@ void GenerateRedactAPDicts(CPDF_Document* doc, normal_stream_dict->SetRectFor("BBox", rect); normal_stream_dict->SetFor("Resources", resource_dict->Clone()); - auto normal_pdf_stream = + auto normal_pdf_stream = doc->NewIndirect(std::move(normal_stream_dict)); normal_pdf_stream->SetDataFromStringstream(normal_stream); @@ -2334,7 +2541,7 @@ void GenerateRedactAPDicts(CPDF_Document* doc, rollover_stream_dict->SetRectFor("BBox", rect); rollover_stream_dict->SetFor("Resources", resource_dict->Clone()); - auto rollover_pdf_stream = + auto rollover_pdf_stream = doc->NewIndirect(std::move(rollover_stream_dict)); rollover_pdf_stream->SetDataFromStringstream(rollover_stream); @@ -2348,13 +2555,13 @@ void GenerateRedactAPDicts(CPDF_Document* doc, ap_dict->SetNewFor("R", doc, rollover_obj_num); // Rollover ap_dict->SetNewFor("D", doc, rollover_obj_num); // Down - // Set RO (Redact Overlay) - this is what gets applied when redaction is finalized - // RO is stored directly on the annotation dict, not inside AP + // Set RO (Redact Overlay) - this is what gets applied when redaction is + // finalized RO is stored directly on the annotation dict, not inside AP annot_dict->SetNewFor("RO", doc, rollover_obj_num); } -bool GenerateRedactAP(CPDF_Document* doc, - CPDF_Dictionary* annot_dict, +bool GenerateRedactAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, const ByteString& blend_name) { fxcrt::ostringstream normal_stream; fxcrt::ostringstream rollover_stream; @@ -2364,7 +2571,7 @@ bool GenerateRedactAP(CPDF_Document* doc, // Get colors from annotation dictionary // C - stroke/border color (default: red for redact) // IC - interior color (fill when redaction applied, default: black) - RetainPtr stroke_color = + RetainPtr stroke_color = annot_dict->GetArrayFor(pdfium::annotation::kC); RetainPtr interior_color = annot_dict->GetArrayFor("IC"); const bool has_fill = interior_color && !interior_color->IsEmpty(); @@ -2410,10 +2617,10 @@ bool GenerateRedactAP(CPDF_Document* doc, // Rollover: fill the rectangle (only if interior color is set) if (has_fill) { - rollover_stream << rect.left << " " << rect.top << " m " - << rect.right << " " << rect.top << " l " - << rect.right << " " << rect.bottom << " l " - << rect.left << " " << rect.bottom << " l h f\n"; + rollover_stream << rect.left << " " << rect.top << " m " << rect.right + << " " << rect.top << " l " << rect.right << " " + << rect.bottom << " l " << rect.left << " " + << rect.bottom << " l h f\n"; } } } else { @@ -2432,8 +2639,8 @@ bool GenerateRedactAP(CPDF_Document* doc, // Rollover: fill the rectangle (only if interior color is set) if (has_fill) { - rollover_stream << rect.left << " " << rect.bottom << " " - << rect.Width() << " " << rect.Height() << " re f\n"; + rollover_stream << rect.left << " " << rect.bottom << " " << rect.Width() + << " " << rect.Height() << " re f\n"; } } @@ -2447,14 +2654,13 @@ bool GenerateRedactAP(CPDF_Document* doc, resources_dict, has_quad_points); return true; -} +} -void GenerateTextFieldFormAP( - fxcrt::ostringstream& app_stream, - const CPDF_Dictionary* annot_dict, - const CFX_FloatRect& bbox, - const DefaultAppearanceInfo& da_info, - CPVT_VariableText::Provider& provider) { +void GenerateTextFieldFormAP(fxcrt::ostringstream& app_stream, + const CPDF_Dictionary* annot_dict, + const CFX_FloatRect& bbox, + const DefaultAppearanceInfo& da_info, + CPVT_VariableText::Provider& provider) { const AppearanceCharacteristics mk = GetAppearanceCharacteristics(annot_dict->GetDictFor("MK")); const bool has_bg = @@ -2511,19 +2717,18 @@ void GenerateTextFieldFormAP( app_stream << "Q\nEMC\n"; } -void GenerateComboBoxFormAP( - fxcrt::ostringstream& app_stream, - const CPDF_Dictionary* annot_dict, - const CFX_FloatRect& bbox, - const DefaultAppearanceInfo& da_info, - CPVT_VariableText::Provider& provider) { +void GenerateComboBoxFormAP(fxcrt::ostringstream& app_stream, + const CPDF_Dictionary* annot_dict, + const CFX_FloatRect& bbox, + const DefaultAppearanceInfo& da_info, + CPVT_VariableText::Provider& provider) { const AnnotationDimensionsAndColor dims = GetAnnotationDimensionsAndColor(annot_dict); const BorderStyleInfo border_info = GetBorderStyleInfo(annot_dict->GetDictFor("BS")); - const ByteString background = GenerateColorAP( - dims.background_color, PaintOperation::kFill); + const ByteString background = + GenerateColorAP(dims.background_color, PaintOperation::kFill); if (background.GetLength() > 0) { app_stream << "q\n" << background; WriteRect(app_stream, bbox) << " re f\nQ\n"; @@ -2542,19 +2747,18 @@ void GenerateComboBoxFormAP( da_info.font_size, provider); } -void GenerateListBoxFormAP( - fxcrt::ostringstream& app_stream, - const CPDF_Dictionary* annot_dict, - const CFX_FloatRect& bbox, - const DefaultAppearanceInfo& da_info, - CPVT_VariableText::Provider& provider) { +void GenerateListBoxFormAP(fxcrt::ostringstream& app_stream, + const CPDF_Dictionary* annot_dict, + const CFX_FloatRect& bbox, + const DefaultAppearanceInfo& da_info, + CPVT_VariableText::Provider& provider) { const AnnotationDimensionsAndColor dims = GetAnnotationDimensionsAndColor(annot_dict); const BorderStyleInfo border_info = GetBorderStyleInfo(annot_dict->GetDictFor("BS")); - const ByteString background = GenerateColorAP( - dims.background_color, PaintOperation::kFill); + const ByteString background = + GenerateColorAP(dims.background_color, PaintOperation::kFill); if (background.GetLength() > 0) { app_stream << "q\n" << background; WriteRect(app_stream, bbox) << " re f\nQ\n"; @@ -2620,8 +2824,8 @@ void GenerateCheckmarkPath(fxcrt::ostringstream& stream, WritePoint(stream, {pts[i][0].x + px1 * FXSYS_BEZIER, pts[i][0].y + py1 * FXSYS_BEZIER}) << " "; - WritePoint(stream, {pt_next.x + px2 * FXSYS_BEZIER, - pt_next.y + py2 * FXSYS_BEZIER}) + WritePoint(stream, + {pt_next.x + px2 * FXSYS_BEZIER, pt_next.y + py2 * FXSYS_BEZIER}) << " "; WritePoint(stream, pt_next) << " c\n"; } @@ -2670,73 +2874,113 @@ uint32_t CreateFormXObjectStream(CPDF_Document* doc, stream->SetDataFromStringstreamAndRemoveFilter(&content); return stream->GetObjNum(); } - -} // namespace -// static -void CPDF_GenerateAP::GenerateFormAP(CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - FormType type) { - RetainPtr root_dict = doc->GetMutableRoot(); +std::optional GetWidgetFormType( + const CPDF_Dictionary* annot_dict) { + RetainPtr field_type_obj = + CPDF_FormField::GetFieldAttrForDict(annot_dict, pdfium::form_fields::kFT); + if (!field_type_obj) { + return std::nullopt; + } + + const ByteString field_type = field_type_obj->GetString(); + if (field_type == pdfium::form_fields::kTx) { + return CPDF_GenerateAP::kTextField; + } + + if (field_type != pdfium::form_fields::kCh) { + return std::nullopt; + } + + RetainPtr field_flags_obj = + CPDF_FormField::GetFieldAttrForDict(annot_dict, pdfium::form_fields::kFf); + const uint32_t flags = field_flags_obj ? field_flags_obj->GetInteger() : 0; + return (flags & pdfium::form_flags::kChoiceCombo) ? CPDF_GenerateAP::kComboBox + : CPDF_GenerateAP::kListBox; +} + +bool GenerateFormAPToTarget(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + CPDF_GenerateAP::FormType type) { + CPDF_Document* const doc = target->doc; + const CPDF_Dictionary* root_dict = doc->GetRoot(); if (!root_dict) { - return; + return false; } - RetainPtr form_dict = - root_dict->GetMutableDictFor("AcroForm"); + RetainPtr form_dict = + root_dict->GetDictFor("AcroForm"); if (!form_dict) { - return; + return false; } std::optional default_appearance_info = - GetDefaultAppearanceInfo(annot_dict, form_dict); + GetDefaultAppearanceInfo(annot_dict, form_dict.Get()); if (!default_appearance_info.has_value()) { - return; + return false; } - RetainPtr dr_dict = form_dict->GetMutableDictFor("DR"); + RetainPtr dr_dict = form_dict->GetDictFor("DR"); if (!dr_dict) { - return; + return false; } - RetainPtr dr_font_dict = dr_dict->GetMutableDictFor("Font"); + RetainPtr dr_font_dict = dr_dict->GetDictFor("Font"); if (!ValidateFontResourceDict(dr_font_dict.Get())) { - return; + return false; } const ByteString& font_name = default_appearance_info.value().font_name; - RetainPtr font_dict = - GetFontFromDrFontDictOrGenerateFallback(doc, dr_font_dict, font_name); + RetainPtr font_dict; + if (target->IsPersistent()) { + font_dict = GetFontFromDrFontDictOrGenerateFallback( + doc, + pdfium::WrapRetain(const_cast(dr_font_dict.Get())), + font_name); + } else { + font_dict = + GetFontFromDrFontDictOrDirectFallback(dr_font_dict.Get(), font_name); + } auto* doc_page_data = CPDF_DocPageData::FromDocument(doc); RetainPtr default_font = doc_page_data->GetFont(font_dict); if (!default_font) { - return; + return false; } const AnnotationDimensionsAndColor dims = GetAnnotationDimensionsAndColor(annot_dict); - RetainPtr ap_dict = - annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); - RetainPtr normal_stream = ap_dict->GetMutableStreamFor("N"); RetainPtr resources_dict; - if (normal_stream) { - RetainPtr stream_dict = normal_stream->GetMutableDict(); - const bool cloned = - CloneResourcesDictIfMissingFromStream(stream_dict, dr_dict); - if (!cloned) { - if (!ValidateOrCreateFontResources(doc, stream_dict, font_dict, - font_name)) { - return; + RetainPtr normal_stream; + if (target->IsPersistent()) { + RetainPtr ap_dict = + annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); + normal_stream = ap_dict->GetMutableStreamFor("N"); + if (normal_stream) { + RetainPtr stream_dict = normal_stream->GetMutableDict(); + const bool cloned = + CloneResourcesDictIfMissingFromStream(stream_dict, dr_dict.Get()); + if (!cloned) { + if (!ValidateOrCreateFontResources(doc, stream_dict, font_dict, + font_name)) { + return false; + } } + resources_dict = stream_dict->GetMutableDictFor("Resources"); + } else { + normal_stream = + doc->NewIndirect(pdfium::MakeRetain()); + ap_dict->SetNewFor("N", doc, normal_stream->GetObjNum()); } - resources_dict = stream_dict->GetMutableDictFor("Resources"); } else { - normal_stream = - doc->NewIndirect(pdfium::MakeRetain()); - ap_dict->SetNewFor("N", doc, normal_stream->GetObjNum()); + auto gs_dict = GenerateExtGStateDict(*annot_dict, "Normal"); + auto resource_font_dict = + GenerateResourceFontDict(doc, font_name, font_dict.Get()); + resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), + std::move(resource_font_dict)); } + RetainPtr ephemeral_resources_dict = resources_dict; CPVT_FontMap map(doc, std::move(resources_dict), std::move(default_font), font_name); CPVT_VariableText::Provider provider(&map); @@ -2757,18 +3001,48 @@ void CPDF_GenerateAP::GenerateFormAP(CPDF_Document* doc, break; } + if (!target->IsPersistent()) { + return GenerateAPDict( + target, annot_dict, &app_stream, std::move(ephemeral_resources_dict), + /*is_text_markup_annotation=*/false, dims.matrix, dims.bbox); + } + normal_stream->SetDataFromStringstreamAndRemoveFilter(&app_stream); RetainPtr stream_dict = normal_stream->GetMutableDict(); stream_dict->SetMatrixFor("Matrix", dims.matrix); stream_dict->SetRectFor("BBox", dims.bbox); - + const bool cloned = CloneResourcesDictIfMissingFromStream(stream_dict, dr_dict); if (cloned) { - return; + return true; } ValidateOrCreateFontResources(doc, stream_dict, font_dict, font_name); + return true; +} + +} // namespace + +// static +void CPDF_GenerateAP::GenerateFormAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + FormType type) { + APGenerationTarget target{doc, annot_dict}; + GenerateFormAPToTarget(&target, annot_dict, type); +} + +// static +std::optional +CPDF_GenerateAP::GenerateEphemeralFormAP(CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + FormType type) { + APGenerationTarget target{doc, nullptr}; + if (!GenerateFormAPToTarget(&target, const_cast(annot_dict), + type)) { + return std::nullopt; + } + return GeneratedAP{std::move(target.normal_stream)}; } // static @@ -2815,11 +3089,11 @@ void CPDF_GenerateAP::GenerateCheckboxFormAP(CPDF_Document* doc, } } } - if (on_state.IsEmpty()) + if (on_state.IsEmpty()) { on_state = "Yes"; + } - RetainPtr n_dict = - ap_dict->SetNewFor("N"); + RetainPtr n_dict = ap_dict->SetNewFor("N"); n_dict->SetNewFor("Off", doc, off_obj_num); n_dict->SetNewFor(on_state, doc, yes_obj_num); @@ -2975,14 +3249,14 @@ void CPDF_GenerateAP::GenerateRadioButtonFormAP(CPDF_Document* doc, } if (on_state.IsEmpty()) { WideString nm = annot_dict->GetUnicodeTextFor("NM"); - if (!nm.IsEmpty()) + if (!nm.IsEmpty()) { on_state = nm.ToUTF8(); - else + } else { on_state = "Yes"; + } } - RetainPtr n_dict = - ap_dict->SetNewFor("N"); + RetainPtr n_dict = ap_dict->SetNewFor("N"); n_dict->SetNewFor("Off", doc, off_obj_num); n_dict->SetNewFor(on_state, doc, yes_obj_num); @@ -3002,7 +3276,9 @@ void CPDF_GenerateAP::GenerateEmptyAP(CPDF_Document* doc, false); } -bool GenerateCaretAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { +bool GenerateCaretAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { fxcrt::ostringstream app_stream; app_stream << "/" << kGSDictName << " gs "; @@ -3038,8 +3314,8 @@ bool GenerateCaretAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byte // Left bezier: from (draw_left, draw_bottom) to (mid_x, draw_top) app_stream << draw_left << " " << draw_bottom << " m\n"; app_stream << (draw_left + width * 0.27f) << " " << draw_bottom << " " - << mid_x << " " << (draw_bottom + height * 0.44f) << " " - << mid_x << " " << draw_top << " c\n"; + << mid_x << " " << (draw_bottom + height * 0.44f) << " " << mid_x + << " " << draw_top << " c\n"; // Right bezier: from (mid_x, draw_top) to (draw_right, draw_bottom) app_stream << mid_x << " " << (draw_bottom + height * 0.44f) << " " @@ -3055,6 +3331,37 @@ bool GenerateCaretAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const Byte return true; } +bool GenerateAnnotAPToTarget(APGenerationTarget* target, + CPDF_Dictionary* annot_dict, + CPDF_Annot::Subtype subtype, + BlendMode blend_mode) { + ByteString blend_name = BlendModeToPDFName(blend_mode); + switch (subtype) { + case CPDF_Annot::Subtype::CIRCLE: + return GenerateCircleAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::HIGHLIGHT: + return GenerateHighlightAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::INK: + return GenerateInkAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::LINE: + return GenerateLineAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::POLYGON: + return GeneratePolygonAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::POLYLINE: + return GeneratePolyLineAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::SQUARE: + return GenerateSquareAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::SQUIGGLY: + return GenerateSquigglyAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::STRIKEOUT: + return GenerateStrikeOutAP(target, annot_dict, blend_name); + case CPDF_Annot::Subtype::UNDERLINE: + return GenerateUnderlineAP(target, annot_dict, blend_name); + default: + return false; + } +} + // static bool CPDF_GenerateAP::GenerateAnnotAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, @@ -3068,34 +3375,19 @@ bool CPDF_GenerateAP::GenerateAnnotAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, CPDF_Annot::Subtype subtype, BlendMode blend_mode) { + APGenerationTarget target{doc, annot_dict}; + if (GenerateAnnotAPToTarget(&target, annot_dict, subtype, blend_mode)) { + return true; + } + ByteString blend_name = BlendModeToPDFName(blend_mode); switch (subtype) { - case CPDF_Annot::Subtype::CIRCLE: - return GenerateCircleAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::FREETEXT: - return GenerateFreeTextAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::HIGHLIGHT: - return GenerateHighlightAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::INK: - return GenerateInkAP(doc, annot_dict, blend_name); + return GenerateFreeTextAP(&target, annot_dict, blend_name); case CPDF_Annot::Subtype::POPUP: return GeneratePopupAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::SQUARE: - return GenerateSquareAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::SQUIGGLY: - return GenerateSquigglyAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::STRIKEOUT: - return GenerateStrikeOutAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::TEXT: return GenerateTextAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::UNDERLINE: - return GenerateUnderlineAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::POLYGON: - return GeneratePolygonAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::POLYLINE: - return GeneratePolyLineAP(doc, annot_dict, blend_name); - case CPDF_Annot::Subtype::LINE: - return GenerateLineAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::LINK: return GenerateLinkAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::REDACT: @@ -3107,6 +3399,56 @@ bool CPDF_GenerateAP::GenerateAnnotAP(CPDF_Document* doc, } } +// static +std::optional +CPDF_GenerateAP::GenerateEphemeralAnnotAP(CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + CPDF_Annot::Subtype subtype) { + return GenerateEphemeralAnnotAP(doc, annot_dict, subtype, + DefaultBlendModeFor(subtype)); +} + +// static +std::optional +CPDF_GenerateAP::GenerateEphemeralAnnotAP(CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + CPDF_Annot::Subtype subtype, + BlendMode blend_mode) { + if (!SupportsEphemeralAnnotAP(subtype)) { + return std::nullopt; + } + + if (subtype == CPDF_Annot::Subtype::WIDGET) { + std::optional type = GetWidgetFormType(annot_dict); + return type.has_value() + ? GenerateEphemeralFormAP(doc, annot_dict, type.value()) + : std::nullopt; + } + + APGenerationTarget target{doc, nullptr}; + CPDF_Dictionary* mutable_annot_dict = + const_cast(annot_dict); + if (subtype == CPDF_Annot::Subtype::FREETEXT) { + if (!GenerateFreeTextAP(&target, mutable_annot_dict, + BlendModeToPDFName(blend_mode))) { + return std::nullopt; + } + return GeneratedAP{std::move(target.normal_stream)}; + } + + if (!GenerateAnnotAPToTarget(&target, mutable_annot_dict, subtype, + blend_mode)) { + return std::nullopt; + } + + return GeneratedAP{std::move(target.normal_stream)}; +} + +// static +bool CPDF_GenerateAP::CanGenerateEphemeralAnnotAP(CPDF_Annot::Subtype subtype) { + return SupportsEphemeralAnnotAP(subtype); +} + // static bool CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( CPDF_Document* doc, @@ -3130,6 +3472,13 @@ bool CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( return false; } + RetainPtr dr_font_dict = + acroform_dict->GetOrCreateDictFor("DR")->GetOrCreateDictFor("Font"); + if (!GetFontFromDrFontDictOrGenerateFallback( + doc, dr_font_dict.Get(), maybe_font_name_and_size.value().name)) { + return false; + } + ByteString new_default_appearance_font_name_and_size = StringFromFontNameAndSize(maybe_font_name_and_size.value().name, maybe_font_name_and_size.value().size); @@ -3150,20 +3499,18 @@ bool CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( new_default_appearance_color.TrimBack('\n'); new_default_appearance_font_name_and_size.TrimBack('\n'); annot_dict->SetNewFor( - "DA", - new_default_appearance_color + " " + - new_default_appearance_font_name_and_size); + "DA", new_default_appearance_color + " " + + new_default_appearance_font_name_and_size); // TODO(thestig): Call GenerateAnnotAP(); return true; } -bool CPDF_GenerateAP::UpdateDefaultAppearance( - CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - CPDF_Annot::StandardFont font, - float font_size, - const CFX_Color& color) { +bool CPDF_GenerateAP::UpdateDefaultAppearance(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + CPDF_Annot::StandardFont font, + float font_size, + const CFX_Color& color) { ByteString resource_key; // When font is kUnknown, preserve the existing non-standard font resource @@ -3173,8 +3520,9 @@ bool CPDF_GenerateAP::UpdateDefaultAppearance( ByteString existing_da = annot_dict->GetByteStringFor("DA"); CPDF_DefaultAppearance current_da(existing_da); auto font_info = current_da.GetFont(); - if (!font_info.has_value() || font_info->name.IsEmpty()) + if (!font_info.has_value() || font_info->name.IsEmpty()) { return false; + } resource_key = font_info->name; } else { RetainPtr root_dict = doc->GetMutableRoot(); diff --git a/core/fpdfdoc/cpdf_generateap.h b/core/fpdfdoc/cpdf_generateap.h index 865315e04c..c0b4cc1f4c 100644 --- a/core/fpdfdoc/cpdf_generateap.h +++ b/core/fpdfdoc/cpdf_generateap.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFDOC_CPDF_GENERATEAP_H_ #define CORE_FPDFDOC_CPDF_GENERATEAP_H_ +#include + #include "core/fpdfdoc/cpdf_annot.h" class CPDF_Dictionary; @@ -39,6 +41,28 @@ class CPDF_GenerateAP { CPDF_Annot::Subtype subtype, BlendMode blend_mode); + struct GeneratedAP { + RetainPtr normal_stream; + }; + + static std::optional GenerateEphemeralAnnotAP( + CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + CPDF_Annot::Subtype subtype); + + static std::optional GenerateEphemeralAnnotAP( + CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + CPDF_Annot::Subtype subtype, + BlendMode blend_mode); + + static std::optional GenerateEphemeralFormAP( + CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + FormType type); + + static bool CanGenerateEphemeralAnnotAP(CPDF_Annot::Subtype subtype); + static bool GenerateDefaultAppearanceWithColor(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const CFX_Color& color); diff --git a/core/fpdfdoc/cpdf_generateap_unittest.cpp b/core/fpdfdoc/cpdf_generateap_unittest.cpp new file mode 100644 index 0000000000..635e1533c3 --- /dev/null +++ b/core/fpdfdoc/cpdf_generateap_unittest.cpp @@ -0,0 +1,276 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfdoc/cpdf_generateap.h" + +#include + +#include "constants/annotation_common.h" +#include "constants/font_encodings.h" +#include "constants/form_fields.h" +#include "core/fpdfapi/page/test_with_page_module.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/cpdf_test_document.h" +#include "core/fxge/cfx_color.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class CPDFGenerateAPTest : public TestWithPageModule {}; + +RetainPtr MakeNumberArray(const std::vector& values) { + auto array = pdfium::MakeRetain(); + for (float value : values) { + array->AppendNew(value); + } + return array; +} + +RetainPtr MakeAnnotDict(const ByteString& subtype, + const CFX_FloatRect& rect) { + auto annot_dict = pdfium::MakeRetain(); + annot_dict->SetNewFor(pdfium::annotation::kSubtype, subtype); + annot_dict->SetRectFor(pdfium::annotation::kRect, rect); + return annot_dict; +} + +RetainPtr AddAcroFormWithHelvetica(CPDF_TestDocument* doc) { + doc->CreateNewDoc(); + RetainPtr root = doc->GetMutableRoot(); + auto acroform = root->SetNewFor("AcroForm"); + acroform->SetNewFor("DA", "/Helv 12 Tf 0 g"); + + auto dr = acroform->SetNewFor("DR"); + auto fonts = dr->SetNewFor("Font"); + auto helv = doc->NewIndirect(); + helv->SetNewFor("Type", "Font"); + helv->SetNewFor("Subtype", "Type1"); + helv->SetNewFor("BaseFont", "Helvetica"); + helv->SetNewFor("Encoding", + pdfium::font_encodings::kWinAnsiEncoding); + fonts->SetNewFor("Helv", doc, helv->GetObjNum()); + return acroform; +} + +RetainPtr MakeSupportedAnnotDict(CPDF_Annot::Subtype subtype) { + switch (subtype) { + case CPDF_Annot::Subtype::CIRCLE: + return MakeAnnotDict("Circle", CFX_FloatRect(0, 0, 100, 100)); + case CPDF_Annot::Subtype::HIGHLIGHT: { + auto annot_dict = + MakeAnnotDict("Highlight", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", + MakeNumberArray({10, 20, 50, 20, 10, 10, 50, 10})); + return annot_dict; + } + case CPDF_Annot::Subtype::FREETEXT: { + auto annot_dict = MakeAnnotDict("FreeText", CFX_FloatRect(0, 0, 100, 40)); + annot_dict->SetNewFor("DA", "/Helv 12 Tf 0 g"); + annot_dict->SetNewFor(pdfium::annotation::kContents, + "hello"); + return annot_dict; + } + case CPDF_Annot::Subtype::INK: { + auto annot_dict = MakeAnnotDict("Ink", CFX_FloatRect(0, 0, 10, 10)); + auto ink_list = pdfium::MakeRetain(); + ink_list->Append(MakeNumberArray({1, 1, 9, 9})); + annot_dict->SetFor("InkList", std::move(ink_list)); + return annot_dict; + } + case CPDF_Annot::Subtype::LINE: { + auto annot_dict = MakeAnnotDict("Line", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("L", MakeNumberArray({10, 10, 90, 90})); + return annot_dict; + } + case CPDF_Annot::Subtype::POLYGON: { + auto annot_dict = MakeAnnotDict("Polygon", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor(pdfium::annotation::kVertices, + MakeNumberArray({10, 10, 90, 10, 90, 90})); + return annot_dict; + } + case CPDF_Annot::Subtype::POLYLINE: { + auto annot_dict = + MakeAnnotDict("PolyLine", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor(pdfium::annotation::kVertices, + MakeNumberArray({10, 10, 50, 90, 90, 10})); + return annot_dict; + } + case CPDF_Annot::Subtype::SQUARE: + return MakeAnnotDict("Square", CFX_FloatRect(0, 0, 100, 100)); + case CPDF_Annot::Subtype::SQUIGGLY: { + auto annot_dict = + MakeAnnotDict("Squiggly", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", + MakeNumberArray({10, 20, 50, 20, 10, 10, 50, 10})); + return annot_dict; + } + case CPDF_Annot::Subtype::STRIKEOUT: { + auto annot_dict = + MakeAnnotDict("StrikeOut", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", + MakeNumberArray({10, 20, 50, 20, 10, 10, 50, 10})); + return annot_dict; + } + case CPDF_Annot::Subtype::UNDERLINE: { + auto annot_dict = + MakeAnnotDict("Underline", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", + MakeNumberArray({10, 20, 50, 20, 10, 10, 50, 10})); + return annot_dict; + } + case CPDF_Annot::Subtype::WIDGET: { + auto annot_dict = MakeAnnotDict("Widget", CFX_FloatRect(0, 0, 100, 40)); + annot_dict->SetNewFor(pdfium::form_fields::kFT, + pdfium::form_fields::kTx); + annot_dict->SetNewFor("DA", "/Helv 12 Tf 0 g"); + annot_dict->SetNewFor("V", "hello"); + return annot_dict; + } + default: + return nullptr; + } +} + +} // namespace + +TEST_F(CPDFGenerateAPTest, + GenerateEphemeralSupportedAnnotAPDoesNotPersistGraphState) { + static constexpr CPDF_Annot::Subtype kSupportedSubtypes[] = { + CPDF_Annot::Subtype::CIRCLE, CPDF_Annot::Subtype::FREETEXT, + CPDF_Annot::Subtype::HIGHLIGHT, CPDF_Annot::Subtype::INK, + CPDF_Annot::Subtype::LINE, CPDF_Annot::Subtype::POLYGON, + CPDF_Annot::Subtype::POLYLINE, CPDF_Annot::Subtype::SQUARE, + CPDF_Annot::Subtype::SQUIGGLY, CPDF_Annot::Subtype::STRIKEOUT, + CPDF_Annot::Subtype::UNDERLINE, CPDF_Annot::Subtype::WIDGET}; + + for (CPDF_Annot::Subtype subtype : kSupportedSubtypes) { + CPDF_TestDocument doc; + if (subtype == CPDF_Annot::Subtype::FREETEXT || + subtype == CPDF_Annot::Subtype::WIDGET) { + AddAcroFormWithHelvetica(&doc); + } + RetainPtr annot_dict = MakeSupportedAnnotDict(subtype); + ASSERT_TRUE(annot_dict); + + const uint32_t last_obj_num = doc.GetLastObjNum(); + std::optional generated = + CPDF_GenerateAP::GenerateEphemeralAnnotAP(&doc, annot_dict.Get(), + subtype); + + ASSERT_TRUE(generated.has_value()); + ASSERT_TRUE(generated->normal_stream); + EXPECT_EQ(0u, generated->normal_stream->GetObjNum()); + EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); + } +} + +TEST_F(CPDFGenerateAPTest, GenerateEphemeralFreeTextAPDoesNotCreateAcroForm) { + CPDF_TestDocument doc; + doc.CreateNewDoc(); + auto annot_dict = MakeSupportedAnnotDict(CPDF_Annot::Subtype::FREETEXT); + + const uint32_t last_obj_num = doc.GetLastObjNum(); + std::optional generated = + CPDF_GenerateAP::GenerateEphemeralAnnotAP(&doc, annot_dict.Get(), + CPDF_Annot::Subtype::FREETEXT); + + ASSERT_TRUE(generated.has_value()); + ASSERT_TRUE(generated->normal_stream); + EXPECT_EQ(0u, generated->normal_stream->GetObjNum()); + EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); + EXPECT_FALSE(doc.GetRoot()->KeyExist("AcroForm")); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); +} + +TEST_F(CPDFGenerateAPTest, + GeneratePersistentFreeTextAPAfterDefaultAppearanceColorUpdate) { + CPDF_TestDocument doc; + doc.CreateNewDoc(); + auto annot_dict = MakeAnnotDict("FreeText", CFX_FloatRect(100, 50, 150, 75)); + annot_dict->SetNewFor(pdfium::annotation::kContents, "Hello!"); + + ASSERT_TRUE(CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( + &doc, annot_dict.Get(), CFX_Color(60, 120, 180))); + ASSERT_TRUE(CPDF_GenerateAP::GenerateAnnotAP( + &doc, annot_dict.Get(), CPDF_Annot::Subtype::FREETEXT)); + + RetainPtr ap_dict = + annot_dict->GetDictFor(pdfium::annotation::kAP); + ASSERT_TRUE(ap_dict); + RetainPtr normal_stream = ap_dict->GetStreamFor("N"); + ASSERT_TRUE(normal_stream); + EXPECT_NE(0u, normal_stream->GetObjNum()); +} + +TEST_F(CPDFGenerateAPTest, + DefaultAppearanceColorUpdateEnsuresPersistentFontResource) { + CPDF_TestDocument doc; + doc.CreateNewDoc(); + RetainPtr acroform = + doc.GetMutableRoot()->SetNewFor("AcroForm"); + acroform->SetNewFor("DA", "/Helv 12 Tf 0 g"); + + auto annot_dict = MakeAnnotDict("FreeText", CFX_FloatRect(100, 50, 150, 75)); + + ASSERT_TRUE(CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( + &doc, annot_dict.Get(), CFX_Color(60, 120, 180))); + + RetainPtr font_dict = + acroform->GetDictFor("DR")->GetDictFor("Font"); + ASSERT_TRUE(font_dict); + EXPECT_TRUE(font_dict->KeyExist("Helv")); +} + +TEST_F(CPDFGenerateAPTest, GenerateEphemeralAnnotAPDoesNotPersistHighlightAP) { + CPDF_TestDocument doc; + auto annot_dict = MakeAnnotDict("Highlight", CFX_FloatRect(0, 0, 100, 100)); + annot_dict->SetFor("QuadPoints", + MakeNumberArray({10, 20, 50, 20, 10, 10, 50, 10})); + + const uint32_t last_obj_num = doc.GetLastObjNum(); + std::optional generated = + CPDF_GenerateAP::GenerateEphemeralAnnotAP(&doc, annot_dict.Get(), + CPDF_Annot::Subtype::HIGHLIGHT); + + ASSERT_TRUE(generated.has_value()); + ASSERT_TRUE(generated->normal_stream); + EXPECT_EQ(0u, generated->normal_stream->GetObjNum()); + EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); +} + +TEST_F(CPDFGenerateAPTest, GenerateEphemeralInkAPDoesNotInflateAnnotRect) { + CPDF_TestDocument doc; + auto annot_dict = MakeAnnotDict("Ink", CFX_FloatRect(0, 0, 10, 10)); + + auto border_style = annot_dict->SetNewFor("BS"); + border_style->SetNewFor("W", 4); + + auto ink_list = pdfium::MakeRetain(); + ink_list->Append(MakeNumberArray({1, 1, 9, 9})); + annot_dict->SetFor("InkList", std::move(ink_list)); + + const CFX_FloatRect original_rect = + annot_dict->GetRectFor(pdfium::annotation::kRect); + const uint32_t last_obj_num = doc.GetLastObjNum(); + std::optional generated = + CPDF_GenerateAP::GenerateEphemeralAnnotAP(&doc, annot_dict.Get(), + CPDF_Annot::Subtype::INK); + + ASSERT_TRUE(generated.has_value()); + ASSERT_TRUE(generated->normal_stream); + EXPECT_EQ(0u, generated->normal_stream->GetObjNum()); + EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); + EXPECT_EQ(original_rect, annot_dict->GetRectFor(pdfium::annotation::kRect)); + EXPECT_EQ(CFX_FloatRect(-2, -2, 12, 12), + generated->normal_stream->GetDict()->GetRectFor("BBox")); + EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); +} diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index 339201caec..c4e8bc395e 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp @@ -107,9 +107,6 @@ std::unique_ptr CPDFSDK_PageView::NewAnnot(CPDF_Annot* annot) { auto ret = std::make_unique(annot, this, form); form->AddMap(form_control, ret.get()); - if (pdf_form->NeedConstructAP()) { - ret->ResetAppearance(std::nullopt, CPDFSDK_Widget::kValueUnchanged); - } return ret; } diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 3d262c6a3b..b893959c5b 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -851,7 +851,13 @@ std::optional GetFreetextFontColor( RetainPtr acroform_dict = root_dict ? root_dict->GetDictFor("AcroForm") : nullptr; CPDF_DefaultAppearance default_appearance(annot_dict, acroform_dict); - return default_appearance.GetColorARGB(); + std::optional color = + default_appearance.GetColorARGB(); + if (color.has_value()) { + return color; + } + return CFX_Color::TypeAndARGB(CFX_Color::Type::kGray, + ArgbEncode(255, 0, 0, 0)); } std::optional GetWidgetFontColor(FPDF_FORMHANDLE handle, @@ -2202,19 +2208,15 @@ FPDFAnnot_SetFontColor(FPDF_FORMHANDLE handle, return false; } - bool generated = CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( - form->GetInteractiveForm()->document(), annot_dict, CFX_Color(R, G, B)); - if (!generated) { + CPDF_Document* doc = form->GetInteractiveForm()->document(); + bool updated = CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( + doc, annot_dict, CFX_Color(R, G, B)); + if (!updated) { return false; } - // Remove the appearance stream. Otherwise PDF viewers will render that and - // not use the new color. - // - // TODO(thestig) When GenerateDefaultAppearanceWithColor() properly updates - // the annotation's appearance stream, remove this. - annot_dict->RemoveFor(pdfium::annotation::kAP); - return true; + return CPDF_GenerateAP::GenerateAnnotAP(doc, annot_dict.Get(), + CPDF_Annot::Subtype::FREETEXT); } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV From 71516c3898e1c72887f833b08e2143d70f250d0e Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 00:06:44 +0300 Subject: [PATCH 03/56] CPDF_AnnotList preserves direct annotations --- core/fpdfdoc/cpdf_annotlist.cpp | 15 ++++++++------ core/fpdfdoc/cpdf_annotlist_unittest.cpp | 25 ++++++++++++++++++++++++ fpdfsdk/fpdf_annot_embeddertest.cpp | 20 +++++++++++++++++++ 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp index 32e7b6aa77..8b53e30398 100644 --- a/core/fpdfdoc/cpdf_annotlist.cpp +++ b/core/fpdfdoc/cpdf_annotlist.cpp @@ -125,25 +125,28 @@ std::unique_ptr CreatePopupAnnot(CPDF_Document* document, CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) : page_(pPage), document_(page_->GetDocument()) { - RetainPtr pAnnots = page_->GetMutableAnnotsArray(); + RetainPtr pAnnots = page_->GetAnnotsArray(); if (!pAnnots) { return; } for (size_t i = 0; i < pAnnots->size(); ++i) { - RetainPtr dict = - ToDictionary(pAnnots->GetMutableDirectObjectAt(i)); - if (!dict) { + RetainPtr const_dict = pAnnots->GetDictAt(i); + if (!const_dict) { continue; } const ByteString subtype = - dict->GetByteStringFor(pdfium::annotation::kSubtype); + const_dict->GetByteStringFor(pdfium::annotation::kSubtype); if (subtype == "Popup") { // Skip creating Popup annotations in the PDF document since PDFium // provides its own Popup annotations. continue; } - pAnnots->ConvertToIndirectObjectAt(i, document_); + // CPDF_Annot still owns a mutable dictionary handle because explicit edit + // APIs mutate annotation dictionaries. Listing/rendering must not promote + // direct annotations to indirect objects. + RetainPtr dict = + pdfium::WrapRetain(const_cast(const_dict.Get())); annot_list_.push_back(std::make_unique(dict, document_)); } diff --git a/core/fpdfdoc/cpdf_annotlist_unittest.cpp b/core/fpdfdoc/cpdf_annotlist_unittest.cpp index a59f9595d1..2f93c93dc9 100644 --- a/core/fpdfdoc/cpdf_annotlist_unittest.cpp +++ b/core/fpdfdoc/cpdf_annotlist_unittest.cpp @@ -52,6 +52,13 @@ class CPDFAnnotListTest : public TestWithPageModule { annotation->SetNewFor(pdfium::annotation::kContents, contents); } + RetainPtr AddDirectAnnotation(const ByteString& subtype) { + RetainPtr annotation = + page_->GetOrCreateAnnotsArray()->AppendNew(); + annotation->SetNewFor(pdfium::annotation::kSubtype, subtype); + return annotation; + } + std::unique_ptr document_; RetainPtr page_; }; @@ -124,3 +131,21 @@ TEST_F(CPDFAnnotListTest, CreatePopupAnnotFromEmptyUnicodedWithEscape) { EXPECT_EQ(1u, list.Count()); } + +TEST_F(CPDFAnnotListTest, ConstructionPreservesDirectAnnotations) { + RetainPtr annotation = AddDirectAnnotation("FreeText"); + RetainPtr annots = page_->GetAnnotsArray(); + ASSERT_TRUE(annots); + ASSERT_EQ(1u, annots->size()); + ASSERT_EQ(annotation.Get(), annots->GetObjectAt(0).Get()); + ASSERT_EQ(0u, annotation->GetObjNum()); + const uint32_t last_obj_num = document_->GetLastObjNum(); + + CPDF_AnnotList list(page_); + + ASSERT_EQ(1u, list.Count()); + EXPECT_EQ(annotation.Get(), list.GetAt(0)->GetAnnotDict()); + EXPECT_EQ(0u, annotation->GetObjNum()); + EXPECT_EQ(annotation.Get(), annots->GetObjectAt(0).Get()); + EXPECT_EQ(last_obj_num, document_->GetLastObjNum()); +} diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index d23c3e35f5..7cfdd97b14 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -2548,6 +2548,26 @@ TEST_F(FPDFAnnotEmbedderTest, GetFontSizeNegative) { } } +TEST_F(FPDFAnnotEmbedderTest, DirectAnnotationObjectNumberStaysZeroAfterRender) { + ASSERT_TRUE(OpenDocument("freetext_annotation_without_da.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + EXPECT_EQ(0u, EPDFAnnot_GetObjectNumber(annot.get())); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 0)); + + ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT); + ASSERT_TRUE(bitmap); + EXPECT_EQ(0u, EPDFAnnot_GetObjectNumber(annot.get())); + + ASSERT_TRUE(EPDFAnnot_SetColor(annot.get(), FPDFANNOT_COLORTYPE_Color, 10, + 20, 30)); + EXPECT_EQ(0u, EPDFAnnot_GetObjectNumber(annot.get())); +} + TEST_F(FPDFAnnotEmbedderTest, SetFontColor) { ASSERT_TRUE(OpenDocument("freetext_annotation_without_da.pdf")); ScopedPage page = LoadScopedPage(0); From 2dd7caa5505922b93a88ce18a8173f01097bc20b Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 00:30:19 +0300 Subject: [PATCH 04/56] CPDF_InteractiveForm const walk + explicit normalize --- core/fpdfdoc/cpdf_formcontrol.cpp | 29 ++-- core/fpdfdoc/cpdf_formfield.cpp | 14 +- core/fpdfdoc/cpdf_interactiveform.cpp | 137 ++++++++---------- core/fpdfdoc/cpdf_interactiveform.h | 4 +- .../fpdfdoc/cpdf_interactiveform_unittest.cpp | 61 ++++++-- 5 files changed, 142 insertions(+), 103 deletions(-) diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp index 814a1fa97f..2a5187a527 100644 --- a/core/fpdfdoc/cpdf_formcontrol.cpp +++ b/core/fpdfdoc/cpdf_formcontrol.cpp @@ -222,16 +222,16 @@ RetainPtr CPDF_FormControl::GetDefaultControlFont() const { } const ByteString& font_name = maybe_font_name_and_size.value().name; - RetainPtr pDRDict = ToDictionary( - CPDF_FormField::GetMutableFieldAttrForDict(widget_dict_.Get(), "DR")); + RetainPtr pDRDict = ToDictionary( + CPDF_FormField::GetFieldAttrForDict(widget_dict_.Get(), "DR")); if (pDRDict) { - RetainPtr fonts = pDRDict->GetMutableDictFor("Font"); + RetainPtr fonts = pDRDict->GetDictFor("Font"); if (ValidateFontResourceDict(fonts.Get())) { - RetainPtr pElement = - fonts->GetMutableDictFor(font_name.AsStringView()); + RetainPtr pElement = + fonts->GetDictFor(font_name.AsStringView()); if (pElement) { - RetainPtr font = - form_->GetFontForElement(std::move(pElement)); + RetainPtr font = form_->GetFontForElement( + pdfium::WrapRetain(const_cast(pElement.Get()))); if (font) { return font; } @@ -243,25 +243,26 @@ RetainPtr CPDF_FormControl::GetDefaultControlFont() const { return pFormFont; } - RetainPtr pPageDict = widget_dict_->GetMutableDictFor("P"); - RetainPtr dict = ToDictionary( - CPDF_FormField::GetMutableFieldAttrForDict(pPageDict.Get(), "Resources")); + RetainPtr pPageDict = widget_dict_->GetDictFor("P"); + RetainPtr dict = ToDictionary( + CPDF_FormField::GetFieldAttrForDict(pPageDict.Get(), "Resources")); if (!dict) { return nullptr; } - RetainPtr fonts = dict->GetMutableDictFor("Font"); + RetainPtr fonts = dict->GetDictFor("Font"); if (!ValidateFontResourceDict(fonts.Get())) { return nullptr; } - RetainPtr pElement = - fonts->GetMutableDictFor(font_name.AsStringView()); + RetainPtr pElement = + fonts->GetDictFor(font_name.AsStringView()); if (!pElement) { return nullptr; } - return form_->GetFontForElement(std::move(pElement)); + return form_->GetFontForElement( + pdfium::WrapRetain(const_cast(pElement.Get()))); } int CPDF_FormControl::GetControlAlignment() const { diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp index 00a54f39c9..220941d37b 100644 --- a/core/fpdfdoc/cpdf_formfield.cpp +++ b/core/fpdfdoc/cpdf_formfield.cpp @@ -19,6 +19,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" @@ -62,6 +63,17 @@ bool IsComboOrListField(CPDF_FormField::Type type) { } } +WideString GetFieldNameComponent(const CPDF_Dictionary* dict) { + RetainPtr t_obj = + dict->GetObjectFor(pdfium::form_fields::kT); + if (ToReference(t_obj)) { + RetainPtr direct_obj = t_obj->GetDirect(); + return direct_obj && direct_obj->IsString() ? direct_obj->GetUnicodeText() + : WideString(); + } + return dict->GetUnicodeTextFor(pdfium::form_fields::kT); +} + } // namespace // static @@ -96,7 +108,7 @@ WideString CPDF_FormField::GetFullNameForDict( const CPDF_Dictionary* pLevel = pFieldDict; while (pLevel) { visited.insert(pLevel); - WideString short_name = pLevel->GetUnicodeTextFor(pdfium::form_fields::kT); + WideString short_name = GetFieldNameComponent(pLevel); if (!short_name.IsEmpty()) { if (full_name.IsEmpty()) { full_name = std::move(short_name); diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp index 24bf93ad41..4f85fde2db 100644 --- a/core/fpdfdoc/cpdf_interactiveform.cpp +++ b/core/fpdfdoc/cpdf_interactiveform.cpp @@ -249,14 +249,15 @@ bool FindFontFromDoc(const CPDF_Dictionary* form_dict, CPDF_DictionaryLocker locker(font_dict); for (const auto& it : locker) { const ByteString& key = it.first; - RetainPtr element = - ToDictionary(it.second->GetMutableDirect()); + RetainPtr element = + ToDictionary(it.second->GetDirect()); if (!ValidateDictType(element.Get(), "Font")) { continue; } auto* pData = CPDF_DocPageData::FromDocument(document); - font = pData->GetFont(std::move(element)); + font = pData->GetFont( + pdfium::WrapRetain(const_cast(element.Get()))); if (!font) { continue; } @@ -349,14 +350,15 @@ RetainPtr GetNativeFont(const CPDF_Dictionary* form_dict, CPDF_DictionaryLocker locker(font_dict); for (const auto& it : locker) { const ByteString& key = it.first; - RetainPtr element = - ToDictionary(it.second->GetMutableDirect()); + RetainPtr element = + ToDictionary(it.second->GetDirect()); if (!ValidateDictType(element.Get(), "Font")) { continue; } auto* pData = CPDF_DocPageData::FromDocument(document); - RetainPtr pFind = pData->GetFont(std::move(element)); + RetainPtr pFind = pData->GetFont( + pdfium::WrapRetain(const_cast(element.Get()))); if (!pFind) { continue; } @@ -588,23 +590,25 @@ CFieldTree::Node* CFieldTree::FindNode(const WideString& full_name) { CPDF_InteractiveForm::CPDF_InteractiveForm(CPDF_Document* document) : document_(document), field_tree_(std::make_unique()) { - RetainPtr pRoot = document_->GetMutableRoot(); + const CPDF_Dictionary* pRoot = document_->GetRoot(); if (!pRoot) { return; } - form_dict_ = pRoot->GetMutableDictFor("AcroForm"); - if (!form_dict_) { + RetainPtr form_dict = pRoot->GetDictFor("AcroForm"); + if (!form_dict) { return; } + form_dict_ = + pdfium::WrapRetain(const_cast(form_dict.Get())); - RetainPtr fields = form_dict_->GetMutableArrayFor("Fields"); + RetainPtr fields = form_dict->GetArrayFor("Fields"); if (!fields) { return; } for (size_t i = 0; i < fields->size(); ++i) { - LoadField(fields->GetMutableDictAt(i), 0); + LoadField(fields->GetDictAt(i), 0); } } @@ -789,23 +793,24 @@ RetainPtr CPDF_InteractiveForm::GetFormFont( return nullptr; } - RetainPtr pDR = form_dict_->GetMutableDictFor("DR"); + RetainPtr pDR = form_dict_->GetDictFor("DR"); if (!pDR) { return nullptr; } - RetainPtr font_dict = pDR->GetMutableDictFor("Font"); + RetainPtr font_dict = pDR->GetDictFor("Font"); if (!ValidateFontResourceDict(font_dict.Get())) { return nullptr; } - RetainPtr element = - font_dict->GetMutableDictFor(alias.AsStringView()); + RetainPtr element = + font_dict->GetDictFor(alias.AsStringView()); if (!ValidateDictType(element.Get(), "Font")) { return nullptr; } - return GetFontForElement(std::move(element)); + return GetFontForElement( + pdfium::WrapRetain(const_cast(element.Get()))); } RetainPtr CPDF_InteractiveForm::GetFontForElement( @@ -851,8 +856,9 @@ CPDF_InteractiveForm::GetControlsForField(const CPDF_FormField* field) { return control_lists_[pdfium::WrapUnowned(field)]; } -void CPDF_InteractiveForm::LoadField(RetainPtr field_dict, - int nLevel) { +void CPDF_InteractiveForm::LoadField( + RetainPtr field_dict, + int nLevel) { if (nLevel > kMaxRecursion) { return; } @@ -861,8 +867,8 @@ void CPDF_InteractiveForm::LoadField(RetainPtr field_dict, } uint32_t dwParentObjNum = field_dict->GetObjNum(); - RetainPtr kids = - field_dict->GetMutableArrayFor(pdfium::form_fields::kKids); + RetainPtr kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); if (!kids) { AddTerminalField(std::move(field_dict)); return; @@ -879,21 +885,22 @@ void CPDF_InteractiveForm::LoadField(RetainPtr field_dict, return; } for (size_t i = 0; i < kids->size(); i++) { - RetainPtr pChildDict = kids->GetMutableDictAt(i); - if (pChildDict && pChildDict->GetObjNum() != dwParentObjNum) { + RetainPtr pChildDict = kids->GetDictAt(i); + if (pChildDict && pChildDict.Get() != field_dict.Get() && + (dwParentObjNum == 0 || pChildDict->GetObjNum() != dwParentObjNum)) { LoadField(std::move(pChildDict), nLevel + 1); } } } void CPDF_InteractiveForm::FixPageFields(CPDF_Page* page) { - RetainPtr annots = page->GetMutableAnnotsArray(); + RetainPtr annots = page->GetAnnotsArray(); if (!annots) { return; } for (size_t i = 0; i < annots->size(); i++) { - RetainPtr annot = annots->GetMutableDictAt(i); + RetainPtr annot = annots->GetDictAt(i); if (annot && annot->GetNameFor("Subtype") == "Widget") { LoadField(std::move(annot), 0); } @@ -901,81 +908,59 @@ void CPDF_InteractiveForm::FixPageFields(CPDF_Page* page) { } void CPDF_InteractiveForm::AddTerminalField( - RetainPtr field_dict) { - if (!field_dict->KeyExist(pdfium::form_fields::kFT)) { - // Key "FT" is required for terminal fields, it is also inheritable. - RetainPtr pParentDict = - field_dict->GetDictFor(pdfium::form_fields::kParent); - if (!pParentDict || !pParentDict->KeyExist(pdfium::form_fields::kFT)) { + RetainPtr field_dict) { + RetainPtr field_storage_dict = field_dict; + if (!CPDF_FormField::GetFieldAttrForDict(field_storage_dict.Get(), + pdfium::form_fields::kFT)) { + RetainPtr kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); + field_storage_dict.Reset(); + if (kids) { + for (size_t i = 0; i < kids->size(); ++i) { + RetainPtr kid = kids->GetDictAt(i); + if (CPDF_FormField::GetFieldAttrForDict(kid.Get(), + pdfium::form_fields::kFT)) { + field_storage_dict = std::move(kid); + break; + } + } + } + if (!field_storage_dict) { return; } } - WideString field_name = CPDF_FormField::GetFullNameForDict(field_dict.Get()); + WideString field_name = + CPDF_FormField::GetFullNameForDict(field_storage_dict.Get()); if (field_name.IsEmpty()) { return; } CPDF_FormField* field = field_tree_->GetField(field_name); if (!field) { - RetainPtr pParent(field_dict); - if (!field_dict->KeyExist(pdfium::form_fields::kT) && - field_dict->GetNameFor("Subtype") == "Widget") { - pParent = field_dict->GetMutableDictFor(pdfium::form_fields::kParent); - if (!pParent) { - pParent = field_dict; - } - } - - if (pParent && pParent != field_dict && - !pParent->KeyExist(pdfium::form_fields::kFT)) { - if (field_dict->KeyExist(pdfium::form_fields::kFT)) { - RetainPtr pFTValue = - field_dict->GetDirectObjectFor(pdfium::form_fields::kFT); - if (pFTValue) { - pParent->SetFor(pdfium::form_fields::kFT, pFTValue->Clone()); - } - } - - if (field_dict->KeyExist(pdfium::form_fields::kFf)) { - RetainPtr pFfValue = - field_dict->GetDirectObjectFor(pdfium::form_fields::kFf); - if (pFfValue) { - pParent->SetFor(pdfium::form_fields::kFf, pFfValue->Clone()); - } - } - } - - auto new_field = std::make_unique(this, std::move(pParent)); + auto new_field = std::make_unique( + this, pdfium::WrapRetain( + const_cast(field_storage_dict.Get()))); field = new_field.get(); - RetainPtr t_obj = - field_dict->GetObjectFor(pdfium::form_fields::kT); - if (ToReference(t_obj)) { - RetainPtr t_obj_clone = t_obj->CloneDirectObject(); - if (t_obj_clone && t_obj_clone->IsString()) { - field_dict->SetFor(pdfium::form_fields::kT, std::move(t_obj_clone)); - } else { - field_dict->SetNewFor(pdfium::form_fields::kT, - ByteString()); - } - } if (!field_tree_->SetField(field_name, std::move(new_field))) { return; } } - RetainPtr kids = - field_dict->GetMutableArrayFor(pdfium::form_fields::kKids); + RetainPtr kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); if (!kids) { if (field_dict->GetNameFor("Subtype") == "Widget") { - AddControl(field, std::move(field_dict)); + AddControl(field, pdfium::WrapRetain( + const_cast(field_dict.Get()))); } return; } for (size_t i = 0; i < kids->size(); i++) { - RetainPtr kid = kids->GetMutableDictAt(i); + RetainPtr kid = kids->GetDictAt(i); if (kid && kid->GetNameFor("Subtype") == "Widget") { - AddControl(field, std::move(kid)); + AddControl(field, + pdfium::WrapRetain(const_cast(kid.Get()))); } } } diff --git a/core/fpdfdoc/cpdf_interactiveform.h b/core/fpdfdoc/cpdf_interactiveform.h index 33c09170e7..3de7645fd2 100644 --- a/core/fpdfdoc/cpdf_interactiveform.h +++ b/core/fpdfdoc/cpdf_interactiveform.h @@ -108,8 +108,8 @@ class CPDF_InteractiveForm { CPDF_Document* document() { return document_; } private: - void LoadField(RetainPtr field_dict, int nLevel); - void AddTerminalField(RetainPtr field_dict); + void LoadField(RetainPtr field_dict, int nLevel); + void AddTerminalField(RetainPtr field_dict); CPDF_FormControl* AddControl(CPDF_FormField* field, RetainPtr widget_dict); diff --git a/core/fpdfdoc/cpdf_interactiveform_unittest.cpp b/core/fpdfdoc/cpdf_interactiveform_unittest.cpp index 9866687384..9c6a3d97c6 100644 --- a/core/fpdfdoc/cpdf_interactiveform_unittest.cpp +++ b/core/fpdfdoc/cpdf_interactiveform_unittest.cpp @@ -10,6 +10,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" @@ -57,18 +58,58 @@ TEST_F(CPDFInteractiveFormTest, LoadFieldsWithReferencedNames) { bad_stream_field_dict->SetNewFor("T", doc.get(), bad_stream->GetObjNum()); - // Let `interactive_form` parse the dictionaries above and fix them up. + const uint32_t last_obj_num = doc->GetLastObjNum(); + + // Let `interactive_form` parse the dictionaries above. CPDF_InteractiveForm interactive_form(doc.get()); - auto good_string_field_t = good_string_field_dict->GetStringFor("T"); - ASSERT_TRUE(good_string_field_t); - EXPECT_EQ("good_string", good_string_field_t->GetString()); + EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); + EXPECT_TRUE(ToReference(good_string_field_dict->GetObjectFor("T"))); + EXPECT_TRUE(ToReference(bad_name_field_dict->GetObjectFor("T"))); + EXPECT_TRUE(ToReference(bad_stream_field_dict->GetObjectFor("T"))); + + EXPECT_EQ(1u, + interactive_form.CountFields(WideString::FromASCII("good_string"))); + EXPECT_EQ(0u, + interactive_form.CountFields(WideString::FromASCII("bad_name"))); + EXPECT_EQ(1u, interactive_form.CountFields(WideString())); +} + +TEST_F(CPDFInteractiveFormTest, LoadFieldDoesNotCopyInheritedTypeToParent) { + auto doc = std::make_unique(); + doc->CreateNewDoc(); + RetainPtr root = doc->GetMutableRoot(); + ASSERT_TRUE(root); - auto bad_name_field_t = bad_name_field_dict->GetStringFor("T"); - ASSERT_TRUE(bad_name_field_t); - EXPECT_TRUE(bad_name_field_t->GetString().IsEmpty()); + auto acroform_dict = root->SetNewFor("AcroForm"); + auto fields_array = acroform_dict->SetNewFor("Fields"); + + auto parent_dict = doc->NewIndirect(); + parent_dict->SetNewFor("T", "Parent"); + fields_array->AppendNew(doc.get(), parent_dict->GetObjNum()); + + auto kids = parent_dict->SetNewFor("Kids"); + auto widget_dict = kids->AppendNew(); + widget_dict->SetNewFor("Type", "Annot"); + widget_dict->SetNewFor("Subtype", "Widget"); + widget_dict->SetNewFor("FT", "Tx"); + widget_dict->SetNewFor("Ff", 123); + widget_dict->SetNewFor("Parent", doc.get(), + parent_dict->GetObjNum()); + + ASSERT_FALSE(parent_dict->KeyExist("FT")); + ASSERT_FALSE(parent_dict->KeyExist("Ff")); + const uint32_t last_obj_num = doc->GetLastObjNum(); + + CPDF_InteractiveForm interactive_form(doc.get()); - auto bad_stream_field_t = bad_stream_field_dict->GetStringFor("T"); - ASSERT_TRUE(bad_stream_field_t); - EXPECT_TRUE(bad_stream_field_t->GetString().IsEmpty()); + EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); + EXPECT_FALSE(parent_dict->KeyExist("FT")); + EXPECT_FALSE(parent_dict->KeyExist("Ff")); + EXPECT_EQ(1u, interactive_form.CountFields(WideString::FromASCII("Parent"))); + CPDF_FormField* field = + interactive_form.GetField(0, WideString::FromASCII("Parent")); + ASSERT_TRUE(field); + EXPECT_EQ(FormFieldType::kTextField, field->GetFieldType()); + EXPECT_EQ(1, field->CountControls()); } From b50c87f6a168fd98e64f7d3178c391820abc2ad7 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 00:41:36 +0300 Subject: [PATCH 05/56] CPDF_Image and CPDF_DocPageData cache hardening --- core/fpdfapi/page/cpdf_docpagedata.cpp | 3 + core/fpdfapi/page/cpdf_image.cpp | 138 +++++++++++------- core/fpdfapi/page/cpdf_image.h | 9 +- .../page/cpdf_pageimagecache_unittest.cpp | 122 ++++++++++++++++ core/fpdfapi/parser/cpdf_document.cpp | 4 + core/fpdfapi/parser/cpdf_document.h | 4 + 6 files changed, 222 insertions(+), 58 deletions(-) diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index 2c3f841df9..902d253bd2 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -427,6 +427,9 @@ RetainPtr CPDF_DocPageData::GetImage(uint32_t dwStreamObjNum) { DCHECK(dwStreamObjNum); auto it = image_map_.find(dwStreamObjNum); if (it != image_map_.end()) { + if (GetDocument()->IsObjectPromoted(dwStreamObjNum)) { + it->second->RebindStreamIfPromoted(); + } return it->second; } diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp index 6cb86bbe65..384cb91b31 100644 --- a/core/fpdfapi/page/cpdf_image.cpp +++ b/core/fpdfapi/page/cpdf_image.cpp @@ -42,67 +42,74 @@ namespace { - // Internal helper that overwrites an existing stream's dict + bytes - // and purges any cached image. - bool OverwriteStreamData(CPDF_Stream* s, - CPDF_Document* doc, - DataVector new_data, - RetainPtr new_dict, - bool data_is_decoded) { - if (!s || !new_dict) - return false; - - // Replace dictionary entries (no streams allowed as values). - RetainPtr old = s->GetMutableDict(); - if (!old) - return false; - - // Clear existing keys. - for (const ByteString& k : old->GetKeys()) - old->RemoveFor(k.AsStringView()); - - // Deep-copy all entries from new_dict into old. - CPDF_DictionaryLocker lock(new_dict); - for (auto it = lock.begin(); it != lock.end(); ++it) - old->SetFor(it->first, it->second->Clone()); - - // Swap in the bytes. - if (data_is_decoded) { - // Decoded pixels: also removes Filter/DecodeParms from the stream dict. - s->SetDataAndRemoveFilter(pdfium::span(new_data)); - } else { - // Already filtered (e.g., JPEG with /Filter /DCTDecode). - s->TakeData(std::move(new_data)); - } - - if (doc) - doc->MaybePurgeImage(s->GetObjNum()); - - return true; +// Internal helper that overwrites an existing stream's dict + bytes +// and purges any cached image. +bool OverwriteStreamData(CPDF_Stream* s, + CPDF_Document* doc, + DataVector new_data, + RetainPtr new_dict, + bool data_is_decoded) { + if (!s || !new_dict) { + return false; + } + + // Replace dictionary entries (no streams allowed as values). + RetainPtr old = s->GetMutableDict(); + if (!old) { + return false; + } + + // Clear existing keys. + for (const ByteString& k : old->GetKeys()) { + old->RemoveFor(k.AsStringView()); } - + + // Deep-copy all entries from new_dict into old. + CPDF_DictionaryLocker lock(new_dict); + for (auto it = lock.begin(); it != lock.end(); ++it) { + old->SetFor(it->first, it->second->Clone()); + } + + // Swap in the bytes. + if (data_is_decoded) { + // Decoded pixels: also removes Filter/DecodeParms from the stream dict. + s->SetDataAndRemoveFilter(pdfium::span(new_data)); + } else { + // Already filtered (e.g., JPEG with /Filter /DCTDecode). + s->TakeData(std::move(new_data)); + } + + if (doc) { + doc->MaybePurgeImage(s->GetObjNum()); + } + + return true; +} + } // namespace bool CPDF_Image::OverwriteStreamInPlace(DataVector new_data, RetainPtr new_dict, bool data_is_decoded) { // Ensure we can mutate the underlying stream. - if (stream_->IsInline()) + if (stream_->IsInline()) { ConvertStreamToIndirectObject(); + } RetainPtr s_const = GetStream(); - if (!s_const) + if (!s_const) { return false; + } // Get a mutable stream by objnum. RetainPtr s = ToStream(document_->GetMutableIndirectObject(s_const->GetObjNum())); - if (!s) + if (!s) { return false; + } - const bool ok = - OverwriteStreamData(s.Get(), document_, std::move(new_data), - std::move(new_dict), data_is_decoded); + const bool ok = OverwriteStreamData(s.Get(), document_, std::move(new_data), + std::move(new_dict), data_is_decoded); if (ok) { // Refresh cached flags/size from the new dictionary. FinishInitialization(); @@ -132,7 +139,7 @@ CPDF_Image::CPDF_Image(CPDF_Document* doc, RetainPtr pStream) CPDF_Image::CPDF_Image(CPDF_Document* doc, uint32_t dwStreamObjNum) : document_(doc), - stream_(ToStream(doc->GetMutableIndirectObject(dwStreamObjNum))) { + stream_(ToStream(doc->GetIndirectObject(dwStreamObjNum))) { DCHECK(document_); FinishInitialization(); } @@ -151,7 +158,11 @@ void CPDF_Image::FinishInitialization() { void CPDF_Image::ConvertStreamToIndirectObject() { CHECK(stream_->IsInline()); - document_->AddIndirectObject(stream_); + document_->AddIndirectObject(AcquireMutableStreamForEdit()); +} + +RetainPtr CPDF_Image::AcquireMutableStreamForEdit() { + return pdfium::WrapRetain(const_cast(stream_.Get())); } RetainPtr CPDF_Image::GetDict() const { @@ -166,6 +177,22 @@ RetainPtr CPDF_Image::GetOC() const { return oc_; } +bool CPDF_Image::RebindStreamIfPromoted() { + if (!stream_ || stream_->GetObjNum() == 0) { + return false; + } + + RetainPtr current_stream = + ToStream(document_->GetIndirectObject(stream_->GetObjNum())); + if (!current_stream || current_stream.Get() == stream_.Get()) { + return false; + } + + stream_ = std::move(current_stream); + FinishInitialization(); + return true; +} + RetainPtr CPDF_Image::InitJPEG( pdfium::span src_span) { std::optional info_opt = @@ -254,7 +281,6 @@ void CPDF_Image::SetJpegImageInline(RetainPtr pFile) { stream_ = pdfium::MakeRetain(std::move(data), std::move(dict)); } - void CPDF_Image::SetImage(const RetainPtr& pBitmap) { int32_t BitmapWidth = pBitmap->GetWidth(); int32_t BitmapHeight = pBitmap->GetHeight(); @@ -393,10 +419,11 @@ void CPDF_Image::SetImage(const RetainPtr& pBitmap) { } void CPDF_Image::SetPng(const uint8_t* png_data, size_t png_size) { - auto decoded = PngModule::Decode( - pdfium::span(png_data, png_size)); - if (!decoded.has_value()) + auto decoded = + PngModule::Decode(pdfium::span(png_data, png_size)); + if (!decoded.has_value()) { return; + } const uint32_t w = decoded->width; const uint32_t h = decoded->height; @@ -431,13 +458,12 @@ void CPDF_Image::SetPng(const uint8_t* png_data, size_t png_size) { parms->SetNewFor("BitsPerComponent", 8); parms->SetNewFor("Columns", static_cast(w)); - dict->SetNewFor( - "Length", pdfium::checked_cast(compressed.size())); + dict->SetNewFor("Length", + pdfium::checked_cast(compressed.size())); // Build alpha (SMask) stream if the PNG had transparency. if (!decoded->alpha.empty()) { - DataVector alpha_compressed = - FlateModule::Encode(decoded->alpha); + DataVector alpha_compressed = FlateModule::Encode(decoded->alpha); RetainPtr mask_dict = CreateXObjectImageDict(w, h); mask_dict->SetNewFor("ColorSpace", "DeviceGray"); @@ -452,8 +478,8 @@ void CPDF_Image::SetPng(const uint8_t* png_data, size_t png_size) { mask_stream->GetObjNum()); } - stream_ = pdfium::MakeRetain( - std::move(compressed), std::move(dict)); + stream_ = + pdfium::MakeRetain(std::move(compressed), std::move(dict)); is_mask_ = false; width_ = w; height_ = h; diff --git a/core/fpdfapi/page/cpdf_image.h b/core/fpdfapi/page/cpdf_image.h index b547578f2d..f9137ff1e9 100644 --- a/core/fpdfapi/page/cpdf_image.h +++ b/core/fpdfapi/page/cpdf_image.h @@ -10,10 +10,10 @@ #include #include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fxcrt/data_vector.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" #include "core/fxcrt/unowned_ptr.h" -#include "core/fxcrt/data_vector.h" class CFX_DIBBase; class CFX_DIBitmap; @@ -53,6 +53,9 @@ class CPDF_Image final : public Retainable { RetainPtr CreateNewDIB() const; RetainPtr LoadDIBBase() const; + // Rebinds the image to the current stream object for its object number. + bool RebindStreamIfPromoted(); + void SetImage(const RetainPtr& pBitmap); void SetJpegImage(RetainPtr pFile); void SetJpegImageInline(RetainPtr pFile); @@ -88,6 +91,8 @@ class CPDF_Image final : public Retainable { ~CPDF_Image() override; void FinishInitialization(); + // Used only by explicit edit paths that need to promote this stream. + RetainPtr AcquireMutableStreamForEdit(); RetainPtr InitJPEG(pdfium::span src_span); RetainPtr CreateXObjectImageDict(int width, int height); @@ -101,7 +106,7 @@ class CPDF_Image final : public Retainable { UnownedPtr const document_; RetainPtr dibbase_; RetainPtr mask_; - RetainPtr stream_; + RetainPtr stream_; RetainPtr oc_; }; diff --git a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp index cc7ba1e177..e90836552a 100644 --- a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp +++ b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp @@ -13,13 +13,58 @@ #include "core/fpdfapi/page/cpdf_imageobject.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/render/cpdf_docrenderdata.h" #include "core/fxcrt/cfx_fileaccess_stream.h" +#include "core/fxcrt/data_vector.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/utils/path_service.h" namespace pdfium { +namespace { + +class ScopedPageModule { + public: + ScopedPageModule() { InitializePageModule(); } + ~ScopedPageModule() { DestroyPageModule(); } +}; + +RetainPtr CreateImageDict(int width, int height) { + auto dict = pdfium::MakeRetain(); + dict->SetNewFor("Type", "XObject"); + dict->SetNewFor("Subtype", "Image"); + dict->SetNewFor("Width", width); + dict->SetNewFor("Height", height); + dict->SetNewFor("ColorSpace", "DeviceRGB"); + dict->SetNewFor("BitsPerComponent", 8); + return dict; +} + +DataVector MakeRgbPixel(uint8_t r, uint8_t g, uint8_t b) { + return {r, g, b}; +} + +class PromotedImageDocument final : public CPDF_Document { + public: + PromotedImageDocument() + : CPDF_Document(std::make_unique(), + std::make_unique()) {} + + void SetPromotedObject(uint32_t objnum) { promoted_objnum_ = objnum; } + + bool IsObjectPromoted(uint32_t objnum) const override { + return objnum == promoted_objnum_; + } + + private: + uint32_t promoted_objnum_ = 0; +}; + +} // namespace TEST(CPDFPageImageCache, RenderBug1924) { // If you render a page with a JPEG2000 image as a thumbnail (small picture) @@ -84,4 +129,81 @@ TEST(CPDFPageImageCache, RenderBug1924) { DestroyPageModule(); } +TEST(CPDFDocPageDataTest, GetImageDoesNotMutateDocument) { + ScopedPageModule page_module; + CPDF_Document document(std::make_unique(), + std::make_unique()); + RetainPtr stream = document.NewIndirect( + MakeRgbPixel(1, 2, 3), CreateImageDict(1, 1)); + const uint32_t stream_objnum = stream->GetObjNum(); + const uint32_t last_objnum = document.GetLastObjNum(); + + CPDF_DocPageData* page_data = CPDF_DocPageData::FromDocument(&document); + RetainPtr image = page_data->GetImage(stream_objnum); + + EXPECT_EQ(last_objnum, document.GetLastObjNum()); + EXPECT_EQ(stream.Get(), image->GetStream().Get()); + + RetainPtr cached_image = page_data->GetImage(stream_objnum); + EXPECT_EQ(last_objnum, document.GetLastObjNum()); + EXPECT_EQ(image.Get(), cached_image.Get()); +} + +TEST(CPDFDocPageDataTest, GetImageRebindsPromotedStream) { + ScopedPageModule page_module; + PromotedImageDocument document; + RetainPtr original_stream = document.NewIndirect( + MakeRgbPixel(1, 2, 3), CreateImageDict(1, 1)); + const uint32_t stream_objnum = original_stream->GetObjNum(); + + CPDF_DocPageData* page_data = CPDF_DocPageData::FromDocument(&document); + RetainPtr image = page_data->GetImage(stream_objnum); + ASSERT_EQ(original_stream.Get(), image->GetStream().Get()); + + auto promoted_stream = pdfium::MakeRetain(MakeRgbPixel(4, 5, 6), + CreateImageDict(1, 1)); + promoted_stream->SetGenNum(1); + ASSERT_TRUE(document.ReplaceIndirectObjectIfHigherGeneration( + stream_objnum, promoted_stream)); + document.SetPromotedObject(stream_objnum); + + RetainPtr cached_image = page_data->GetImage(stream_objnum); + + EXPECT_EQ(image.Get(), cached_image.Get()); + EXPECT_EQ(promoted_stream.Get(), cached_image->GetStream().Get()); + pdfium::span raw_data = + cached_image->GetStream()->GetInMemoryRawData(); + ASSERT_EQ(3u, raw_data.size()); + EXPECT_EQ(4u, raw_data[0]); + EXPECT_EQ(5u, raw_data[1]); + EXPECT_EQ(6u, raw_data[2]); +} + +TEST(CPDFDocPageDataTest, OverwriteStreamInPlaceUpdatesCachedImage) { + ScopedPageModule page_module; + CPDF_Document document(std::make_unique(), + std::make_unique()); + RetainPtr stream = document.NewIndirect( + MakeRgbPixel(1, 2, 3), CreateImageDict(1, 1)); + const uint32_t stream_objnum = stream->GetObjNum(); + const uint32_t last_objnum = document.GetLastObjNum(); + + CPDF_DocPageData* page_data = CPDF_DocPageData::FromDocument(&document); + RetainPtr image = page_data->GetImage(stream_objnum); + + ASSERT_TRUE(image->OverwriteStreamInPlace(MakeRgbPixel(7, 8, 9), + CreateImageDict(1, 1), + /*data_is_decoded=*/false)); + RetainPtr cached_image = page_data->GetImage(stream_objnum); + + EXPECT_EQ(last_objnum, document.GetLastObjNum()); + EXPECT_EQ(image.Get(), cached_image.Get()); + pdfium::span raw_data = + cached_image->GetStream()->GetInMemoryRawData(); + ASSERT_EQ(3u, raw_data.size()); + EXPECT_EQ(7u, raw_data[0]); + EXPECT_EQ(8u, raw_data[1]); + EXPECT_EQ(9u, raw_data[2]); +} + } // namespace pdfium diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 166ef94f83..ab8967572b 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -416,6 +416,10 @@ bool CPDF_Document::IsModifiedAPStream(const CPDF_Stream* stream) const { pdfium::Contains(modified_apstream_ids_, stream->GetObjNum()); } +bool CPDF_Document::IsObjectPromoted(uint32_t objnum) const { + return false; +} + int CPDF_Document::GetPageIndex(uint32_t objnum) { uint32_t skip_count = 0; bool bSkipped = false; diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 48b01270c9..1c5988d6fc 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -144,6 +144,10 @@ class CPDF_Document : public Observable, // Returns whether CreateModifiedAPStream() created `stream`. bool IsModifiedAPStream(const CPDF_Stream* stream) const; + // Returns whether `objnum` has been promoted from its base storage into a + // document overlay. Always false for ordinary documents. + virtual bool IsObjectPromoted(uint32_t objnum) const; + // CPDF_Parser::ParsedObjectsHolder: bool TryInit() override; RetainPtr ParseIndirectObject(uint32_t objnum) override; From 3cdfb37616a1110c25c8b65ba3063741dcec4c3b Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 01:03:19 +0300 Subject: [PATCH 06/56] Install macros --- .../page/cpdf_pageimagecache_unittest.cpp | 13 ++++++- .../fpdfapi/page/cpdf_streamcontentparser.cpp | 3 ++ core/fpdfapi/parser/cpdf_array.cpp | 7 ++++ core/fpdfapi/parser/cpdf_dictionary.cpp | 5 +++ .../parser/cpdf_indirect_object_holder.cpp | 4 ++ .../parser/cpdf_read_only_graph_guard.cpp | 14 +++++++ .../parser/cpdf_read_only_graph_guard.h | 11 +++++- .../cpdf_read_only_graph_guard_unittest.cpp | 14 +++++++ core/fpdfapi/parser/cpdf_stream.cpp | 7 ++++ core/fpdfapi/parser/cpdf_string.cpp | 2 + core/fpdfdoc/cpdf_annotlist_unittest.cpp | 11 ++++-- .../fpdfdoc/cpdf_interactiveform_unittest.cpp | 26 +++++++++---- fpdfsdk/fpdf_annot_embeddertest.cpp | 37 +++++++++++++++++++ fpdfsdk/fpdf_doc_embeddertest.cpp | 20 ++++++++++ fpdfsdk/fpdf_text_embeddertest.cpp | 20 ++++++++++ 15 files changed, 180 insertions(+), 14 deletions(-) diff --git a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp index e90836552a..7e833205db 100644 --- a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp +++ b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp @@ -17,6 +17,7 @@ #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/render/cpdf_docrenderdata.h" #include "core/fxcrt/cfx_fileaccess_stream.h" @@ -139,12 +140,20 @@ TEST(CPDFDocPageDataTest, GetImageDoesNotMutateDocument) { const uint32_t last_objnum = document.GetLastObjNum(); CPDF_DocPageData* page_data = CPDF_DocPageData::FromDocument(&document); - RetainPtr image = page_data->GetImage(stream_objnum); + RetainPtr image; + { + CPDF_ReadOnlyGraphGuard guard; + image = page_data->GetImage(stream_objnum); + } EXPECT_EQ(last_objnum, document.GetLastObjNum()); EXPECT_EQ(stream.Get(), image->GetStream().Get()); - RetainPtr cached_image = page_data->GetImage(stream_objnum); + RetainPtr cached_image; + { + CPDF_ReadOnlyGraphGuard guard; + cached_image = page_data->GetImage(stream_objnum); + } EXPECT_EQ(last_objnum, document.GetLastObjNum()); EXPECT_EQ(image.Get(), cached_image.Get()); } diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 35cac51d74..49412ec67a 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -33,6 +33,7 @@ #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/fpdf_parser_utility.h" @@ -187,6 +188,7 @@ ByteStringView FindFullName(pdfium::span table, void ReplaceAbbr(RetainPtr pObj); void ReplaceAbbrInDictionary(CPDF_Dictionary* dict) { + CPDF_ScopedInlineRewrite inline_rewrite; std::vector replacements; { CPDF_DictionaryLocker locker(dict); @@ -228,6 +230,7 @@ void ReplaceAbbrInDictionary(CPDF_Dictionary* dict) { } void ReplaceAbbrInArray(CPDF_Array* pArray) { + CPDF_ScopedInlineRewrite inline_rewrite; for (size_t i = 0; i < pArray->size(); ++i) { RetainPtr pElement = pArray->GetMutableObjectAt(i); if (pElement->IsName()) { diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index 4939e24be0..605a96107b 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp @@ -13,6 +13,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" @@ -204,12 +205,14 @@ RetainPtr CPDF_Array::GetStringAt(size_t index) const { void CPDF_Array::Clear() { CHECK(!IsLocked()); + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); objects_.clear(); } void CPDF_Array::RemoveAt(size_t index) { CHECK(!IsLocked()); if (index < objects_.size()) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); objects_.erase(objects_.begin() + index); } } @@ -225,6 +228,7 @@ void CPDF_Array::ConvertToIndirectObjectAt(size_t index, return; } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); pHolder->AddIndirectObject(objects_[index]); objects_[index] = objects_[index]->MakeReference(pHolder); } @@ -251,6 +255,7 @@ CPDF_Object* CPDF_Array::SetAtInternal(size_t index, return nullptr; } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); CPDF_Object* pRet = pObj.Get(); objects_[index] = std::move(pObj); return pRet; @@ -266,6 +271,7 @@ CPDF_Object* CPDF_Array::InsertAtInternal(size_t index, return nullptr; } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); CPDF_Object* pRet = pObj.Get(); objects_.insert(objects_.begin() + index, std::move(pObj)); return pRet; @@ -276,6 +282,7 @@ CPDF_Object* CPDF_Array::AppendInternal(RetainPtr pObj) { CHECK(pObj); CHECK(pObj->IsInline()); CHECK(!pObj->IsStream()); + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); CPDF_Object* pRet = pObj.Get(); objects_.push_back(std::move(pObj)); return pRet; diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index de35427745..29abba7910 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -14,6 +14,7 @@ #include "core/fpdfapi/parser/cpdf_crypto_handler.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" @@ -277,6 +278,7 @@ void CPDF_Dictionary::SetFor(const ByteString& key, CPDF_Object* CPDF_Dictionary::SetForInternal(const ByteString& key, RetainPtr pObj) { CHECK(!IsLocked()); + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); if (!pObj) { map_.erase(key); return nullptr; @@ -297,6 +299,7 @@ void CPDF_Dictionary::ConvertToIndirectObjectFor( return; } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); pHolder->AddIndirectObject(it->second); it->second = it->second->MakeReference(pHolder); } @@ -307,6 +310,7 @@ RetainPtr CPDF_Dictionary::RemoveFor(ByteStringView key) { if (it == map_.end()) { return RetainPtr(); } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); auto node = map_.extract(it); return std::move(node.mapped()); } @@ -324,6 +328,7 @@ void CPDF_Dictionary::ReplaceKey(const ByteString& oldkey, return; } + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); map_[MaybeIntern(newkey)] = std::move(old_it->second); map_.erase(old_it); } diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 6e02e258af..9aa7cabd13 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -12,6 +12,7 @@ #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fxcrt/check.h" namespace { @@ -88,6 +89,7 @@ RetainPtr CPDF_IndirectObjectHolder::ParseIndirectObject( uint32_t CPDF_IndirectObjectHolder::AddIndirectObject( RetainPtr pObj) { + DCHECK_PDF_HOLDER_MUTABLE(); CHECK(!pObj->GetObjNum()); pObj->SetObjNum(++last_obj_num_); indirect_objs_[last_obj_num_] = std::move(pObj); @@ -108,6 +110,7 @@ bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( return false; } + DCHECK_PDF_HOLDER_MUTABLE(); pObj->SetObjNum(objnum); obj_holder = std::move(pObj); last_obj_num_ = std::max(last_obj_num_, objnum); @@ -120,5 +123,6 @@ void CPDF_IndirectObjectHolder::DeleteIndirectObject(uint32_t objnum) { return; } + DCHECK_PDF_HOLDER_MUTABLE(); indirect_objs_.erase(it); } diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp b/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp index 607bc3bf85..61e3c99bdd 100644 --- a/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard.cpp @@ -7,6 +7,7 @@ namespace { thread_local bool g_read_only_graph_guard_active = false; +thread_local int g_inline_rewrite_depth = 0; } // namespace @@ -23,3 +24,16 @@ CPDF_ReadOnlyGraphGuard::~CPDF_ReadOnlyGraphGuard() { bool CPDF_ReadOnlyGraphGuard::IsActive() { return g_read_only_graph_guard_active; } + +// static +bool CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive() { + return g_inline_rewrite_depth > 0; +} + +CPDF_ScopedInlineRewrite::CPDF_ScopedInlineRewrite() { + ++g_inline_rewrite_depth; +} + +CPDF_ScopedInlineRewrite::~CPDF_ScopedInlineRewrite() { + --g_inline_rewrite_depth; +} diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard.h b/core/fpdfapi/parser/cpdf_read_only_graph_guard.h index 64e1630af6..ee3cae76ea 100644 --- a/core/fpdfapi/parser/cpdf_read_only_graph_guard.h +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard.h @@ -13,14 +13,23 @@ class CPDF_ReadOnlyGraphGuard { ~CPDF_ReadOnlyGraphGuard(); static bool IsActive(); + static bool IsInlineRewriteActive(); private: const bool previous_; }; +class CPDF_ScopedInlineRewrite { + public: + CPDF_ScopedInlineRewrite(); + ~CPDF_ScopedInlineRewrite(); +}; + #if DCHECK_IS_ON() #define DCHECK_PDF_GRAPH_MUTABLE_FOR(obj) \ - DCHECK(!CPDF_ReadOnlyGraphGuard::IsActive() || (obj)->GetObjNum() == 0) + DCHECK(!CPDF_ReadOnlyGraphGuard::IsActive() || \ + CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive() || \ + (obj)->GetObjNum() == 0) #define DCHECK_PDF_HOLDER_MUTABLE() DCHECK(!CPDF_ReadOnlyGraphGuard::IsActive()) #else #define DCHECK_PDF_GRAPH_MUTABLE_FOR(obj) ((void)0) diff --git a/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp b/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp index 2a87202f86..7e761faf91 100644 --- a/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_read_only_graph_guard_unittest.cpp @@ -28,3 +28,17 @@ TEST(CPDFReadOnlyGraphGuardTest, AllowsInlineObjects) { CPDF_ReadOnlyGraphGuard guard; DCHECK_PDF_GRAPH_MUTABLE_FOR(dict.Get()); } + +TEST(CPDFReadOnlyGraphGuardTest, InlineRewriteStateStacks) { + EXPECT_FALSE(CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive()); + { + CPDF_ScopedInlineRewrite rewrite; + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive()); + { + CPDF_ScopedInlineRewrite nested_rewrite; + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive()); + } + EXPECT_TRUE(CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive()); + } + EXPECT_FALSE(CPDF_ReadOnlyGraphGuard::IsInlineRewriteActive()); +} diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index d6700e8b3f..461f6b5de3 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp @@ -17,6 +17,7 @@ #include "core/fpdfapi/parser/cpdf_encryptor.h" #include "core/fpdfapi/parser/cpdf_flateencoder.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_stream_acc.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfapi/parser/fpdf_parser_utility.h" @@ -87,6 +88,7 @@ CPDF_Stream* CPDF_Stream::AsMutableStream() { } void CPDF_Stream::InitStreamFromFile(RetainPtr file) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); const int size = pdfium::checked_cast(file->GetSize()); data_ = std::move(file); dict_ = pdfium::MakeRetain(); @@ -115,6 +117,7 @@ RetainPtr CPDF_Stream::CloneNonCyclic( } void CPDF_Stream::SetDataAndRemoveFilter(pdfium::span pData) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); SetData(pData); dict_->RemoveFor("Filter"); dict_->RemoveFor(pdfium::stream::kDecodeParms); @@ -131,17 +134,20 @@ void CPDF_Stream::SetDataFromStringstreamAndRemoveFilter( } void CPDF_Stream::SetData(pdfium::span pData) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); DataVector data_copy(pData.begin(), pData.end()); TakeData(std::move(data_copy)); } void CPDF_Stream::TakeData(DataVector data) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); const int size = pdfium::checked_cast(data.size()); data_ = std::move(data); SetLengthInDict(size); } void CPDF_Stream::SetDataFromStringstream(fxcrt::ostringstream* stream) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); if (stream->tellp() <= 0) { SetData({}); return; @@ -216,5 +222,6 @@ pdfium::span CPDF_Stream::GetInMemoryRawData() const { } void CPDF_Stream::SetLengthInDict(int length) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); dict_->SetNewFor("Length", length); } diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp index 8bdba046ce..39434349f9 100644 --- a/core/fpdfapi/parser/cpdf_string.cpp +++ b/core/fpdfapi/parser/cpdf_string.cpp @@ -11,6 +11,7 @@ #include #include "core/fpdfapi/parser/cpdf_encryptor.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fx_stream.h" @@ -56,6 +57,7 @@ ByteString CPDF_String::GetString() const { } void CPDF_String::SetString(const ByteString& str) { + DCHECK_PDF_GRAPH_MUTABLE_FOR(this); data_ = str; } diff --git a/core/fpdfdoc/cpdf_annotlist_unittest.cpp b/core/fpdfdoc/cpdf_annotlist_unittest.cpp index 2f93c93dc9..2d7260265c 100644 --- a/core/fpdfdoc/cpdf_annotlist_unittest.cpp +++ b/core/fpdfdoc/cpdf_annotlist_unittest.cpp @@ -15,6 +15,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fpdfapi/parser/cpdf_test_document.h" #include "core/fpdfdoc/cpdf_annot.h" @@ -141,10 +142,14 @@ TEST_F(CPDFAnnotListTest, ConstructionPreservesDirectAnnotations) { ASSERT_EQ(0u, annotation->GetObjNum()); const uint32_t last_obj_num = document_->GetLastObjNum(); - CPDF_AnnotList list(page_); + std::unique_ptr list; + { + CPDF_ReadOnlyGraphGuard guard; + list = std::make_unique(page_); + } - ASSERT_EQ(1u, list.Count()); - EXPECT_EQ(annotation.Get(), list.GetAt(0)->GetAnnotDict()); + ASSERT_EQ(1u, list->Count()); + EXPECT_EQ(annotation.Get(), list->GetAt(0)->GetAnnotDict()); EXPECT_EQ(0u, annotation->GetObjNum()); EXPECT_EQ(annotation.Get(), annots->GetObjectAt(0).Get()); EXPECT_EQ(last_obj_num, document_->GetLastObjNum()); diff --git a/core/fpdfdoc/cpdf_interactiveform_unittest.cpp b/core/fpdfdoc/cpdf_interactiveform_unittest.cpp index 9c6a3d97c6..405497b070 100644 --- a/core/fpdfdoc/cpdf_interactiveform_unittest.cpp +++ b/core/fpdfdoc/cpdf_interactiveform_unittest.cpp @@ -11,6 +11,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" @@ -61,18 +62,22 @@ TEST_F(CPDFInteractiveFormTest, LoadFieldsWithReferencedNames) { const uint32_t last_obj_num = doc->GetLastObjNum(); // Let `interactive_form` parse the dictionaries above. - CPDF_InteractiveForm interactive_form(doc.get()); + std::unique_ptr interactive_form; + { + CPDF_ReadOnlyGraphGuard guard; + interactive_form = std::make_unique(doc.get()); + } EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); EXPECT_TRUE(ToReference(good_string_field_dict->GetObjectFor("T"))); EXPECT_TRUE(ToReference(bad_name_field_dict->GetObjectFor("T"))); EXPECT_TRUE(ToReference(bad_stream_field_dict->GetObjectFor("T"))); - EXPECT_EQ(1u, - interactive_form.CountFields(WideString::FromASCII("good_string"))); + EXPECT_EQ( + 1u, interactive_form->CountFields(WideString::FromASCII("good_string"))); EXPECT_EQ(0u, - interactive_form.CountFields(WideString::FromASCII("bad_name"))); - EXPECT_EQ(1u, interactive_form.CountFields(WideString())); + interactive_form->CountFields(WideString::FromASCII("bad_name"))); + EXPECT_EQ(1u, interactive_form->CountFields(WideString())); } TEST_F(CPDFInteractiveFormTest, LoadFieldDoesNotCopyInheritedTypeToParent) { @@ -101,14 +106,19 @@ TEST_F(CPDFInteractiveFormTest, LoadFieldDoesNotCopyInheritedTypeToParent) { ASSERT_FALSE(parent_dict->KeyExist("Ff")); const uint32_t last_obj_num = doc->GetLastObjNum(); - CPDF_InteractiveForm interactive_form(doc.get()); + std::unique_ptr interactive_form; + { + CPDF_ReadOnlyGraphGuard guard; + interactive_form = std::make_unique(doc.get()); + } EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); EXPECT_FALSE(parent_dict->KeyExist("FT")); EXPECT_FALSE(parent_dict->KeyExist("Ff")); - EXPECT_EQ(1u, interactive_form.CountFields(WideString::FromASCII("Parent"))); + EXPECT_EQ(1u, + interactive_form->CountFields(WideString::FromASCII("Parent"))); CPDF_FormField* field = - interactive_form.GetField(0, WideString::FromASCII("Parent")); + interactive_form->GetField(0, WideString::FromASCII("Parent")); ASSERT_TRUE(field); EXPECT_EQ(FormFieldType::kTextField, field->GetFieldType()); EXPECT_EQ(1, field->CountControls()); diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 7cfdd97b14..44a0415b4e 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -16,6 +16,8 @@ #include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/fx_memcpy_wrappers.h" @@ -413,6 +415,41 @@ TEST_F(FPDFAnnotEmbedderTest, RenderMultilineMarkupAnnotWithoutAP) { "annotation_markup_multiline_no_ap"); } +TEST_F(FPDFAnnotEmbedderTest, ReadPurityRenderMarkupAnnotWithoutAP) { + ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + const uint32_t last_obj_num = doc->GetLastObjNum(); + + { + CPDF_ReadOnlyGraphGuard guard; + EXPECT_GT(FPDFPage_GetAnnotCount(page.get()), 0); + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + ScopedFPDFBitmap bitmap = RenderLoadedPageWithFlags(page.get(), FPDF_ANNOT); + ASSERT_TRUE(bitmap); + } + + EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); +} + +TEST_F(FPDFAnnotEmbedderTest, ExplicitGenerateAppearanceAllowed) { + ASSERT_TRUE(OpenDocument("annotation_markup_multiline_no_ap.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + const uint32_t before = doc->GetLastObjNum(); + + EXPECT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + + EXPECT_GT(doc->GetLastObjNum(), before); +} + TEST_F(FPDFAnnotEmbedderTest, ExtractHighlightLongContent) { // Open a file with one annotation and load its first page. ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf")); diff --git a/fpdfsdk/fpdf_doc_embeddertest.cpp b/fpdfsdk/fpdf_doc_embeddertest.cpp index aa61b5d4aa..c76a91986c 100644 --- a/fpdfsdk/fpdf_doc_embeddertest.cpp +++ b/fpdfsdk/fpdf_doc_embeddertest.cpp @@ -9,6 +9,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fxcrt/bytestring.h" #include "core/fxcrt/fx_safe_types.h" @@ -75,6 +76,25 @@ int CountStreamEntries(const std::string& data) { class FPDFDocEmbedderTest : public EmbedderTest {}; +TEST_F(FPDFDocEmbedderTest, ReadPurityLinkEnumeration) { + ASSERT_TRUE(OpenDocument("links_highlights_annots.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + const uint32_t last_obj_num = doc->GetLastObjNum(); + + { + CPDF_ReadOnlyGraphGuard guard; + int start_pos = 0; + FPDF_LINK link = nullptr; + while (FPDFLink_Enumerate(page.get(), &start_pos, &link)) { + } + } + + EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); +} + TEST_F(FPDFDocEmbedderTest, MultipleSamePage) { ASSERT_TRUE(OpenDocument("hello_world.pdf")); CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); diff --git a/fpdfsdk/fpdf_text_embeddertest.cpp b/fpdfsdk/fpdf_text_embeddertest.cpp index f77c04efc1..5e6bb8cc4f 100644 --- a/fpdfsdk/fpdf_text_embeddertest.cpp +++ b/fpdfsdk/fpdf_text_embeddertest.cpp @@ -9,8 +9,11 @@ #include #include "build/build_config.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fxcrt/notreached.h" #include "core/fxge/fx_font.h" +#include "fpdfsdk/cpdfsdk_helpers.h" #include "public/cpp/fpdf_scopers.h" #include "public/fpdf_doc.h" #include "public/fpdf_text.h" @@ -2113,6 +2116,23 @@ TEST_F(FPDFTextEmbedderTest, SmallType3Glyph) { EXPECT_DOUBLE_EQ(61.520000457763672, top); } +TEST_F(FPDFTextEmbedderTest, ReadPurityRenderType3Font) { + ASSERT_TRUE(OpenDocument("bug_1591.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + const uint32_t last_obj_num = doc->GetLastObjNum(); + + { + CPDF_ReadOnlyGraphGuard guard; + ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); + ASSERT_TRUE(bitmap); + } + + EXPECT_EQ(last_obj_num, doc->GetLastObjNum()); +} + TEST_F(FPDFTextEmbedderTest, BigtableTextExtraction) { static constexpr char kExpectedText[] = "{fay,jeff,sanjay,wilsonh,kerr,m3b,tushar,\x02k es,gruber}@google.com"; From 87aec2eaf7ea7d14303985ec9796ba0690036c14 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 22:54:00 +0300 Subject: [PATCH 07/56] Widen all internal seams --- core/fpdfapi/page/cpdf_docpagedata.cpp | 41 +++++ core/fpdfapi/page/cpdf_docpagedata.h | 6 + .../page/cpdf_pageimagecache_unittest.cpp | 7 +- core/fpdfapi/parser/cpdf_document.cpp | 170 +++++++++++++----- core/fpdfapi/parser/cpdf_document.h | 31 +++- .../parser/cpdf_indirect_object_holder.cpp | 6 + .../parser/cpdf_indirect_object_holder.h | 15 +- core/fpdfapi/render/cpdf_docrenderdata.cpp | 22 +++ core/fpdfapi/render/cpdf_docrenderdata.h | 6 + 9 files changed, 239 insertions(+), 65 deletions(-) diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index 902d253bd2..8356c69300 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -178,6 +178,9 @@ CPDF_DocPageData* CPDF_DocPageData::FromDocument(const CPDF_Document* doc) { CPDF_DocPageData::CPDF_DocPageData() = default; +CPDF_DocPageData::CPDF_DocPageData(CPDF_DocPageData* fallback) + : fallback_(fallback) {} + CPDF_DocPageData::~CPDF_DocPageData() { for (auto& it : image_map_) { it.second->WillBeDestroyed(); @@ -220,6 +223,10 @@ RetainPtr CPDF_DocPageData::GetFont( return pdfium::WrapRetain(it->second.Get()); } + if (fallback_ && CanUseFallbackForObject(font_dict.Get())) { + return fallback_->GetFont(font_dict); + } + RetainPtr font = CPDF_Font::Create(GetDocument(), font_dict, this); if (!font) { return nullptr; @@ -370,6 +377,10 @@ RetainPtr CPDF_DocPageData::GetColorSpaceInternal( return pdfium::WrapRetain(it->second.Get()); } + if (fallback_ && CanUseFallbackForObject(pArray.Get())) { + return fallback_->GetColorSpaceGuarded(pCSObj, pResources, pVisited); + } + RetainPtr pCS = CPDF_ColorSpace::Load(GetDocument(), pArray.Get(), pVisited); if (!pCS) { @@ -390,6 +401,10 @@ RetainPtr CPDF_DocPageData::GetPattern( return pdfium::WrapRetain(it->second.Get()); } + if (fallback_ && CanUseFallbackForObject(pPatternObj.Get())) { + return fallback_->GetPattern(pPatternObj, matrix); + } + RetainPtr pattern; switch (pPatternObj->GetDict()->GetIntegerFor("PatternType")) { case CPDF_Pattern::kTiling: @@ -417,6 +432,10 @@ RetainPtr CPDF_DocPageData::GetShading( return pdfium::WrapRetain(it->second->AsShadingPattern()); } + if (fallback_ && CanUseFallbackForObject(pPatternObj.Get())) { + return fallback_->GetShading(pPatternObj, matrix); + } + auto pPattern = pdfium::MakeRetain( GetDocument(), pPatternObj, true, matrix); pattern_map_[pPatternObj].Reset(pPattern.Get()); @@ -433,6 +452,10 @@ RetainPtr CPDF_DocPageData::GetImage(uint32_t dwStreamObjNum) { return it->second; } + if (fallback_ && !GetDocument()->IsObjectPromoted(dwStreamObjNum)) { + return fallback_->GetImage(dwStreamObjNum); + } + auto pImage = pdfium::MakeRetain(GetDocument(), dwStreamObjNum); image_map_[dwStreamObjNum] = pImage; return pImage; @@ -455,6 +478,10 @@ RetainPtr CPDF_DocPageData::GetIccProfile( return it->second; } + if (fallback_ && CanUseFallbackForObject(pProfileStream.Get())) { + return fallback_->GetIccProfile(pProfileStream); + } + auto pAccessor = pdfium::MakeRetain(pProfileStream); pAccessor->LoadAllDataFiltered(); @@ -489,6 +516,10 @@ RetainPtr CPDF_DocPageData::GetFontFileStreamAcc( return it->second; } + if (fallback_ && CanUseFallbackForObject(font_stream.Get())) { + return fallback_->GetFontFileStreamAcc(font_stream); + } + RetainPtr font_dict = font_stream->GetDict(); int32_t len1 = font_dict->GetIntegerFor("Length1"); int32_t len2 = font_dict->GetIntegerFor("Length2"); @@ -525,6 +556,16 @@ void CPDF_DocPageData::MaybePurgeFontFileStreamAcc( } } +bool CPDF_DocPageData::CanUseFallbackForObject( + const CPDF_Object* object) const { + if (!object) { + return false; + } + + const uint32_t objnum = object->GetObjNum(); + return objnum != 0 && !GetDocument()->IsObjectPromoted(objnum); +} + std::unique_ptr CPDF_DocPageData::CreateForm( CPDF_Document* document, RetainPtr pPageResources, diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h index a46ff6ecc0..ebaeb47210 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.h +++ b/core/fpdfapi/page/cpdf_docpagedata.h @@ -19,6 +19,7 @@ #include "core/fxcrt/fx_codepage_forward.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/unowned_ptr.h" class CFX_Font; class CPDF_Dictionary; @@ -36,8 +37,11 @@ class CPDF_DocPageData final : public CPDF_Document::PageDataIface, static CPDF_DocPageData* FromDocument(const CPDF_Document* doc); CPDF_DocPageData(); + explicit CPDF_DocPageData(CPDF_DocPageData* fallback); ~CPDF_DocPageData() override; + void SetFallback(CPDF_DocPageData* fallback) { fallback_ = fallback; } + // CPDF_Document::PageDataIface: void ClearStockFont() override; RetainPtr GetFontFileStreamAcc( @@ -109,6 +113,7 @@ class CPDF_DocPageData final : public CPDF_Document::PageDataIface, const CPDF_Dictionary* pResources, std::set* pVisited, std::set* pVisitedInternal); + bool CanUseFallbackForObject(const CPDF_Object* object) const; size_t CalculateEncodingDict(FX_Charset charset, CPDF_Dictionary* pBaseDict); RetainPtr ProcessbCJK( @@ -118,6 +123,7 @@ class CPDF_DocPageData final : public CPDF_Document::PageDataIface, std::function Insert); bool force_clear_ = false; + UnownedPtr fallback_; // Specific destruction order may be required between maps. std::map> diff --git a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp index 7e833205db..9f05687b32 100644 --- a/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp +++ b/core/fpdfapi/page/cpdf_pageimagecache_unittest.cpp @@ -57,8 +57,11 @@ class PromotedImageDocument final : public CPDF_Document { void SetPromotedObject(uint32_t objnum) { promoted_objnum_ = objnum; } - bool IsObjectPromoted(uint32_t objnum) const override { - return objnum == promoted_objnum_; + RetainPtr FindPromotedObject(uint32_t objnum) const override { + return objnum == promoted_objnum_ + ? const_cast(this) + ->GetMutableIndirectObject(objnum) + : nullptr; } private: diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index ab8967572b..59506c882e 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -28,6 +28,7 @@ #include "core/fxcrt/check_op.h" #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/fx_codepage.h" +#include "core/fxcrt/numerics/safe_conversions.h" #include "core/fxcrt/scoped_set_insertion.h" #include "core/fxcrt/span.h" #include "core/fxcrt/stl_util.h" @@ -195,17 +196,31 @@ bool CPDF_Document::IsValidPageObject(const CPDF_Object* obj) { return ValidateDictType(ToDictionary(obj), "Page"); } +CPDF_Parser* CPDF_Document::GetParser() const { + return parser_.get(); +} + +const CPDF_Dictionary* CPDF_Document::GetRoot() const { + return root_dict_.Get(); +} + +RetainPtr CPDF_Document::GetMutableRoot() { + return root_dict_; +} + RetainPtr CPDF_Document::ParseIndirectObject(uint32_t objnum) { - return parser_ ? parser_->ParseIndirectObject(objnum) : nullptr; + CPDF_Parser* parser = GetParser(); + return parser ? parser->ParseIndirectObject(objnum) : nullptr; } bool CPDF_Document::TryInit() { - SetLastObjNum(parser_->GetLastObjNum()); + CPDF_Parser* parser = GetParser(); + SetLastObjNum(parser->GetLastObjNum()); RetainPtr pRootObj = - GetOrParseIndirectObject(parser_->GetRootObjNum()); + GetOrParseIndirectObject(parser->GetRootObjNum()); if (pRootObj) { - root_dict_ = pRootObj->GetMutableDict(); + SetCachedRootDict(pRootObj->GetMutableDict()); } LoadPages(); @@ -215,44 +230,44 @@ bool CPDF_Document::TryInit() { CPDF_Parser::Error CPDF_Document::LoadDoc( RetainPtr pFileAccess, const ByteString& password) { - if (!parser_) { + if (!GetParser()) { SetParser(std::make_unique(this)); } return HandleLoadResult( - parser_->StartParse(std::move(pFileAccess), password)); + GetParser()->StartParse(std::move(pFileAccess), password)); } CPDF_Parser::Error CPDF_Document::LoadLinearizedDoc( RetainPtr validator, const ByteString& password) { - if (!parser_) { + if (!GetParser()) { SetParser(std::make_unique(this)); } return HandleLoadResult( - parser_->StartLinearizedParse(std::move(validator), password)); + GetParser()->StartLinearizedParse(std::move(validator), password)); } void CPDF_Document::LoadPages() { const CPDF_LinearizedHeader* linearized_header = - parser_->GetLinearizedHeader(); + GetParser()->GetLinearizedHeader(); if (!linearized_header) { - page_list_.resize(RetrievePageCount()); + ResizePageList(RetrievePageCount()); return; } uint32_t objnum = linearized_header->GetFirstPageObjNum(); if (!IsValidPageObject(GetOrParseIndirectObject(objnum).Get())) { - page_list_.resize(RetrievePageCount()); + ResizePageList(RetrievePageCount()); return; } uint32_t first_page_num = linearized_header->GetFirstPageNo(); uint32_t page_count = linearized_header->GetPageCount(); DCHECK(first_page_num < page_count); - page_list_.resize(page_count); - page_list_[first_page_num] = objnum; + ResizePageList(page_count); + SetPageObjNumAt(first_page_num, objnum); } RetainPtr CPDF_Document::TraversePDFPages(int iPage, @@ -269,7 +284,7 @@ RetainPtr CPDF_Document::TraversePDFPages(int iPage, if (*nPagesToGo != 1) { return nullptr; } - page_list_[iPage] = pPages->GetObjNum(); + SetPageObjNumAt(iPage, pPages->GetObjNum()); return pPages; } if (level >= kMaxPageLevel) { @@ -294,7 +309,7 @@ RetainPtr CPDF_Document::TraversePDFPages(int iPage, continue; } if (!pKid->KeyExist("Kids")) { - page_list_[iPage - (*nPagesToGo) + 1] = pKid->GetObjNum(); + SetPageObjNumAt(iPage - (*nPagesToGo) + 1, pKid->GetObjNum()); (*nPagesToGo)--; tree_traversal_[level].second++; if (*nPagesToGo == 0) { @@ -340,7 +355,7 @@ void CPDF_Document::SetParser(std::unique_ptr pParser) { CPDF_Parser::Error CPDF_Document::HandleLoadResult(CPDF_Parser::Error error) { if (error == CPDF_Parser::SUCCESS) { - has_valid_cross_reference_table_ = !parser_->xref_table_rebuilt(); + has_valid_cross_reference_table_ = !GetParser()->xref_table_rebuilt(); } return error; } @@ -356,15 +371,15 @@ RetainPtr CPDF_Document::GetMutablePagesDict() { } bool CPDF_Document::IsPageLoaded(int iPage) const { - return !!page_list_[iPage]; + return !!GetPageObjNumAt(iPage); } RetainPtr CPDF_Document::GetPageDictionary(int iPage) { - if (!fxcrt::IndexInBounds(page_list_, iPage)) { + if (iPage < 0 || static_cast(iPage) >= GetPageListSize()) { return nullptr; } - const uint32_t objnum = page_list_[iPage]; + const uint32_t objnum = GetPageObjNumAt(iPage); if (objnum) { RetainPtr result = ToDictionary(GetOrParseIndirectObject(objnum)); @@ -394,7 +409,7 @@ RetainPtr CPDF_Document::GetMutablePageDictionary(int iPage) { } void CPDF_Document::SetPageObjNum(int iPage, uint32_t objNum) { - page_list_[iPage] = objNum; + SetPageObjNumAt(iPage, objNum); } JBig2_DocumentContext* CPDF_Document::GetOrCreateCodecContext() { @@ -416,20 +431,29 @@ bool CPDF_Document::IsModifiedAPStream(const CPDF_Stream* stream) const { pdfium::Contains(modified_apstream_ids_, stream->GetObjNum()); } +RetainPtr CPDF_Document::FindPromotedObject( + uint32_t objnum) const { + return nullptr; +} + bool CPDF_Document::IsObjectPromoted(uint32_t objnum) const { + return !!FindPromotedObject(objnum); +} + +bool CPDF_Document::IsLayerDocument() const { return false; } int CPDF_Document::GetPageIndex(uint32_t objnum) { uint32_t skip_count = 0; bool bSkipped = false; - for (uint32_t i = 0; i < page_list_.size(); ++i) { - if (page_list_[i] == objnum) { - return i; + for (size_t i = 0; i < GetPageListSize(); ++i) { + if (GetPageObjNumAt(i) == objnum) { + return pdfium::checked_cast(i); } - if (!bSkipped && page_list_[i] == 0) { - skip_count = i; + if (!bSkipped && GetPageObjNumAt(i) == 0) { + skip_count = pdfium::checked_cast(i); bSkipped = true; } } @@ -442,19 +466,19 @@ int CPDF_Document::GetPageIndex(uint32_t objnum) { int found_index = FindPageIndex(pPages, &skip_count, objnum, &start_index, 0); // Corrupt page tree may yield out-of-range results. - if (!fxcrt::IndexInBounds(page_list_, found_index)) { + if (found_index < 0 || static_cast(found_index) >= GetPageListSize()) { return -1; } // Only update |page_list_| when |objnum| points to a /Page object. if (IsValidPageObject(GetOrParseIndirectObject(objnum).Get())) { - page_list_[found_index] = objnum; + SetPageObjNumAt(found_index, objnum); } return found_index; } int CPDF_Document::GetPageCount() const { - return fxcrt::CollectionSize(page_list_); + return pdfium::checked_cast(GetPageListSize()); } int CPDF_Document::RetrievePageCount() { @@ -472,7 +496,8 @@ int CPDF_Document::RetrievePageCount() { } uint32_t CPDF_Document::GetUserPermissions(bool get_owner_perms) const { - return parser_ ? parser_->GetPermissions(get_owner_perms) : 0; + CPDF_Parser* parser = GetParser(); + return parser ? parser->GetPermissions(get_owner_perms) : 0; } RetainPtr CPDF_Document::GetFontFileStreamAcc( @@ -490,17 +515,18 @@ void CPDF_Document::MaybePurgeImage(uint32_t objnum) { } void CPDF_Document::CreateNewDoc() { - DCHECK(!root_dict_); - DCHECK(!info_dict_); - root_dict_ = NewIndirect(); - root_dict_->SetNewFor("Type", "Catalog"); + DCHECK(!GetRoot()); + DCHECK(!GetInfo()); + RetainPtr root = NewIndirect(); + SetCachedRootDict(root); + root->SetNewFor("Type", "Catalog"); auto pPages = NewIndirect(); pPages->SetNewFor("Type", "Pages"); pPages->SetNewFor("Count", 0); pPages->SetNewFor("Kids"); - root_dict_->SetNewFor("Pages", this, pPages->GetObjNum()); - info_dict_ = NewIndirect(); + root->SetNewFor("Pages", this, pPages->GetObjNum()); + SetCachedInfoDict(NewIndirect()); } RetainPtr CPDF_Document::CreateNewPage(int iPage) { @@ -598,7 +624,7 @@ bool CPDF_Document::InsertNewPage(int iPage, return false; } } - page_list_.insert(page_list_.begin() + iPage, pPageDict->GetObjNum()); + InsertPageObjNum(iPage, pPageDict->GetObjNum()); return true; } @@ -607,20 +633,25 @@ RetainPtr CPDF_Document::GetInfo() { return info_dict_; } - if (!parser_) { + CPDF_Parser* parser = GetParser(); + if (!parser) { return nullptr; } - uint32_t info_obj_num = parser_->GetInfoObjNum(); + uint32_t info_obj_num = parser->GetInfoObjNum(); if (info_obj_num == 0) { return nullptr; } auto ref = pdfium::MakeRetain(this, info_obj_num); - info_dict_ = ToDictionary(ref->GetMutableDirect()); + SetCachedInfoDict(ToDictionary(ref->GetMutableDirect())); return info_dict_; } +RetainPtr CPDF_Document::GetMutableInfo() { + return GetInfo(); +} + RetainPtr CPDF_Document::GetOrCreateInfo() { if (info_dict_) return info_dict_; @@ -630,12 +661,13 @@ RetainPtr CPDF_Document::GetOrCreateInfo() { return existing; // No Info present: create a new indirect dictionary and cache it. - info_dict_ = NewIndirect(); + SetCachedInfoDict(NewIndirect()); return info_dict_; } RetainPtr CPDF_Document::GetFileIdentifier() const { - return parser_ ? parser_->GetIDArray() : nullptr; + CPDF_Parser* parser = GetParser(); + return parser ? parser->GetIDArray() : nullptr; } uint32_t CPDF_Document::DeletePage(int iPage) { @@ -659,22 +691,24 @@ uint32_t CPDF_Document::DeletePage(int iPage) { return 0; } - page_list_.erase(page_list_.begin() + iPage); + ErasePageObjNum(iPage); return page_dict->GetObjNum(); } void CPDF_Document::SetPageToNullObject(uint32_t page_obj_num) { - if (!page_obj_num || page_list_.empty()) { + if (!page_obj_num || GetPageListSize() == 0) { return; } // Load all pages so `page_list_` has all the object numbers. - for (size_t i = 0; i < page_list_.size(); ++i) { - GetPageDictionary(i); + for (size_t i = 0; i < GetPageListSize(); ++i) { + GetPageDictionary(pdfium::checked_cast(i)); } - if (pdfium::Contains(page_list_, page_obj_num)) { - return; + for (size_t i = 0; i < GetPageListSize(); ++i) { + if (GetPageObjNumAt(i) == page_obj_num) { + return; + } } // If `page_dict` is no longer in the page tree, replace it with an object of @@ -689,7 +723,7 @@ void CPDF_Document::SetPageToNullObject(uint32_t page_obj_num) { } void CPDF_Document::SetRootForTesting(RetainPtr root) { - root_dict_ = std::move(root); + SetCachedRootDict(std::move(root)); } bool CPDF_Document::MovePages(pdfium::span page_indices, @@ -773,9 +807,49 @@ bool CPDF_Document::MovePages(pdfium::span page_indices, } void CPDF_Document::ResizePageListForTesting(size_t size) { + ResizePageList(size); +} + +uint32_t CPDF_Document::GetPageObjNumAt(size_t index) const { + return page_list_[index]; +} + +void CPDF_Document::SetPageObjNumAt(size_t index, uint32_t objnum) { + page_list_[index] = objnum; +} + +void CPDF_Document::InsertPageObjNum(size_t index, uint32_t objnum) { + page_list_.insert(page_list_.begin() + index, objnum); +} + +void CPDF_Document::ErasePageObjNum(size_t index) { + page_list_.erase(page_list_.begin() + index); +} + +void CPDF_Document::ResizePageList(size_t size) { page_list_.resize(size); } +size_t CPDF_Document::GetPageListSize() const { + return page_list_.size(); +} + +void CPDF_Document::SetCachedRootDict(RetainPtr root) { + root_dict_ = std::move(root); +} + +void CPDF_Document::InvalidateCachedRootDict() { + root_dict_.Reset(); +} + +void CPDF_Document::SetCachedInfoDict(RetainPtr info) { + info_dict_ = std::move(info); +} + +void CPDF_Document::InvalidateCachedInfoDict() { + info_dict_.Reset(); +} + CPDF_Document::StockFontClearer::StockFontClearer( CPDF_Document::PageDataIface* pPageData) : page_data_(pPageData) {} diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 1c5988d6fc..0493f6e524 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -94,10 +94,11 @@ class CPDF_Document : public Observable, extension_ = std::move(pExt); } - CPDF_Parser* GetParser() const { return parser_.get(); } - const CPDF_Dictionary* GetRoot() const { return root_dict_.Get(); } - RetainPtr GetMutableRoot() { return root_dict_; } - RetainPtr GetInfo(); + virtual CPDF_Parser* GetParser() const; + virtual const CPDF_Dictionary* GetRoot() const; + virtual RetainPtr GetMutableRoot(); + virtual RetainPtr GetInfo(); + virtual RetainPtr GetMutableInfo(); RetainPtr GetOrCreateInfo(); RetainPtr GetFileIdentifier() const; @@ -111,12 +112,12 @@ class CPDF_Document : public Observable, int GetPageCount() const; bool IsPageLoaded(int iPage) const; - RetainPtr GetPageDictionary(int iPage); - RetainPtr GetMutablePageDictionary(int iPage); + virtual RetainPtr GetPageDictionary(int iPage); + virtual RetainPtr GetMutablePageDictionary(int iPage); int GetPageIndex(uint32_t objnum); // When `get_owner_perms` is true, returns full permissions if unlocked by // owner. - uint32_t GetUserPermissions(bool get_owner_perms) const; + virtual uint32_t GetUserPermissions(bool get_owner_perms) const; // PageDataIface wrappers, try to avoid explicit getter calls. RetainPtr GetFontFileStreamAcc( @@ -146,7 +147,9 @@ class CPDF_Document : public Observable, // Returns whether `objnum` has been promoted from its base storage into a // document overlay. Always false for ordinary documents. - virtual bool IsObjectPromoted(uint32_t objnum) const; + virtual RetainPtr FindPromotedObject(uint32_t objnum) const; + bool IsObjectPromoted(uint32_t objnum) const; + virtual bool IsLayerDocument() const; // CPDF_Parser::ParsedObjectsHolder: bool TryInit() override; @@ -174,6 +177,18 @@ class CPDF_Document : public Observable, void ResizePageListForTesting(size_t size); + virtual uint32_t GetPageObjNumAt(size_t index) const; + virtual void SetPageObjNumAt(size_t index, uint32_t objnum); + virtual void InsertPageObjNum(size_t index, uint32_t objnum); + virtual void ErasePageObjNum(size_t index); + virtual void ResizePageList(size_t size); + virtual size_t GetPageListSize() const; + + void SetCachedRootDict(RetainPtr root); + void InvalidateCachedRootDict(); + void SetCachedInfoDict(RetainPtr info); + void InvalidateCachedInfoDict(); + private: class StockFontClearer { public: diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 9aa7cabd13..a477a82fd0 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -51,6 +51,12 @@ const CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObjectInternal( return FilterInvalidObjNum(it->second.Get()); } +RetainPtr CPDF_IndirectObjectHolder::FindLocalIndirectObject( + uint32_t objnum) const { + return pdfium::WrapRetain( + const_cast(GetIndirectObjectInternal(objnum))); +} + RetainPtr CPDF_IndirectObjectHolder::GetOrParseIndirectObject( uint32_t objnum) { return pdfium::WrapRetain(GetOrParseIndirectObjectInternal(objnum)); diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h index 46b9a7b405..c2f35d20f0 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h @@ -26,10 +26,10 @@ class CPDF_IndirectObjectHolder { CPDF_IndirectObjectHolder(); virtual ~CPDF_IndirectObjectHolder(); - RetainPtr GetOrParseIndirectObject(uint32_t objnum); - RetainPtr GetIndirectObject(uint32_t objnum) const; - RetainPtr GetMutableIndirectObject(uint32_t objnum); - void DeleteIndirectObject(uint32_t objnum); + virtual RetainPtr GetOrParseIndirectObject(uint32_t objnum); + virtual RetainPtr GetIndirectObject(uint32_t objnum) const; + virtual RetainPtr GetMutableIndirectObject(uint32_t objnum); + virtual void DeleteIndirectObject(uint32_t objnum); // Creates and adds a new object retained by the indirect object holder, // and returns a retained pointer to it. @@ -74,13 +74,14 @@ class CPDF_IndirectObjectHolder { protected: virtual RetainPtr ParseIndirectObject(uint32_t objnum); + virtual const CPDF_Object* GetIndirectObjectInternal(uint32_t objnum) const; + virtual CPDF_Object* GetOrParseIndirectObjectInternal(uint32_t objnum); + + RetainPtr FindLocalIndirectObject(uint32_t objnum) const; private: friend class CPDF_Reference; - const CPDF_Object* GetIndirectObjectInternal(uint32_t objnum) const; - CPDF_Object* GetOrParseIndirectObjectInternal(uint32_t objnum); - uint32_t last_obj_num_ = 0; std::map> indirect_objs_; WeakPtr byte_string_pool_; diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp index c35e952d74..100d9199a5 100644 --- a/core/fpdfapi/render/cpdf_docrenderdata.cpp +++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp @@ -40,6 +40,9 @@ CPDF_DocRenderData* CPDF_DocRenderData::FromDocument(const CPDF_Document* doc) { CPDF_DocRenderData::CPDF_DocRenderData() = default; +CPDF_DocRenderData::CPDF_DocRenderData(CPDF_DocRenderData* fallback) + : fallback_(fallback) {} + CPDF_DocRenderData::~CPDF_DocRenderData() = default; RetainPtr CPDF_DocRenderData::GetCachedType3( @@ -50,6 +53,11 @@ RetainPtr CPDF_DocRenderData::GetCachedType3( return pdfium::WrapRetain(it->second.Get()); } + if (fallback_ && font->GetFontDictObjNum() != 0 && + !GetDocument()->IsObjectPromoted(font->GetFontDictObjNum())) { + return fallback_->GetCachedType3(font); + } + auto cache = pdfium::MakeRetain(font); type3_face_map_[font].Reset(cache.Get()); return cache; @@ -63,11 +71,25 @@ RetainPtr CPDF_DocRenderData::GetTransferFunc( return pdfium::WrapRetain(it->second.Get()); } + if (fallback_ && CanUseFallbackForObject(obj.Get())) { + return fallback_->GetTransferFunc(obj); + } + auto func = CreateTransferFunc(obj); transfer_func_map_[obj].Reset(func.Get()); return func; } +bool CPDF_DocRenderData::CanUseFallbackForObject( + const CPDF_Object* object) const { + if (!object) { + return false; + } + + const uint32_t objnum = object->GetObjNum(); + return objnum != 0 && !GetDocument()->IsObjectPromoted(objnum); +} + #if BUILDFLAG(IS_WIN) CFX_PSFontTracker* CPDF_DocRenderData::GetPSFontTracker() { if (!psfont_tracker_) { diff --git a/core/fpdfapi/render/cpdf_docrenderdata.h b/core/fpdfapi/render/cpdf_docrenderdata.h index f11be0caec..691a97c751 100644 --- a/core/fpdfapi/render/cpdf_docrenderdata.h +++ b/core/fpdfapi/render/cpdf_docrenderdata.h @@ -14,6 +14,7 @@ #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/unowned_ptr.h" #if BUILDFLAG(IS_WIN) #include @@ -34,6 +35,7 @@ class CPDF_DocRenderData : public CPDF_Document::RenderDataIface { static CPDF_DocRenderData* FromDocument(const CPDF_Document* doc); CPDF_DocRenderData(); + explicit CPDF_DocRenderData(CPDF_DocRenderData* fallback); ~CPDF_DocRenderData() override; CPDF_DocRenderData(const CPDF_DocRenderData&) = delete; @@ -53,7 +55,11 @@ class CPDF_DocRenderData : public CPDF_Document::RenderDataIface { RetainPtr CreateTransferFunc( RetainPtr pObj) const; + bool CanUseFallbackForObject(const CPDF_Object* object) const; + private: + UnownedPtr fallback_; + // TODO(tsepez): investigate this map outliving its font keys. std::map> type3_face_map_; std::map, From 4e5781ec3ffa80f6561db88866e876d96b142620 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 23:10:27 +0300 Subject: [PATCH 08/56] CPDF_BaseDocument + eager parse + freeze --- core/fpdfapi/parser/BUILD.gn | 3 + core/fpdfapi/parser/cpdf_array.cpp | 12 ++ core/fpdfapi/parser/cpdf_array.h | 1 + core/fpdfapi/parser/cpdf_base_document.cpp | 102 ++++++++++ core/fpdfapi/parser/cpdf_base_document.h | 28 +++ .../parser/cpdf_base_document_unittest.cpp | 186 ++++++++++++++++++ core/fpdfapi/parser/cpdf_boolean.cpp | 2 + core/fpdfapi/parser/cpdf_dictionary.cpp | 11 ++ core/fpdfapi/parser/cpdf_dictionary.h | 1 + .../parser/cpdf_indirect_object_holder.cpp | 17 ++ .../parser/cpdf_indirect_object_holder.h | 3 + core/fpdfapi/parser/cpdf_name.cpp | 2 + core/fpdfapi/parser/cpdf_number.cpp | 2 + core/fpdfapi/parser/cpdf_object.cpp | 17 ++ core/fpdfapi/parser/cpdf_object.h | 7 + core/fpdfapi/parser/cpdf_stream.cpp | 10 + core/fpdfapi/parser/cpdf_stream.h | 1 + core/fpdfapi/parser/cpdf_string.cpp | 2 + fpdfsdk/BUILD.gn | 1 + fpdfsdk/epdf_base_document.cpp | 48 +++++ fpdfsdk/fpdf_view_c_api_test.c | 2 + public/fpdfview.h | 18 ++ 22 files changed, 476 insertions(+) create mode 100644 core/fpdfapi/parser/cpdf_base_document.cpp create mode 100644 core/fpdfapi/parser/cpdf_base_document.h create mode 100644 core/fpdfapi/parser/cpdf_base_document_unittest.cpp create mode 100644 fpdfsdk/epdf_base_document.cpp diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn index 475c093aa0..12787998fe 100644 --- a/core/fpdfapi/parser/BUILD.gn +++ b/core/fpdfapi/parser/BUILD.gn @@ -11,6 +11,8 @@ source_set("parser") { "cfdf_document.h", "cpdf_array.cpp", "cpdf_array.h", + "cpdf_base_document.cpp", + "cpdf_base_document.h", "cpdf_boolean.cpp", "cpdf_boolean.h", "cpdf_cross_ref_avail.cpp", @@ -118,6 +120,7 @@ source_set("unit_test_support") { pdfium_unittest_source_set("unittests") { sources = [ "cpdf_array_unittest.cpp", + "cpdf_base_document_unittest.cpp", "cpdf_cross_ref_avail_unittest.cpp", "cpdf_dictionary_unittest.cpp", "cpdf_document_unittest.cpp", diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index 605a96107b..70a67b24f4 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp @@ -63,6 +63,12 @@ RetainPtr CPDF_Array::CloneNonCyclic( return pCopy; } +void CPDF_Array::FreezeChildren(std::set* visited) { + for (const auto& object : objects_) { + object->FreezeForHolder(visited); + } +} + CFX_FloatRect CPDF_Array::GetRect() const { CFX_FloatRect rect; if (objects_.size() != 4) { @@ -205,6 +211,7 @@ RetainPtr CPDF_Array::GetStringAt(size_t index) const { void CPDF_Array::Clear() { CHECK(!IsLocked()); + DCHECK(!IsFrozen()); DCHECK_PDF_GRAPH_MUTABLE_FOR(this); objects_.clear(); } @@ -212,6 +219,7 @@ void CPDF_Array::Clear() { void CPDF_Array::RemoveAt(size_t index) { CHECK(!IsLocked()); if (index < objects_.size()) { + DCHECK(!IsFrozen()); DCHECK_PDF_GRAPH_MUTABLE_FOR(this); objects_.erase(objects_.begin() + index); } @@ -229,6 +237,7 @@ void CPDF_Array::ConvertToIndirectObjectAt(size_t index, } DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); pHolder->AddIndirectObject(objects_[index]); objects_[index] = objects_[index]->MakeReference(pHolder); } @@ -256,6 +265,7 @@ CPDF_Object* CPDF_Array::SetAtInternal(size_t index, } DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); CPDF_Object* pRet = pObj.Get(); objects_[index] = std::move(pObj); return pRet; @@ -272,6 +282,7 @@ CPDF_Object* CPDF_Array::InsertAtInternal(size_t index, } DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); CPDF_Object* pRet = pObj.Get(); objects_.insert(objects_.begin() + index, std::move(pObj)); return pRet; @@ -283,6 +294,7 @@ CPDF_Object* CPDF_Array::AppendInternal(RetainPtr pObj) { CHECK(pObj->IsInline()); CHECK(!pObj->IsStream()); DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); CPDF_Object* pRet = pObj.Get(); objects_.push_back(std::move(pObj)); return pRet; diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h index 473588dfc8..5b71bf5175 100644 --- a/core/fpdfapi/parser/cpdf_array.h +++ b/core/fpdfapi/parser/cpdf_array.h @@ -166,6 +166,7 @@ class CPDF_Array final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* pVisited) const override; + void FreezeChildren(std::set* visited) override; std::vector> objects_; WeakPtr pool_; diff --git a/core/fpdfapi/parser/cpdf_base_document.cpp b/core/fpdfapi/parser/cpdf_base_document.cpp new file mode 100644 index 0000000000..1e3fa6fe3f --- /dev/null +++ b/core/fpdfapi/parser/cpdf_base_document.cpp @@ -0,0 +1,102 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_base_document.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/render/cpdf_docrenderdata.h" + +namespace { + +void PushIfNew(RetainPtr object, + std::set* visited, + std::queue>* worklist) { + if (!object || !visited->insert(object.Get()).second) { + return; + } + worklist->push(std::move(object)); +} + +} // namespace + +CPDF_BaseDocument::CPDF_BaseDocument() + : CPDF_Document(std::make_unique(), + std::make_unique()) {} + +CPDF_BaseDocument::~CPDF_BaseDocument() = default; + +CPDF_Parser::Error CPDF_BaseDocument::LoadBaseDoc( + RetainPtr file_access, + const ByteString& password) { + CPDF_Parser::Error error = LoadDoc(std::move(file_access), password); + if (error != CPDF_Parser::SUCCESS) { + return error; + } + return EagerlyParseAllReachable() ? CPDF_Parser::SUCCESS + : CPDF_Parser::FORMAT_ERROR; +} + +bool CPDF_BaseDocument::EagerlyParseAllReachable() { + if (!GetParser() || !GetRoot()) { + return false; + } + + std::set visited; + std::queue> worklist; + PushIfNew(pdfium::WrapRetain(GetParser()->GetTrailer()), &visited, &worklist); + PushIfNew(pdfium::WrapRetain(GetRoot()), &visited, &worklist); + PushIfNew(GetInfo(), &visited, &worklist); + PushIfNew(GetParser()->GetEncryptDict(), &visited, &worklist); + + while (!worklist.empty()) { + RetainPtr object = worklist.front(); + worklist.pop(); + + switch (object->GetType()) { + case CPDF_Object::kReference: { + const uint32_t ref_objnum = object->AsReference()->GetRefObjNum(); + PushIfNew(GetOrParseIndirectObject(ref_objnum), &visited, &worklist); + break; + } + case CPDF_Object::kArray: { + CPDF_ArrayLocker locker(object->AsArray()); + for (const auto& child : locker) { + PushIfNew(child, &visited, &worklist); + } + break; + } + case CPDF_Object::kDictionary: { + CPDF_DictionaryLocker locker(object->AsDictionary()); + for (const auto& child : locker) { + PushIfNew(child.second, &visited, &worklist); + } + break; + } + case CPDF_Object::kStream: { + PushIfNew(object->AsStream()->GetDict(), &visited, &worklist); + break; + } + default: + break; + } + } + + Freeze(); + return true; +} + +RetainPtr CPDF_BaseDocument::GetFrozenObjectForLayer( + uint32_t objnum) const { + return GetIndirectObject(objnum); +} diff --git a/core/fpdfapi/parser/cpdf_base_document.h b/core/fpdfapi/parser/cpdf_base_document.h new file mode 100644 index 0000000000..693dd2d565 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_base_document.h @@ -0,0 +1,28 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ +#define CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/retain_ptr.h" + +class IFX_SeekableReadStream; + +class CPDF_BaseDocument final : public CPDF_Document, public Retainable { + public: + CONSTRUCT_VIA_MAKE_RETAIN; + + CPDF_Parser::Error LoadBaseDoc(RetainPtr file_access, + const ByteString& password); + bool EagerlyParseAllReachable(); + + RetainPtr GetFrozenObjectForLayer(uint32_t objnum) const; + + private: + CPDF_BaseDocument(); + ~CPDF_BaseDocument() override; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ diff --git a/core/fpdfapi/parser/cpdf_base_document_unittest.cpp b/core/fpdfapi/parser/cpdf_base_document_unittest.cpp new file mode 100644 index 0000000000..c1a637df16 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_base_document_unittest.cpp @@ -0,0 +1,186 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_base_document.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/cfx_read_only_span_stream.h" +#include "core/fxcrt/check.h" +#include "core/fxcrt/data_vector.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class CPDFBaseDocumentTest : public testing::Test { + protected: + static void SetUpTestSuite() { pdfium::InitializePageModule(); } + static void TearDownTestSuite() { pdfium::DestroyPageModule(); } +}; + +RetainPtr LoadBaseDocumentFromString( + const std::string& data) { + RetainPtr document = + pdfium::MakeRetain(); + auto stream = pdfium::MakeRetain( + pdfium::span(reinterpret_cast(data.data()), + data.size())); + if (document->LoadBaseDoc(std::move(stream), "") != CPDF_Parser::SUCCESS) { + return nullptr; + } + return document; +} + +size_t CountIndirectObjects(const CPDF_IndirectObjectHolder& holder) { + return static_cast(std::distance(holder.begin(), holder.end())); +} + +std::string BuildPdfWithOrphanObject() { + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100] >>\n" + "endobj\n", + "4 0 obj\n<< /Orphan true >>\nendobj\n", + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) + << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + +} // namespace + +TEST_F(CPDFBaseDocumentTest, LoadFreezesReachableGraph) { + const std::string pdf = BuildPdfWithOrphanObject(); + RetainPtr document = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(document); + + const size_t initial_object_count = CountIndirectObjects(*document); + EXPECT_TRUE(document->IsHolderFrozen()); + EXPECT_GT(initial_object_count, 0u); + + ASSERT_TRUE(document->GetPageDictionary(0)); + EXPECT_EQ(initial_object_count, CountIndirectObjects(*document)); + ASSERT_TRUE(document->GetPageDictionary(0)); + EXPECT_EQ(initial_object_count, CountIndirectObjects(*document)); +} + +TEST_F(CPDFBaseDocumentTest, IsFrozenVisibleThroughConstObject) { + auto object = pdfium::MakeRetain(); + object->Freeze(); + const CPDF_Object* const_object = object.Get(); + EXPECT_TRUE(const_object->IsFrozen()); +} + +TEST_F(CPDFBaseDocumentTest, CloneOfFrozenObjectIsMutable) { + auto dict = pdfium::MakeRetain(); + RetainPtr nested = dict->SetNewFor("Kids"); + nested->AppendNew("child"); + dict->Freeze(); + + RetainPtr clone = ToDictionary(dict->Clone()); + ASSERT_TRUE(clone); + EXPECT_FALSE(clone->IsFrozen()); + + RetainPtr cloned_kids = clone->GetMutableArrayFor("Kids"); + ASSERT_TRUE(cloned_kids); + EXPECT_FALSE(cloned_kids->IsFrozen()); + EXPECT_FALSE(cloned_kids->GetMutableObjectAt(0)->IsFrozen()); + + clone->SetNewFor("Mutable", 1); + cloned_kids->AppendNew(2); +} + +TEST_F(CPDFBaseDocumentTest, RetainableRefCountSanity) { + RetainPtr document = + pdfium::MakeRetain(); + EXPECT_TRUE(document->HasOneRef()); + RetainPtr second_reference = document; + EXPECT_FALSE(document->HasOneRef()); + second_reference.Reset(); + EXPECT_TRUE(document->HasOneRef()); +} + +#if DCHECK_IS_ON() +TEST_F(CPDFBaseDocumentTest, HolderMutatorsDcheckAfterFreeze) { + CPDF_IndirectObjectHolder holder; + holder.NewIndirect(); + holder.Freeze(); + + EXPECT_DEATH_IF_SUPPORTED(holder.NewIndirect(), ""); + auto replacement = pdfium::MakeRetain(); + replacement->SetGenNum(1); + EXPECT_DEATH_IF_SUPPORTED(holder.ReplaceIndirectObjectIfHigherGeneration( + 1, std::move(replacement)), + ""); + EXPECT_DEATH_IF_SUPPORTED(holder.DeleteIndirectObject(1), ""); +} + +TEST_F(CPDFBaseDocumentTest, ObjectMutatorsDcheckAfterFreeze) { + auto dict = pdfium::MakeRetain(); + RetainPtr array = dict->SetNewFor("Array"); + array->AppendNew(0); + RetainPtr string = + dict->SetNewFor("String", "value"); + RetainPtr stream = + pdfium::MakeRetain(pdfium::span()); + dict->Freeze(); + stream->Freeze(); + + EXPECT_DEATH_IF_SUPPORTED(dict->SetNewFor("New", 1), ""); + EXPECT_DEATH_IF_SUPPORTED(dict->RemoveFor("String"), ""); + EXPECT_DEATH_IF_SUPPORTED(array->AppendNew(1), ""); + EXPECT_DEATH_IF_SUPPORTED(array->InsertNewAt(0, 1), ""); + EXPECT_DEATH_IF_SUPPORTED(array->SetNewAt(0, 1), ""); + EXPECT_DEATH_IF_SUPPORTED(array->RemoveAt(0), ""); + EXPECT_DEATH_IF_SUPPORTED(array->Clear(), ""); + EXPECT_DEATH_IF_SUPPORTED(stream->SetData(pdfium::span()), + ""); + EXPECT_DEATH_IF_SUPPORTED( + stream->SetDataAndRemoveFilter(pdfium::span()), ""); + EXPECT_DEATH_IF_SUPPORTED(stream->TakeData(DataVector()), ""); + EXPECT_DEATH_IF_SUPPORTED(string->SetString("changed"), ""); +} + +TEST_F(CPDFBaseDocumentTest, ReadMissAfterFreezeDchecks) { + const std::string pdf = BuildPdfWithOrphanObject(); + RetainPtr document = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(document); + EXPECT_TRUE(document->IsHolderFrozen()); + EXPECT_FALSE(document->GetFrozenObjectForLayer(4)); + + EXPECT_DEATH_IF_SUPPORTED(document->GetOrParseIndirectObject(4), ""); +} +#endif // DCHECK_IS_ON() diff --git a/core/fpdfapi/parser/cpdf_boolean.cpp b/core/fpdfapi/parser/cpdf_boolean.cpp index b3ebb95530..4674bc763c 100644 --- a/core/fpdfapi/parser/cpdf_boolean.cpp +++ b/core/fpdfapi/parser/cpdf_boolean.cpp @@ -6,6 +6,7 @@ #include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fxcrt/check.h" #include "core/fxcrt/fx_stream.h" CPDF_Boolean::CPDF_Boolean() = default; @@ -31,6 +32,7 @@ int CPDF_Boolean::GetInteger() const { } void CPDF_Boolean::SetString(const ByteString& str) { + DCHECK(!IsFrozen()); value_ = (str == "true"); } diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index 29abba7910..9d23fe69ba 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -70,6 +70,13 @@ RetainPtr CPDF_Dictionary::CloneNonCyclic( return pCopy; } +void CPDF_Dictionary::FreezeChildren(std::set* visited) { + CPDF_DictionaryLocker locker(this); + for (const auto& item : locker) { + item.second->FreezeForHolder(visited); + } +} + const CPDF_Object* CPDF_Dictionary::GetObjectForInternal( ByteStringView key) const { auto it = map_.find(key); @@ -278,6 +285,7 @@ void CPDF_Dictionary::SetFor(const ByteString& key, CPDF_Object* CPDF_Dictionary::SetForInternal(const ByteString& key, RetainPtr pObj) { CHECK(!IsLocked()); + DCHECK(!IsFrozen()); DCHECK_PDF_GRAPH_MUTABLE_FOR(this); if (!pObj) { map_.erase(key); @@ -300,6 +308,7 @@ void CPDF_Dictionary::ConvertToIndirectObjectFor( } DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); pHolder->AddIndirectObject(it->second); it->second = it->second->MakeReference(pHolder); } @@ -310,6 +319,7 @@ RetainPtr CPDF_Dictionary::RemoveFor(ByteStringView key) { if (it == map_.end()) { return RetainPtr(); } + DCHECK(!IsFrozen()); DCHECK_PDF_GRAPH_MUTABLE_FOR(this); auto node = map_.extract(it); return std::move(node.mapped()); @@ -329,6 +339,7 @@ void CPDF_Dictionary::ReplaceKey(const ByteString& oldkey, } DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); map_[MaybeIntern(newkey)] = std::move(old_it->second); map_.erase(old_it); } diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h index a6c8653bfa..2b7b13362e 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.h +++ b/core/fpdfapi/parser/cpdf_dictionary.h @@ -148,6 +148,7 @@ class CPDF_Dictionary final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* visited) const override; + void FreezeChildren(std::set* visited) override; mutable uint32_t lock_count_ = 0; WeakPtr pool_; diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index a477a82fd0..7b2c5abc09 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -62,6 +62,19 @@ RetainPtr CPDF_IndirectObjectHolder::GetOrParseIndirectObject( return pdfium::WrapRetain(GetOrParseIndirectObjectInternal(objnum)); } +void CPDF_IndirectObjectHolder::Freeze() { + if (frozen_) { + return; + } + + frozen_ = true; + for (const auto& item : indirect_objs_) { + if (item.second) { + item.second->Freeze(); + } + } +} + CPDF_Object* CPDF_IndirectObjectHolder::GetOrParseIndirectObjectInternal( uint32_t objnum) { if (objnum == 0 || objnum == CPDF_Object::kInvalidObjNum) { @@ -74,6 +87,7 @@ CPDF_Object* CPDF_IndirectObjectHolder::GetOrParseIndirectObjectInternal( return const_cast( FilterInvalidObjNum(insert_result.first->second.Get())); } + DCHECK(!frozen_); RetainPtr pNewObj = ParseIndirectObject(objnum); if (!pNewObj) { indirect_objs_.erase(insert_result.first); @@ -96,6 +110,7 @@ RetainPtr CPDF_IndirectObjectHolder::ParseIndirectObject( uint32_t CPDF_IndirectObjectHolder::AddIndirectObject( RetainPtr pObj) { DCHECK_PDF_HOLDER_MUTABLE(); + DCHECK(!frozen_); CHECK(!pObj->GetObjNum()); pObj->SetObjNum(++last_obj_num_); indirect_objs_[last_obj_num_] = std::move(pObj); @@ -117,6 +132,7 @@ bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( } DCHECK_PDF_HOLDER_MUTABLE(); + DCHECK(!frozen_); pObj->SetObjNum(objnum); obj_holder = std::move(pObj); last_obj_num_ = std::max(last_obj_num_, objnum); @@ -130,5 +146,6 @@ void CPDF_IndirectObjectHolder::DeleteIndirectObject(uint32_t objnum) { } DCHECK_PDF_HOLDER_MUTABLE(); + DCHECK(!frozen_); indirect_objs_.erase(it); } diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h index c2f35d20f0..d2d51d8e12 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h @@ -64,6 +64,8 @@ class CPDF_IndirectObjectHolder { uint32_t GetLastObjNum() const { return last_obj_num_; } void SetLastObjNum(uint32_t objnum) { last_obj_num_ = objnum; } + void Freeze(); + bool IsHolderFrozen() const { return frozen_; } WeakPtr GetByteStringPool() const { return byte_string_pool_; @@ -83,6 +85,7 @@ class CPDF_IndirectObjectHolder { friend class CPDF_Reference; uint32_t last_obj_num_ = 0; + bool frozen_ = false; std::map> indirect_objs_; WeakPtr byte_string_pool_; }; diff --git a/core/fpdfapi/parser/cpdf_name.cpp b/core/fpdfapi/parser/cpdf_name.cpp index 8fd027aa4b..95204b943f 100644 --- a/core/fpdfapi/parser/cpdf_name.cpp +++ b/core/fpdfapi/parser/cpdf_name.cpp @@ -8,6 +8,7 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcrt/check.h" #include "core/fxcrt/fx_stream.h" CPDF_Name::CPDF_Name(WeakPtr pPool, const ByteString& str) @@ -32,6 +33,7 @@ ByteString CPDF_Name::GetString() const { } void CPDF_Name::SetString(const ByteString& str) { + DCHECK(!IsFrozen()); name_ = str; } diff --git a/core/fpdfapi/parser/cpdf_number.cpp b/core/fpdfapi/parser/cpdf_number.cpp index cd5a9ed53a..7179d0dd03 100644 --- a/core/fpdfapi/parser/cpdf_number.cpp +++ b/core/fpdfapi/parser/cpdf_number.cpp @@ -9,6 +9,7 @@ #include #include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" +#include "core/fxcrt/check.h" #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/fx_string_wrappers.h" @@ -55,6 +56,7 @@ CPDF_Number* CPDF_Number::AsMutableNumber() { } void CPDF_Number::SetString(const ByteString& str) { + DCHECK(!IsFrozen()); number_ = FX_Number(str.AsStringView()); } diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp index 1f901acd09..68cbeef0bd 100644 --- a/core/fpdfapi/parser/cpdf_object.cpp +++ b/core/fpdfapi/parser/cpdf_object.cpp @@ -7,6 +7,7 @@ #include "core/fpdfapi/parser/cpdf_object.h" #include +#include #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -34,6 +35,22 @@ uint64_t CPDF_Object::KeyForCache() const { static_cast(gen_num_); } +void CPDF_Object::Freeze() { + std::set visited; + FreezeForHolder(&visited); +} + +void CPDF_Object::FreezeForHolder(std::set* visited) { + if (!visited->insert(this).second) { + return; + } + + frozen_ = true; + FreezeChildren(visited); +} + +void CPDF_Object::FreezeChildren(std::set*) {} + RetainPtr CPDF_Object::GetMutableDirect() { return pdfium::WrapRetain(const_cast(GetDirectInternal())); } diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h index 8de91f6441..a8a7ab5fac 100644 --- a/core/fpdfapi/parser/cpdf_object.h +++ b/core/fpdfapi/parser/cpdf_object.h @@ -74,6 +74,10 @@ class CPDF_Object : public Retainable { // Create a deep copy of the object. virtual RetainPtr Clone() const = 0; + void Freeze(); + void FreezeForHolder(std::set* visited); + bool IsFrozen() const { return frozen_; } + // Create a deep copy of the object except any reference object be // copied to the object it points to directly. RetainPtr CloneDirectObject() const; @@ -115,6 +119,8 @@ class CPDF_Object : public Retainable { virtual RetainPtr MakeReference( CPDF_IndirectObjectHolder* holder) const; + virtual void FreezeChildren(std::set* visited); + RetainPtr GetDirect() const; // Wraps virtual method. RetainPtr GetMutableDirect(); // Wraps virtual method. RetainPtr GetDict() const; // Wraps virtual method. @@ -156,6 +162,7 @@ class CPDF_Object : public Retainable { uint32_t obj_num_ = 0; uint32_t gen_num_ = 0; + bool frozen_ = false; }; template diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index 461f6b5de3..a98bec1353 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp @@ -89,6 +89,7 @@ CPDF_Stream* CPDF_Stream::AsMutableStream() { void CPDF_Stream::InitStreamFromFile(RetainPtr file) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); const int size = pdfium::checked_cast(file->GetSize()); data_ = std::move(file); dict_ = pdfium::MakeRetain(); @@ -116,8 +117,13 @@ RetainPtr CPDF_Stream::CloneNonCyclic( std::move(pNewDict)); } +void CPDF_Stream::FreezeChildren(std::set* visited) { + dict_->FreezeForHolder(visited); +} + void CPDF_Stream::SetDataAndRemoveFilter(pdfium::span pData) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); SetData(pData); dict_->RemoveFor("Filter"); dict_->RemoveFor(pdfium::stream::kDecodeParms); @@ -135,12 +141,14 @@ void CPDF_Stream::SetDataFromStringstreamAndRemoveFilter( void CPDF_Stream::SetData(pdfium::span pData) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); DataVector data_copy(pData.begin(), pData.end()); TakeData(std::move(data_copy)); } void CPDF_Stream::TakeData(DataVector data) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); const int size = pdfium::checked_cast(data.size()); data_ = std::move(data); SetLengthInDict(size); @@ -148,6 +156,7 @@ void CPDF_Stream::TakeData(DataVector data) { void CPDF_Stream::SetDataFromStringstream(fxcrt::ostringstream* stream) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); if (stream->tellp() <= 0) { SetData({}); return; @@ -223,5 +232,6 @@ pdfium::span CPDF_Stream::GetInMemoryRawData() const { void CPDF_Stream::SetLengthInDict(int length) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); dict_->SetNewFor("Length", length); } diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h index ffeea79cac..a618df5b85 100644 --- a/core/fpdfapi/parser/cpdf_stream.h +++ b/core/fpdfapi/parser/cpdf_stream.h @@ -90,6 +90,7 @@ class CPDF_Stream final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* pVisited) const override; + void FreezeChildren(std::set* visited) override; void SetLengthInDict(int length); diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp index 39434349f9..2b4553d792 100644 --- a/core/fpdfapi/parser/cpdf_string.cpp +++ b/core/fpdfapi/parser/cpdf_string.cpp @@ -13,6 +13,7 @@ #include "core/fpdfapi/parser/cpdf_encryptor.h" #include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/check.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fx_stream.h" @@ -58,6 +59,7 @@ ByteString CPDF_String::GetString() const { void CPDF_String::SetString(const ByteString& str) { DCHECK_PDF_GRAPH_MUTABLE_FOR(this); + DCHECK(!IsFrozen()); data_ = str; } diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index b903c2b31f..6fbabc94d1 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -7,6 +7,7 @@ import("../testing/test.gni") source_set("fpdfsdk") { sources = [ + "epdf_base_document.cpp", "epdf_outline.cpp", "epdf_png_shim.cpp", "epdf_jpeg_shim.cpp", diff --git a/fpdfsdk/epdf_base_document.cpp b/fpdfsdk/epdf_base_document.cpp new file mode 100644 index 0000000000..212b329c11 --- /dev/null +++ b/fpdfsdk/epdf_base_document.cpp @@ -0,0 +1,48 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdfview.h" + +#include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fxcrt/retain_ptr.h" +#include "fpdfsdk/cpdfsdk_customaccess.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace { + +CPDF_BaseDocument* CPDFBaseDocumentFromEPDFBaseDocument( + EPDF_BASE_DOCUMENT base) { + return reinterpret_cast(base); +} + +EPDF_BASE_DOCUMENT EPDFBaseDocumentFromCPDFBaseDocument( + CPDF_BaseDocument* base) { + return reinterpret_cast(base); +} + +} // namespace + +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { + if (!pFileAccess) { + return nullptr; + } + + RetainPtr base = pdfium::MakeRetain(); + CPDF_Parser::Error error = base->LoadBaseDoc( + pdfium::MakeRetain(pFileAccess), password); + if (error != CPDF_Parser::SUCCESS) { + ProcessParseError(error); + return nullptr; + } + + return EPDFBaseDocumentFromCPDFBaseDocument(base.Leak()); +} + +FPDF_EXPORT void FPDF_CALLCONV +EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base) { + RetainPtr retained; + retained.Unleak(CPDFBaseDocumentFromEPDFBaseDocument(base)); +} diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index a4f21974cf..88210ef78b 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -534,6 +534,8 @@ int CheckPDFiumCApi() { CHK(FPDF_GetXFAPacketName); CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); + CHK(EPDF_LoadBaseDocument); + CHK(EPDF_ReleaseBaseDocument); CHK(FPDF_LoadCustomDocument); CHK(FPDF_LoadDocument); CHK(FPDF_LoadMemDocument); diff --git a/public/fpdfview.h b/public/fpdfview.h index 2af9a0ac41..e9b13000a7 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -67,6 +67,7 @@ typedef struct fpdf_bitmap_t__* FPDF_BITMAP; typedef struct fpdf_bookmark_t__* FPDF_BOOKMARK; typedef struct fpdf_clippath_t__* FPDF_CLIPPATH; typedef struct fpdf_dest_t__* FPDF_DEST; +typedef struct fpdf_base_document_t__* EPDF_BASE_DOCUMENT; typedef struct fpdf_document_t__* FPDF_DOCUMENT; typedef struct fpdf_font_t__* FPDF_FONT; typedef struct fpdf_form_handle_t__* FPDF_FORMHANDLE; @@ -562,6 +563,23 @@ typedef struct FPDF_FILEHANDLER_ { FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); +// Function: EPDF_LoadBaseDocument +// Load and freeze a shareable base PDF document from a custom access +// descriptor. The returned handle is distinct from FPDF_DOCUMENT and +// cannot be used with ordinary document APIs such as FPDF_LoadPage(). +// Parameters: +// pFileAccess - A structure for accessing the file. +// password - Optional password for decrypting the PDF file. +// Return value: +// A handle to the loaded base document, or NULL on failure. +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); + +// Function: EPDF_ReleaseBaseDocument +// Release a base document returned by EPDF_LoadBaseDocument(). +FPDF_EXPORT void FPDF_CALLCONV +EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base); + // Function: FPDF_GetFileVersion // Get the file version of the given PDF document. // Parameters: From ef257bad4c3c520cd5b6e3167065e93003ca8da7 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 23:25:50 +0300 Subject: [PATCH 09/56] CPDF_LayerDocument (read fall-through) --- core/fpdfapi/parser/BUILD.gn | 3 + .../parser/cpdf_indirect_object_holder.cpp | 7 +- core/fpdfapi/parser/cpdf_layer_document.cpp | 173 ++++++++++++++++++ core/fpdfapi/parser/cpdf_layer_document.h | 73 ++++++++ .../parser/cpdf_layer_document_unittest.cpp | 139 ++++++++++++++ fpdfsdk/BUILD.gn | 1 + fpdfsdk/epdf_layer.cpp | 102 +++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 4 + fpdfsdk/fpdf_view_embeddertest.cpp | 31 ++++ public/fpdfview.h | 44 +++++ 10 files changed, 576 insertions(+), 1 deletion(-) create mode 100644 core/fpdfapi/parser/cpdf_layer_document.cpp create mode 100644 core/fpdfapi/parser/cpdf_layer_document.h create mode 100644 core/fpdfapi/parser/cpdf_layer_document_unittest.cpp create mode 100644 fpdfsdk/epdf_layer.cpp diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn index 12787998fe..c3ccf34648 100644 --- a/core/fpdfapi/parser/BUILD.gn +++ b/core/fpdfapi/parser/BUILD.gn @@ -35,6 +35,8 @@ source_set("parser") { "cpdf_hint_tables.h", "cpdf_indirect_object_holder.cpp", "cpdf_indirect_object_holder.h", + "cpdf_layer_document.cpp", + "cpdf_layer_document.h", "cpdf_linearized_header.cpp", "cpdf_linearized_header.h", "cpdf_name.cpp", @@ -126,6 +128,7 @@ pdfium_unittest_source_set("unittests") { "cpdf_document_unittest.cpp", "cpdf_hint_tables_unittest.cpp", "cpdf_indirect_object_holder_unittest.cpp", + "cpdf_layer_document_unittest.cpp", "cpdf_number_unittest.cpp", "cpdf_object_avail_unittest.cpp", "cpdf_object_stream_unittest.cpp", diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 7b2c5abc09..9c8f87b836 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -53,8 +53,13 @@ const CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObjectInternal( RetainPtr CPDF_IndirectObjectHolder::FindLocalIndirectObject( uint32_t objnum) const { + auto it = indirect_objs_.find(objnum); + if (it == indirect_objs_.end()) { + return nullptr; + } + return pdfium::WrapRetain( - const_cast(GetIndirectObjectInternal(objnum))); + const_cast(FilterInvalidObjNum(it->second.Get()))); } RetainPtr CPDF_IndirectObjectHolder::GetOrParseIndirectObject( diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp new file mode 100644 index 0000000000..18e7626c54 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -0,0 +1,173 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_layer_document.h" + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/render/cpdf_docrenderdata.h" +#include "core/fxcrt/check.h" +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/notreached.h" + +CPDF_LayerDocument::CPDF_LayerDocument( + RetainPtr base, + RetainPtr file_access) + : CPDF_Document(std::make_unique( + CPDF_DocRenderData::FromDocument(base.Get())), + std::make_unique( + CPDF_DocPageData::FromDocument(base.Get()))), + base_(std::move(base)), + file_access_(std::move(file_access)) { + CHECK(base_); + SetLastObjNum(base_->GetLastObjNum()); + InitializeFromBase(); + IngestCurrentDelta(); +} + +CPDF_LayerDocument::~CPDF_LayerDocument() = default; + +// static +CPDF_LayerDocument* CPDF_LayerDocument::FromDocument(CPDF_Document* document) { + return document && document->IsLayerDocument() + ? static_cast(document) + : nullptr; +} + +// static +const CPDF_LayerDocument* CPDF_LayerDocument::FromDocument( + const CPDF_Document* document) { + return document && document->IsLayerDocument() + ? static_cast(document) + : nullptr; +} + +size_t CPDF_LayerDocument::GetPromotedObjectCount() const { + return static_cast(std::distance(begin(), end())); +} + +CPDF_Parser* CPDF_LayerDocument::GetParser() const { + return base_->GetParser(); +} + +uint32_t CPDF_LayerDocument::GetUserPermissions(bool get_owner_perms) const { + return base_->GetUserPermissions(get_owner_perms); +} + +RetainPtr CPDF_LayerDocument::FindPromotedObject( + uint32_t objnum) const { + return FindLocalIndirectObject(objnum); +} + +bool CPDF_LayerDocument::IsLayerDocument() const { + return true; +} + +RetainPtr CPDF_LayerDocument::ParseIndirectObject( + uint32_t objnum) { + NOTREACHED(); + return nullptr; +} + +RetainPtr CPDF_LayerDocument::GetMutableIndirectObject( + uint32_t objnum) { + NOTREACHED(); + return nullptr; +} + +void CPDF_LayerDocument::DeleteIndirectObject(uint32_t objnum) { + if (FindLocalIndirectObject(objnum)) { + CPDF_Document::DeleteIndirectObject(objnum); + } +} + +const CPDF_Object* CPDF_LayerDocument::GetIndirectObjectInternal( + uint32_t objnum) const { + if (RetainPtr local = FindLocalIndirectObject(objnum)) { + return local.Get(); + } + return base_->GetFrozenObjectForLayer(objnum).Get(); +} + +CPDF_Object* CPDF_LayerDocument::GetOrParseIndirectObjectInternal( + uint32_t objnum) { + return const_cast(GetIndirectObjectInternal(objnum)); +} + +uint32_t CPDF_LayerDocument::GetPageObjNumAt(size_t index) const { + CHECK_LT(index, layer_page_list_.size()); + return layer_page_list_[index]; +} + +void CPDF_LayerDocument::SetPageObjNumAt(size_t index, uint32_t objnum) { + CHECK_LT(index, layer_page_list_.size()); + layer_page_list_[index] = objnum; +} + +void CPDF_LayerDocument::InsertPageObjNum(size_t index, uint32_t objnum) { + CHECK_LE(index, layer_page_list_.size()); + layer_page_list_.insert(layer_page_list_.begin() + index, objnum); +} + +void CPDF_LayerDocument::ErasePageObjNum(size_t index) { + CHECK_LT(index, layer_page_list_.size()); + layer_page_list_.erase(layer_page_list_.begin() + index); +} + +void CPDF_LayerDocument::ResizePageList(size_t size) { + layer_page_list_.resize(size); +} + +size_t CPDF_LayerDocument::GetPageListSize() const { + return layer_page_list_.size(); +} + +void CPDF_LayerDocument::InitializeFromBase() { + SetCachedRootDict( + pdfium::WrapRetain(const_cast(base_->GetRoot()))); + SetCachedInfoDict(base_->GetInfo()); + + const int page_count = base_->GetPageCount(); + if (page_count < 0) { + ingest_status_ = OpenStatus::kOpenFailed; + return; + } + + layer_page_list_.reserve(static_cast(page_count)); + for (int i = 0; i < page_count; ++i) { + RetainPtr page = base_->GetPageDictionary(i); + layer_page_list_.push_back(page ? page->GetObjNum() : 0); + } +} + +void CPDF_LayerDocument::IngestCurrentDelta() { + if (ingest_status_ != OpenStatus::kSuccess) { + return; + } + + CPDF_Parser* base_parser = base_->GetParser(); + if (!base_parser || !file_access_) { + ingest_status_ = OpenStatus::kOpenFailed; + return; + } + + const FX_FILESIZE base_end = base_parser->GetDocumentSize(); + const FX_FILESIZE layer_size = file_access_->GetSize(); + if (layer_size < base_end) { + ingest_status_ = OpenStatus::kBaseLayerMismatch; + return; + } + if (layer_size > base_end) { + // Full appended-xref ingest lands with the delta parser. Until then, fail + // closed instead of silently ignoring a caller-provided delta. + ingest_status_ = OpenStatus::kMalformedDelta; + } +} diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h new file mode 100644 index 0000000000..442f9e2f16 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -0,0 +1,73 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_LAYER_DOCUMENT_H_ +#define CORE_FPDFAPI_PARSER_CPDF_LAYER_DOCUMENT_H_ + +#include +#include + +#include + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/retain_ptr.h" + +class CPDF_BaseDocument; +class IFX_SeekableReadStream; + +class CPDF_LayerDocument final : public CPDF_Document { + public: + enum class OpenStatus { + kSuccess, + kMalformedDelta, + kBaseLayerMismatch, + kOpenFailed, + }; + + CPDF_LayerDocument(RetainPtr base, + RetainPtr file_access); + ~CPDF_LayerDocument() override; + + static CPDF_LayerDocument* FromDocument(CPDF_Document* document); + static const CPDF_LayerDocument* FromDocument(const CPDF_Document* document); + + OpenStatus ingest_status() const { return ingest_status_; } + size_t GetPromotedObjectCount() const; + CPDF_BaseDocument* GetBaseDocument() const { return base_.Get(); } + + // CPDF_Document: + CPDF_Parser* GetParser() const override; + uint32_t GetUserPermissions(bool get_owner_perms) const override; + RetainPtr FindPromotedObject(uint32_t objnum) const override; + bool IsLayerDocument() const override; + + // CPDF_Parser::ParsedObjectsHolder: + RetainPtr ParseIndirectObject(uint32_t objnum) override; + RetainPtr GetMutableIndirectObject(uint32_t objnum) override; + void DeleteIndirectObject(uint32_t objnum) override; + + protected: + // CPDF_IndirectObjectHolder: + const CPDF_Object* GetIndirectObjectInternal(uint32_t objnum) const override; + CPDF_Object* GetOrParseIndirectObjectInternal(uint32_t objnum) override; + + // CPDF_Document page-list storage: + uint32_t GetPageObjNumAt(size_t index) const override; + void SetPageObjNumAt(size_t index, uint32_t objnum) override; + void InsertPageObjNum(size_t index, uint32_t objnum) override; + void ErasePageObjNum(size_t index) override; + void ResizePageList(size_t size) override; + size_t GetPageListSize() const override; + + private: + void InitializeFromBase(); + void IngestCurrentDelta(); + + RetainPtr const base_; + RetainPtr const file_access_; + std::vector layer_page_list_; + OpenStatus ingest_status_ = OpenStatus::kSuccess; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_LAYER_DOCUMENT_H_ diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp new file mode 100644 index 0000000000..4444b49067 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -0,0 +1,139 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_layer_document.h" + +#include +#include +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fxcrt/cfx_read_only_span_stream.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class CPDFLayerDocumentTest : public testing::Test { + protected: + static void SetUpTestSuite() { pdfium::InitializePageModule(); } + static void TearDownTestSuite() { pdfium::DestroyPageModule(); } +}; + +std::string BuildSimplePdf() { + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100] >>\n" + "endobj\n", + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + +RetainPtr MakeStreamForString(const std::string& data) { + return pdfium::MakeRetain( + pdfium::span(reinterpret_cast(data.data()), data.size())); +} + +RetainPtr LoadBaseDocumentFromString( + const std::string& data) { + RetainPtr document = + pdfium::MakeRetain(); + if (document->LoadBaseDoc(MakeStreamForString(data), "") != + CPDF_Parser::SUCCESS) { + return nullptr; + } + return document; +} + +} // namespace + +TEST_F(CPDFLayerDocumentTest, FreshLayerFallsThroughToFrozenBase) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kSuccess, layer->ingest_status()); + EXPECT_TRUE(layer->IsLayerDocument()); + EXPECT_EQ(base->GetParser(), layer->GetParser()); + EXPECT_EQ(base->GetLastObjNum(), layer->GetLastObjNum()); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); + EXPECT_EQ(1, layer->GetPageCount()); + + RetainPtr page = layer->GetPageDictionary(0); + ASSERT_TRUE(page); + EXPECT_EQ(3u, page->GetObjNum()); + EXPECT_EQ(base->GetFrozenObjectForLayer(3).Get(), page.Get()); + EXPECT_EQ(base->GetUserPermissions(false), layer->GetUserPermissions(false)); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); +} + +TEST_F(CPDFLayerDocumentTest, DeleteBaseObjectIsNoOp) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + ASSERT_TRUE(layer->GetIndirectObject(1)); + layer->DeleteIndirectObject(1); + EXPECT_TRUE(layer->GetIndirectObject(1)); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); +} + +TEST_F(CPDFLayerDocumentTest, AppendedBytesFailClosedUntilDeltaIngestLands) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + const std::string layer_bytes = pdf + "\n% appended delta placeholder\n"; + + auto layer = std::make_unique( + base, MakeStreamForString(layer_bytes)); + + EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kMalformedDelta, + layer->ingest_status()); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); +} + +#if DCHECK_IS_ON() +TEST_F(CPDFLayerDocumentTest, MutatorsDcheckUntilCowSliceLands) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + EXPECT_DEATH_IF_SUPPORTED(layer->GetMutableIndirectObject(1), ""); + EXPECT_DEATH_IF_SUPPORTED(layer->ParseIndirectObject(1), ""); +} +#endif // DCHECK_IS_ON() diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 6fbabc94d1..99aacb3175 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -8,6 +8,7 @@ import("../testing/test.gni") source_set("fpdfsdk") { sources = [ "epdf_base_document.cpp", + "epdf_layer.cpp", "epdf_outline.cpp", "epdf_png_shim.cpp", "epdf_jpeg_shim.cpp", diff --git a/fpdfsdk/epdf_layer.cpp b/fpdfsdk/epdf_layer.cpp new file mode 100644 index 0000000000..738b724a00 --- /dev/null +++ b/fpdfsdk/epdf_layer.cpp @@ -0,0 +1,102 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdfview.h" + +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_layer_document.h" +#include "core/fxcrt/retain_ptr.h" +#include "fpdfsdk/cpdfsdk_customaccess.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace { + +CPDF_BaseDocument* CPDFBaseDocumentFromEPDFBaseDocument( + EPDF_BASE_DOCUMENT base) { + return reinterpret_cast(base); +} + +EPDF_BASE_DOCUMENT EPDFBaseDocumentFromCPDFBaseDocument( + CPDF_BaseDocument* base) { + return reinterpret_cast(base); +} + +EPDFLayerOpenStatus ToPublicStatus(CPDF_LayerDocument::OpenStatus status) { + switch (status) { + case CPDF_LayerDocument::OpenStatus::kSuccess: + return EPDFLayerOpenStatus_kSuccess; + case CPDF_LayerDocument::OpenStatus::kMalformedDelta: + return EPDFLayerOpenStatus_kMalformedDelta; + case CPDF_LayerDocument::OpenStatus::kBaseLayerMismatch: + return EPDFLayerOpenStatus_kBaseLayerMismatch; + case CPDF_LayerDocument::OpenStatus::kOpenFailed: + return EPDFLayerOpenStatus_kOpenFailed; + } +} + +} // namespace + +FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV +EPDFLayer_OpenLayer(EPDF_BASE_DOCUMENT base, + FPDF_FILEACCESS* pFileAccess, + FPDF_BYTESTRING password, + EPDFLayerOpenStatus* out_status) { + if (out_status) { + *out_status = EPDFLayerOpenStatus_kOpenFailed; + } + if (!base || !pFileAccess) { + return nullptr; + } + + // Slice 7.2 layers share the base parser/security state; password handling is + // already complete when the base is loaded. + (void)password; + + CPDF_BaseDocument* base_doc = CPDFBaseDocumentFromEPDFBaseDocument(base); + RetainPtr retained_base = pdfium::WrapRetain(base_doc); + auto layer = std::make_unique( + std::move(retained_base), + pdfium::MakeRetain(pFileAccess)); + + const EPDFLayerOpenStatus status = ToPublicStatus(layer->ingest_status()); + if (out_status) { + *out_status = status; + } + if (status != EPDFLayerOpenStatus_kSuccess) { + return nullptr; + } + + return FPDFDocumentFromCPDFDocument(layer.release()); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_IsObjectPromoted(FPDF_DOCUMENT layer, unsigned long obj_num) { + if (obj_num > std::numeric_limits::max()) { + return false; + } + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + return layer_doc && + layer_doc->IsObjectPromoted(static_cast(obj_num)); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFLayer_GetPromotedObjectCount(FPDF_DOCUMENT layer) { + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + return layer_doc ? layer_doc->GetPromotedObjectCount() : 0; +} + +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDFLayer_GetBaseDocument(FPDF_DOCUMENT layer) { + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + return layer_doc ? EPDFBaseDocumentFromCPDFBaseDocument( + layer_doc->GetBaseDocument()) + : nullptr; +} diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 88210ef78b..f51db07ece 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -535,6 +535,10 @@ int CheckPDFiumCApi() { CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); CHK(EPDF_LoadBaseDocument); + CHK(EPDFLayer_GetBaseDocument); + CHK(EPDFLayer_GetPromotedObjectCount); + CHK(EPDFLayer_IsObjectPromoted); + CHK(EPDFLayer_OpenLayer); CHK(EPDF_ReleaseBaseDocument); CHK(FPDF_LoadCustomDocument); CHK(FPDF_LoadDocument); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 56b87842e4..1131e8e967 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -18,6 +18,7 @@ #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/fpdf_view_c_api_test.h" #include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_annot.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/embedder_test_constants.h" @@ -659,6 +660,36 @@ TEST_F(FPDFViewEmbedderTest, LoadCustomDocumentWithShortLivedFileAccess) { EXPECT_FLOAT_EQ(300.0f, FPDF_GetPageHeightF(page.get())); } +TEST_F(FPDFViewEmbedderTest, OpenFreshLayerRendersWithEmptyOverlay) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + { + FileAccessForTesting layer_access("rectangles.pdf"); + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(base, EPDFLayer_GetBaseDocument(layer.get())); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(layer.get(), 1)); + EXPECT_EQ(1, FPDF_GetPageCount(layer.get())); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + EXPECT_FLOAT_EQ(200.0f, FPDF_GetPageWidthF(page.get())); + EXPECT_FLOAT_EQ(300.0f, FPDF_GetPageHeightF(page.get())); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + ScopedFPDFBitmap bitmap = RenderPage(page.get()); + ASSERT_TRUE(bitmap); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + } + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/public/fpdfview.h b/public/fpdfview.h index e9b13000a7..dad1f1246c 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -580,6 +580,50 @@ EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); FPDF_EXPORT void FPDF_CALLCONV EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base); +// Runtime-side status for opening a layer on top of a base document. +typedef enum { + EPDFLayerOpenStatus_kSuccess = 0, + EPDFLayerOpenStatus_kPasswordRequired = 1, + EPDFLayerOpenStatus_kMalformedDelta = 2, + EPDFLayerOpenStatus_kBaseLayerMismatch = 3, + EPDFLayerOpenStatus_kOpenFailed = 4, +} EPDFLayerOpenStatus; + +// Function: EPDFLayer_OpenLayer +// Open a layer view on top of a previously loaded base document. +// The returned handle is an ordinary FPDF_DOCUMENT and must be closed +// with FPDF_CloseDocument(). +// Parameters: +// base - A base document returned by EPDF_LoadBaseDocument(). +// pFileAccess - A structure for accessing the materialized layer +// bytes. For Slice 7.2 this must be the base bytes +// with no appended delta. +// password - Reserved for future delta-password handling. +// out_status - Optional detailed open status. +// Return value: +// A layer document handle, or NULL on failure. +FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV +EPDFLayer_OpenLayer(EPDF_BASE_DOCUMENT base, + FPDF_FILEACCESS* pFileAccess, + FPDF_BYTESTRING password, + EPDFLayerOpenStatus* out_status); + +// Function: EPDFLayer_IsObjectPromoted +// Return whether the object exists in the layer overlay. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_IsObjectPromoted(FPDF_DOCUMENT layer, unsigned long obj_num); + +// Function: EPDFLayer_GetPromotedObjectCount +// Return the number of objects currently stored in the layer overlay. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFLayer_GetPromotedObjectCount(FPDF_DOCUMENT layer); + +// Function: EPDFLayer_GetBaseDocument +// Return the layer's borrowed base document handle. The caller MUST +// NOT release the returned handle. +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDFLayer_GetBaseDocument(FPDF_DOCUMENT layer); + // Function: FPDF_GetFileVersion // Get the file version of the given PDF document. // Parameters: From b345d990874d06fbcbc07001b702f5079066a8c4 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 23:44:47 +0300 Subject: [PATCH 10/56] COW on actual mutable handle USE --- core/fpdfapi/page/cpdf_annotcontext.cpp | 48 ++++++- core/fpdfapi/page/cpdf_annotcontext.h | 11 +- core/fpdfapi/page/cpdf_contentparser.cpp | 8 +- core/fpdfapi/page/cpdf_form.cpp | 38 +++-- core/fpdfapi/page/cpdf_form.h | 12 +- core/fpdfapi/page/cpdf_page.cpp | 23 ++- core/fpdfapi/page/cpdf_page.h | 4 + core/fpdfapi/page/cpdf_pageobjectholder.cpp | 132 ++++++++++++++++++ core/fpdfapi/page/cpdf_pageobjectholder.h | 26 ++-- .../fpdfapi/page/cpdf_streamcontentparser.cpp | 7 +- core/fpdfapi/parser/cpdf_array.cpp | 19 ++- core/fpdfapi/parser/cpdf_dictionary.cpp | 21 ++- .../parser/cpdf_indirect_object_holder.cpp | 2 +- core/fpdfapi/parser/cpdf_layer_document.cpp | 22 +++ core/fpdfapi/parser/cpdf_layer_document.h | 2 + .../parser/cpdf_layer_document_unittest.cpp | 9 ++ core/fpdfapi/parser/cpdf_object.h | 5 +- core/fpdfapi/parser/cpdf_reference.cpp | 5 + core/fpdfapi/parser/cpdf_reference.h | 1 + core/fpdfapi/render/cpdf_renderstatus.cpp | 4 +- core/fpdfdoc/cpdf_annot.cpp | 8 +- fpdfsdk/cpdfsdk_renderpage.cpp | 5 +- fpdfsdk/fpdf_annot.cpp | 5 +- fpdfsdk/fpdf_view.cpp | 107 ++++++++------ fpdfsdk/fpdf_view_embeddertest.cpp | 26 ++++ 25 files changed, 449 insertions(+), 101 deletions(-) diff --git a/core/fpdfapi/page/cpdf_annotcontext.cpp b/core/fpdfapi/page/cpdf_annotcontext.cpp index dcaf973548..75fa276107 100644 --- a/core/fpdfapi/page/cpdf_annotcontext.cpp +++ b/core/fpdfapi/page/cpdf_annotcontext.cpp @@ -10,13 +10,20 @@ #include "core/fpdfapi/page/cpdf_form.h" #include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/check.h" +#include "core/fxcrt/check_op.h" CPDF_AnnotContext::CPDF_AnnotContext(RetainPtr pAnnotDict, - IPDF_Page* pPage) - : annot_dict_(std::move(pAnnotDict)), page_(pPage) { + IPDF_Page* pPage, + int annot_index) + : annot_dict_(std::move(pAnnotDict)), + page_(pPage), + annot_index_(annot_index) { DCHECK(annot_dict_); DCHECK(page_); DCHECK(page_->AsPDFPage()); @@ -27,7 +34,10 @@ CPDF_AnnotContext::~CPDF_AnnotContext() = default; void CPDF_AnnotContext::SetForm(RetainPtr pStream) { CHECK(pStream); annot_form_ = std::make_unique( - page_->GetDocument(), page_->AsPDFPage()->GetMutableResources(), pStream); + page_->GetDocument(), + pdfium::WrapRetain(const_cast( + page_->AsPDFPage()->GetResources().Get())), + pStream); // The annotation expects the form content to be parsed with the identity // matrix (ignoring the matrix defined in the stream). To achieve this without @@ -38,3 +48,35 @@ void CPDF_AnnotContext::SetForm(RetainPtr pStream) { pStream->GetDict()->GetMatrixFor("Matrix").GetInverse(); annot_form_->ParseContent(nullptr, &inverse_stream_matrix, nullptr); } + +RetainPtr CPDF_AnnotContext::GetMutableAnnotDict() { + CPDF_Page* page = page_ ? page_->AsPDFPage() : nullptr; + CPDF_Document* doc = page ? page->GetDocument() : nullptr; + if (!doc) { + return annot_dict_; + } + + const uint32_t objnum = annot_dict_->GetObjNum(); + if (objnum != 0) { + RetainPtr live = doc->GetMutableIndirectObject(objnum); + if (live && live.Get() != annot_dict_.Get()) { + annot_dict_ = pdfium::WrapRetain(live->AsMutableDictionary()); + } + return annot_dict_; + } + + if (annot_dict_->IsFrozen()) { + EnsureMutableBackingForAnnotDict(); + } + return annot_dict_; +} + +void CPDF_AnnotContext::EnsureMutableBackingForAnnotDict() { + CHECK_GE(annot_index_, 0); + CPDF_Page* page = page_->AsPDFPage(); + RetainPtr page_dict = page->GetMutableDict(); + RetainPtr annots = page_dict->GetMutableArrayFor("Annots"); + CHECK(annots); + annot_dict_ = annots->GetMutableDictAt(annot_index_); + CHECK(annot_dict_); +} diff --git a/core/fpdfapi/page/cpdf_annotcontext.h b/core/fpdfapi/page/cpdf_annotcontext.h index b1d008bf26..ebc16c97a1 100644 --- a/core/fpdfapi/page/cpdf_annotcontext.h +++ b/core/fpdfapi/page/cpdf_annotcontext.h @@ -19,7 +19,9 @@ class IPDF_Page; class CPDF_AnnotContext { public: - CPDF_AnnotContext(RetainPtr pAnnotDict, IPDF_Page* pPage); + CPDF_AnnotContext(RetainPtr pAnnotDict, + IPDF_Page* pPage, + int annot_index = -1); ~CPDF_AnnotContext(); void SetForm(RetainPtr pStream); @@ -27,16 +29,19 @@ class CPDF_AnnotContext { CPDF_Form* GetForm() const { return annot_form_.get(); } // Never nullptr. - RetainPtr GetMutableAnnotDict() { return annot_dict_; } + RetainPtr GetMutableAnnotDict(); const CPDF_Dictionary* GetAnnotDict() const { return annot_dict_.Get(); } // Never nullptr. IPDF_Page* GetPage() const { return page_; } private: + void EnsureMutableBackingForAnnotDict(); + std::unique_ptr annot_form_; - RetainPtr const annot_dict_; + RetainPtr annot_dict_; UnownedPtr const page_; + const int annot_index_ = -1; }; #endif // CORE_FPDFAPI_PAGE_CPDF_ANNOTCONTEXT_H_ diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index 4e74180fcf..80e7c9a620 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp @@ -97,9 +97,11 @@ CPDF_ContentParser::CPDF_ContentParser( page_object_holder_->GetDict()->GetDictFor("Resources"); parser_ = std::make_unique( page_object_holder_->GetDocument(), - page_object_holder_->GetMutablePageResources(), - page_object_holder_->GetMutableResources(), pParentMatrix, - page_object_holder_, + pdfium::WrapRetain(const_cast( + page_object_holder_->GetPageResources().Get())), + pdfium::WrapRetain(const_cast( + page_object_holder_->GetResources().Get())), + pParentMatrix, page_object_holder_, pdfium::WrapRetain(const_cast(pResources.Get())), form_bbox, pGraphicStates, recursion_state); parser_->GetCurStates()->set_current_transformation_matrix(form_matrix); diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp index c363862ace..76daf765ba 100644 --- a/core/fpdfapi/page/cpdf_form.cpp +++ b/core/fpdfapi/page/cpdf_form.cpp @@ -14,6 +14,8 @@ #include "core/fpdfapi/page/cpdf_pageobject.h" #include "core/fpdfapi/page/cpdf_pageobjectholder.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/check_op.h" #include "core/fxge/dib/cfx_dibitmap.h" @@ -23,10 +25,10 @@ CPDF_Form::RecursionState::RecursionState() = default; CPDF_Form::RecursionState::~RecursionState() = default; // static -CPDF_Dictionary* CPDF_Form::ChooseResourcesDict( - CPDF_Dictionary* pResources, - CPDF_Dictionary* pParentResources, - CPDF_Dictionary* pPageResources) { +const CPDF_Dictionary* CPDF_Form::ChooseResourcesDict( + const CPDF_Dictionary* pResources, + const CPDF_Dictionary* pParentResources, + const CPDF_Dictionary* pPageResources) { if (pResources) { return pResources; } @@ -47,13 +49,13 @@ CPDF_Form::CPDF_Form(CPDF_Document* doc, CPDF_Dictionary* pParentResources) : CPDF_PageObjectHolder( doc, - pFormStream->GetMutableDict(), + pdfium::WrapRetain( + const_cast(pFormStream->GetDict().Get())), pPageResources, - pdfium::WrapRetain(ChooseResourcesDict( - const_cast( - pFormStream->GetDict()->GetDictFor("Resources").Get()), + pdfium::WrapRetain(const_cast(ChooseResourcesDict( + pFormStream->GetDict()->GetDictFor("Resources").Get(), pParentResources, - pPageResources.Get()))), + pPageResources.Get())))), form_stream_(std::move(pFormStream)) { LoadTransparencyInfo(); } @@ -118,9 +120,27 @@ CFX_FloatRect CPDF_Form::CalcBoundingBox() const { } RetainPtr CPDF_Form::GetMutableFormStream() { + CPDF_Document* doc = GetDocument(); + if (!doc || !form_stream_) { + return form_stream_; + } + + const uint32_t objnum = form_stream_->GetObjNum(); + DCHECK(objnum); + RetainPtr live = doc->GetMutableIndirectObject(objnum); + if (live && live.Get() != form_stream_.Get()) { + form_stream_ = pdfium::WrapRetain(live->AsMutableStream()); + } return form_stream_; } +void CPDF_Form::EnsureMutableBackingObjectForDict() { + RetainPtr live_stream = GetMutableFormStream(); + if (live_stream) { + dict_ = live_stream->GetMutableDict(); + } +} + RetainPtr CPDF_Form::GetStream() const { return form_stream_; } diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index 354c50d051..80ab06eeec 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h @@ -32,9 +32,10 @@ class CPDF_Form final : public CPDF_PageObjectHolder, }; // Helper method to choose the first non-null resources dictionary. - static CPDF_Dictionary* ChooseResourcesDict(CPDF_Dictionary* pResources, - CPDF_Dictionary* pParentResources, - CPDF_Dictionary* pPageResources); + static const CPDF_Dictionary* ChooseResourcesDict( + const CPDF_Dictionary* pResources, + const CPDF_Dictionary* pParentResources, + const CPDF_Dictionary* pPageResources); CPDF_Form(CPDF_Document* document, RetainPtr pPageResources, @@ -64,13 +65,16 @@ class CPDF_Form final : public CPDF_PageObjectHolder, RetainPtr GetStream() const; private: + // CPDF_PageObjectHolder: + void EnsureMutableBackingObjectForDict() override; + void ParseContentInternal(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, CPDF_Type3Char* pType3Char, RecursionState* recursion_state); RecursionState recursion_state_; - RetainPtr const form_stream_; + RetainPtr form_stream_; }; #endif // CORE_FPDFAPI_PAGE_CPDF_FORM_H_ diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp index f0f7c25993..2490f624a4 100644 --- a/core/fpdfapi/page/cpdf_page.cpp +++ b/core/fpdfapi/page/cpdf_page.cpp @@ -15,6 +15,7 @@ #include "core/fpdfapi/page/cpdf_pageobject.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fxcrt/check.h" #include "core/fxcrt/check_op.h" @@ -28,9 +29,10 @@ CPDF_Page::CPDF_Page(CPDF_Document* document, // Cannot initialize |resources_| and |page_resources_| via the // CPDF_PageObjectHolder ctor because GetPageAttr() requires // CPDF_PageObjectHolder to finish initializing first. - RetainPtr pPageAttr = - GetMutablePageAttr(pdfium::page_object::kResources); - resources_ = pPageAttr ? pPageAttr->GetMutableDict() : nullptr; + RetainPtr pPageAttr = + GetPageAttr(pdfium::page_object::kResources); + resources_ = pdfium::WrapRetain(const_cast( + pPageAttr ? pPageAttr->GetDict().Get() : nullptr)); page_resources_ = resources_; UpdateDimensions(); @@ -81,6 +83,21 @@ RetainPtr CPDF_Page::GetMutablePageAttr(ByteStringView name) { return pdfium::WrapRetain(const_cast(GetPageAttr(name).Get())); } +void CPDF_Page::EnsureMutableBackingObjectForResources() { + RetainPtr page_dict = GetMutableDict(); + if (GetDocument() && GetDocument()->IsLayerDocument() && + !page_dict->KeyExist(pdfium::page_object::kResources) && resources_) { + page_dict->SetFor(pdfium::page_object::kResources, + resources_->CloneDirectObject()); + } + resources_ = page_dict->GetMutableDictFor(pdfium::page_object::kResources); +} + +void CPDF_Page::EnsureMutableBackingObjectForPageResources() { + EnsureMutableBackingObjectForResources(); + page_resources_ = resources_; +} + RetainPtr CPDF_Page::GetPageAttr(ByteStringView name) const { std::set> visited; RetainPtr pPageDict = GetDict(); diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index ba1da8dac4..ae9b829f3c 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h @@ -106,6 +106,10 @@ class CPDF_Page final : public IPDF_Page, public CPDF_PageObjectHolder { CPDF_Page(CPDF_Document* document, RetainPtr pPageDict); ~CPDF_Page() override; + // CPDF_PageObjectHolder: + void EnsureMutableBackingObjectForResources() override; + void EnsureMutableBackingObjectForPageResources() override; + RetainPtr GetMutablePageAttr(ByteStringView name); RetainPtr GetPageAttr(ByteStringView name) const; CFX_FloatRect GetBox(ByteStringView name) const; diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/core/fpdfapi/page/cpdf_pageobjectholder.cpp index f05f01a61a..4e44212c61 100644 --- a/core/fpdfapi/page/cpdf_pageobjectholder.cpp +++ b/core/fpdfapi/page/cpdf_pageobjectholder.cpp @@ -15,11 +15,13 @@ #include "core/fpdfapi/page/cpdf_pageobject.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/check.h" #include "core/fxcrt/check_op.h" #include "core/fxcrt/containers/unique_ptr_adapters.h" #include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/notreached.h" #include "core/fxcrt/stl_util.h" bool GraphicsData::operator<(const GraphicsData& other) const { @@ -61,6 +63,136 @@ RetainPtr CPDF_PageObjectHolder::GetMutableFormStream() { return nullptr; } +RetainPtr CPDF_PageObjectHolder::GetDict() const { + if (!document_) { + return dict_; + } + + const uint32_t objnum = dict_->GetObjNum(); + if (objnum == 0) { + return dict_; + } + + RetainPtr live = document_->FindPromotedObject(objnum); + if (live && live.Get() != dict_.Get()) { + const_cast(this)->dict_ = + pdfium::WrapRetain(live->AsMutableDictionary()); + } + return dict_; +} + +RetainPtr CPDF_PageObjectHolder::GetMutableDict() { + if (!document_) { + return dict_; + } + + const uint32_t objnum = dict_->GetObjNum(); + if (objnum != 0) { + RetainPtr live = document_->GetMutableIndirectObject(objnum); + if (live && live.Get() != dict_.Get()) { + dict_ = pdfium::WrapRetain(live->AsMutableDictionary()); + } + return dict_; + } + + if (dict_->IsFrozen()) { + EnsureMutableBackingObjectForDict(); + } + return dict_; +} + +RetainPtr CPDF_PageObjectHolder::GetResources() const { + if (!document_ || !resources_) { + return resources_; + } + + const uint32_t objnum = resources_->GetObjNum(); + if (objnum == 0) { + return resources_; + } + + RetainPtr live = document_->FindPromotedObject(objnum); + if (live && live.Get() != resources_.Get()) { + const_cast(this)->resources_ = + pdfium::WrapRetain(live->AsMutableDictionary()); + } + return resources_; +} + +RetainPtr CPDF_PageObjectHolder::GetMutableResources() { + if (!document_ || !resources_) { + return resources_; + } + + const uint32_t objnum = resources_->GetObjNum(); + if (objnum != 0) { + RetainPtr live = document_->GetMutableIndirectObject(objnum); + if (live && live.Get() != resources_.Get()) { + resources_ = pdfium::WrapRetain(live->AsMutableDictionary()); + } + return resources_; + } + + if (resources_->IsFrozen()) { + EnsureMutableBackingObjectForResources(); + } + return resources_; +} + +RetainPtr CPDF_PageObjectHolder::GetPageResources() + const { + if (!document_ || !page_resources_) { + return page_resources_; + } + + const uint32_t objnum = page_resources_->GetObjNum(); + if (objnum == 0) { + return page_resources_; + } + + RetainPtr live = document_->FindPromotedObject(objnum); + if (live && live.Get() != page_resources_.Get()) { + const_cast(this)->page_resources_ = + pdfium::WrapRetain(live->AsMutableDictionary()); + } + return page_resources_; +} + +RetainPtr CPDF_PageObjectHolder::GetMutablePageResources() { + if (!document_ || !page_resources_) { + return page_resources_; + } + + const uint32_t objnum = page_resources_->GetObjNum(); + if (objnum != 0) { + RetainPtr live = document_->GetMutableIndirectObject(objnum); + if (live && live.Get() != page_resources_.Get()) { + page_resources_ = pdfium::WrapRetain(live->AsMutableDictionary()); + } + return page_resources_; + } + + if (page_resources_->IsFrozen()) { + EnsureMutableBackingObjectForPageResources(); + } + return page_resources_; +} + +void CPDF_PageObjectHolder::EnsureMutableBackingObjectForDict() { + NOTREACHED(); + CHECK(false); +} + +void CPDF_PageObjectHolder::EnsureMutableBackingObjectForResources() { + RetainPtr dict = GetMutableDict(); + resources_ = dict ? dict->GetMutableDictFor("Resources") : nullptr; +} + +void CPDF_PageObjectHolder::EnsureMutableBackingObjectForPageResources() { + RetainPtr dict = GetMutableDict(); + page_resources_ = dict ? dict->GetMutableDictFor("Resources") : nullptr; +} + void CPDF_PageObjectHolder::StartParse( std::unique_ptr pParser) { DCHECK_EQ(parse_state_, ParseState::kNotParsed); diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h index 898a3d1c00..5ac3a6cc77 100644 --- a/core/fpdfapi/page/cpdf_pageobjectholder.h +++ b/core/fpdfapi/page/cpdf_pageobjectholder.h @@ -79,8 +79,9 @@ class CPDF_PageObjectHolder { virtual bool IsPage() const; - // Returns the mutable Form XObject stream for CPDF_Form, or nullptr for Pages. - // Used by CPDF_PageContentManager to update Form XObject content directly. + // Returns the mutable Form XObject stream for CPDF_Form, or nullptr for + // Pages. Used by CPDF_PageContentManager to update Form XObject content + // directly. virtual RetainPtr GetMutableFormStream(); void StartParse(std::unique_ptr pParser); @@ -88,19 +89,15 @@ class CPDF_PageObjectHolder { ParseState GetParseState() const { return parse_state_; } CPDF_Document* GetDocument() const { return document_; } - RetainPtr GetDict() const { return dict_; } - RetainPtr GetMutableDict() { return dict_; } - RetainPtr GetResources() const { return resources_; } - RetainPtr GetMutableResources() { return resources_; } + RetainPtr GetDict() const; + RetainPtr GetMutableDict(); + RetainPtr GetResources() const; + RetainPtr GetMutableResources(); void SetResources(RetainPtr dict) { resources_ = std::move(dict); } - RetainPtr GetPageResources() const { - return page_resources_; - } - RetainPtr GetMutablePageResources() { - return page_resources_; - } + RetainPtr GetPageResources() const; + RetainPtr GetMutablePageResources(); size_t GetPageObjectCount() const { return page_object_list_.size(); } size_t GetActivePageObjectCount() const; CPDF_PageObject* GetPageObjectByIndex(size_t index) const; @@ -159,9 +156,13 @@ class CPDF_PageObjectHolder { protected: void LoadTransparencyInfo(); + virtual void EnsureMutableBackingObjectForDict(); + virtual void EnsureMutableBackingObjectForResources(); + virtual void EnsureMutableBackingObjectForPageResources(); RetainPtr page_resources_; RetainPtr resources_; + RetainPtr dict_; std::map graphics_map_; std::map fonts_map_; std::map fonts_by_objnum_; @@ -172,7 +173,6 @@ class CPDF_PageObjectHolder { private: bool background_alpha_needed_ = false; ParseState parse_state_ = ParseState::kNotParsed; - RetainPtr const dict_; UnownedPtr document_; std::vector mask_bounding_boxes_; std::unique_ptr parser_; diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 49412ec67a..64f366c2fc 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -401,9 +401,10 @@ CPDF_StreamContentParser::CPDF_StreamContentParser( : document_(document), page_resources_(pPageResources), parent_resources_(pParentResources), - resources_(CPDF_Form::ChooseResourcesDict(pResources.Get(), - pParentResources.Get(), - pPageResources.Get())), + resources_(pdfium::WrapRetain(const_cast( + CPDF_Form::ChooseResourcesDict(pResources.Get(), + pParentResources.Get(), + pPageResources.Get())))), object_holder_(pObjHolder), recursion_state_(recursion_state), bbox_(rcBBox), diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index 70a67b24f4..4849c27698 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp @@ -109,7 +109,7 @@ CPDF_Object* CPDF_Array::GetMutableObjectAtInternal(size_t index) { } const CPDF_Object* CPDF_Array::GetObjectAtInternal(size_t index) const { - return const_cast(this)->GetMutableObjectAtInternal(index); + return index < objects_.size() ? objects_[index].Get() : nullptr; } RetainPtr CPDF_Array::GetMutableObjectAt(size_t index) { @@ -121,7 +121,8 @@ RetainPtr CPDF_Array::GetObjectAt(size_t index) const { } RetainPtr CPDF_Array::GetDirectObjectAt(size_t index) const { - return const_cast(this)->GetMutableDirectObjectAt(index); + RetainPtr pObj = GetObjectAt(index); + return pObj ? pObj->GetDirect() : nullptr; } RetainPtr CPDF_Array::GetMutableDirectObjectAt(size_t index) { @@ -182,7 +183,15 @@ RetainPtr CPDF_Array::GetMutableDictAt(size_t index) { } RetainPtr CPDF_Array::GetDictAt(size_t index) const { - return const_cast(this)->GetMutableDictAt(index); + RetainPtr p = GetDirectObjectAt(index); + if (!p) { + return nullptr; + } + if (const CPDF_Dictionary* dict = p->AsDictionary()) { + return pdfium::WrapRetain(dict); + } + const CPDF_Stream* pStream = p->AsStream(); + return pStream ? pStream->GetDict() : nullptr; } RetainPtr CPDF_Array::GetMutableStreamAt(size_t index) { @@ -190,7 +199,7 @@ RetainPtr CPDF_Array::GetMutableStreamAt(size_t index) { } RetainPtr CPDF_Array::GetStreamAt(size_t index) const { - return const_cast(this)->GetMutableStreamAt(index); + return ToStream(GetDirectObjectAt(index)); } RetainPtr CPDF_Array::GetMutableArrayAt(size_t index) { @@ -198,7 +207,7 @@ RetainPtr CPDF_Array::GetMutableArrayAt(size_t index) { } RetainPtr CPDF_Array::GetArrayAt(size_t index) const { - return const_cast(this)->GetMutableArrayAt(index); + return ToArray(GetDirectObjectAt(index)); } RetainPtr CPDF_Array::GetNumberAt(size_t index) const { diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index 9d23fe69ba..4967f5b850 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -107,8 +107,8 @@ RetainPtr CPDF_Dictionary::GetDirectObjectFor( RetainPtr CPDF_Dictionary::GetMutableDirectObjectFor( ByteStringView key) { - return pdfium::WrapRetain( - const_cast(GetDirectObjectForInternal(key))); + RetainPtr p = GetMutableObjectFor(key); + return p ? p->GetMutableDirect() : nullptr; } ByteString CPDF_Dictionary::GetByteStringFor(ByteStringView key) const { @@ -177,8 +177,16 @@ RetainPtr CPDF_Dictionary::GetDictFor( RetainPtr CPDF_Dictionary::GetMutableDictFor( ByteStringView key) { - return pdfium::WrapRetain( - const_cast(GetDictForInternal(key))); + RetainPtr p = GetMutableDirectObjectFor(key); + if (!p) { + return nullptr; + } + CPDF_Dictionary* dict = p->AsMutableDictionary(); + if (dict) { + return pdfium::WrapRetain(dict); + } + CPDF_Stream* stream = p->AsMutableStream(); + return stream ? stream->GetMutableDict() : nullptr; } RetainPtr CPDF_Dictionary::GetOrCreateDictFor( @@ -201,7 +209,7 @@ RetainPtr CPDF_Dictionary::GetArrayFor( } RetainPtr CPDF_Dictionary::GetMutableArrayFor(ByteStringView key) { - return pdfium::WrapRetain(const_cast(GetArrayForInternal(key))); + return ToArray(GetMutableDirectObjectFor(key)); } RetainPtr CPDF_Dictionary::GetOrCreateArrayFor(ByteStringView key) { @@ -224,8 +232,7 @@ RetainPtr CPDF_Dictionary::GetStreamFor( RetainPtr CPDF_Dictionary::GetMutableStreamFor( ByteStringView key) { - return pdfium::WrapRetain( - const_cast(GetStreamForInternal(key))); + return ToStream(GetMutableDirectObjectFor(key)); } const CPDF_Number* CPDF_Dictionary::GetNumberForInternal( diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 9c8f87b836..0ed55f4591 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -38,7 +38,7 @@ RetainPtr CPDF_IndirectObjectHolder::GetIndirectObject( RetainPtr CPDF_IndirectObjectHolder::GetMutableIndirectObject( uint32_t objnum) { return pdfium::WrapRetain( - const_cast(GetIndirectObjectInternal(objnum))); + const_cast(GetOrParseIndirectObjectInternal(objnum))); } const CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObjectInternal( diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index 18e7626c54..770e2cdeca 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -58,6 +58,28 @@ CPDF_Parser* CPDF_LayerDocument::GetParser() const { return base_->GetParser(); } +RetainPtr CPDF_LayerDocument::GetMutableRoot() { + const uint32_t root_objnum = base_->GetParser()->GetRootObjNum(); + RetainPtr live = GetMutableIndirectObject(root_objnum); + RetainPtr root = + live ? pdfium::WrapRetain(live->AsMutableDictionary()) : nullptr; + SetCachedRootDict(root); + return root; +} + +RetainPtr CPDF_LayerDocument::GetMutableInfo() { + CPDF_Parser* parser = base_->GetParser(); + const uint32_t info_objnum = parser ? parser->GetInfoObjNum() : 0; + if (!info_objnum || info_objnum == CPDF_Object::kInvalidObjNum) { + return nullptr; + } + RetainPtr live = GetMutableIndirectObject(info_objnum); + RetainPtr info = + live ? pdfium::WrapRetain(live->AsMutableDictionary()) : nullptr; + SetCachedInfoDict(info); + return info; +} + uint32_t CPDF_LayerDocument::GetUserPermissions(bool get_owner_perms) const { return base_->GetUserPermissions(get_owner_perms); } diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index 442f9e2f16..3d21378338 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -38,6 +38,8 @@ class CPDF_LayerDocument final : public CPDF_Document { // CPDF_Document: CPDF_Parser* GetParser() const override; + RetainPtr GetMutableRoot() override; + RetainPtr GetMutableInfo() override; uint32_t GetUserPermissions(bool get_owner_perms) const override; RetainPtr FindPromotedObject(uint32_t objnum) const override; bool IsLayerDocument() const override; diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp index 4444b49067..74ff894e49 100644 --- a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -11,6 +11,7 @@ #include #include +#include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pagemodule.h" #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -135,5 +136,13 @@ TEST_F(CPDFLayerDocumentTest, MutatorsDcheckUntilCowSliceLands) { EXPECT_DEATH_IF_SUPPORTED(layer->GetMutableIndirectObject(1), ""); EXPECT_DEATH_IF_SUPPORTED(layer->ParseIndirectObject(1), ""); + + RetainPtr page_dict = layer->GetPageDictionary(0); + ASSERT_TRUE(page_dict); + auto page = pdfium::MakeRetain( + layer.get(), + pdfium::WrapRetain(const_cast(page_dict.Get()))); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); + EXPECT_DEATH_IF_SUPPORTED(page->GetMutableDict(), ""); } #endif // DCHECK_IS_ON() diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h index a8a7ab5fac..4915d04ef4 100644 --- a/core/fpdfapi/parser/cpdf_object.h +++ b/core/fpdfapi/parser/cpdf_object.h @@ -121,8 +121,9 @@ class CPDF_Object : public Retainable { virtual void FreezeChildren(std::set* visited); - RetainPtr GetDirect() const; // Wraps virtual method. - RetainPtr GetMutableDirect(); // Wraps virtual method. + RetainPtr GetDirect() const; // Wraps virtual method. + virtual RetainPtr GetMutableDirect(); + // Wraps virtual method. RetainPtr GetDict() const; // Wraps virtual method. RetainPtr GetMutableDict(); // Wraps virtual method. diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp index 8dc56d5281..c0e6fd8e35 100644 --- a/core/fpdfapi/parser/cpdf_reference.cpp +++ b/core/fpdfapi/parser/cpdf_reference.cpp @@ -49,6 +49,11 @@ RetainPtr CPDF_Reference::Clone() const { return CloneObjectNonCyclic(false); } +RetainPtr CPDF_Reference::GetMutableDirect() { + return obj_list_ ? obj_list_->GetMutableIndirectObject(ref_obj_num_) + : nullptr; +} + RetainPtr CPDF_Reference::CloneNonCyclic( bool bDirect, std::set* pVisited) const { diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h index 63baff1b0a..45e04d48d1 100644 --- a/core/fpdfapi/parser/cpdf_reference.h +++ b/core/fpdfapi/parser/cpdf_reference.h @@ -22,6 +22,7 @@ class CPDF_Reference final : public CPDF_Object { // CPDF_Object: Type GetType() const override; RetainPtr Clone() const override; + RetainPtr GetMutableDirect() override; ByteString GetString() const override; float GetNumber() const override; int GetInteger() const override; diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index 6f8ec8e54b..8494f1c615 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -1438,7 +1438,9 @@ RetainPtr CPDF_RenderStatus::LoadSMask( CFX_Matrix matrix = smask_matrix; matrix.Translate(-clip_rect.left, -clip_rect.top); - CPDF_Form form(context_->GetDocument(), context_->GetMutablePageResources(), + CPDF_Form form(context_->GetDocument(), + pdfium::WrapRetain(const_cast( + context_->GetPageResources())), pGroup); form.ParseContent(); diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index 8a65fcdbf6..d8bc6a2e25 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp @@ -277,7 +277,10 @@ CPDF_Form* CPDF_Annot::GetAPForm(CPDF_Page* pPage, AppearanceMode mode) { } auto pNewForm = std::make_unique( - document_, pPage->GetMutableResources(), pStream); + document_, + pdfium::WrapRetain( + const_cast(pPage->GetResources().Get())), + pStream); pNewForm->ParseContent(); CPDF_Form* pResult = pNewForm.get(); @@ -955,7 +958,8 @@ bool CPDF_Annot::DrawAppearance(CPDF_Page* pPage, } CPDF_RenderContext context(pPage->GetDocument(), - pPage->GetMutablePageResources(), + pdfium::WrapRetain(const_cast( + pPage->GetPageResources().Get())), pPage->GetPageImageCache()); context.AppendLayer(pForm, matrix); context.Render(pDevice, nullptr, nullptr, nullptr); diff --git a/fpdfsdk/cpdfsdk_renderpage.cpp b/fpdfsdk/cpdfsdk_renderpage.cpp index 4def06a07c..39ef4d1cbb 100644 --- a/fpdfsdk/cpdfsdk_renderpage.cpp +++ b/fpdfsdk/cpdfsdk_renderpage.cpp @@ -11,6 +11,7 @@ #include "build/build_config.h" #include "core/fpdfapi/page/cpdf_pageimagecache.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/render/cpdf_pagerendercontext.h" #include "core/fpdfapi/render/cpdf_progressiverenderer.h" #include "core/fpdfapi/render/cpdf_renderoptions.h" @@ -62,7 +63,9 @@ void RenderPageImpl(CPDF_PageRenderContext* context, context->device_->SetBaseClip(clipping_rect); context->device_->SetClip_Rect(clipping_rect); context->context_ = std::make_unique( - pPage->GetDocument(), pPage->GetMutablePageResources(), + pPage->GetDocument(), + pdfium::WrapRetain( + const_cast(pPage->GetPageResources().Get())), pPage->GetPageImageCache()); context->context_->AppendLayer(pPage, matrix); diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index b893959c5b..4db7fa00b7 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -1120,7 +1120,7 @@ FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page, } auto pNewAnnot = std::make_unique( - std::move(dict), IPDFPageFromFPDFPage(page)); + std::move(dict), IPDFPageFromFPDFPage(page), index); // Caller takes ownership. return FPDFAnnotationFromCPDFAnnotContext(pNewAnnot.release()); @@ -3547,7 +3547,8 @@ EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { pdfium::WrapRetain(const_cast(const_dict.Get())); if (d && d->GetUnicodeTextFor("NM") == target) { auto ctx = std::make_unique( - std::move(d), IPDFPageFromFPDFPage(page)); + std::move(d), IPDFPageFromFPDFPage(page), + pdfium::checked_cast(i)); return FPDFAnnotationFromCPDFAnnotContext(ctx.release()); } } diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 6a4278cf8e..2cef39bfe8 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -16,20 +16,19 @@ #include "build/build_config.h" #include "constants/page_object.h" +#include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/page/cpdf_form.h" #include "core/fpdfapi/page/cpdf_occontext.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pageimagecache.h" #include "core/fpdfapi/page/cpdf_pagemodule.h" -#include "core/fpdfdoc/cpdf_annot.h" -#include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_boolean.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" -#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fpdfapi/parser/cpdf_security_handler.h" #include "core/fpdfapi/parser/cpdf_stream.h" @@ -39,6 +38,7 @@ #include "core/fpdfapi/render/cpdf_pagerendercontext.h" #include "core/fpdfapi/render/cpdf_rendercontext.h" #include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_annot.h" #include "core/fpdfdoc/cpdf_nametree.h" #include "core/fpdfdoc/cpdf_viewerpreferences.h" #include "core/fxcrt/cfx_fileaccess_stream.h" @@ -477,8 +477,8 @@ FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { namespace { // Build P value with correct reserved bits for R>=3 (including R=4 and R=6) -// Input: allowed_flags - OR'd combination of permission bits user wants to ALLOW -// Output: proper P value with reserved bits set correctly +// Input: allowed_flags - OR'd combination of permission bits user wants to +// ALLOW Output: proper P value with reserved bits set correctly uint32_t BuildPermissionsForRevision(uint32_t allowed_flags) { // Enforce: PrintHighQuality implies Print (bit 12 requires bit 3) // Some readers interpret oddly if PRINT_HIGH is set without PRINT @@ -611,8 +611,7 @@ EPDF_UnlockOwnerPermissions(FPDF_DOCUMENT document, return security_handler->UnlockOwner(password); } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDF_IsEncrypted(FPDF_DOCUMENT document) { +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_IsEncrypted(FPDF_DOCUMENT document) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); if (!pDoc) { return false; @@ -675,7 +674,10 @@ FPDF_PAGE LoadPageByValidatedIndex(FPDF_DOCUMENT document, } #endif // PDF_ENABLE_XFA - RetainPtr dict = doc->GetMutablePageDictionary(page_index); + RetainPtr const_dict = + doc->GetPageDictionary(page_index); + RetainPtr dict = + pdfium::WrapRetain(const_cast(const_dict.Get())); if (!dict) { return nullptr; } @@ -712,11 +714,13 @@ EPDFPage_GetObjectNumber(FPDF_PAGE page) { // Note: CPDFPageFromFPDFPage() returns null for XFA pages, so this function // returns 0 for XFA pages (documented in the header). CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) + if (!pPage) { return 0; + } const CPDF_Dictionary* dict = pPage->GetDict().Get(); - if (!dict) + if (!dict) { return 0; + } return dict->GetObjNum(); } @@ -1059,30 +1063,35 @@ EPDF_RenderAnnotBitmap(FPDF_BITMAP bitmap, int flags) { // Guards CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!bitmap || !pPage || !annot) + if (!bitmap || !pPage || !annot) { return false; + } CPDF_AnnotContext* pAnnotContext = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!pAnnotContext) + if (!pAnnotContext) { return false; + } // Get the annotation's dictionary from the context. RetainPtr pAnnotDict = pAnnotContext->GetMutableAnnotDict(); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } // Get the document from the page. The CPDF_Annot constructor needs it. CPDF_Document* pDoc = pPage->GetDocument(); - if (!pDoc) + if (!pDoc) { return false; + } // Instantiate CPDF_Annot using its public constructor. auto pAnnot = std::make_unique(std::move(pAnnotDict), pDoc); // ---------------------------------------------------------------- bitmaps RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); - if (!pBitmap) + if (!pBitmap) { return false; + } ValidateBitmapPremultiplyState(pBitmap); #if defined(PDF_USE_SKIA) @@ -1095,8 +1104,9 @@ EPDF_RenderAnnotBitmap(FPDF_BITMAP bitmap, // CTM = DisplayMatrix * userMatrix * Translate(bbox.left, bbox.bottom) CFX_Matrix ctm = pPage->GetDisplayMatrix(); - if (matrix) + if (matrix) { ctm.Concat(CFXMatrixFromFSMatrix(*matrix)); + } // Draw appearance const bool ok = pAnnot->DrawAppearance( @@ -1115,20 +1125,24 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, int flags) { // Guards (same as EPDF_RenderAnnotBitmap) CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!bitmap || !pPage || !annot) + if (!bitmap || !pPage || !annot) { return false; + } CPDF_AnnotContext* pAnnotContext = CPDFAnnotContextFromFPDFAnnotation(annot); - if (!pAnnotContext) + if (!pAnnotContext) { return false; + } RetainPtr pAnnotDict = pAnnotContext->GetMutableAnnotDict(); - if (!pAnnotDict) + if (!pAnnotDict) { return false; + } CPDF_Document* pDoc = pPage->GetDocument(); - if (!pDoc) + if (!pDoc) { return false; + } auto pAnnot = std::make_unique(std::move(pAnnotDict), pDoc); @@ -1137,17 +1151,20 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, // the AP stream is expected to already exist when rendering stamps. auto mode = static_cast(appearanceMode); CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); - if (!pForm) + if (!pForm) { return false; + } // Read the raw BBox WITHOUT applying the AP Matrix. CFX_FloatRect form_bbox = pForm->GetDict()->GetRectFor("BBox"); // Use EPDFUnrotatedRect as the target rect for MatchRect. // Falls back to /Rect if EPDFUnrotatedRect is not set. - CFX_FloatRect target = pAnnot->GetAnnotDict()->GetRectFor("EPDFUnrotatedRect"); - if (target.IsEmpty()) + CFX_FloatRect target = + pAnnot->GetAnnotDict()->GetRectFor("EPDFUnrotatedRect"); + if (target.IsEmpty()) { target = pAnnot->GetRect(); + } // The form's Matrix (rotation) was baked into the content objects during // parsing by CPDF_ContentParser. We must undo it so the bitmap is unrotated. @@ -1161,16 +1178,18 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, // Build CTM = displayMatrix * userMatrix CFX_Matrix ctm = pPage->GetDisplayMatrix(); - if (matrix) + if (matrix) { ctm.Concat(CFXMatrixFromFSMatrix(*matrix)); + } // Combine: form -> page -> device mtForm2Page.Concat(ctm); // ---- Bitmap setup (same as EPDF_RenderAnnotBitmap) ---- RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); - if (!pBitmap) + if (!pBitmap) { return false; + } ValidateBitmapPremultiplyState(pBitmap); #if defined(PDF_USE_SKIA) @@ -1183,7 +1202,8 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, // Render the AP form with our custom matrix (no AP Matrix distortion). CPDF_RenderContext context(pDoc, - pPage->GetMutablePageResources(), + pdfium::WrapRetain(const_cast( + pPage->GetPageResources().Get())), pPage->GetPageImageCache()); context.AppendLayer(pForm, mtForm2Page); context.Render(device.get(), nullptr, nullptr, nullptr); @@ -1515,16 +1535,19 @@ FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, FPDF_EXPORT int FPDF_CALLCONV EPDF_GetPageRotationByIndex(FPDF_DOCUMENT document, int page_index) { auto* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) + if (!pDoc) { return -1; + } - if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) + if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { return -1; + } // Cheap: no ParseContent(). RetainPtr dict = pDoc->GetMutablePageDictionary(page_index); - if (!dict) + if (!dict) { return -1; + } auto page = pdfium::MakeRetain(pDoc, std::move(dict)); return page->GetPageRotation(); } @@ -1554,27 +1577,32 @@ static CFX_FloatRect GetInheritedRect(const CPDF_Dictionary* pPageDict, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, - int page_index, - FS_SIZEF* size) { - if (!size) + int page_index, + FS_SIZEF* size) { + if (!size) { return false; + } auto* pDoc = CPDFDocumentFromFPDFDocument(document); - if (!pDoc) + if (!pDoc) { return false; + } - if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) + if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { return false; + } RetainPtr dict = pDoc->GetMutablePageDictionary(page_index); - if (!dict) + if (!dict) { return false; + } // Resolve MediaBox/CropBox via page tree inheritance (not just the page dict) CFX_FloatRect mediabox = GetInheritedRect(dict.Get(), pdfium::page_object::kMediaBox); - if (mediabox.IsEmpty()) + if (mediabox.IsEmpty()) { mediabox = CFX_FloatRect(0, 0, 612, 792); + } CFX_FloatRect cropbox = GetInheritedRect(dict.Get(), pdfium::page_object::kCropBox); @@ -1589,12 +1617,13 @@ EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV EPDF_LoadPageNormalized(FPDF_DOCUMENT document, - int page_index, - int* out_original_rotation) { + int page_index, + int* out_original_rotation) { // Load page normally first FPDF_PAGE page = FPDF_LoadPage(document, page_index); - if (!page) + if (!page) { return nullptr; + } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) { diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 1131e8e967..f9d2a108d5 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -690,6 +690,32 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerRendersWithEmptyOverlay) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, OpenFreshLayerAnnotHandleDoesNotPromote) { + FileAccessForTesting base_access("annotation_stamp_with_ap.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + { + FileAccessForTesting layer_access("annotation_stamp_with_ap.pdf"); + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ASSERT_GT(FPDFPage_GetAnnotCount(page.get()), 0); + + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + } + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); From a59180571428588a4f35fdc05ea89e0d2fd4a02d Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 9 May 2026 23:57:39 +0300 Subject: [PATCH 11/56] CloneForHolder + PromoteFromBase --- core/fpdfapi/parser/cpdf_array.cpp | 22 +++ core/fpdfapi/parser/cpdf_array.h | 5 + core/fpdfapi/parser/cpdf_dictionary.cpp | 24 +++ core/fpdfapi/parser/cpdf_dictionary.h | 5 + .../parser/cpdf_indirect_object_holder.cpp | 14 ++ .../parser/cpdf_indirect_object_holder.h | 1 + core/fpdfapi/parser/cpdf_layer_document.cpp | 40 +++- core/fpdfapi/parser/cpdf_layer_document.h | 1 + .../parser/cpdf_layer_document_unittest.cpp | 176 +++++++++++++++++- core/fpdfapi/parser/cpdf_object.cpp | 12 ++ core/fpdfapi/parser/cpdf_object.h | 10 + core/fpdfapi/parser/cpdf_reference.cpp | 12 ++ core/fpdfapi/parser/cpdf_reference.h | 5 + core/fpdfapi/parser/cpdf_stream.cpp | 23 +++ core/fpdfapi/parser/cpdf_stream.h | 5 + fpdfsdk/fpdf_view_embeddertest.cpp | 28 +++ 16 files changed, 371 insertions(+), 12 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index 4849c27698..5665b4ebca 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp @@ -47,6 +47,12 @@ RetainPtr CPDF_Array::Clone() const { return CloneObjectNonCyclic(false); } +RetainPtr CPDF_Array::CloneForHolder( + CPDF_IndirectObjectHolder* holder) const { + std::set visited; + return CloneForHolderNonCyclic(holder, &visited); +} + RetainPtr CPDF_Array::CloneNonCyclic( bool bDirect, std::set* pVisited) const { @@ -63,6 +69,22 @@ RetainPtr CPDF_Array::CloneNonCyclic( return pCopy; } +RetainPtr CPDF_Array::CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const { + pVisited->insert(this); + auto pCopy = pdfium::MakeRetain(); + for (const auto& pValue : objects_) { + if (!pdfium::Contains(*pVisited, pValue.Get())) { + std::set visited(*pVisited); + if (auto obj = pValue->CloneForHolderNonCyclic(holder, &visited)) { + pCopy->objects_.push_back(std::move(obj)); + } + } + } + return pCopy; +} + void CPDF_Array::FreezeChildren(std::set* visited) { for (const auto& object : objects_) { object->FreezeForHolder(visited); diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h index 5b71bf5175..053d6cb9ad 100644 --- a/core/fpdfapi/parser/cpdf_array.h +++ b/core/fpdfapi/parser/cpdf_array.h @@ -33,6 +33,8 @@ class CPDF_Array final : public CPDF_Object { // CPDF_Object: Type GetType() const override; RetainPtr Clone() const override; + RetainPtr CloneForHolder( + CPDF_IndirectObjectHolder* holder) const override; CPDF_Array* AsMutableArray() override; bool WriteTo(IFX_ArchiveStream* archive, const CPDF_Encryptor* encryptor) const override; @@ -166,6 +168,9 @@ class CPDF_Array final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* pVisited) const override; + RetainPtr CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const override; void FreezeChildren(std::set* visited) override; std::vector> objects_; diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index 4967f5b850..fa9e447458 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -52,6 +52,12 @@ RetainPtr CPDF_Dictionary::Clone() const { return CloneObjectNonCyclic(false); } +RetainPtr CPDF_Dictionary::CloneForHolder( + CPDF_IndirectObjectHolder* holder) const { + std::set visited; + return CloneForHolderNonCyclic(holder, &visited); +} + RetainPtr CPDF_Dictionary::CloneNonCyclic( bool bDirect, std::set* pVisited) const { @@ -70,6 +76,24 @@ RetainPtr CPDF_Dictionary::CloneNonCyclic( return pCopy; } +RetainPtr CPDF_Dictionary::CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const { + pVisited->insert(this); + auto pCopy = pdfium::MakeRetain(pool_); + CPDF_DictionaryLocker locker(this); + for (const auto& it : locker) { + if (!pdfium::Contains(*pVisited, it.second.Get())) { + std::set visited(*pVisited); + auto obj = it.second->CloneForHolderNonCyclic(holder, &visited); + if (obj) { + pCopy->map_.insert(std::make_pair(it.first, std::move(obj))); + } + } + } + return pCopy; +} + void CPDF_Dictionary::FreezeChildren(std::set* visited) { CPDF_DictionaryLocker locker(this); for (const auto& item : locker) { diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h index 2b7b13362e..0f8b33a52a 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.h +++ b/core/fpdfapi/parser/cpdf_dictionary.h @@ -36,6 +36,8 @@ class CPDF_Dictionary final : public CPDF_Object { // CPDF_Object: Type GetType() const override; RetainPtr Clone() const override; + RetainPtr CloneForHolder( + CPDF_IndirectObjectHolder* holder) const override; CPDF_Dictionary* AsMutableDictionary() override; bool WriteTo(IFX_ArchiveStream* archive, const CPDF_Encryptor* encryptor) const override; @@ -148,6 +150,9 @@ class CPDF_Dictionary final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* visited) const override; + RetainPtr CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* visited) const override; void FreezeChildren(std::set* visited) override; mutable uint32_t lock_count_ = 0; diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp index 0ed55f4591..b9de488ec3 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -62,6 +62,20 @@ RetainPtr CPDF_IndirectObjectHolder::FindLocalIndirectObject( const_cast(FilterInvalidObjNum(it->second.Get()))); } +void CPDF_IndirectObjectHolder::AddPromotedObject( + uint32_t objnum, + RetainPtr object) { + DCHECK(objnum); + DCHECK(objnum != CPDF_Object::kInvalidObjNum); + CHECK(object); + + DCHECK_PDF_HOLDER_MUTABLE(); + DCHECK(!frozen_); + object->SetObjNum(objnum); + indirect_objs_[objnum] = std::move(object); + last_obj_num_ = std::max(last_obj_num_, objnum); +} + RetainPtr CPDF_IndirectObjectHolder::GetOrParseIndirectObject( uint32_t objnum) { return pdfium::WrapRetain(GetOrParseIndirectObjectInternal(objnum)); diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h index d2d51d8e12..51529e016c 100644 --- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h +++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h @@ -80,6 +80,7 @@ class CPDF_IndirectObjectHolder { virtual CPDF_Object* GetOrParseIndirectObjectInternal(uint32_t objnum); RetainPtr FindLocalIndirectObject(uint32_t objnum) const; + void AddPromotedObject(uint32_t objnum, RetainPtr object); private: friend class CPDF_Reference; diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index 770e2cdeca..e0a146aab9 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -101,8 +101,10 @@ RetainPtr CPDF_LayerDocument::ParseIndirectObject( RetainPtr CPDF_LayerDocument::GetMutableIndirectObject( uint32_t objnum) { - NOTREACHED(); - return nullptr; + if (RetainPtr local = FindLocalIndirectObject(objnum)) { + return local; + } + return PromoteFromBase(objnum); } void CPDF_LayerDocument::DeleteIndirectObject(uint32_t objnum) { @@ -193,3 +195,37 @@ void CPDF_LayerDocument::IngestCurrentDelta() { ingest_status_ = OpenStatus::kMalformedDelta; } } + +RetainPtr CPDF_LayerDocument::PromoteFromBase(uint32_t objnum) { + if (!objnum || objnum == CPDF_Object::kInvalidObjNum) { + return nullptr; + } + if (RetainPtr local = FindLocalIndirectObject(objnum)) { + return local; + } + + RetainPtr base_object = + base_->GetFrozenObjectForLayer(objnum); + if (!base_object) { + return nullptr; + } + + RetainPtr clone = base_object->CloneForHolder(this); + if (!clone) { + return nullptr; + } + clone->SetGenNum(base_object->GetGenNum()); + AddPromotedObject(objnum, clone); + + CPDF_Parser* parser = base_->GetParser(); + if (parser) { + if (parser->GetRootObjNum() == objnum) { + InvalidateCachedRootDict(); + } + if (parser->GetInfoObjNum() == objnum) { + InvalidateCachedInfoDict(); + } + } + + return clone; +} diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index 3d21378338..2cfc44a6e6 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -65,6 +65,7 @@ class CPDF_LayerDocument final : public CPDF_Document { private: void InitializeFromBase(); void IngestCurrentDelta(); + RetainPtr PromoteFromBase(uint32_t objnum); RetainPtr const base_; RetainPtr const file_access_; diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp index 74ff894e49..421638720b 100644 --- a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -15,8 +15,10 @@ #include "core/fpdfapi/page/cpdf_pagemodule.h" #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fxcrt/cfx_read_only_span_stream.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" @@ -58,6 +60,35 @@ std::string BuildSimplePdf() { return pdf.str(); } +std::string BuildPdfWithDirectResources() { + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100]\n" + " /Resources << /ProcSet [/PDF] >> >>\n" + "endobj\n", + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + RetainPtr MakeStreamForString(const std::string& data) { return pdfium::MakeRetain( pdfium::span(reinterpret_cast(data.data()), data.size())); @@ -74,6 +105,17 @@ RetainPtr LoadBaseDocumentFromString( return document; } +RetainPtr MakeLayerPage(CPDF_LayerDocument* layer, int page_index) { + RetainPtr page_dict = + layer->GetPageDictionary(page_index); + if (!page_dict) { + return nullptr; + } + return pdfium::MakeRetain( + layer, + pdfium::WrapRetain(const_cast(page_dict.Get()))); +} + } // namespace TEST_F(CPDFLayerDocumentTest, FreshLayerFallsThroughToFrozenBase) { @@ -126,23 +168,137 @@ TEST_F(CPDFLayerDocumentTest, AppendedBytesFailClosedUntilDeltaIngestLands) { EXPECT_EQ(0u, layer->GetPromotedObjectCount()); } -#if DCHECK_IS_ON() -TEST_F(CPDFLayerDocumentTest, MutatorsDcheckUntilCowSliceLands) { +TEST_F(CPDFLayerDocumentTest, GetMutableIndirectObjectPromotesFromBase) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); auto layer = std::make_unique(base, MakeStreamForString(pdf)); - EXPECT_DEATH_IF_SUPPORTED(layer->GetMutableIndirectObject(1), ""); - EXPECT_DEATH_IF_SUPPORTED(layer->ParseIndirectObject(1), ""); + RetainPtr promoted = layer->GetMutableIndirectObject(1); + ASSERT_TRUE(promoted); + EXPECT_EQ(1u, promoted->GetObjNum()); + EXPECT_NE(base->GetFrozenObjectForLayer(1).Get(), promoted.Get()); + EXPECT_EQ(promoted.Get(), layer->FindPromotedObject(1).Get()); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + EXPECT_FALSE(promoted->IsFrozen()); + EXPECT_TRUE(base->GetFrozenObjectForLayer(1)->IsFrozen()); +} - RetainPtr page_dict = layer->GetPageDictionary(0); - ASSERT_TRUE(page_dict); - auto page = pdfium::MakeRetain( - layer.get(), - pdfium::WrapRetain(const_cast(page_dict.Get()))); +TEST_F(CPDFLayerDocumentTest, PageMutableDictPromotesAndLeavesBaseFrozen) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + auto page = MakeLayerPage(layer.get(), 0); + ASSERT_TRUE(page); EXPECT_EQ(0u, layer->GetPromotedObjectCount()); - EXPECT_DEATH_IF_SUPPORTED(page->GetMutableDict(), ""); + + RetainPtr page_dict = page->GetMutableDict(); + ASSERT_TRUE(page_dict); + EXPECT_EQ(3u, page_dict->GetObjNum()); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + EXPECT_TRUE(layer->FindPromotedObject(3)); + EXPECT_NE(base->GetFrozenObjectForLayer(3).Get(), page_dict.Get()); + + page_dict->SetNewFor("Tier3Marker", 73); + EXPECT_EQ(73, page->GetDict()->GetIntegerFor("Tier3Marker")); + ASSERT_TRUE(base->GetFrozenObjectForLayer(3)->AsDictionary()); + EXPECT_FALSE( + base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Tier3Marker")); +} + +TEST_F(CPDFLayerDocumentTest, PromotedReferencesResolveThroughLayerHolder) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + auto page = MakeLayerPage(layer.get(), 0); + ASSERT_TRUE(page); + RetainPtr page_dict = page->GetMutableDict(); + ASSERT_TRUE(page_dict); + + RetainPtr parent_ref = + ToReference(page_dict->GetObjectFor("Parent")); + ASSERT_TRUE(parent_ref); + EXPECT_TRUE(parent_ref->HasIndirectObjectHolder()); + + RetainPtr parent = page_dict->GetMutableDictFor("Parent"); + ASSERT_TRUE(parent); + EXPECT_EQ("Pages", parent->GetNameFor("Type")); + EXPECT_TRUE(layer->FindPromotedObject(2)); + EXPECT_EQ(2u, layer->GetPromotedObjectCount()); + EXPECT_FALSE(base->GetFrozenObjectForLayer(2)->AsDictionary()->KeyExist( + "Tier3ParentMarker")); + + parent->SetNewFor("Tier3ParentMarker", 91); + EXPECT_EQ(91, layer->GetMutableIndirectObject(2) + ->AsMutableDictionary() + ->GetIntegerFor("Tier3ParentMarker")); + EXPECT_FALSE(base->GetFrozenObjectForLayer(2)->AsDictionary()->KeyExist( + "Tier3ParentMarker")); +} + +TEST_F(CPDFLayerDocumentTest, CrossHandleReadRefreshesAfterPagePromotion) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + auto page_a = MakeLayerPage(layer.get(), 0); + auto page_b = MakeLayerPage(layer.get(), 0); + ASSERT_TRUE(page_a); + ASSERT_TRUE(page_b); + + page_a->GetMutableDict()->SetNewFor("Foo", 1); + EXPECT_EQ(1, page_b->GetDict()->GetIntegerFor("Foo")); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + + page_b->GetMutableDict()->SetNewFor("Bar", 2); + EXPECT_EQ(2, page_a->GetDict()->GetIntegerFor("Bar")); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + EXPECT_FALSE(base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Foo")); + EXPECT_FALSE(base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Bar")); +} + +TEST_F(CPDFLayerDocumentTest, DirectResourcesPromoteOwningPage) { + const std::string pdf = BuildPdfWithDirectResources(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + auto page = MakeLayerPage(layer.get(), 0); + ASSERT_TRUE(page); + RetainPtr resources = page->GetMutableResources(); + ASSERT_TRUE(resources); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + + resources->SetNewFor("Tier3ResourceMarker", 5); + EXPECT_EQ(5, page->GetResources()->GetIntegerFor("Tier3ResourceMarker")); + + RetainPtr base_page = + base->GetFrozenObjectForLayer(3)->GetDict(); + ASSERT_TRUE(base_page); + RetainPtr base_resources = + base_page->GetDictFor("Resources"); + ASSERT_TRUE(base_resources); + EXPECT_FALSE(base_resources->KeyExist("Tier3ResourceMarker")); +} + +#if DCHECK_IS_ON() +TEST_F(CPDFLayerDocumentTest, ParseIndirectObjectStillUnsupportedOnLayer) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer = + std::make_unique(base, MakeStreamForString(pdf)); + + EXPECT_DEATH_IF_SUPPORTED(layer->ParseIndirectObject(1), ""); } #endif // DCHECK_IS_ON() diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp index 68cbeef0bd..81c02a882b 100644 --- a/core/fpdfapi/parser/cpdf_object.cpp +++ b/core/fpdfapi/parser/cpdf_object.cpp @@ -72,12 +72,24 @@ RetainPtr CPDF_Object::CloneDirectObject() const { return CloneObjectNonCyclic(true); } +RetainPtr CPDF_Object::CloneForHolder( + CPDF_IndirectObjectHolder* holder) const { + std::set visited_objs; + return CloneForHolderNonCyclic(holder, &visited_objs); +} + RetainPtr CPDF_Object::CloneNonCyclic( bool bDirect, std::set* pVisited) const { return Clone(); } +RetainPtr CPDF_Object::CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const { + return CloneNonCyclic(/*bDirect=*/false, pVisited); +} + ByteString CPDF_Object::GetString() const { return ByteString(); } diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h index 4915d04ef4..a954b6473e 100644 --- a/core/fpdfapi/parser/cpdf_object.h +++ b/core/fpdfapi/parser/cpdf_object.h @@ -74,6 +74,12 @@ class CPDF_Object : public Retainable { // Create a deep copy of the object. virtual RetainPtr Clone() const = 0; + // Create a deep copy of the object for `holder`. References in the clone are + // retargeted to `holder`, so promoted layer objects resolve through the + // layer overlay rather than the frozen base. + virtual RetainPtr CloneForHolder( + CPDF_IndirectObjectHolder* holder) const; + void Freeze(); void FreezeForHolder(std::set* visited); bool IsFrozen() const { return frozen_; } @@ -114,6 +120,10 @@ class CPDF_Object : public Retainable { bool bDirect, std::set* pVisited) const; + virtual RetainPtr CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const; + // Return a reference to itself. // The object must be direct (!IsInlined). virtual RetainPtr MakeReference( diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp index c0e6fd8e35..06e4d35cf8 100644 --- a/core/fpdfapi/parser/cpdf_reference.cpp +++ b/core/fpdfapi/parser/cpdf_reference.cpp @@ -49,6 +49,11 @@ RetainPtr CPDF_Reference::Clone() const { return CloneObjectNonCyclic(false); } +RetainPtr CPDF_Reference::CloneForHolder( + CPDF_IndirectObjectHolder* holder) const { + return pdfium::MakeRetain(holder, ref_obj_num_); +} + RetainPtr CPDF_Reference::GetMutableDirect() { return obj_list_ ? obj_list_->GetMutableIndirectObject(ref_obj_num_) : nullptr; @@ -67,6 +72,13 @@ RetainPtr CPDF_Reference::CloneNonCyclic( : nullptr; } +RetainPtr CPDF_Reference::CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const { + pVisited->insert(this); + return pdfium::MakeRetain(holder, ref_obj_num_); +} + const CPDF_Object* CPDF_Reference::FastGetDirect() const { if (!obj_list_) { return nullptr; diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h index 45e04d48d1..b0828a0f97 100644 --- a/core/fpdfapi/parser/cpdf_reference.h +++ b/core/fpdfapi/parser/cpdf_reference.h @@ -22,6 +22,8 @@ class CPDF_Reference final : public CPDF_Object { // CPDF_Object: Type GetType() const override; RetainPtr Clone() const override; + RetainPtr CloneForHolder( + CPDF_IndirectObjectHolder* holder) const override; RetainPtr GetMutableDirect() override; ByteString GetString() const override; float GetNumber() const override; @@ -47,6 +49,9 @@ class CPDF_Reference final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* pVisited) const override; + RetainPtr CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const override; const CPDF_Object* FastGetDirect() const; diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index a98bec1353..057404aff2 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp @@ -100,6 +100,12 @@ RetainPtr CPDF_Stream::Clone() const { return CloneObjectNonCyclic(false); } +RetainPtr CPDF_Stream::CloneForHolder( + CPDF_IndirectObjectHolder* holder) const { + std::set visited; + return CloneForHolderNonCyclic(holder, &visited); +} + RetainPtr CPDF_Stream::CloneNonCyclic( bool bDirect, std::set* pVisited) const { @@ -117,6 +123,23 @@ RetainPtr CPDF_Stream::CloneNonCyclic( std::move(pNewDict)); } +RetainPtr CPDF_Stream::CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const { + pVisited->insert(this); + auto pAcc = pdfium::MakeRetain(pdfium::WrapRetain(this)); + pAcc->LoadAllDataRaw(); + + RetainPtr dict = GetDict(); + RetainPtr pNewDict; + if (!pdfium::Contains(*pVisited, dict.Get())) { + pNewDict = ToDictionary(static_cast(dict.Get()) + ->CloneForHolderNonCyclic(holder, pVisited)); + } + return pdfium::MakeRetain(pAcc->DetachData(), + std::move(pNewDict)); +} + void CPDF_Stream::FreezeChildren(std::set* visited) { dict_->FreezeForHolder(visited); } diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h index a618df5b85..b291a724d1 100644 --- a/core/fpdfapi/parser/cpdf_stream.h +++ b/core/fpdfapi/parser/cpdf_stream.h @@ -29,6 +29,8 @@ class CPDF_Stream final : public CPDF_Object { // CPDF_Object: Type GetType() const override; RetainPtr Clone() const override; + RetainPtr CloneForHolder( + CPDF_IndirectObjectHolder* holder) const override; WideString GetUnicodeText() const override; CPDF_Stream* AsMutableStream() override; bool WriteTo(IFX_ArchiveStream* archive, @@ -90,6 +92,9 @@ class CPDF_Stream final : public CPDF_Object { RetainPtr CloneNonCyclic( bool bDirect, std::set* pVisited) const override; + RetainPtr CloneForHolderNonCyclic( + CPDF_IndirectObjectHolder* holder, + std::set* pVisited) const override; void FreezeChildren(std::set* visited) override; void SetLengthInDict(int length); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index f9d2a108d5..650d21d50d 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -716,6 +716,34 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerAnnotHandleDoesNotPromote) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + { + FileAccessForTesting layer_access("rectangles.pdf"); + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + EXPECT_EQ(2u, EPDFLayer_GetPromotedObjectCount(layer.get())); + } + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); From 502f817327ae21f22b7f2133d5f352cd38a8bdc1 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 10 May 2026 00:07:00 +0300 Subject: [PATCH 12/56] EPDFLayer_SaveDeltaToBuffer + creator append-only mode --- core/fpdfapi/edit/BUILD.gn | 1 + core/fpdfapi/edit/cpdf_creator.cpp | 65 ++++++++++++++++++--- core/fpdfapi/edit/cpdf_creator.h | 15 +++++ core/fpdfapi/edit/cpdf_creator_unittest.cpp | 23 ++++++++ fpdfsdk/epdf_layer.cpp | 54 +++++++++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 50 ++++++++++++++++ public/fpdf_save.h | 21 +++++++ 8 files changed, 223 insertions(+), 7 deletions(-) create mode 100644 core/fpdfapi/edit/cpdf_creator_unittest.cpp diff --git a/core/fpdfapi/edit/BUILD.gn b/core/fpdfapi/edit/BUILD.gn index fd0b1eac7f..b5a8ab45bd 100644 --- a/core/fpdfapi/edit/BUILD.gn +++ b/core/fpdfapi/edit/BUILD.gn @@ -53,6 +53,7 @@ source_set("contentstream_write_utils") { pdfium_unittest_source_set("unittests") { sources = [ + "cpdf_creator_unittest.cpp", "cpdf_npagetooneexporter_unittest.cpp", "cpdf_pagecontentgenerator_unittest.cpp", ] diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 612502abab..0499f22eb6 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -44,10 +45,12 @@ constexpr Mask kAllValidFlags{ CPDF_Creator::CreateFlags::kIncremental, CPDF_Creator::CreateFlags::kNoOriginal, CPDF_Creator::CreateFlags::kRemoveSecurity, - CPDF_Creator::CreateFlags::kSubsetNewFonts}; + CPDF_Creator::CreateFlags::kSubsetNewFonts, + CPDF_Creator::CreateFlags::kIncrementalAppendOnly}; constexpr Mask kConflictingFlags{ CPDF_Creator::CreateFlags::kIncremental, CPDF_Creator::CreateFlags::kNoOriginal}; +constexpr FX_FILESIZE kMaxFourByteXrefOffset = 0xffffffff; class CFX_FileBufferArchive final : public IFX_ArchiveStream { public: @@ -56,6 +59,7 @@ class CFX_FileBufferArchive final : public IFX_ArchiveStream { bool WriteBlock(pdfium::span buffer) override; FX_FILESIZE CurrentOffset() const override { return offset_; } + void SetNotionalStartOffset(FX_FILESIZE offset) { offset_ = offset; } private: bool Flush(); @@ -128,6 +132,10 @@ bool OutputIndex(IFX_ArchiveStream* archive, FX_FILESIZE offset) { archive->WriteByte(0); } +ByteString FormatXrefOffset10(FX_FILESIZE offset) { + return ByteString::Format("%010" PRId64, static_cast(offset)); +} + } // namespace CPDF_Creator::CPDF_Creator(CPDF_Document* doc, @@ -141,6 +149,11 @@ CPDF_Creator::CPDF_Creator(CPDF_Document* doc, CPDF_Creator::~CPDF_Creator() = default; +// static +ByteString CPDF_Creator::FormatXrefOffset10ForTesting(FX_FILESIZE offset) { + return FormatXrefOffset10(offset); +} + bool CPDF_Creator::WriteIndirectObj(uint32_t objnum, const CPDF_Object* pObj) { if (!archive_->WriteDWord(objnum) || !archive_->WriteString(" 0 obj\r\n")) { return false; @@ -225,6 +238,14 @@ bool CPDF_Creator::WriteNewObjs() { return true; } +bool CPDF_Creator::CheckEmittedOffset(FX_FILESIZE offset) { + if (offset <= kMaxFourByteXrefOffset) { + return true; + } + failure_reason_ = FailureReason::kAppendOnlyOffsetTooLarge; + return false; +} + void CPDF_Creator::InitNewObjNumOffsets() { for (const auto& pair : *document_) { const uint32_t objnum = pair.first; @@ -274,8 +295,9 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage1() { } } if (stage_ == Stage::kWriteIncremental15) { - if (is_original_ && saved_offset_ > 0) { + if (is_original_ && !is_incremental_append_only_ && saved_offset_ > 0) { if (!parser_->WriteToArchive(archive_.get(), saved_offset_)) { + failure_reason_ = FailureReason::kArchiveError; return Stage::kInvalid; } } @@ -401,7 +423,11 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage3() { } while (i < j) { - str = ByteString::Format("%010d 00000 n\r\n", object_offsets_[i++]); + const FX_FILESIZE offset = object_offsets_[i++]; + if (!CheckEmittedOffset(offset)) { + return Stage::kInvalid; + } + str = FormatXrefOffset10(offset) + " 00000 n\r\n"; if (!archive_->WriteString(str.AsStringView())) { return Stage::kInvalid; } @@ -442,7 +468,11 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage3() { while (i < j) { objnum = new_obj_num_array_[i++]; - str = ByteString::Format("%010d 00000 n\r\n", object_offsets_[objnum]); + const FX_FILESIZE offset = object_offsets_[objnum]; + if (!CheckEmittedOffset(offset)) { + return Stage::kInvalid; + } + str = FormatXrefOffset10(offset) + " 00000 n\r\n"; if (!archive_->WriteString(str.AsStringView())) { return Stage::kInvalid; } @@ -562,6 +592,9 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { if (it == object_offsets_.end()) { continue; } + if (!CheckEmittedOffset(it->second)) { + return Stage::kInvalid; + } if (!OutputIndex(archive_.get(), it->second)) { return Stage::kInvalid; } @@ -581,8 +614,11 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { return Stage::kInvalid; } for (i = 0; i < count; ++i) { - if (!OutputIndex(archive_.get(), - object_offsets_[new_obj_num_array_[i]])) { + const FX_FILESIZE offset = object_offsets_[new_obj_num_array_[i]]; + if (!CheckEmittedOffset(offset)) { + return Stage::kInvalid; + } + if (!OutputIndex(archive_.get(), offset)) { return Stage::kInvalid; } } @@ -603,6 +639,7 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { } bool CPDF_Creator::Create(Mask flags, int32_t file_version) { + failure_reason_ = FailureReason::kNone; if (flags & ~kAllValidFlags) { flags = CreateFlags::kNone; } @@ -617,7 +654,17 @@ bool CPDF_Creator::Create(Mask flags, int32_t file_version) { } is_incremental_ = !!(flags & CreateFlags::kIncremental); + is_incremental_append_only_ = + !!(flags & CreateFlags::kIncrementalAppendOnly); + if (is_incremental_append_only_ && !is_incremental_) { + failure_reason_ = FailureReason::kOther; + return false; + } is_original_ = !(flags & CreateFlags::kNoOriginal); + if (is_incremental_append_only_ && parser_) { + static_cast(archive_.get()) + ->SetNotionalStartOffset(parser_->GetDocumentSize()); + } if (file_version >= 10 && file_version <= 17) { file_version_ = file_version; @@ -629,7 +676,11 @@ bool CPDF_Creator::Create(Mask flags, int32_t file_version) { new_obj_num_array_.clear(); InitID(); - return Continue(); + const bool result = Continue(); + if (!result && failure_reason_ == FailureReason::kNone) { + failure_reason_ = FailureReason::kOther; + } + return result; } void CPDF_Creator::InitID() { diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h index f96e708a7c..06d2fe1205 100644 --- a/core/fpdfapi/edit/cpdf_creator.h +++ b/core/fpdfapi/edit/cpdf_creator.h @@ -13,6 +13,7 @@ #include #include +#include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/mask.h" #include "core/fxcrt/retain_ptr.h" @@ -36,6 +37,14 @@ class CPDF_Creator { kRemoveSecurity = (1 << 2), // TODO(crbug.com/42270430): Implement font subsetting. kSubsetNewFonts = (1 << 3), + kIncrementalAppendOnly = (1 << 4), + }; + + enum class FailureReason { + kNone, + kAppendOnlyOffsetTooLarge, + kArchiveError, + kOther, }; CPDF_Creator(CPDF_Document* doc, @@ -43,6 +52,9 @@ class CPDF_Creator { ~CPDF_Creator(); bool Create(Mask flags, int32_t file_version); + FailureReason GetFailureReason() const { return failure_reason_; } + + static ByteString FormatXrefOffset10ForTesting(FX_FILESIZE offset); // Experimental EmbedPDF Extension: Set encryption for documents that weren't // originally encrypted. This sets both encrypt_dict_ (for trailer writing) @@ -83,6 +95,7 @@ class CPDF_Creator { bool WriteOldObjs(); bool WriteNewObjs(); bool WriteIndirectObj(uint32_t objnum, const CPDF_Object* pObj); + bool CheckEmittedOffset(FX_FILESIZE offset); void RemoveSecurity(); @@ -106,6 +119,8 @@ class CPDF_Creator { bool security_changed_ = false; bool is_incremental_ = false; bool is_original_ = false; + bool is_incremental_append_only_ = false; + FailureReason failure_reason_ = FailureReason::kNone; }; #endif // CORE_FPDFAPI_EDIT_CPDF_CREATOR_H_ diff --git a/core/fpdfapi/edit/cpdf_creator_unittest.cpp b/core/fpdfapi/edit/cpdf_creator_unittest.cpp new file mode 100644 index 0000000000..4ea0c8ba10 --- /dev/null +++ b/core/fpdfapi/edit/cpdf_creator_unittest.cpp @@ -0,0 +1,23 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/edit/cpdf_creator.h" + +#include "testing/gtest/include/gtest/gtest.h" + +TEST(CPDFCreatorTest, FormatXrefOffset10Is64BitClean) { + ByteString small = CPDF_Creator::FormatXrefOffset10ForTesting(42); + EXPECT_EQ("0000000042", small); + EXPECT_EQ(10u, small.GetLength()); + + ByteString mid = + CPDF_Creator::FormatXrefOffset10ForTesting(2500000000LL); + EXPECT_EQ("2500000000", mid); + EXPECT_EQ(10u, mid.GetLength()); + + ByteString max = + CPDF_Creator::FormatXrefOffset10ForTesting(0xffffffff); + EXPECT_EQ("4294967295", max); + EXPECT_EQ(10u, max.GetLength()); +} diff --git a/fpdfsdk/epdf_layer.cpp b/fpdfsdk/epdf_layer.cpp index 738b724a00..04d2b2130f 100644 --- a/fpdfsdk/epdf_layer.cpp +++ b/fpdfsdk/epdf_layer.cpp @@ -8,14 +8,22 @@ #include #include +#include "core/fpdfapi/edit/cpdf_creator.h" #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_layer_document.h" +#include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fxcrt/retain_ptr.h" #include "fpdfsdk/cpdfsdk_customaccess.h" +#include "fpdfsdk/cpdfsdk_filewriteadapter.h" #include "fpdfsdk/cpdfsdk_helpers.h" +#include "public/fpdf_save.h" namespace { +constexpr FX_FILESIZE kReservedDeltaHeadroom = 16 * 1024 * 1024; +constexpr FX_FILESIZE kSafeNotionalStartOffsetMax = + 0xffffffff - kReservedDeltaHeadroom; + CPDF_BaseDocument* CPDFBaseDocumentFromEPDFBaseDocument( EPDF_BASE_DOCUMENT base) { return reinterpret_cast(base); @@ -100,3 +108,49 @@ EPDFLayer_GetBaseDocument(FPDF_DOCUMENT layer) { layer_doc->GetBaseDocument()) : nullptr; } + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_SaveDeltaToBuffer(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status) { + if (out_status) { + *out_status = EPDFLayerSaveStatus_kSaveFailed; + } + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + if (!layer_doc || !file_write) { + return false; + } + + CPDF_Parser* parser = layer_doc->GetParser(); + if (!parser) { + return false; + } + if (parser->GetDocumentSize() > kSafeNotionalStartOffsetMax) { + if (out_status) { + *out_status = EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge; + } + return false; + } + + CPDF_Creator creator( + layer_doc, pdfium::MakeRetain(file_write)); + const bool ok = creator.Create( + Mask( + CPDF_Creator::CreateFlags::kIncremental, + CPDF_Creator::CreateFlags::kIncrementalAppendOnly), + /*file_version=*/0); + if (ok) { + if (out_status) { + *out_status = EPDFLayerSaveStatus_kSuccess; + } + return true; + } + + if (out_status && + creator.GetFailureReason() == + CPDF_Creator::FailureReason::kAppendOnlyOffsetTooLarge) { + *out_status = EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge; + } + return false; +} diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index f51db07ece..3b7f6cd032 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -539,6 +539,7 @@ int CheckPDFiumCApi() { CHK(EPDFLayer_GetPromotedObjectCount); CHK(EPDFLayer_IsObjectPromoted); CHK(EPDFLayer_OpenLayer); + CHK(EPDFLayer_SaveDeltaToBuffer); CHK(EPDF_ReleaseBaseDocument); CHK(FPDF_LoadCustomDocument); CHK(FPDF_LoadDocument); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 650d21d50d..1cafe29f17 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -19,6 +19,7 @@ #include "fpdfsdk/fpdf_view_c_api_test.h" #include "public/cpp/fpdf_scopers.h" #include "public/fpdf_annot.h" +#include "public/fpdf_save.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/embedder_test_constants.h" @@ -744,6 +745,55 @@ TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, SaveLayerDeltaMaterializesWithBaseBytes) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + std::string materialized; + { + FileAccessForTesting layer_access("rectangles.pdf"); + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, &layer_access, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDeltaToBuffer(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + const std::string delta = GetString(); + EXPECT_FALSE(delta.empty()); + EXPECT_FALSE(delta.starts_with("%PDF-")); + + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector base_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(base_bytes.empty()); + EXPECT_LT(delta.size(), base_bytes.size()); + materialized.assign(reinterpret_cast(base_bytes.data()), + base_bytes.size()); + materialized += delta; + } + + ScopedFPDFDocument reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + ASSERT_TRUE(reopened); + ScopedFPDFPage reopened_page(FPDF_LoadPage(reopened.get(), 0)); + ASSERT_TRUE(reopened_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(reopened_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/public/fpdf_save.h b/public/fpdf_save.h index 093b889ad1..d388ae11fd 100644 --- a/public/fpdf_save.h +++ b/public/fpdf_save.h @@ -86,6 +86,27 @@ FPDF_SaveWithVersion(FPDF_DOCUMENT document, FPDF_DWORD flags, int file_version); +// Runtime-side status for saving a layer delta. +typedef enum { + EPDFLayerSaveStatus_kSuccess = 0, + EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge = 1, + EPDFLayerSaveStatus_kSaveFailed = 2, +} EPDFLayerSaveStatus; + +// Function: EPDFLayer_SaveDeltaToBuffer +// Saves only a layer document's current overlay delta. The caller can +// materialize the layer as base bytes followed by this returned delta. +// Parameters: +// layer - A layer document returned by EPDFLayer_OpenLayer(). +// file_write - A pointer to a custom file write structure. +// out_status - Optional detailed save status. +// Return value: +// TRUE if succeed, FALSE if failed. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_SaveDeltaToBuffer(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status); + #ifdef __cplusplus } #endif From 2cde580c996a2a8aeaccde00c07e5630e71a0ac5 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 10 May 2026 00:18:14 +0300 Subject: [PATCH 13/56] Introspection + benchmarks + soak --- fpdfsdk/fpdf_view_embeddertest.cpp | 61 ++++++ testing/tools/BUILD.gn | 31 +++ testing/tools/epdf_layer_memory_benchmark.cpp | 174 +++++++++++++++++ testing/tools/epdf_layer_replay_soak.cpp | 182 ++++++++++++++++++ testing/tools/epdf_layer_tool_common.h | 108 +++++++++++ 5 files changed, 556 insertions(+) create mode 100644 testing/tools/epdf_layer_memory_benchmark.cpp create mode 100644 testing/tools/epdf_layer_replay_soak.cpp create mode 100644 testing/tools/epdf_layer_tool_common.h diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 1cafe29f17..77c9c69820 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -794,6 +794,67 @@ TEST_F(FPDFViewEmbedderTest, SaveLayerDeltaMaterializesWithBaseBytes) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerDiagnosticsRejectPlainDocuments) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + EXPECT_FALSE(EPDFLayer_GetBaseDocument(document())); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document(), 1)); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(document())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSuccess; + EXPECT_FALSE(EPDFLayer_SaveDeltaToBuffer(document(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSaveFailed, save_status); +} + +TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector base_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(base_bytes.empty()); + + for (int expected_annots = 1; expected_annots <= 3; ++expected_annots) { + std::string materialized; + { + FileAccessForTesting layer_access("rectangles.pdf"); + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, &layer_access, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + for (int i = 0; i < expected_annots; ++i) { + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + } + EXPECT_EQ(expected_annots, FPDFPage_GetAnnotCount(page.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDeltaToBuffer(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + materialized.assign(reinterpret_cast(base_bytes.data()), + base_bytes.size()); + materialized += GetString(); + } + + ScopedFPDFDocument reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + ASSERT_TRUE(reopened); + ScopedFPDFPage reopened_page(FPDF_LoadPage(reopened.get(), 0)); + ASSERT_TRUE(reopened_page); + EXPECT_EQ(expected_annots, FPDFPage_GetAnnotCount(reopened_page.get())); + } + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/testing/tools/BUILD.gn b/testing/tools/BUILD.gn index 15d841bcfe..a90c5718ea 100644 --- a/testing/tools/BUILD.gn +++ b/testing/tools/BUILD.gn @@ -4,6 +4,37 @@ import("../../pdfium.gni") +source_set("epdf_layer_tool_support") { + testonly = true + sources = [ "epdf_layer_tool_common.h" ] + deps = [ "../../:pdfium_public_headers" ] + configs += [ "../../:pdfium_common_config" ] +} + +executable("epdf_layer_memory_benchmark") { + testonly = true + sources = [ "epdf_layer_memory_benchmark.cpp" ] + deps = [ + ":epdf_layer_tool_support", + "../../:pdfium_public_headers", + "../../fpdfsdk", + "//build/win:default_exe_manifest", + ] + configs += [ "../../:pdfium_common_config" ] +} + +executable("epdf_layer_replay_soak") { + testonly = true + sources = [ "epdf_layer_replay_soak.cpp" ] + deps = [ + ":epdf_layer_tool_support", + "../../:pdfium_public_headers", + "../../fpdfsdk", + "//build/win:default_exe_manifest", + ] + configs += [ "../../:pdfium_common_config" ] +} + if (pdf_is_standalone) { # Generates the list of inputs required by `test_runner.py` tests. action("test_runner_py") { diff --git a/testing/tools/epdf_layer_memory_benchmark.cpp b/testing/tools/epdf_layer_memory_benchmark.cpp new file mode 100644 index 0000000000..7b8930c11d --- /dev/null +++ b/testing/tools/epdf_layer_memory_benchmark.cpp @@ -0,0 +1,174 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/tools/epdf_layer_tool_common.h" + +#include + +#include +#include +#include +#include +#include + +#if defined(__APPLE__) +#include +#elif defined(__linux__) +#include + +#include +#endif + +#include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_annot.h" +#include "public/fpdfview.h" + +namespace { + +size_t CurrentRssBytes() { +#if defined(__APPLE__) + mach_task_basic_info_data_t info; + mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; + if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, + reinterpret_cast(&info), &count) != KERN_SUCCESS) { + return 0; + } + return static_cast(info.resident_size); +#elif defined(__linux__) + std::ifstream statm("/proc/self/statm"); + size_t total_pages = 0; + size_t resident_pages = 0; + statm >> total_pages >> resident_pages; + const long page_size = sysconf(_SC_PAGESIZE); + if (!statm || page_size <= 0) { + return 0; + } + return resident_pages * static_cast(page_size); +#else + return 0; +#endif +} + +std::vector ParseLayerCounts(const std::string& spec) { + std::vector result; + size_t start = 0; + while (start <= spec.size()) { + const size_t comma = spec.find(',', start); + const std::string token = + spec.substr(start, comma == std::string::npos ? std::string::npos + : comma - start); + if (!token.empty()) { + result.push_back(static_cast(std::strtoull(token.c_str(), nullptr, + 10))); + } + if (comma == std::string::npos) { + break; + } + start = comma + 1; + } + std::sort(result.begin(), result.end()); + result.erase(std::unique(result.begin(), result.end()), result.end()); + return result; +} + +bool AddTextAnnotation(FPDF_DOCUMENT layer) { + ScopedFPDFPage page(FPDF_LoadPage(layer, 0)); + if (!page) { + return false; + } + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + return !!annot; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + epdf_layer_tool::PrintUsage(argv[0], "[--layers=1,10,100,1000]"); + return 2; + } + + std::string path = argv[1]; + std::vector layer_counts = {1, 10, 100, 1000}; + for (int i = 2; i < argc; ++i) { + const std::string arg = argv[i]; + constexpr char kLayersPrefix[] = "--layers="; + if (arg.rfind(kLayersPrefix, 0) == 0) { + layer_counts = ParseLayerCounts(arg.substr(sizeof(kLayersPrefix) - 1)); + } else { + epdf_layer_tool::PrintUsage(argv[0], "[--layers=1,10,100,1000]"); + return 2; + } + } + if (layer_counts.empty() || layer_counts.front() == 0) { + std::fprintf(stderr, "Layer counts must be positive.\n"); + return 2; + } + + std::vector base_bytes; + if (!epdf_layer_tool::ReadFile(path, &base_bytes)) { + std::fprintf(stderr, "Failed to read %s\n", path.c_str()); + return 1; + } + + FPDF_InitLibrary(); + epdf_layer_tool::MemoryFile base_file(&base_bytes); + EPDF_BASE_DOCUMENT base = + EPDF_LoadBaseDocument(base_file.file_access(), nullptr); + if (!base) { + std::fprintf(stderr, "Failed to load base document.\n"); + FPDF_DestroyLibrary(); + return 1; + } + + const size_t baseline_rss = CurrentRssBytes(); + std::vector layers; + layers.reserve(layer_counts.back()); + std::vector layer_files; + layer_files.reserve(layer_counts.back()); + + std::puts("layers,rss_bytes,delta_from_base_rss,bytes_per_layer," + "promoted_objects"); + size_t next_report = 0; + for (size_t i = 1; i <= layer_counts.back(); ++i) { + layer_files.emplace_back(&base_bytes); + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer(EPDFLayer_OpenLayer( + base, layer_files.back().file_access(), nullptr, &status)); + if (!layer || status != EPDFLayerOpenStatus_kSuccess) { + std::fprintf(stderr, "Failed to open layer %zu.\n", i); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + if (!AddTextAnnotation(layer.get())) { + std::fprintf(stderr, "Failed to mutate layer %zu.\n", i); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + layers.push_back(std::move(layer)); + + if (i == layer_counts[next_report]) { + size_t promoted_objects = 0; + for (const auto& live_layer : layers) { + promoted_objects += EPDFLayer_GetPromotedObjectCount(live_layer.get()); + } + const size_t rss = CurrentRssBytes(); + const size_t delta = rss > baseline_rss ? rss - baseline_rss : 0; + std::printf("%zu,%zu,%zu,%zu,%zu\n", i, rss, delta, delta / i, + promoted_objects); + ++next_report; + if (next_report == layer_counts.size()) { + break; + } + } + } + + layers.clear(); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 0; +} diff --git a/testing/tools/epdf_layer_replay_soak.cpp b/testing/tools/epdf_layer_replay_soak.cpp new file mode 100644 index 0000000000..abd63f291d --- /dev/null +++ b/testing/tools/epdf_layer_replay_soak.cpp @@ -0,0 +1,182 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/tools/epdf_layer_tool_common.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_annot.h" +#include "public/fpdf_save.h" +#include "public/fpdfview.h" + +namespace { + +size_t ParseSizeArg(const std::string& arg, + const char* prefix, + size_t fallback) { + const std::string prefix_string(prefix); + if (arg.rfind(prefix_string, 0) != 0) { + return fallback; + } + return static_cast( + std::strtoull(arg.substr(prefix_string.size()).c_str(), nullptr, 10)); +} + +bool AddTextAnnotations(FPDF_DOCUMENT layer, size_t count) { + ScopedFPDFPage page(FPDF_LoadPage(layer, 0)); + if (!page) { + return false; + } + for (size_t i = 0; i < count; ++i) { + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + if (!annot) { + return false; + } + } + return static_cast(FPDFPage_GetAnnotCount(page.get())) == count; +} + +bool VerifyMaterializedAnnotCount(const std::vector& materialized, + size_t expected_count) { + ScopedFPDFDocument reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + if (!reopened) { + return false; + } + ScopedFPDFPage page(FPDF_LoadPage(reopened.get(), 0)); + if (!page) { + return false; + } + return static_cast(FPDFPage_GetAnnotCount(page.get())) == + expected_count; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + epdf_layer_tool::PrintUsage( + argv[0], "[--layers=100] [--rounds=60] [--sleep-seconds=60] [--seed=N]"); + return 2; + } + + std::string path = argv[1]; + size_t layer_count = 100; + size_t rounds = 60; + size_t sleep_seconds = 60; + uint32_t seed = 0xE7DF750u; + + for (int i = 2; i < argc; ++i) { + const std::string arg = argv[i]; + if (arg.rfind("--layers=", 0) == 0) { + layer_count = ParseSizeArg(arg, "--layers=", layer_count); + } else if (arg.rfind("--rounds=", 0) == 0) { + rounds = ParseSizeArg(arg, "--rounds=", rounds); + } else if (arg.rfind("--sleep-seconds=", 0) == 0) { + sleep_seconds = ParseSizeArg(arg, "--sleep-seconds=", sleep_seconds); + } else if (arg.rfind("--seed=", 0) == 0) { + seed = static_cast(ParseSizeArg(arg, "--seed=", seed)); + } else { + epdf_layer_tool::PrintUsage( + argv[0], + "[--layers=100] [--rounds=60] [--sleep-seconds=60] [--seed=N]"); + return 2; + } + } + + if (layer_count == 0 || rounds == 0) { + std::fprintf(stderr, "Layer count and rounds must be positive.\n"); + return 2; + } + + std::vector base_bytes; + if (!epdf_layer_tool::ReadFile(path, &base_bytes)) { + std::fprintf(stderr, "Failed to read %s\n", path.c_str()); + return 1; + } + + FPDF_InitLibrary(); + epdf_layer_tool::MemoryFile base_file(&base_bytes); + EPDF_BASE_DOCUMENT base = + EPDF_LoadBaseDocument(base_file.file_access(), nullptr); + if (!base) { + std::fprintf(stderr, "Failed to load base document.\n"); + FPDF_DestroyLibrary(); + return 1; + } + + std::mt19937 rng(seed); + std::uniform_int_distribution layer_dist(0, layer_count - 1); + std::uniform_int_distribution edit_dist(1, 3); + std::vector expected_annots(layer_count, 0); + + for (size_t round = 0; round < rounds; ++round) { + const size_t edited_layer = layer_dist(rng); + expected_annots[edited_layer] += edit_dist(rng); + + for (size_t layer_index = 0; layer_index < layer_count; ++layer_index) { + epdf_layer_tool::MemoryFile layer_file(&base_bytes); + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer(EPDFLayer_OpenLayer( + base, layer_file.file_access(), nullptr, &open_status)); + if (!layer || open_status != EPDFLayerOpenStatus_kSuccess) { + std::fprintf(stderr, "Round %zu layer %zu: open failed.\n", round, + layer_index); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + if (!AddTextAnnotations(layer.get(), expected_annots[layer_index])) { + std::fprintf(stderr, "Round %zu layer %zu: mutation failed.\n", round, + layer_index); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + + epdf_layer_tool::StringWriter writer; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + if (!EPDFLayer_SaveDeltaToBuffer(layer.get(), &writer, &save_status) || + save_status != EPDFLayerSaveStatus_kSuccess) { + std::fprintf(stderr, "Round %zu layer %zu: save failed (%d).\n", round, + layer_index, save_status); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + + const std::vector materialized = + epdf_layer_tool::MaterializeLayerBytes(base_bytes, writer.data); + if (!VerifyMaterializedAnnotCount(materialized, + expected_annots[layer_index])) { + std::fprintf(stderr, + "Round %zu layer %zu: materialized verification failed.\n", + round, layer_index); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + } + + std::printf("round=%zu layers=%zu edited_layer=%zu ok\n", round + 1, + layer_count, edited_layer); + if (round + 1 < rounds && sleep_seconds > 0) { + std::this_thread::sleep_for(std::chrono::seconds(sleep_seconds)); + } + } + + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 0; +} diff --git a/testing/tools/epdf_layer_tool_common.h b/testing/tools/epdf_layer_tool_common.h new file mode 100644 index 0000000000..d78a95238b --- /dev/null +++ b/testing/tools/epdf_layer_tool_common.h @@ -0,0 +1,108 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef TESTING_TOOLS_EPDF_LAYER_TOOL_COMMON_H_ +#define TESTING_TOOLS_EPDF_LAYER_TOOL_COMMON_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "public/fpdf_save.h" +#include "public/fpdfview.h" + +namespace epdf_layer_tool { + +struct MemoryFile { + explicit MemoryFile(std::vector input) + : owned_bytes(std::move(input)), bytes(&owned_bytes) { + InitAccess(); + } + + explicit MemoryFile(const std::vector* input) : bytes(input) { + InitAccess(); + } + + void InitAccess() { + access.m_FileLen = static_cast(bytes->size()); + access.m_GetBlock = &MemoryFile::GetBlock; + access.m_Param = this; + } + + FPDF_FILEACCESS* file_access() { return &access; } + + static int GetBlock(void* param, + unsigned long pos, + unsigned char* buf, + unsigned long size) { + MemoryFile* file = static_cast(param); + if (!file || !file->bytes || pos > file->bytes->size() || + size > file->bytes->size() - pos) { + return 0; + } + memcpy(buf, file->bytes->data() + pos, size); + return 1; + } + + std::vector owned_bytes; + const std::vector* bytes = nullptr; + FPDF_FILEACCESS access = {}; +}; + +struct StringWriter : FPDF_FILEWRITE { + StringWriter() { + version = 1; + WriteBlock = &StringWriter::WriteBlockCallback; + } + + void Clear() { data.clear(); } + + static int WriteBlockCallback(FPDF_FILEWRITE* file_write, + const void* buffer, + unsigned long size) { + StringWriter* writer = static_cast(file_write); + writer->data.append(static_cast(buffer), size); + return 1; + } + + std::string data; +}; + +inline bool ReadFile(const std::string& path, std::vector* out) { + std::ifstream file(path, std::ios::binary); + if (!file) { + return false; + } + file.seekg(0, std::ios::end); + const std::streamoff length = file.tellg(); + if (length < 0) { + return false; + } + file.seekg(0, std::ios::beg); + out->resize(static_cast(length)); + return out->empty() || + file.read(reinterpret_cast(out->data()), length).good(); +} + +inline std::vector MaterializeLayerBytes( + const std::vector& base_bytes, + const std::string& delta) { + std::vector materialized = base_bytes; + materialized.insert(materialized.end(), delta.begin(), delta.end()); + return materialized; +} + +inline void PrintUsage(const char* argv0, const char* extra) { + std::fprintf(stderr, "Usage: %s %s\n", argv0, extra); +} + +} // namespace epdf_layer_tool + +#endif // TESTING_TOOLS_EPDF_LAYER_TOOL_COMMON_H_ From 986cd2eb2c485bd2f1c543b514b7ab8b4211a37d Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 10 May 2026 16:35:33 +0300 Subject: [PATCH 14/56] Finish opening file with delta --- core/fpdfapi/edit/cpdf_creator.cpp | 17 +- core/fpdfapi/parser/BUILD.gn | 2 + core/fpdfapi/parser/cpdf_base_document.cpp | 52 +++ core/fpdfapi/parser/cpdf_base_document.h | 21 + .../parser/cpdf_concat_read_stream.cpp | 63 +++ core/fpdfapi/parser/cpdf_concat_read_stream.h | 31 ++ core/fpdfapi/parser/cpdf_document.cpp | 79 +++- core/fpdfapi/parser/cpdf_document.h | 2 + core/fpdfapi/parser/cpdf_layer_document.cpp | 151 ++++++- core/fpdfapi/parser/cpdf_layer_document.h | 4 +- .../parser/cpdf_layer_document_unittest.cpp | 180 ++++++-- core/fpdfapi/parser/cpdf_parser.cpp | 14 +- core/fpdfapi/parser/cpdf_parser.h | 6 +- core/fpdfapi/parser/cpdf_parser_unittest.cpp | 2 + core/fpdfapi/parser/cpdf_read_validator.h | 1 + core/fpdfapi/parser/cpdf_syntax_parser.cpp | 4 + core/fpdfapi/parser/cpdf_syntax_parser.h | 1 + fpdfsdk/epdf_layer.cpp | 392 +++++++++++++++-- fpdfsdk/fpdf_save.cpp | 67 ++- fpdfsdk/fpdf_save_embeddertest.cpp | 21 + fpdfsdk/fpdf_view_c_api_test.c | 8 +- fpdfsdk/fpdf_view_embeddertest.cpp | 410 +++++++++++++++++- public/fpdf_save.h | 58 ++- public/fpdfview.h | 16 +- testing/tools/epdf_layer_memory_benchmark.cpp | 24 +- testing/tools/epdf_layer_replay_soak.cpp | 73 +++- 26 files changed, 1562 insertions(+), 137 deletions(-) create mode 100644 core/fpdfapi/parser/cpdf_concat_read_stream.cpp create mode 100644 core/fpdfapi/parser/cpdf_concat_read_stream.h diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 0499f22eb6..fe806bf2c7 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -8,9 +8,9 @@ #include +#include #include #include -#include #include #include @@ -290,7 +290,9 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage1() { } stage_ = Stage::kInitWriteObjs20; } else { - saved_offset_ = parser_->GetDocumentSize(); + saved_offset_ = is_incremental_append_only_ + ? document_->GetLayerAppendBaseOffset() + : parser_->GetDocumentSize(); stage_ = Stage::kWriteIncremental15; } } @@ -370,7 +372,8 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage3() { uint32_t dwLastObjNum = last_obj_num_; if (stage_ == Stage::kInitWriteXRefs80) { xref_start_ = archive_->CurrentOffset(); - if (!is_incremental_ || !parser_->IsXRefStream()) { + if (!is_incremental_ || is_incremental_append_only_ || + !parser_->IsXRefStream()) { if (!is_incremental_ || parser_->GetLastXRefOffset() == 0) { ByteString str; str = pdfium::Contains(object_offsets_, 1) @@ -486,7 +489,8 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage3() { CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { DCHECK(stage_ >= Stage::kWriteTrailerAndFinish90); - bool bXRefStream = is_incremental_ && parser_->IsXRefStream(); + bool bXRefStream = is_incremental_ && !is_incremental_append_only_ && + parser_->IsXRefStream(); if (!bXRefStream) { if (!archive_->WriteString("trailer\r\n<<")) { return Stage::kInvalid; @@ -654,8 +658,7 @@ bool CPDF_Creator::Create(Mask flags, int32_t file_version) { } is_incremental_ = !!(flags & CreateFlags::kIncremental); - is_incremental_append_only_ = - !!(flags & CreateFlags::kIncrementalAppendOnly); + is_incremental_append_only_ = !!(flags & CreateFlags::kIncrementalAppendOnly); if (is_incremental_append_only_ && !is_incremental_) { failure_reason_ = FailureReason::kOther; return false; @@ -663,7 +666,7 @@ bool CPDF_Creator::Create(Mask flags, int32_t file_version) { is_original_ = !(flags & CreateFlags::kNoOriginal); if (is_incremental_append_only_ && parser_) { static_cast(archive_.get()) - ->SetNotionalStartOffset(parser_->GetDocumentSize()); + ->SetNotionalStartOffset(document_->GetLayerAppendBaseOffset()); } if (file_version >= 10 && file_version <= 17) { diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn index c3ccf34648..a66441b47e 100644 --- a/core/fpdfapi/parser/BUILD.gn +++ b/core/fpdfapi/parser/BUILD.gn @@ -15,6 +15,8 @@ source_set("parser") { "cpdf_base_document.h", "cpdf_boolean.cpp", "cpdf_boolean.h", + "cpdf_concat_read_stream.cpp", + "cpdf_concat_read_stream.h", "cpdf_cross_ref_avail.cpp", "cpdf_cross_ref_avail.h", "cpdf_cross_ref_table.cpp", diff --git a/core/fpdfapi/parser/cpdf_base_document.cpp b/core/fpdfapi/parser/cpdf_base_document.cpp index 1e3fa6fe3f..92abccff44 100644 --- a/core/fpdfapi/parser/cpdf_base_document.cpp +++ b/core/fpdfapi/parser/cpdf_base_document.cpp @@ -4,11 +4,14 @@ #include "core/fpdfapi/parser/cpdf_base_document.h" +#include +#include #include #include #include #include +#include "core/fdrm/fx_crypt_sha.h" #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -16,9 +19,13 @@ #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/render/cpdf_docrenderdata.h" +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/span.h" namespace { +constexpr size_t kSha256DigestSize = 32; + void PushIfNew(RetainPtr object, std::set* visited, std::queue>* worklist) { @@ -28,6 +35,32 @@ void PushIfNew(RetainPtr object, worklist->push(std::move(object)); } +bool ComputeStreamSha256(IFX_SeekableReadStream* stream, + FX_FILESIZE size, + std::array* digest) { + if (!stream || size < 0 || !digest) { + return false; + } + + CRYPT_sha2_context context; + CRYPT_SHA256Start(&context); + std::array buffer = {}; + FX_FILESIZE offset = 0; + while (offset < size) { + const size_t read_size = static_cast( + std::min(buffer.size(), size - offset)); + if (!stream->ReadBlockAtOffset(pdfium::span(buffer).first(read_size), + offset)) { + return false; + } + CRYPT_SHA256Update(&context, pdfium::span(buffer).first(read_size)); + offset += read_size; + } + + CRYPT_SHA256Finish(&context, *digest); + return true; +} + } // namespace CPDF_BaseDocument::CPDF_BaseDocument() @@ -43,10 +76,29 @@ CPDF_Parser::Error CPDF_BaseDocument::LoadBaseDoc( if (error != CPDF_Parser::SUCCESS) { return error; } + if (!CacheBaseIdentity()) { + return CPDF_Parser::FORMAT_ERROR; + } return EagerlyParseAllReachable() ? CPDF_Parser::SUCCESS : CPDF_Parser::FORMAT_ERROR; } +bool CPDF_BaseDocument::CacheBaseIdentity() { + CPDF_Parser* parser = GetParser(); + RetainPtr stream = + parser ? parser->GetFileAccess() : nullptr; + if (!parser || !stream) { + return false; + } + + raw_base_size_ = stream->GetSize(); + if (raw_base_size_ < 0) { + return false; + } + layer_append_base_offset_ = parser->GetDocumentSize(); + return ComputeStreamSha256(stream.Get(), raw_base_size_, &raw_base_sha256_); +} + bool CPDF_BaseDocument::EagerlyParseAllReachable() { if (!GetParser() || !GetRoot()) { return false; diff --git a/core/fpdfapi/parser/cpdf_base_document.h b/core/fpdfapi/parser/cpdf_base_document.h index 693dd2d565..abd434efe4 100644 --- a/core/fpdfapi/parser/cpdf_base_document.h +++ b/core/fpdfapi/parser/cpdf_base_document.h @@ -5,7 +5,12 @@ #ifndef CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ #define CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ +#include + +#include + #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/fx_types.h" #include "core/fxcrt/retain_ptr.h" class IFX_SeekableReadStream; @@ -19,10 +24,26 @@ class CPDF_BaseDocument final : public CPDF_Document, public Retainable { bool EagerlyParseAllReachable(); RetainPtr GetFrozenObjectForLayer(uint32_t objnum) const; + FX_FILESIZE GetRawBaseSize() const { return raw_base_size_; } + FX_FILESIZE GetLayerAppendBaseOffset() const override { + return layer_append_base_offset_; + } + const std::array& GetRawBaseSha256() const { + return raw_base_sha256_; + } private: CPDF_BaseDocument(); ~CPDF_BaseDocument() override; + + bool CacheBaseIdentity(); + + FX_FILESIZE raw_base_size_ = 0; + // PDFium parser offsets are logical PDF offsets after the syntax parser's + // header offset has been subtracted. Layer append-only xref offsets must use + // the same coordinate system, not the raw stream byte size. + FX_FILESIZE layer_append_base_offset_ = 0; + std::array raw_base_sha256_ = {}; }; #endif // CORE_FPDFAPI_PARSER_CPDF_BASE_DOCUMENT_H_ diff --git a/core/fpdfapi/parser/cpdf_concat_read_stream.cpp b/core/fpdfapi/parser/cpdf_concat_read_stream.cpp new file mode 100644 index 0000000000..fe0cac734d --- /dev/null +++ b/core/fpdfapi/parser/cpdf_concat_read_stream.cpp @@ -0,0 +1,63 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_concat_read_stream.h" + +#include +#include + +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxcrt/numerics/safe_conversions.h" + +CPDF_ConcatReadStream::CPDF_ConcatReadStream( + RetainPtr first, + RetainPtr second) + : first_(std::move(first)), + second_(std::move(second)), + first_size_(first_ ? first_->GetSize() : 0), + second_size_(second_ ? second_->GetSize() : 0) {} + +CPDF_ConcatReadStream::~CPDF_ConcatReadStream() = default; + +FX_FILESIZE CPDF_ConcatReadStream::GetSize() { + FX_SAFE_FILESIZE size = first_size_; + size += second_size_; + return size.ValueOrDefault(0); +} + +bool CPDF_ConcatReadStream::ReadBlockAtOffset(pdfium::span buffer, + FX_FILESIZE offset) { + if (offset < 0) { + return false; + } + if (buffer.empty()) { + return offset <= GetSize(); + } + + FX_SAFE_FILESIZE safe_end = offset; + safe_end += buffer.size(); + if (!safe_end.IsValid() || safe_end.ValueOrDie() > GetSize()) { + return false; + } + + if (offset < first_size_) { + const FX_FILESIZE remaining_first_size = first_size_ - offset; + const size_t first_read_size = + pdfium::IsValueInRangeForNumericType(remaining_first_size) + ? std::min(buffer.size(), + pdfium::checked_cast(remaining_first_size)) + : buffer.size(); + if (!first_ || + !first_->ReadBlockAtOffset(buffer.first(first_read_size), offset)) { + return false; + } + buffer = buffer.subspan(first_read_size); + offset = 0; + } else { + offset -= first_size_; + } + + return buffer.empty() || + (second_ && second_->ReadBlockAtOffset(buffer, offset)); +} diff --git a/core/fpdfapi/parser/cpdf_concat_read_stream.h b/core/fpdfapi/parser/cpdf_concat_read_stream.h new file mode 100644 index 0000000000..537040e8e9 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_concat_read_stream.h @@ -0,0 +1,31 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_CONCAT_READ_STREAM_H_ +#define CORE_FPDFAPI_PARSER_CPDF_CONCAT_READ_STREAM_H_ + +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/retain_ptr.h" + +class CPDF_ConcatReadStream final : public IFX_SeekableReadStream { + public: + CONSTRUCT_VIA_MAKE_RETAIN; + + // IFX_SeekableReadStream: + FX_FILESIZE GetSize() override; + bool ReadBlockAtOffset(pdfium::span buffer, + FX_FILESIZE offset) override; + + private: + CPDF_ConcatReadStream(RetainPtr first, + RetainPtr second); + ~CPDF_ConcatReadStream() override; + + RetainPtr const first_; + RetainPtr const second_; + FX_FILESIZE const first_size_; + FX_FILESIZE const second_size_; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_CONCAT_READ_STREAM_H_ diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 59506c882e..e51bf4f8e0 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -171,6 +171,42 @@ int FindPageIndex(const CPDF_Dictionary* pNode, return -1; } +bool AppendPageObjNumsConst(const CPDF_Dictionary* node, + const CPDF_Document* document, + size_t level, + std::set* visited, + std::vector* page_objnums) { + if (!node || !visited->insert(node).second || level >= kMaxPageLevel) { + return false; + } + + RetainPtr kids = node->GetArrayFor("Kids"); + if (!kids) { + if (!ValidateDictType(node, "Page") || !node->GetObjNum()) { + return false; + } + page_objnums->push_back(node->GetObjNum()); + return true; + } + + CPDF_ArrayLocker locker(kids.Get()); + for (const auto& kid : locker) { + RetainPtr direct = kid; + if (RetainPtr ref = ToReference(direct)) { + direct = document->GetIndirectObject(ref->GetRefObjNum()); + } else if (kid) { + direct = kid->GetDirect(); + } + RetainPtr kid_dict = ToDictionary(direct); + if (!kid_dict || + !AppendPageObjNumsConst(kid_dict.Get(), document, level + 1, visited, + page_objnums)) { + return false; + } + } + return true; +} + } // namespace CPDF_Document::CPDF_Document(std::unique_ptr pRenderData, @@ -348,6 +384,35 @@ void CPDF_Document::ResetTraversal() { tree_traversal_.clear(); } +bool CPDF_Document::RebuildPageListFromCurrentPageTree() { + RetainPtr root = pdfium::WrapRetain(GetRoot()); + if (!root && GetParser()) { + root = ToDictionary(GetIndirectObject(GetParser()->GetRootObjNum())); + } + RetainPtr pages_object = + root ? root->GetObjectFor("Pages") : nullptr; + if (RetainPtr ref = ToReference(pages_object)) { + pages_object = GetIndirectObject(ref->GetRefObjNum()); + } else if (pages_object) { + pages_object = pages_object->GetDirect(); + } + RetainPtr pages = ToDictionary(pages_object); + std::set visited; + std::vector page_objnums; + if (!AppendPageObjNumsConst(pages.Get(), this, /*level=*/0, &visited, + &page_objnums) || + page_objnums.empty() || page_objnums.size() >= kPageMaxNum) { + return false; + } + + ResizePageList(page_objnums.size()); + for (size_t i = 0; i < page_objnums.size(); ++i) { + SetPageObjNumAt(i, page_objnums[i]); + } + ResetTraversal(); + return true; +} + void CPDF_Document::SetParser(std::unique_ptr pParser) { DCHECK(!parser_); parser_ = std::move(pParser); @@ -444,6 +509,11 @@ bool CPDF_Document::IsLayerDocument() const { return false; } +FX_FILESIZE CPDF_Document::GetLayerAppendBaseOffset() const { + CPDF_Parser* parser = GetParser(); + return parser ? parser->GetDocumentSize() : 0; +} + int CPDF_Document::GetPageIndex(uint32_t objnum) { uint32_t skip_count = 0; bool bSkipped = false; @@ -466,7 +536,8 @@ int CPDF_Document::GetPageIndex(uint32_t objnum) { int found_index = FindPageIndex(pPages, &skip_count, objnum, &start_index, 0); // Corrupt page tree may yield out-of-range results. - if (found_index < 0 || static_cast(found_index) >= GetPageListSize()) { + if (found_index < 0 || + static_cast(found_index) >= GetPageListSize()) { return -1; } @@ -653,12 +724,14 @@ RetainPtr CPDF_Document::GetMutableInfo() { } RetainPtr CPDF_Document::GetOrCreateInfo() { - if (info_dict_) + if (info_dict_) { return info_dict_; + } // If parser already has an Info object, reuse it (this populates info_dict_). - if (RetainPtr existing = GetInfo()) + if (RetainPtr existing = GetInfo()) { return existing; + } // No Info present: create a new indirect dictionary and cache it. SetCachedInfoDict(NewIndirect()); diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 0493f6e524..0a02dfcea0 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -150,6 +150,7 @@ class CPDF_Document : public Observable, virtual RetainPtr FindPromotedObject(uint32_t objnum) const; bool IsObjectPromoted(uint32_t objnum) const; virtual bool IsLayerDocument() const; + virtual FX_FILESIZE GetLayerAppendBaseOffset() const; // CPDF_Parser::ParsedObjectsHolder: bool TryInit() override; @@ -183,6 +184,7 @@ class CPDF_Document : public Observable, virtual void ErasePageObjNum(size_t index); virtual void ResizePageList(size_t size); virtual size_t GetPageListSize() const; + bool RebuildPageListFromCurrentPageTree(); void SetCachedRootDict(RetainPtr root); void InvalidateCachedRootDict(); diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index e0a146aab9..44747cef02 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -5,11 +5,12 @@ #include "core/fpdfapi/parser/cpdf_layer_document.h" #include -#include #include #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_concat_read_stream.h" +#include "core/fpdfapi/parser/cpdf_cross_ref_table.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" @@ -17,6 +18,56 @@ #include "core/fxcrt/check.h" #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/notreached.h" +#include "core/fxcrt/unowned_ptr.h" + +namespace { + +class DeltaParseObjectHolder final : public CPDF_Parser::ParsedObjectsHolder { + public: + DeltaParseObjectHolder() = default; + ~DeltaParseObjectHolder() override = default; + + void SetParser(CPDF_Parser* parser) { parser_ = parser; } + bool TryInit() override { return true; } + + protected: + RetainPtr ParseIndirectObject(uint32_t objnum) override { + return parser_ ? parser_->ParseIndirectObject(objnum) : nullptr; + } + + private: + UnownedPtr parser_; +}; + +bool IsBaseObjectLive(const CPDF_Parser* base_parser, uint32_t objnum) { + return objnum != 0 && base_parser->IsValidObjectNumber(objnum) && + !base_parser->IsObjectFree(objnum); +} + +bool IsObjectOwnedByAppendedDelta(const CPDF_CrossRefTable* table, + uint32_t objnum, + const CPDF_CrossRefTable::ObjectInfo& info, + FX_FILESIZE layer_append_base_offset) { + if (objnum == table->trailer_object_number()) { + return false; + } + + switch (info.type) { + case CPDF_CrossRefTable::ObjectType::kFree: + return false; + case CPDF_CrossRefTable::ObjectType::kNormal: + return info.pos >= layer_append_base_offset; + case CPDF_CrossRefTable::ObjectType::kCompressed: { + const CPDF_CrossRefTable::ObjectInfo* archive_info = + table->GetObjectInfo(info.archive.obj_num); + return archive_info && + archive_info->type == CPDF_CrossRefTable::ObjectType::kNormal && + archive_info->pos >= layer_append_base_offset; + } + } +} + +} // namespace CPDF_LayerDocument::CPDF_LayerDocument( RetainPtr base, @@ -93,6 +144,10 @@ bool CPDF_LayerDocument::IsLayerDocument() const { return true; } +FX_FILESIZE CPDF_LayerDocument::GetLayerAppendBaseOffset() const { + return base_->GetLayerAppendBaseOffset(); +} + RetainPtr CPDF_LayerDocument::ParseIndirectObject( uint32_t objnum) { NOTREACHED(); @@ -179,21 +234,97 @@ void CPDF_LayerDocument::IngestCurrentDelta() { CPDF_Parser* base_parser = base_->GetParser(); if (!base_parser || !file_access_) { - ingest_status_ = OpenStatus::kOpenFailed; + if (!file_access_) { + return; + } + FailDeltaIngest(OpenStatus::kOpenFailed); + return; + } + + const FX_FILESIZE delta_size = file_access_->GetSize(); + if (delta_size == 0) { + file_access_.Reset(); + return; + } + + RetainPtr base_file = base_parser->GetFileAccess(); + if (!base_file) { + FailDeltaIngest(OpenStatus::kOpenFailed); + return; + } + + const FX_FILESIZE layer_append_base_offset = + base_->GetLayerAppendBaseOffset(); + DeltaParseObjectHolder temp_holder; + CPDF_Parser parser(&temp_holder); + temp_holder.SetParser(&parser); + CPDF_Parser::Error parse_error = + parser.StartParse(pdfium::MakeRetain( + std::move(base_file), file_access_), + base_parser->GetPassword()); + if (parse_error != CPDF_Parser::SUCCESS) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } + if (parser.GetLastXRefOffset() < layer_append_base_offset) { + FailDeltaIngest(OpenStatus::kMalformedDelta); return; } - const FX_FILESIZE base_end = base_parser->GetDocumentSize(); - const FX_FILESIZE layer_size = file_access_->GetSize(); - if (layer_size < base_end) { - ingest_status_ = OpenStatus::kBaseLayerMismatch; + const CPDF_CrossRefTable* table = parser.GetCrossRefTable(); + if (!table) { + FailDeltaIngest(OpenStatus::kMalformedDelta); return; } - if (layer_size > base_end) { - // Full appended-xref ingest lands with the delta parser. Until then, fail - // closed instead of silently ignoring a caller-provided delta. - ingest_status_ = OpenStatus::kMalformedDelta; + + for (const auto& [objnum, info] : table->objects_info()) { + if (info.type == CPDF_CrossRefTable::ObjectType::kFree && + IsBaseObjectLive(base_parser, objnum)) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } } + + size_t selected_delta_object_count = 0; + for (const auto& [objnum, info] : table->objects_info()) { + if (!IsObjectOwnedByAppendedDelta(table, objnum, info, + layer_append_base_offset)) { + continue; + } + + RetainPtr parsed = parser.ParseIndirectObject(objnum); + if (!parsed) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } + + RetainPtr clone = parsed->CloneForHolder(this); + if (!clone) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } + clone->SetGenNum(info.gennum); + AddPromotedObject(objnum, std::move(clone)); + ++selected_delta_object_count; + } + + if (FindLocalIndirectObject(base_parser->GetRootObjNum())) { + InvalidateCachedRootDict(); + } + if (FindLocalIndirectObject(base_parser->GetInfoObjNum())) { + InvalidateCachedInfoDict(); + } + if (selected_delta_object_count > 0 && + !RebuildPageListFromCurrentPageTree()) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } + file_access_.Reset(); +} + +void CPDF_LayerDocument::FailDeltaIngest(OpenStatus status) { + ingest_status_ = status; + file_access_.Reset(); } RetainPtr CPDF_LayerDocument::PromoteFromBase(uint32_t objnum) { diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index 2cfc44a6e6..1d4df51299 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -43,6 +43,7 @@ class CPDF_LayerDocument final : public CPDF_Document { uint32_t GetUserPermissions(bool get_owner_perms) const override; RetainPtr FindPromotedObject(uint32_t objnum) const override; bool IsLayerDocument() const override; + FX_FILESIZE GetLayerAppendBaseOffset() const override; // CPDF_Parser::ParsedObjectsHolder: RetainPtr ParseIndirectObject(uint32_t objnum) override; @@ -65,10 +66,11 @@ class CPDF_LayerDocument final : public CPDF_Document { private: void InitializeFromBase(); void IngestCurrentDelta(); + void FailDeltaIngest(OpenStatus status); RetainPtr PromoteFromBase(uint32_t objnum); RetainPtr const base_; - RetainPtr const file_access_; + RetainPtr file_access_; std::vector layer_page_list_; OpenStatus ingest_status_ = OpenStatus::kSuccess; }; diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp index 421638720b..614bd8b069 100644 --- a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -4,7 +4,9 @@ #include "core/fpdfapi/parser/cpdf_layer_document.h" +#include #include +#include #include #include #include @@ -14,12 +16,14 @@ #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pagemodule.h" #include "core/fpdfapi/parser/cpdf_base_document.h" +#include "core/fpdfapi/parser/cpdf_concat_read_stream.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fxcrt/cfx_read_only_span_stream.h" +#include "core/fxcrt/fx_stream.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" #include "testing/gtest/include/gtest/gtest.h" @@ -32,6 +36,40 @@ class CPDFLayerDocumentTest : public testing::Test { static void TearDownTestSuite() { pdfium::DestroyPageModule(); } }; +class CountingReadStream final : public IFX_SeekableReadStream { + public: + CONSTRUCT_VIA_MAKE_RETAIN; + + FX_FILESIZE GetSize() override { + return static_cast(data_.size()); + } + + bool ReadBlockAtOffset(pdfium::span buffer, + FX_FILESIZE offset) override { + if (offset < 0 || static_cast(offset) > data_.size() || + buffer.size() > data_.size() - static_cast(offset)) { + return false; + } + ++read_count_; + read_bytes_ += buffer.size(); + if (!buffer.empty()) { + memcpy(buffer.data(), data_.data() + offset, buffer.size()); + } + return true; + } + + size_t read_count() const { return read_count_; } + size_t read_bytes() const { return read_bytes_; } + + private: + explicit CountingReadStream(std::string data) : data_(std::move(data)) {} + ~CountingReadStream() override = default; + + std::string data_; + size_t read_count_ = 0; + size_t read_bytes_ = 0; +}; + std::string BuildSimplePdf() { const std::vector objects = { "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", @@ -89,6 +127,41 @@ std::string BuildPdfWithDirectResources() { return pdf.str(); } +size_t GetStartXrefOffsetFromPdf(const std::string& pdf) { + constexpr char kStartXref[] = "startxref\n"; + const size_t start = pdf.rfind(kStartXref); + CHECK_NE(std::string::npos, start); + return static_cast( + std::stoull(pdf.substr(start + sizeof(kStartXref) - 1))); +} + +std::string BuildFreeEntryDeltaForObject(const std::string& base_pdf, + uint32_t objnum) { + std::ostringstream delta; + const size_t xref_offset = base_pdf.size(); + delta << "xref\n" + << objnum << " 1\n0000000000 00001 f \n" + << "trailer\n<< /Size 5 /Root 1 0 R /Prev " + << GetStartXrefOffsetFromPdf(base_pdf) << " >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return delta.str(); +} + +std::string BuildCorruptPagesDelta(const std::string& base_pdf) { + std::ostringstream delta; + delta << "2 0 obj\n" + << "<< /Type /Pages /Count 1 /Kids [4 0 R] >>\n" + << "endobj\n"; + const size_t xref_offset = base_pdf.size() + delta.tellp(); + delta << "xref\n2 1\n" + << std::setw(10) << std::setfill('0') << base_pdf.size() + << " 00000 n \n" + << "trailer\n<< /Size 5 /Root 1 0 R /Prev " + << GetStartXrefOffsetFromPdf(base_pdf) << " >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return delta.str(); +} + RetainPtr MakeStreamForString(const std::string& data) { return pdfium::MakeRetain( pdfium::span(reinterpret_cast(data.data()), data.size())); @@ -112,19 +185,48 @@ RetainPtr MakeLayerPage(CPDF_LayerDocument* layer, int page_index) { return nullptr; } return pdfium::MakeRetain( - layer, - pdfium::WrapRetain(const_cast(page_dict.Get()))); + layer, pdfium::WrapRetain(const_cast(page_dict.Get()))); } } // namespace +TEST(CPDFConcatReadStreamTest, DelegatesReadsAcrossStreamBoundary) { + RetainPtr first = + pdfium::MakeRetain("abc"); + RetainPtr second = + pdfium::MakeRetain("DEF"); + RetainPtr concat = + pdfium::MakeRetain(first, second); + + ASSERT_EQ(6, concat->GetSize()); + std::array buffer = {}; + ASSERT_TRUE(concat->ReadBlockAtOffset(pdfium::span(buffer), 2)); + EXPECT_EQ("cDEF", std::string(reinterpret_cast(buffer.data()), + buffer.size())); + EXPECT_EQ(1u, first->read_count()); + EXPECT_EQ(1u, first->read_bytes()); + EXPECT_EQ(1u, second->read_count()); + EXPECT_EQ(3u, second->read_bytes()); +} + +TEST(CPDFConcatReadStreamTest, AllowsZeroLengthReadAtEnd) { + RetainPtr concat = + pdfium::MakeRetain( + pdfium::MakeRetain("abc"), + pdfium::MakeRetain("")); + std::array buffer = {}; + EXPECT_TRUE(concat->ReadBlockAtOffset( + pdfium::span(buffer).first(static_cast(0)), 3)); + EXPECT_FALSE(concat->ReadBlockAtOffset( + pdfium::span(buffer).first(static_cast(0)), 4)); +} + TEST_F(CPDFLayerDocumentTest, FreshLayerFallsThroughToFrozenBase) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kSuccess, layer->ingest_status()); EXPECT_TRUE(layer->IsLayerDocument()); @@ -145,8 +247,7 @@ TEST_F(CPDFLayerDocumentTest, DeleteBaseObjectIsNoOp) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); ASSERT_TRUE(layer->GetIndirectObject(1)); layer->DeleteIndirectObject(1); @@ -154,26 +255,51 @@ TEST_F(CPDFLayerDocumentTest, DeleteBaseObjectIsNoOp) { EXPECT_EQ(0u, layer->GetPromotedObjectCount()); } -TEST_F(CPDFLayerDocumentTest, AppendedBytesFailClosedUntilDeltaIngestLands) { +TEST_F(CPDFLayerDocumentTest, MalformedRawDeltaFailsClosed) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + const std::string delta = "\n% malformed delta placeholder\n"; + + auto layer = + std::make_unique(base, MakeStreamForString(delta)); + + EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kMalformedDelta, + layer->ingest_status()); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); +} + +TEST_F(CPDFLayerDocumentTest, DeltaFreeEntryOverBaseObjectFailsClosed) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - const std::string layer_bytes = pdf + "\n% appended delta placeholder\n"; auto layer = std::make_unique( - base, MakeStreamForString(layer_bytes)); + base, MakeStreamForString(BuildFreeEntryDeltaForObject(pdf, 3))); EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kMalformedDelta, layer->ingest_status()); EXPECT_EQ(0u, layer->GetPromotedObjectCount()); } +TEST_F(CPDFLayerDocumentTest, DeltaWithCorruptPageTreeFailsClosed) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + + auto layer = std::make_unique( + base, MakeStreamForString(BuildCorruptPagesDelta(pdf))); + + EXPECT_EQ(CPDF_LayerDocument::OpenStatus::kMalformedDelta, + layer->ingest_status()); + EXPECT_TRUE(layer->FindPromotedObject(2)); +} + TEST_F(CPDFLayerDocumentTest, GetMutableIndirectObjectPromotesFromBase) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); RetainPtr promoted = layer->GetMutableIndirectObject(1); ASSERT_TRUE(promoted); @@ -189,8 +315,7 @@ TEST_F(CPDFLayerDocumentTest, PageMutableDictPromotesAndLeavesBaseFrozen) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); auto page = MakeLayerPage(layer.get(), 0); ASSERT_TRUE(page); @@ -206,16 +331,15 @@ TEST_F(CPDFLayerDocumentTest, PageMutableDictPromotesAndLeavesBaseFrozen) { page_dict->SetNewFor("Tier3Marker", 73); EXPECT_EQ(73, page->GetDict()->GetIntegerFor("Tier3Marker")); ASSERT_TRUE(base->GetFrozenObjectForLayer(3)->AsDictionary()); - EXPECT_FALSE( - base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Tier3Marker")); + EXPECT_FALSE(base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist( + "Tier3Marker")); } TEST_F(CPDFLayerDocumentTest, PromotedReferencesResolveThroughLayerHolder) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); auto page = MakeLayerPage(layer.get(), 0); ASSERT_TRUE(page); @@ -236,9 +360,10 @@ TEST_F(CPDFLayerDocumentTest, PromotedReferencesResolveThroughLayerHolder) { "Tier3ParentMarker")); parent->SetNewFor("Tier3ParentMarker", 91); - EXPECT_EQ(91, layer->GetMutableIndirectObject(2) - ->AsMutableDictionary() - ->GetIntegerFor("Tier3ParentMarker")); + EXPECT_EQ( + 91, + layer->GetMutableIndirectObject(2)->AsMutableDictionary()->GetIntegerFor( + "Tier3ParentMarker")); EXPECT_FALSE(base->GetFrozenObjectForLayer(2)->AsDictionary()->KeyExist( "Tier3ParentMarker")); } @@ -247,8 +372,7 @@ TEST_F(CPDFLayerDocumentTest, CrossHandleReadRefreshesAfterPagePromotion) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); auto page_a = MakeLayerPage(layer.get(), 0); auto page_b = MakeLayerPage(layer.get(), 0); @@ -262,16 +386,17 @@ TEST_F(CPDFLayerDocumentTest, CrossHandleReadRefreshesAfterPagePromotion) { page_b->GetMutableDict()->SetNewFor("Bar", 2); EXPECT_EQ(2, page_a->GetDict()->GetIntegerFor("Bar")); EXPECT_EQ(1u, layer->GetPromotedObjectCount()); - EXPECT_FALSE(base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Foo")); - EXPECT_FALSE(base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Bar")); + EXPECT_FALSE( + base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Foo")); + EXPECT_FALSE( + base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Bar")); } TEST_F(CPDFLayerDocumentTest, DirectResourcesPromoteOwningPage) { const std::string pdf = BuildPdfWithDirectResources(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); auto page = MakeLayerPage(layer.get(), 0); ASSERT_TRUE(page); @@ -296,8 +421,7 @@ TEST_F(CPDFLayerDocumentTest, ParseIndirectObjectStillUnsupportedOnLayer) { const std::string pdf = BuildSimplePdf(); RetainPtr base = LoadBaseDocumentFromString(pdf); ASSERT_TRUE(base); - auto layer = - std::make_unique(base, MakeStreamForString(pdf)); + auto layer = std::make_unique(base, nullptr); EXPECT_DEATH_IF_SUPPORTED(layer->ParseIndirectObject(1), ""); } diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index 30dcb11085..be440b584f 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -591,6 +591,11 @@ bool CPDF_Parser::ParseAndAppendCrossRefSubsectionData( pdfium::span pEntry = pdfium::span(buf).subspan(i * kEntrySize); + // TODO(art-snake): The info.gennum is uint16_t, but version may be + // greater than max. Need to solve this issue. + const int32_t version = + StringToInt(ByteStringView(pEntry.subspan<11u>())); + info.gennum = version; if (pEntry[17] == 'f') { info.pos = 0; info.type = ObjectType::kFree; @@ -610,11 +615,6 @@ bool CPDF_Parser::ParseAndAppendCrossRefSubsectionData( info.pos = offset.ValueOrDie(); - // TODO(art-snake): The info.gennum is uint16_t, but version may be - // greater than max. Need to solve this issue. - const int32_t version = - StringToInt(ByteStringView(pEntry.subspan<11u>())); - info.gennum = version; info.type = ObjectType::kNormal; } } @@ -1166,6 +1166,10 @@ FX_FILESIZE CPDF_Parser::GetDocumentSize() const { return syntax_->GetDocumentSize(); } +RetainPtr CPDF_Parser::GetFileAccess() const { + return syntax_ ? syntax_->GetFileAccess() : nullptr; +} + uint32_t CPDF_Parser::GetFirstPageNo() const { return linearized_ ? linearized_->GetFirstPageNo() : 0; } diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h index 613a1d750d..1a3168d6c8 100644 --- a/core/fpdfapi/parser/cpdf_parser.h +++ b/core/fpdfapi/parser/cpdf_parser.h @@ -109,6 +109,7 @@ class CPDF_Parser { bool IsXRefStream() const { return xref_stream_; } FX_FILESIZE GetDocumentSize() const; + RetainPtr GetFileAccess() const; uint32_t GetFirstPageNo() const; const CPDF_LinearizedHeader* GetLinearizedHeader() const { return linearized_.get(); @@ -119,9 +120,12 @@ class CPDF_Parser { std::vector GetTrailerEnds(); bool WriteToArchive(IFX_ArchiveStream* archive, FX_FILESIZE src_size); - const CPDF_CrossRefTable* GetCrossRefTableForTesting() const { + const CPDF_CrossRefTable* GetCrossRefTable() const { return cross_ref_table_.get(); } + const CPDF_CrossRefTable* GetCrossRefTableForTesting() const { + return GetCrossRefTable(); + } CPDF_Dictionary* GetMutableTrailerForTesting(); diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp index ecfd50f236..0c4301b3fd 100644 --- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp @@ -204,6 +204,8 @@ TEST(ParserTest, LoadCrossRefTable) { EXPECT_EQ(kExpected[i].offset, GetObjInfo(parser, i).pos); EXPECT_EQ(kExpected[i].type, GetObjInfo(parser, i).type); } + EXPECT_EQ(65535u, GetObjInfo(parser, 0).gennum); + EXPECT_EQ(7u, GetObjInfo(parser, 3).gennum); } { static const unsigned char kXrefTable[] = diff --git a/core/fpdfapi/parser/cpdf_read_validator.h b/core/fpdfapi/parser/cpdf_read_validator.h index c8665416e3..8056b508bb 100644 --- a/core/fpdfapi/parser/cpdf_read_validator.h +++ b/core/fpdfapi/parser/cpdf_read_validator.h @@ -43,6 +43,7 @@ class CPDF_ReadValidator : public IFX_SeekableReadStream { bool IsWholeFileAvailable(); bool CheckDataRangeAndRequestIfUnavailable(FX_FILESIZE offset, size_t size); bool CheckWholeFileAndRequestIfUnavailable(); + RetainPtr GetFileAccess() const { return file_read_; } // IFX_SeekableReadStream overrides: bool ReadBlockAtOffset(pdfium::span buffer, diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index 749e59c07b..f765a10ead 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -908,6 +908,10 @@ RetainPtr CPDF_SyntaxParser::GetValidator() const { return file_access_; } +RetainPtr CPDF_SyntaxParser::GetFileAccess() const { + return file_access_ ? file_access_->GetFileAccess() : nullptr; +} + bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, ByteStringView tag, diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.h b/core/fpdfapi/parser/cpdf_syntax_parser.h index 79fc68d635..a3c27a9342 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.h +++ b/core/fpdfapi/parser/cpdf_syntax_parser.h @@ -70,6 +70,7 @@ class CPDF_SyntaxParser { ByteString PeekNextWord(); RetainPtr GetValidator() const; + RetainPtr GetFileAccess() const; uint32_t GetDirectNum(); bool GetNextChar(uint8_t& ch); diff --git a/fpdfsdk/epdf_layer.cpp b/fpdfsdk/epdf_layer.cpp index 04d2b2130f..89eae4c787 100644 --- a/fpdfsdk/epdf_layer.cpp +++ b/fpdfsdk/epdf_layer.cpp @@ -4,15 +4,25 @@ #include "public/fpdfview.h" +#include +#include +#include #include #include +#include +#include #include +#include +#include "core/fdrm/fx_crypt_sha.h" #include "core/fpdfapi/edit/cpdf_creator.h" #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_layer_document.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fxcrt/data_vector.h" +#include "core/fxcrt/numerics/safe_conversions.h" #include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span_util.h" #include "fpdfsdk/cpdfsdk_customaccess.h" #include "fpdfsdk/cpdfsdk_filewriteadapter.h" #include "fpdfsdk/cpdfsdk_helpers.h" @@ -23,6 +33,55 @@ namespace { constexpr FX_FILESIZE kReservedDeltaHeadroom = 16 * 1024 * 1024; constexpr FX_FILESIZE kSafeNotionalStartOffsetMax = 0xffffffff - kReservedDeltaHeadroom; +constexpr char kLayerArtifactMagic[] = "EPDFLYR1"; +constexpr uint32_t kLayerArtifactVersion = 1; +constexpr size_t kSha256DigestSize = 32; +constexpr size_t kLayerArtifactHeaderSize = + 8 + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint64_t) * 3 + + kSha256DigestSize * 2; + +class OwnedReadOnlyMemoryStream final : public IFX_SeekableReadStream { + public: + CONSTRUCT_VIA_MAKE_RETAIN; + + FX_FILESIZE GetSize() override { + return static_cast(data_.size()); + } + + bool ReadBlockAtOffset(pdfium::span buffer, + FX_FILESIZE offset) override { + if (offset < 0 || static_cast(offset) > data_.size() || + buffer.size() > data_.size() - static_cast(offset)) { + return false; + } + if (buffer.empty()) { + return true; + } + memcpy(buffer.data(), data_.data() + offset, buffer.size()); + return true; + } + + private: + explicit OwnedReadOnlyMemoryStream(DataVector data) + : data_(std::move(data)) {} + ~OwnedReadOnlyMemoryStream() override = default; + + DataVector data_; +}; + +struct MemoryFileWriter : public FPDF_FILEWRITE { + std::string data; + + MemoryFileWriter() { + version = 1; + WriteBlock = [](FPDF_FILEWRITE* self, const void* buf, + unsigned long size) -> int { + static_cast(self)->data.append( + static_cast(buf), size); + return 1; + }; + } +}; CPDF_BaseDocument* CPDFBaseDocumentFromEPDFBaseDocument( EPDF_BASE_DOCUMENT base) { @@ -47,6 +106,132 @@ EPDFLayerOpenStatus ToPublicStatus(CPDF_LayerDocument::OpenStatus status) { } } +void SetOpenStatus(EPDFLayerOpenStatus* out_status, + EPDFLayerOpenStatus status) { + if (out_status) { + *out_status = status; + } +} + +void SetSaveStatus(EPDFLayerSaveStatus* out_status, + EPDFLayerSaveStatus status) { + if (out_status) { + *out_status = status; + } +} + +FPDF_DOCUMENT OpenLayerWithDeltaStream( + EPDF_BASE_DOCUMENT base, + RetainPtr delta_stream, + EPDFLayerOpenStatus* out_status) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kOpenFailed); + if (!base) { + return nullptr; + } + + CPDF_BaseDocument* base_doc = CPDFBaseDocumentFromEPDFBaseDocument(base); + RetainPtr retained_base = pdfium::WrapRetain(base_doc); + auto layer = std::make_unique(std::move(retained_base), + std::move(delta_stream)); + + const EPDFLayerOpenStatus status = ToPublicStatus(layer->ingest_status()); + SetOpenStatus(out_status, status); + if (status != EPDFLayerOpenStatus_kSuccess) { + return nullptr; + } + + return FPDFDocumentFromCPDFDocument(layer.release()); +} + +std::optional> ComputeDeltaSha256( + IFX_SeekableReadStream* stream, + FX_FILESIZE size) { + if (!stream || size < 0) { + return std::nullopt; + } + + CRYPT_sha2_context context; + CRYPT_SHA256Start(&context); + std::array buffer = {}; + FX_FILESIZE offset = 0; + while (offset < size) { + const size_t read_size = static_cast( + std::min(buffer.size(), size - offset)); + if (!stream->ReadBlockAtOffset(pdfium::span(buffer).first(read_size), + offset)) { + return std::nullopt; + } + CRYPT_SHA256Update(&context, pdfium::span(buffer).first(read_size)); + offset += read_size; + } + + std::array digest = {}; + CRYPT_SHA256Finish(&context, digest); + return digest; +} + +void AppendUint32LE(std::vector* buffer, uint32_t value) { + for (size_t i = 0; i < 4; ++i) { + buffer->push_back(static_cast(value >> (i * 8))); + } +} + +void AppendUint64LE(std::vector* buffer, uint64_t value) { + for (size_t i = 0; i < 8; ++i) { + buffer->push_back(static_cast(value >> (i * 8))); + } +} + +uint32_t ReadUint32LE(const uint8_t* data) { + return static_cast(data[0]) | + (static_cast(data[1]) << 8) | + (static_cast(data[2]) << 16) | + (static_cast(data[3]) << 24); +} + +uint64_t ReadUint64LE(const uint8_t* data) { + uint64_t value = 0; + for (size_t i = 0; i < 8; ++i) { + value |= static_cast(data[i]) << (i * 8); + } + return value; +} + +void* CopyToOwnedBuffer(pdfium::span data, + unsigned long* out_size) { + if (!out_size || data.empty() || + data.size() > std::numeric_limits::max()) { + if (out_size) { + *out_size = 0; + } + return nullptr; + } + + void* buffer = malloc(data.size()); + if (!buffer) { + *out_size = 0; + return nullptr; + } + memcpy(buffer, data.data(), data.size()); + *out_size = static_cast(data.size()); + return buffer; +} + +DataVector ReadStreamToVector(IFX_SeekableReadStream* stream) { + if (!stream || stream->GetSize() < 0 || + !pdfium::IsValueInRangeForNumericType(stream->GetSize())) { + return {}; + } + + const FX_FILESIZE size = stream->GetSize(); + DataVector data(pdfium::checked_cast(size)); + if (!data.empty() && + !stream->ReadBlockAtOffset(pdfium::span(data), /*offset=*/0)) { + return {}; + } + return data; +} + } // namespace FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV @@ -54,32 +239,99 @@ EPDFLayer_OpenLayer(EPDF_BASE_DOCUMENT base, FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password, EPDFLayerOpenStatus* out_status) { - if (out_status) { - *out_status = EPDFLayerOpenStatus_kOpenFailed; - } - if (!base || !pFileAccess) { - return nullptr; - } - // Slice 7.2 layers share the base parser/security state; password handling is // already complete when the base is loaded. (void)password; + RetainPtr delta_stream = + pFileAccess ? pdfium::MakeRetain(pFileAccess) + : nullptr; + return OpenLayerWithDeltaStream(base, std::move(delta_stream), out_status); +} + +FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV +EPDFLayer_OpenLayerArtifact(EPDF_BASE_DOCUMENT base, + FPDF_FILEACCESS* pFileAccess, + FPDF_BYTESTRING password, + EPDFLayerOpenStatus* out_status) { + (void)password; + SetOpenStatus(out_status, EPDFLayerOpenStatus_kOpenFailed); + if (!base || !pFileAccess) { + return nullptr; + } + CPDF_BaseDocument* base_doc = CPDFBaseDocumentFromEPDFBaseDocument(base); - RetainPtr retained_base = pdfium::WrapRetain(base_doc); - auto layer = std::make_unique( - std::move(retained_base), - pdfium::MakeRetain(pFileAccess)); + if (!base_doc) { + return nullptr; + } - const EPDFLayerOpenStatus status = ToPublicStatus(layer->ingest_status()); - if (out_status) { - *out_status = status; + RetainPtr artifact_stream = + pdfium::MakeRetain(pFileAccess); + DataVector artifact = ReadStreamToVector(artifact_stream.Get()); + if (artifact.size() < kLayerArtifactHeaderSize) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kMalformedDelta); + return nullptr; } - if (status != EPDFLayerOpenStatus_kSuccess) { + + const uint8_t* data = artifact.data(); + if (memcmp(data, kLayerArtifactMagic, 8) != 0) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kMalformedDelta); return nullptr; } + size_t cursor = 8; + const uint32_t version = ReadUint32LE(data + cursor); + cursor += sizeof(uint32_t); + const uint32_t header_size = ReadUint32LE(data + cursor); + cursor += sizeof(uint32_t); + const uint64_t raw_base_size = ReadUint64LE(data + cursor); + cursor += sizeof(uint64_t); + const uint64_t layer_append_base_offset = ReadUint64LE(data + cursor); + cursor += sizeof(uint64_t); + const uint64_t delta_size = ReadUint64LE(data + cursor); + cursor += sizeof(uint64_t); + const uint8_t* base_sha = data + cursor; + cursor += kSha256DigestSize; + const uint8_t* delta_sha = data + cursor; + cursor += kSha256DigestSize; - return FPDFDocumentFromCPDFDocument(layer.release()); + if (version != kLayerArtifactVersion || + header_size != kLayerArtifactHeaderSize || + raw_base_size != static_cast(base_doc->GetRawBaseSize()) || + layer_append_base_offset != + static_cast(base_doc->GetLayerAppendBaseOffset()) || + delta_size > artifact.size() - header_size) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kBaseLayerMismatch); + return nullptr; + } + if (header_size + delta_size != artifact.size()) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kMalformedDelta); + return nullptr; + } + + if (memcmp(base_doc->GetRawBaseSha256().data(), base_sha, + kSha256DigestSize) != 0) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kBaseLayerMismatch); + return nullptr; + } + + DataVector delta; + delta.resize(static_cast(delta_size)); + if (!delta.empty()) { + memcpy(delta.data(), artifact.data() + header_size, delta.size()); + } + std::optional> actual_delta_sha = + ComputeDeltaSha256( + pdfium::MakeRetain(delta).Get(), + delta.size()); + if (!actual_delta_sha || + memcmp(actual_delta_sha->data(), delta_sha, kSha256DigestSize) != 0) { + SetOpenStatus(out_status, EPDFLayerOpenStatus_kMalformedDelta); + return nullptr; + } + + return OpenLayerWithDeltaStream( + base, pdfium::MakeRetain(std::move(delta)), + out_status); } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV @@ -110,47 +362,107 @@ EPDFLayer_GetBaseDocument(FPDF_DOCUMENT layer) { } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFLayer_SaveDeltaToBuffer(FPDF_DOCUMENT layer, - FPDF_FILEWRITE* file_write, - EPDFLayerSaveStatus* out_status) { - if (out_status) { - *out_status = EPDFLayerSaveStatus_kSaveFailed; - } +EPDFLayer_SaveDelta(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status) { + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSaveFailed); CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); if (!layer_doc || !file_write) { return false; } - CPDF_Parser* parser = layer_doc->GetParser(); - if (!parser) { + if (!layer_doc->GetParser()) { return false; } - if (parser->GetDocumentSize() > kSafeNotionalStartOffsetMax) { - if (out_status) { - *out_status = EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge; - } + if (layer_doc->GetLayerAppendBaseOffset() > kSafeNotionalStartOffsetMax) { + SetSaveStatus(out_status, EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge); return false; } CPDF_Creator creator( layer_doc, pdfium::MakeRetain(file_write)); - const bool ok = creator.Create( - Mask( - CPDF_Creator::CreateFlags::kIncremental, - CPDF_Creator::CreateFlags::kIncrementalAppendOnly), - /*file_version=*/0); + const bool ok = + creator.Create(Mask( + CPDF_Creator::CreateFlags::kIncremental, + CPDF_Creator::CreateFlags::kIncrementalAppendOnly), + /*file_version=*/0); if (ok) { - if (out_status) { - *out_status = EPDFLayerSaveStatus_kSuccess; - } + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSuccess); return true; } - if (out_status && - creator.GetFailureReason() == - CPDF_Creator::FailureReason::kAppendOnlyOffsetTooLarge) { - *out_status = EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge; + if (creator.GetFailureReason() == + CPDF_Creator::FailureReason::kAppendOnlyOffsetTooLarge) { + SetSaveStatus(out_status, EPDFLayerSaveStatus_kAppendOnlyOffsetTooLarge); } return false; } + +FPDF_EXPORT void* FPDF_CALLCONV +EPDFLayer_SaveDeltaToOwnedBuffer(FPDF_DOCUMENT layer, + unsigned long* out_size, + EPDFLayerSaveStatus* out_status) { + if (out_size) { + *out_size = 0; + } + MemoryFileWriter writer; + if (!EPDFLayer_SaveDelta(layer, &writer, out_status) || writer.data.empty()) { + return nullptr; + } + return CopyToOwnedBuffer(pdfium::as_byte_span(writer.data), out_size); +} + +FPDF_EXPORT void* FPDF_CALLCONV +EPDFLayer_SaveLayerArtifactToOwnedBuffer(FPDF_DOCUMENT layer, + unsigned long* out_size, + EPDFLayerSaveStatus* out_status) { + if (out_size) { + *out_size = 0; + } + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSaveFailed); + + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + CPDF_BaseDocument* base_doc = + layer_doc ? layer_doc->GetBaseDocument() : nullptr; + if (!layer_doc || !base_doc) { + return nullptr; + } + + MemoryFileWriter delta_writer; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + if (!EPDFLayer_SaveDelta(layer, &delta_writer, &save_status)) { + SetSaveStatus(out_status, save_status); + return nullptr; + } + + const DataVector delta_bytes(delta_writer.data.begin(), + delta_writer.data.end()); + std::optional> delta_sha = + ComputeDeltaSha256( + pdfium::MakeRetain(delta_bytes).Get(), + delta_bytes.size()); + if (!delta_sha) { + return nullptr; + } + + std::vector artifact; + artifact.reserve(kLayerArtifactHeaderSize + delta_writer.data.size()); + artifact.insert(artifact.end(), kLayerArtifactMagic, kLayerArtifactMagic + 8); + AppendUint32LE(&artifact, kLayerArtifactVersion); + AppendUint32LE(&artifact, kLayerArtifactHeaderSize); + AppendUint64LE(&artifact, static_cast(base_doc->GetRawBaseSize())); + AppendUint64LE(&artifact, + static_cast(base_doc->GetLayerAppendBaseOffset())); + AppendUint64LE(&artifact, static_cast(delta_writer.data.size())); + const std::array& base_sha = + base_doc->GetRawBaseSha256(); + artifact.insert(artifact.end(), base_sha.begin(), base_sha.end()); + artifact.insert(artifact.end(), delta_sha->begin(), delta_sha->end()); + artifact.insert(artifact.end(), delta_writer.data.begin(), + delta_writer.data.end()); + + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSuccess); + return CopyToOwnedBuffer(pdfium::span(artifact), out_size); +} diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp index a6eb68ca5f..d82567c8e2 100644 --- a/fpdfsdk/fpdf_save.cpp +++ b/fpdfsdk/fpdf_save.cpp @@ -6,10 +6,14 @@ #include "public/fpdf_save.h" -#include #include +#include +#include +#include +#include #include +#include #include #include @@ -229,8 +233,54 @@ bool DoDocSave(FPDF_DOCUMENT document, return create_result; } +struct MemoryFileWriter : public FPDF_FILEWRITE { + std::string data; + + MemoryFileWriter() { + version = 1; + WriteBlock = [](FPDF_FILEWRITE* self, const void* buf, + unsigned long size) -> int { + static_cast(self)->data.append( + static_cast(buf), size); + return 1; + }; + } +}; + +void* SaveToOwnedBuffer(FPDF_DOCUMENT document, + FPDF_DWORD flags, + unsigned long* out_size, + std::optional version) { + if (!out_size) { + return nullptr; + } + *out_size = 0; + + MemoryFileWriter writer; + const bool ok = version.has_value() + ? DoDocSave(document, &writer, flags, version.value()) + : DoDocSave(document, &writer, flags, {}); + if (!ok || writer.data.empty() || + writer.data.size() > std::numeric_limits::max()) { + return nullptr; + } + + void* buffer = malloc(writer.data.size()); + if (!buffer) { + return nullptr; + } + + memcpy(buffer, writer.data.data(), writer.data.size()); + *out_size = static_cast(writer.data.size()); + return buffer; +} + } // namespace +FPDF_EXPORT void FPDF_CALLCONV EPDF_FreeBuffer(void* buffer) { + free(buffer); +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_SaveAsCopy(FPDF_DOCUMENT document, FPDF_FILEWRITE* file_write, FPDF_DWORD flags) { @@ -244,3 +294,18 @@ FPDF_SaveWithVersion(FPDF_DOCUMENT document, int fileVersion) { return DoDocSave(document, file_write, flags, fileVersion); } + +FPDF_EXPORT void* FPDF_CALLCONV +EPDF_SaveDocumentToOwnedBuffer(FPDF_DOCUMENT document, + FPDF_DWORD flags, + unsigned long* out_size) { + return SaveToOwnedBuffer(document, flags, out_size, {}); +} + +FPDF_EXPORT void* FPDF_CALLCONV +EPDF_SaveDocumentToOwnedBufferWithVersion(FPDF_DOCUMENT document, + FPDF_DWORD flags, + unsigned long* out_size, + int file_version) { + return SaveToOwnedBuffer(document, flags, out_size, file_version); +} diff --git a/fpdfsdk/fpdf_save_embeddertest.cpp b/fpdfsdk/fpdf_save_embeddertest.cpp index ea45c40180..471756c918 100644 --- a/fpdfsdk/fpdf_save_embeddertest.cpp +++ b/fpdfsdk/fpdf_save_embeddertest.cpp @@ -40,6 +40,27 @@ TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithVersion) { EXPECT_EQ(805u, GetString().size()); } +TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocToOwnedBuffer) { + EPDF_FreeBuffer(nullptr); + + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + unsigned long size = 0; + void* buffer = EPDF_SaveDocumentToOwnedBuffer(document(), 0, &size); + ASSERT_TRUE(buffer); + EXPECT_EQ(805u, size); + std::string saved(static_cast(buffer), size); + EPDF_FreeBuffer(buffer); + EXPECT_THAT(saved, StartsWith("%PDF-1.7\r\n")); + + size = 0; + buffer = EPDF_SaveDocumentToOwnedBufferWithVersion(document(), 0, &size, 14); + ASSERT_TRUE(buffer); + EXPECT_EQ(805u, size); + saved.assign(static_cast(buffer), size); + EPDF_FreeBuffer(buffer); + EXPECT_THAT(saved, StartsWith("%PDF-1.4\r\n")); +} + TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithBadVersion) { ASSERT_TRUE(OpenDocument("hello_world.pdf")); EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, -1)); diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 3b7f6cd032..4957427151 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -535,11 +535,17 @@ int CheckPDFiumCApi() { CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); CHK(EPDF_LoadBaseDocument); + CHK(EPDF_FreeBuffer); + CHK(EPDF_SaveDocumentToOwnedBuffer); + CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); CHK(EPDFLayer_GetBaseDocument); CHK(EPDFLayer_GetPromotedObjectCount); CHK(EPDFLayer_IsObjectPromoted); CHK(EPDFLayer_OpenLayer); - CHK(EPDFLayer_SaveDeltaToBuffer); + CHK(EPDFLayer_OpenLayerArtifact); + CHK(EPDFLayer_SaveDelta); + CHK(EPDFLayer_SaveDeltaToOwnedBuffer); + CHK(EPDFLayer_SaveLayerArtifactToOwnedBuffer); CHK(EPDF_ReleaseBaseDocument); CHK(FPDF_LoadCustomDocument); CHK(FPDF_LoadDocument); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 77c9c69820..aa86677a6d 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -110,6 +111,48 @@ class MockDownloadHints final : public FX_DOWNLOADHINTS { ~MockDownloadHints() = default; }; +struct CountingStringFileAccess { + explicit CountingStringFileAccess(std::string data) : data(std::move(data)) { + file_access.m_FileLen = this->data.size(); + file_access.m_GetBlock = &CountingStringFileAccess::GetBlock; + file_access.m_Param = this; + } + + FPDF_FILEACCESS* get() { return &file_access; } + void ResetCounts() { + read_count = 0; + read_bytes = 0; + } + + static int GetBlock(void* param, + unsigned long pos, + unsigned char* buf, + unsigned long size) { + CountingStringFileAccess* file = + static_cast(param); + if (!file || pos > file->data.size() || size > file->data.size() - pos) { + return 0; + } + memcpy(buf, file->data.data() + pos, size); + ++file->read_count; + file->read_bytes += size; + return 1; + } + + std::string data; + FPDF_FILEACCESS file_access = {}; + size_t read_count = 0; + size_t read_bytes = 0; +}; + +uint64_t ReadUint64LEForTest(const char* data) { + uint64_t value = 0; + for (size_t i = 0; i < 8; ++i) { + value |= static_cast(static_cast(data[i])) << (i * 8); + } + return value; +} + #if defined(PDF_USE_SKIA) ScopedFPDFBitmap SkImageToPdfiumBitmap(const SkImage& image) { ScopedFPDFBitmap bitmap( @@ -667,10 +710,9 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerRendersWithEmptyOverlay) { ASSERT_TRUE(base); { - FileAccessForTesting layer_access("rectangles.pdf"); EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( - EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); ASSERT_TRUE(layer); EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); EXPECT_EQ(base, EPDFLayer_GetBaseDocument(layer.get())); @@ -697,10 +739,9 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerAnnotHandleDoesNotPromote) { ASSERT_TRUE(base); { - FileAccessForTesting layer_access("annotation_stamp_with_ap.pdf"); EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( - EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); ASSERT_TRUE(layer); EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); @@ -723,10 +764,9 @@ TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { ASSERT_TRUE(base); { - FileAccessForTesting layer_access("rectangles.pdf"); EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( - EPDFLayer_OpenLayer(base, &layer_access, nullptr, &status)); + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); ASSERT_TRUE(layer); EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); @@ -752,10 +792,9 @@ TEST_F(FPDFViewEmbedderTest, SaveLayerDeltaMaterializesWithBaseBytes) { std::string materialized; { - FileAccessForTesting layer_access("rectangles.pdf"); EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( - EPDFLayer_OpenLayer(base, &layer_access, nullptr, &open_status)); + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); ASSERT_TRUE(layer); EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); @@ -768,12 +807,25 @@ TEST_F(FPDFViewEmbedderTest, SaveLayerDeltaMaterializesWithBaseBytes) { ClearString(); EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; - ASSERT_TRUE(EPDFLayer_SaveDeltaToBuffer(layer.get(), this, &save_status)); + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); const std::string delta = GetString(); EXPECT_FALSE(delta.empty()); EXPECT_FALSE(delta.starts_with("%PDF-")); + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = const_cast(&delta); + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ASSERT_TRUE(replayed); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(replayed_page.get())); + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); ASSERT_FALSE(pdf_path.empty()); std::vector base_bytes = GetFileContents(pdf_path.c_str()); @@ -794,6 +846,166 @@ TEST_F(FPDFViewEmbedderTest, SaveLayerDeltaMaterializesWithBaseBytes) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerDeltaReplayWithLeadingBytesInBase) { + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector file_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(file_bytes.empty()); + + std::string base_bytes = "leading junk\n"; + base_bytes.append(reinterpret_cast(file_bytes.data()), + file_bytes.size()); + CountingStringFileAccess base_access(base_bytes); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(base_access.get(), nullptr); + ASSERT_TRUE(base); + + std::string delta; + { + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + delta = GetString(); + + unsigned long artifact_size = 0; + void* artifact_buffer = EPDFLayer_SaveLayerArtifactToOwnedBuffer( + layer.get(), &artifact_size, &save_status); + ASSERT_TRUE(artifact_buffer); + std::string artifact(static_cast(artifact_buffer), + artifact_size); + EPDF_FreeBuffer(artifact_buffer); + ASSERT_GE(artifact.size(), 40u); + EXPECT_EQ(base_bytes.size(), ReadUint64LEForTest(artifact.data() + 16)); + EXPECT_LT(ReadUint64LEForTest(artifact.data() + 24), + ReadUint64LEForTest(artifact.data() + 16)); + } + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(replayed_page.get())); + + const std::string materialized = base_bytes + delta; + ScopedFPDFDocument stock_reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + ASSERT_TRUE(stock_reopened); + ScopedFPDFPage stock_page(FPDF_LoadPage(stock_reopened.get(), 0)); + ASSERT_TRUE(stock_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(stock_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LayerDeltaReplayWithTrailingBytesInBase) { + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector file_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(file_bytes.empty()); + + std::string base_bytes(reinterpret_cast(file_bytes.data()), + file_bytes.size()); + base_bytes += "\n% harmless trailing bytes\n"; + CountingStringFileAccess base_access(base_bytes); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(base_access.get(), nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + const std::string delta = GetString(); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = const_cast(&delta); + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(replayed_page.get())); + + const std::string materialized = base_bytes + delta; + ScopedFPDFDocument stock_reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + ASSERT_TRUE(stock_reopened); + ScopedFPDFPage stock_page(FPDF_LoadPage(stock_reopened.get(), 0)); + ASSERT_TRUE(stock_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(stock_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LayerArtifactSaveUsesCachedBaseIdentity) { + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector file_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(file_bytes.empty()); + std::string base_bytes(reinterpret_cast(file_bytes.data()), + file_bytes.size()); + + CountingStringFileAccess base_access(base_bytes); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(base_access.get(), nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + + base_access.ResetCounts(); + unsigned long artifact_size = 0; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + void* artifact_buffer = EPDFLayer_SaveLayerArtifactToOwnedBuffer( + layer.get(), &artifact_size, &save_status); + ASSERT_TRUE(artifact_buffer); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + EXPECT_EQ(0u, base_access.read_bytes); + EPDF_FreeBuffer(artifact_buffer); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, LayerDiagnosticsRejectPlainDocuments) { ASSERT_TRUE(OpenDocument("rectangles.pdf")); EXPECT_FALSE(EPDFLayer_GetBaseDocument(document())); @@ -802,10 +1014,77 @@ TEST_F(FPDFViewEmbedderTest, LayerDiagnosticsRejectPlainDocuments) { ClearString(); EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSuccess; - EXPECT_FALSE(EPDFLayer_SaveDeltaToBuffer(document(), this, &save_status)); + EXPECT_FALSE(EPDFLayer_SaveDelta(document(), this, &save_status)); EXPECT_EQ(EPDFLayerSaveStatus_kSaveFailed, save_status); } +TEST_F(FPDFViewEmbedderTest, LayerOwnedBufferAndArtifactReplay) { + EPDF_FreeBuffer(nullptr); + + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + + unsigned long delta_size = 0; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + void* delta_buffer = + EPDFLayer_SaveDeltaToOwnedBuffer(layer.get(), &delta_size, &save_status); + ASSERT_TRUE(delta_buffer); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta(static_cast(delta_buffer), delta_size); + EPDF_FreeBuffer(delta_buffer); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus delta_open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &delta_open_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, delta_open_status); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(replayed_page.get())); + + unsigned long artifact_size = 0; + save_status = EPDFLayerSaveStatus_kSaveFailed; + void* artifact_buffer = EPDFLayer_SaveLayerArtifactToOwnedBuffer( + layer.get(), &artifact_size, &save_status); + ASSERT_TRUE(artifact_buffer); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string artifact(static_cast(artifact_buffer), + artifact_size); + EPDF_FreeBuffer(artifact_buffer); + + FPDF_FILEACCESS artifact_access = {}; + artifact_access.m_FileLen = artifact.size(); + artifact_access.m_GetBlock = GetBlockFromString; + artifact_access.m_Param = &artifact; + EPDFLayerOpenStatus artifact_open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument artifact_replayed(EPDFLayer_OpenLayerArtifact( + base, &artifact_access, nullptr, &artifact_open_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, artifact_open_status); + ASSERT_TRUE(artifact_replayed); + ScopedFPDFPage artifact_page(FPDF_LoadPage(artifact_replayed.get(), 0)); + ASSERT_TRUE(artifact_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(artifact_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); @@ -819,10 +1098,9 @@ TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { for (int expected_annots = 1; expected_annots <= 3; ++expected_annots) { std::string materialized; { - FileAccessForTesting layer_access("rectangles.pdf"); EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( - EPDFLayer_OpenLayer(base, &layer_access, nullptr, &open_status)); + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); ASSERT_TRUE(layer); EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); @@ -837,7 +1115,7 @@ TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { ClearString(); EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; - ASSERT_TRUE(EPDFLayer_SaveDeltaToBuffer(layer.get(), this, &save_status)); + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); materialized.assign(reinterpret_cast(base_bytes.data()), base_bytes.size()); @@ -855,6 +1133,112 @@ TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerDeltaReplaysMultipleAnnotRemoval) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + ASSERT_FALSE(pdf_path.empty()); + std::vector base_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(base_bytes.empty()); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + for (int i = 0; i < 3; ++i) { + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + } + ASSERT_EQ(3, FPDFPage_GetAnnotCount(page.get())); + + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 1)); + ASSERT_EQ(2, FPDFPage_GetAnnotCount(page.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + const std::string delta = GetString(); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = const_cast(&delta); + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(2, FPDFPage_GetAnnotCount(replayed_page.get())); + + std::string materialized(reinterpret_cast(base_bytes.data()), + base_bytes.size()); + materialized += delta; + ScopedFPDFDocument stock_reopened(FPDF_LoadMemDocument64( + materialized.data(), materialized.size(), nullptr)); + ASSERT_TRUE(stock_reopened); + ScopedFPDFPage stock_page(FPDF_LoadPage(stock_reopened.get(), 0)); + ASSERT_TRUE(stock_page); + EXPECT_EQ(2, FPDFPage_GetAnnotCount(stock_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LayerDeltaReplaysRemoveAllAnnots) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + for (int i = 0; i < 3; ++i) { + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + } + ASSERT_EQ(3, FPDFPage_GetAnnotCount(page.get())); + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 2)); + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 1)); + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 0)); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + const std::string delta = GetString(); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = const_cast(&delta); + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(replayed_page.get())); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, Page) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/public/fpdf_save.h b/public/fpdf_save.h index d388ae11fd..72a5dfcfa2 100644 --- a/public/fpdf_save.h +++ b/public/fpdf_save.h @@ -86,6 +86,36 @@ FPDF_SaveWithVersion(FPDF_DOCUMENT document, FPDF_DWORD flags, int file_version); +// Function: EPDF_FreeBuffer +// Releases a buffer returned by an EPDF_*ToOwnedBuffer() API. +// Parameters: +// buffer - Buffer returned by an EPDF owned-buffer API, or +// NULL. +FPDF_EXPORT void FPDF_CALLCONV EPDF_FreeBuffer(void* buffer); + +// Function: EPDF_SaveDocumentToOwnedBuffer +// Saves the copy of specified document into an owned memory buffer. +// The caller must release the returned buffer with EPDF_FreeBuffer(). +// Parameters: +// document - Handle to document. +// flags - Flags above that affect how the PDF gets saved. +// out_size - Receives the size of the returned buffer. +// Return value: +// Owned buffer if successful, NULL if failed. +FPDF_EXPORT void* FPDF_CALLCONV +EPDF_SaveDocumentToOwnedBuffer(FPDF_DOCUMENT document, + FPDF_DWORD flags, + unsigned long* out_size); + +// Function: EPDF_SaveDocumentToOwnedBufferWithVersion +// Same as EPDF_SaveDocumentToOwnedBuffer(), except the file version of +// the saved document can be specified by the caller. +FPDF_EXPORT void* FPDF_CALLCONV +EPDF_SaveDocumentToOwnedBufferWithVersion(FPDF_DOCUMENT document, + FPDF_DWORD flags, + unsigned long* out_size, + int file_version); + // Runtime-side status for saving a layer delta. typedef enum { EPDFLayerSaveStatus_kSuccess = 0, @@ -93,9 +123,9 @@ typedef enum { EPDFLayerSaveStatus_kSaveFailed = 2, } EPDFLayerSaveStatus; -// Function: EPDFLayer_SaveDeltaToBuffer +// Function: EPDFLayer_SaveDelta // Saves only a layer document's current overlay delta. The caller can -// materialize the layer as base bytes followed by this returned delta. +// materialize the layer as base bytes followed by the written delta. // Parameters: // layer - A layer document returned by EPDFLayer_OpenLayer(). // file_write - A pointer to a custom file write structure. @@ -103,9 +133,27 @@ typedef enum { // Return value: // TRUE if succeed, FALSE if failed. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFLayer_SaveDeltaToBuffer(FPDF_DOCUMENT layer, - FPDF_FILEWRITE* file_write, - EPDFLayerSaveStatus* out_status); +EPDFLayer_SaveDelta(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status); + +// Function: EPDFLayer_SaveDeltaToOwnedBuffer +// Saves only a layer document's current overlay delta into an owned +// memory buffer. The caller must release the returned buffer with +// EPDF_FreeBuffer(). +FPDF_EXPORT void* FPDF_CALLCONV +EPDFLayer_SaveDeltaToOwnedBuffer(FPDF_DOCUMENT layer, + unsigned long* out_size, + EPDFLayerSaveStatus* out_status); + +// Function: EPDFLayer_SaveLayerArtifactToOwnedBuffer +// Saves a server-facing layer artifact containing base identity +// metadata and the raw layer delta. The caller must release the +// returned buffer with EPDF_FreeBuffer(). +FPDF_EXPORT void* FPDF_CALLCONV +EPDFLayer_SaveLayerArtifactToOwnedBuffer(FPDF_DOCUMENT layer, + unsigned long* out_size, + EPDFLayerSaveStatus* out_status); #ifdef __cplusplus } diff --git a/public/fpdfview.h b/public/fpdfview.h index dad1f1246c..47c4143dbd 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -595,9 +595,9 @@ typedef enum { // with FPDF_CloseDocument(). // Parameters: // base - A base document returned by EPDF_LoadBaseDocument(). -// pFileAccess - A structure for accessing the materialized layer -// bytes. For Slice 7.2 this must be the base bytes -// with no appended delta. +// pFileAccess - Optional raw layer delta bytes as returned by +// EPDFLayer_SaveDelta(). NULL or zero-length opens a +// fresh empty layer. // password - Reserved for future delta-password handling. // out_status - Optional detailed open status. // Return value: @@ -608,6 +608,16 @@ EPDFLayer_OpenLayer(EPDF_BASE_DOCUMENT base, FPDF_BYTESTRING password, EPDFLayerOpenStatus* out_status); +// Function: EPDFLayer_OpenLayerArtifact +// Open a layer view from a layer artifact produced by +// EPDFLayer_SaveLayerArtifactToOwnedBuffer(). Validates that the +// artifact belongs to |base| before ingesting its raw delta. +FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV +EPDFLayer_OpenLayerArtifact(EPDF_BASE_DOCUMENT base, + FPDF_FILEACCESS* pFileAccess, + FPDF_BYTESTRING password, + EPDFLayerOpenStatus* out_status); + // Function: EPDFLayer_IsObjectPromoted // Return whether the object exists in the layer overlay. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV diff --git a/testing/tools/epdf_layer_memory_benchmark.cpp b/testing/tools/epdf_layer_memory_benchmark.cpp index 7b8930c11d..bfcc25f3d8 100644 --- a/testing/tools/epdf_layer_memory_benchmark.cpp +++ b/testing/tools/epdf_layer_memory_benchmark.cpp @@ -55,12 +55,11 @@ std::vector ParseLayerCounts(const std::string& spec) { size_t start = 0; while (start <= spec.size()) { const size_t comma = spec.find(',', start); - const std::string token = - spec.substr(start, comma == std::string::npos ? std::string::npos - : comma - start); + const std::string token = spec.substr( + start, comma == std::string::npos ? std::string::npos : comma - start); if (!token.empty()) { - result.push_back(static_cast(std::strtoull(token.c_str(), nullptr, - 10))); + result.push_back( + static_cast(std::strtoull(token.c_str(), nullptr, 10))); } if (comma == std::string::npos) { break; @@ -77,8 +76,7 @@ bool AddTextAnnotation(FPDF_DOCUMENT layer) { if (!page) { return false; } - ScopedFPDFAnnotation annot( - EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); return !!annot; } @@ -126,17 +124,15 @@ int main(int argc, char** argv) { const size_t baseline_rss = CurrentRssBytes(); std::vector layers; layers.reserve(layer_counts.back()); - std::vector layer_files; - layer_files.reserve(layer_counts.back()); - std::puts("layers,rss_bytes,delta_from_base_rss,bytes_per_layer," - "promoted_objects"); + std::puts( + "layers,rss_bytes,delta_from_base_rss,bytes_per_layer," + "promoted_objects"); size_t next_report = 0; for (size_t i = 1; i <= layer_counts.back(); ++i) { - layer_files.emplace_back(&base_bytes); EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; - ScopedFPDFDocument layer(EPDFLayer_OpenLayer( - base, layer_files.back().file_access(), nullptr, &status)); + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, /*pFileAccess=*/nullptr, nullptr, &status)); if (!layer || status != EPDFLayerOpenStatus_kSuccess) { std::fprintf(stderr, "Failed to open layer %zu.\n", i); EPDF_ReleaseBaseDocument(base); diff --git a/testing/tools/epdf_layer_replay_soak.cpp b/testing/tools/epdf_layer_replay_soak.cpp index abd63f291d..e5c060f923 100644 --- a/testing/tools/epdf_layer_replay_soak.cpp +++ b/testing/tools/epdf_layer_replay_soak.cpp @@ -62,12 +62,60 @@ bool VerifyMaterializedAnnotCount(const std::vector& materialized, expected_count; } +bool VerifyLayerAnnotCount(FPDF_DOCUMENT layer, size_t expected_count) { + ScopedFPDFPage page(FPDF_LoadPage(layer, 0)); + if (!page) { + return false; + } + return static_cast(FPDFPage_GetAnnotCount(page.get())) == + expected_count; +} + +bool VerifyRawDeltaReplay(EPDF_BASE_DOCUMENT base, + const std::string& delta, + size_t expected_count) { + const std::vector delta_bytes(delta.begin(), delta.end()); + epdf_layer_tool::MemoryFile delta_file(&delta_bytes); + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument reopened(EPDFLayer_OpenLayer( + base, delta_file.file_access(), nullptr, &open_status)); + return reopened && open_status == EPDFLayerOpenStatus_kSuccess && + VerifyLayerAnnotCount(reopened.get(), expected_count); +} + +bool VerifyArtifactReplay(EPDF_BASE_DOCUMENT base, + FPDF_DOCUMENT layer, + size_t expected_count) { + unsigned long artifact_size = 0; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + void* artifact = EPDFLayer_SaveLayerArtifactToOwnedBuffer( + layer, &artifact_size, &save_status); + if (!artifact || artifact_size == 0 || + save_status != EPDFLayerSaveStatus_kSuccess) { + EPDF_FreeBuffer(artifact); + return false; + } + + std::vector artifact_bytes( + static_cast(artifact), + static_cast(artifact) + artifact_size); + EPDF_FreeBuffer(artifact); + + epdf_layer_tool::MemoryFile artifact_file(&artifact_bytes); + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument reopened(EPDFLayer_OpenLayerArtifact( + base, artifact_file.file_access(), nullptr, &open_status)); + return reopened && open_status == EPDFLayerOpenStatus_kSuccess && + VerifyLayerAnnotCount(reopened.get(), expected_count); +} + } // namespace int main(int argc, char** argv) { if (argc < 2) { epdf_layer_tool::PrintUsage( - argv[0], "[--layers=100] [--rounds=60] [--sleep-seconds=60] [--seed=N]"); + argv[0], + "[--layers=100] [--rounds=60] [--sleep-seconds=60] [--seed=N]"); return 2; } @@ -126,10 +174,9 @@ int main(int argc, char** argv) { expected_annots[edited_layer] += edit_dist(rng); for (size_t layer_index = 0; layer_index < layer_count; ++layer_index) { - epdf_layer_tool::MemoryFile layer_file(&base_bytes); EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; - ScopedFPDFDocument layer(EPDFLayer_OpenLayer( - base, layer_file.file_access(), nullptr, &open_status)); + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); if (!layer || open_status != EPDFLayerOpenStatus_kSuccess) { std::fprintf(stderr, "Round %zu layer %zu: open failed.\n", round, layer_index); @@ -147,7 +194,7 @@ int main(int argc, char** argv) { epdf_layer_tool::StringWriter writer; EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; - if (!EPDFLayer_SaveDeltaToBuffer(layer.get(), &writer, &save_status) || + if (!EPDFLayer_SaveDelta(layer.get(), &writer, &save_status) || save_status != EPDFLayerSaveStatus_kSuccess) { std::fprintf(stderr, "Round %zu layer %zu: save failed (%d).\n", round, layer_index, save_status); @@ -167,6 +214,22 @@ int main(int argc, char** argv) { FPDF_DestroyLibrary(); return 1; } + if (!VerifyRawDeltaReplay(base, writer.data, + expected_annots[layer_index])) { + std::fprintf(stderr, "Round %zu layer %zu: raw delta replay failed.\n", + round, layer_index); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } + if (!VerifyArtifactReplay(base, layer.get(), + expected_annots[layer_index])) { + std::fprintf(stderr, "Round %zu layer %zu: artifact replay failed.\n", + round, layer_index); + EPDF_ReleaseBaseDocument(base); + FPDF_DestroyLibrary(); + return 1; + } } std::printf("round=%zu layers=%zu edited_layer=%zu ok\n", round + 1, From 7d468aff8daef7452844335b6593ab4ff217077b Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 10 May 2026 21:45:36 +0300 Subject: [PATCH 15/56] ReadOnlyLayerWorkflowsProduceEmptyDelta --- core/fpdfapi/page/cpdf_docpagedata.cpp | 7 ++-- fpdfsdk/epdf_layer.cpp | 5 +++ fpdfsdk/fpdf_view_embeddertest.cpp | 55 ++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index 8356c69300..a40e1e9369 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -452,10 +452,9 @@ RetainPtr CPDF_DocPageData::GetImage(uint32_t dwStreamObjNum) { return it->second; } - if (fallback_ && !GetDocument()->IsObjectPromoted(dwStreamObjNum)) { - return fallback_->GetImage(dwStreamObjNum); - } - + // CPDF_Image carries a document back-pointer and CPDF_PageImageCache rejects + // cross-document images. Build a document-local CPDF_Image even when the + // underlying stream falls through to a shared base document. auto pImage = pdfium::MakeRetain(GetDocument(), dwStreamObjNum); image_map_[dwStreamObjNum] = pImage; return pImage; diff --git a/fpdfsdk/epdf_layer.cpp b/fpdfsdk/epdf_layer.cpp index 89eae4c787..56fb0856a6 100644 --- a/fpdfsdk/epdf_layer.cpp +++ b/fpdfsdk/epdf_layer.cpp @@ -372,6 +372,11 @@ EPDFLayer_SaveDelta(FPDF_DOCUMENT layer, return false; } + if (layer_doc->GetPromotedObjectCount() == 0) { + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSuccess); + return true; + } + if (!layer_doc->GetParser()) { return false; } diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index aa86677a6d..81feb76221 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -20,6 +20,7 @@ #include "fpdfsdk/fpdf_view_c_api_test.h" #include "public/cpp/fpdf_scopers.h" #include "public/fpdf_annot.h" +#include "public/fpdf_doc.h" #include "public/fpdf_save.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" @@ -758,6 +759,60 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerAnnotHandleDoesNotPromote) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerWorkflowsProduceEmptyDelta) { + static constexpr const char* kFiles[] = { + "links_highlights_annots.pdf", + "multiple_form_types.pdf", + "embedded_images.pdf", + "annotation_stamp_with_ap.pdf", + }; + + for (const char* file_name : kFiles) { + FileAccessForTesting base_access(file_name); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base) << file_name; + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer) << file_name; + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status) << file_name; + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + const int page_count = FPDF_GetPageCount(layer.get()); + ASSERT_GT(page_count, 0) << file_name; + for (int page_index = 0; page_index < page_count; ++page_index) { + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), page_index)); + ASSERT_TRUE(page) << file_name << " page " << page_index; + ScopedFPDFBitmap bitmap = RenderPage(page.get()); + ASSERT_TRUE(bitmap) << file_name << " page " << page_index; + + const int annot_count = FPDFPage_GetAnnotCount(page.get()); + for (int annot_index = 0; annot_index < annot_count; ++annot_index) { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), annot_index)); + ASSERT_TRUE(annot) << file_name << " annot " << annot_index; + } + + int link_pos = 0; + FPDF_LINK link = nullptr; + while (FPDFLink_Enumerate(page.get(), &link_pos, &link)) { + ASSERT_TRUE(link) << file_name << " page " << page_index; + } + } + + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)) + << file_name; + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status) << file_name; + EXPECT_TRUE(GetString().empty()) << file_name; + + EPDF_ReleaseBaseDocument(base); + } +} + TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From 8191aebc55b2230664ca256a2364b54989d3d5ee Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 10 May 2026 22:05:57 +0300 Subject: [PATCH 16/56] Keep layer read paths from promoting page and name-tree state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Harden layer read-purity by preventing layer page lookup and name-tree read APIs from entering mutable PDF graph paths. This change: - Adds a CPDF_LayerDocument::GetPageDictionary() override so unresolved layer page slots fail closed instead of running PDFium’s mutable page-tree fallback. - Adds CPDF_NameTree::CreateForReading() and moves named destinations, attachments, JavaScript actions, and form-fill JavaScript scanning onto const traversal. - Keeps mutating name-tree operations on the existing mutable creation path. - Expands read-only layer canaries across render/cache, annotation, catalog, name-tree, malformed page-tree, and sibling-layer isolation cases. - Verifies read-only layer workflows save empty deltas while peer layer mutations remain isolated. --- core/fpdfapi/parser/cpdf_layer_document.cpp | 14 + core/fpdfapi/parser/cpdf_layer_document.h | 1 + core/fpdfdoc/cpdf_nametree.cpp | 41 ++- core/fpdfdoc/cpdf_nametree.h | 6 +- fpdfsdk/cpdfsdk_formfillenvironment.cpp | 2 +- fpdfsdk/fpdf_attachment.cpp | 60 +++-- fpdfsdk/fpdf_javascript.cpp | 4 +- fpdfsdk/fpdf_view.cpp | 4 +- fpdfsdk/fpdf_view_embeddertest.cpp | 282 ++++++++++++++++++-- 9 files changed, 350 insertions(+), 64 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index 44747cef02..11b232118c 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -131,6 +131,20 @@ RetainPtr CPDF_LayerDocument::GetMutableInfo() { return info; } +RetainPtr CPDF_LayerDocument::GetPageDictionary( + int iPage) { + if (iPage < 0 || static_cast(iPage) >= GetPageListSize()) { + return nullptr; + } + + const uint32_t objnum = GetPageObjNumAt(iPage); + if (!objnum) { + return nullptr; + } + + return ToDictionary(GetOrParseIndirectObject(objnum)); +} + uint32_t CPDF_LayerDocument::GetUserPermissions(bool get_owner_perms) const { return base_->GetUserPermissions(get_owner_perms); } diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index 1d4df51299..6d22237dcd 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -40,6 +40,7 @@ class CPDF_LayerDocument final : public CPDF_Document { CPDF_Parser* GetParser() const override; RetainPtr GetMutableRoot() override; RetainPtr GetMutableInfo() override; + RetainPtr GetPageDictionary(int iPage) override; uint32_t GetUserPermissions(bool get_owner_perms) const override; RetainPtr FindPromotedObject(uint32_t objnum) const override; bool IsLayerDocument() const override; diff --git a/core/fpdfdoc/cpdf_nametree.cpp b/core/fpdfdoc/cpdf_nametree.cpp index b4f65c7a28..967a300e4a 100644 --- a/core/fpdfdoc/cpdf_nametree.cpp +++ b/core/fpdfdoc/cpdf_nametree.cpp @@ -455,8 +455,8 @@ RetainPtr LookupOldStyleNamedDest(CPDF_Document* doc, } // namespace -CPDF_NameTree::CPDF_NameTree(RetainPtr pRoot) - : root_(std::move(pRoot)) { +CPDF_NameTree::CPDF_NameTree(RetainPtr pRoot, bool read_only) + : root_(std::move(pRoot)), read_only_(read_only) { DCHECK(root_); } @@ -481,7 +481,34 @@ std::unique_ptr CPDF_NameTree::Create(CPDF_Document* doc, } return pdfium::WrapUnique( - new CPDF_NameTree(std::move(pCategory))); // Private ctor. + new CPDF_NameTree(std::move(pCategory), /*read_only=*/false)); +} + +// static +std::unique_ptr CPDF_NameTree::CreateForReading( + CPDF_Document* doc, + ByteStringView category) { + const CPDF_Dictionary* root = doc->GetRoot(); + if (!root) { + return nullptr; + } + + RetainPtr names = root->GetDictFor("Names"); + if (!names) { + return nullptr; + } + + RetainPtr category_dict = names->GetDictFor(category); + if (!category_dict) { + return nullptr; + } + + // CPDF_NameTree stores a mutable pointer because the same class also backs + // AddValueAndName() / DeleteValueAndName(). `read_only_` prevents mutation + // through trees constructed by this const traversal path. + return pdfium::WrapUnique(new CPDF_NameTree( + pdfium::WrapRetain(const_cast(category_dict.Get())), + /*read_only=*/true)); } // static @@ -509,14 +536,14 @@ std::unique_ptr CPDF_NameTree::CreateWithRootNameArray( pCategory->GetObjNum()); } - return pdfium::WrapUnique(new CPDF_NameTree(pCategory)); // Private ctor. + return pdfium::WrapUnique(new CPDF_NameTree(pCategory, /*read_only=*/false)); } // static std::unique_ptr CPDF_NameTree::CreateForTesting( CPDF_Dictionary* pRoot) { return pdfium::WrapUnique( - new CPDF_NameTree(pdfium::WrapRetain(pRoot))); // Private ctor. + new CPDF_NameTree(pdfium::WrapRetain(pRoot), /*read_only=*/false)); } // static @@ -524,7 +551,7 @@ RetainPtr CPDF_NameTree::LookupNamedDest( CPDF_Document* doc, const ByteString& name) { RetainPtr dest_array; - std::unique_ptr name_tree = Create(doc, "Dests"); + std::unique_ptr name_tree = CreateForReading(doc, "Dests"); if (name_tree) { dest_array = name_tree->LookupNewStyleNamedDest(name); } @@ -541,6 +568,7 @@ size_t CPDF_NameTree::GetCount() const { bool CPDF_NameTree::AddValueAndName(RetainPtr pObj, const WideString& name) { + CHECK(!read_only_); NodeToInsert node_to_insert; // Handle the corner case where the root node is empty. i.e. No kids and no // names. In which case, just insert into it and skip all the searches. @@ -601,6 +629,7 @@ bool CPDF_NameTree::AddValueAndName(RetainPtr pObj, } bool CPDF_NameTree::DeleteValueAndName(size_t nIndex) { + CHECK(!read_only_); std::optional result = SearchNameNodeByIndex(root_.Get(), nIndex); if (!result) { diff --git a/core/fpdfdoc/cpdf_nametree.h b/core/fpdfdoc/cpdf_nametree.h index a6505a65cd..de6b4043f8 100644 --- a/core/fpdfdoc/cpdf_nametree.h +++ b/core/fpdfdoc/cpdf_nametree.h @@ -27,6 +27,9 @@ class CPDF_NameTree { static std::unique_ptr Create(CPDF_Document* doc, ByteStringView category); + static std::unique_ptr CreateForReading( + CPDF_Document* doc, + ByteStringView category); // If necessary, create missing Names dictionary in |doc|, and/or missing // Names array in the dictionary that corresponds to |category|, if necessary. @@ -52,11 +55,12 @@ class CPDF_NameTree { CPDF_Dictionary* GetRootForTesting() const { return root_.Get(); } private: - explicit CPDF_NameTree(RetainPtr pRoot); + CPDF_NameTree(RetainPtr pRoot, bool read_only); RetainPtr LookupNewStyleNamedDest(const ByteString& name); RetainPtr const root_; + const bool read_only_; }; #endif // CORE_FPDFDOC_CPDF_NAMETREE_H_ diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp index bf887c5797..5c91858b62 100644 --- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp +++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp @@ -685,7 +685,7 @@ CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageViewAtIndex(int nIndex) { } void CPDFSDK_FormFillEnvironment::ProcJavascriptAction() { - auto name_tree = CPDF_NameTree::Create(cpdfdoc_, "JavaScript"); + auto name_tree = CPDF_NameTree::CreateForReading(cpdfdoc_, "JavaScript"); if (!name_tree) { return; } diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp index 5f0d908d41..40ae66baef 100644 --- a/fpdfsdk/fpdf_attachment.cpp +++ b/fpdfsdk/fpdf_attachment.cpp @@ -43,7 +43,7 @@ FPDFDoc_GetAttachmentCount(FPDF_DOCUMENT document) { return 0; } - auto name_tree = CPDF_NameTree::Create(doc, "EmbeddedFiles"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "EmbeddedFiles"); return name_tree ? pdfium::checked_cast(name_tree->GetCount()) : 0; } @@ -87,7 +87,7 @@ FPDFDoc_GetAttachment(FPDF_DOCUMENT document, int index) { return nullptr; } - auto name_tree = CPDF_NameTree::Create(doc, "EmbeddedFiles"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "EmbeddedFiles"); if (!name_tree || static_cast(index) >= name_tree->GetCount()) { return nullptr; } @@ -334,38 +334,44 @@ FPDFAttachment_GetSubtype(FPDF_ATTACHMENT attachment, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAttachment_SetSubtype(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING subtype) { CPDF_Object* file = CPDFObjectFromFPDFAttachment(attachment); - if (!file) + if (!file) { return false; + } CPDF_FileSpec spec(pdfium::WrapRetain(file)); RetainPtr file_stream = spec.GetFileStream(); - if (!file_stream) + if (!file_stream) { return false; + } CPDF_Stream* s = const_cast(file_stream.Get()); CPDF_Dictionary* dict = s->GetMutableDict(); - if (!dict) + if (!dict) { return false; + } // Ensure /Type is present (defensive). - if (dict->GetNameFor("Type").IsEmpty()) + if (dict->GetNameFor("Type").IsEmpty()) { dict->SetNewFor("Type", "EmbeddedFile"); + } // Convert to ByteString. ByteString bs = subtype ? ByteString(subtype) : ByteString(); if (bs.IsEmpty()) { dict->RemoveFor("Subtype"); } else { - dict->SetNewFor("Subtype", bs); + dict->SetNewFor("Subtype", bs); } return true; } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAttachment_SetDescription(FPDF_ATTACHMENT attachment, FPDF_WIDESTRING desc) { +EPDFAttachment_SetDescription(FPDF_ATTACHMENT attachment, + FPDF_WIDESTRING desc) { CPDF_Object* file = CPDFObjectFromFPDFAttachment(attachment); - if (!file || !file->IsDictionary()) + if (!file || !file->IsDictionary()) { return false; + } // SAFETY: required from caller. WideString ws = UNSAFE_BUFFERS(WideStringFromFPDFWideString(desc)); @@ -384,42 +390,48 @@ EPDFAttachment_GetDescription(FPDF_ATTACHMENT attachment, FPDF_WCHAR* buffer, unsigned long buflen) { CPDF_Object* file = CPDFObjectFromFPDFAttachment(attachment); - if (!file || !file->IsDictionary()) + if (!file || !file->IsDictionary()) { return 0; + } - RetainPtr obj = - file->AsDictionary()->GetObjectFor("Desc"); - if (!obj || !obj->IsString()) - return Utf16EncodeMaybeCopyAndReturnLength(WideString(), - UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + RetainPtr obj = file->AsDictionary()->GetObjectFor("Desc"); + if (!obj || !obj->IsString()) { + return Utf16EncodeMaybeCopyAndReturnLength( + WideString(), UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + } - return Utf16EncodeMaybeCopyAndReturnLength(obj->GetUnicodeText(), - UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + return Utf16EncodeMaybeCopyAndReturnLength( + obj->GetUnicodeText(), + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAttachment_GetIntegerValue(FPDF_ATTACHMENT attachment, FPDF_BYTESTRING key, int* out_value) { - if (!out_value) + if (!out_value) { return false; + } CPDF_Object* file = CPDFObjectFromFPDFAttachment(attachment); - if (!file) + if (!file) { return false; + } CPDF_FileSpec spec(pdfium::WrapRetain(file)); RetainPtr params = spec.GetParamsDict(); - if (!params) + if (!params) { return false; + } ByteStringView k(key); RetainPtr obj = params->GetObjectFor(k); - if (!obj || !obj->IsNumber()) + if (!obj || !obj->IsNumber()) { return false; + } const CPDF_Number* num = obj->AsNumber(); - *out_value = num->IsInteger() ? num->GetInteger() - : static_cast(num->GetNumber()); + *out_value = + num->IsInteger() ? num->GetInteger() : static_cast(num->GetNumber()); return true; -} \ No newline at end of file +} diff --git a/fpdfsdk/fpdf_javascript.cpp b/fpdfsdk/fpdf_javascript.cpp index c5a9555760..9ee17d61c5 100644 --- a/fpdfsdk/fpdf_javascript.cpp +++ b/fpdfsdk/fpdf_javascript.cpp @@ -27,7 +27,7 @@ FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) { return -1; } - auto name_tree = CPDF_NameTree::Create(doc, "JavaScript"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "JavaScript"); return name_tree ? pdfium::checked_cast(name_tree->GetCount()) : 0; } @@ -38,7 +38,7 @@ FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { return nullptr; } - auto name_tree = CPDF_NameTree::Create(doc, "JavaScript"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "JavaScript"); if (!name_tree || static_cast(index) >= name_tree->GetCount()) { return nullptr; } diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 2cef39bfe8..a423735d47 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -1761,7 +1761,7 @@ FPDF_CountNamedDests(FPDF_DOCUMENT document) { return 0; } - auto name_tree = CPDF_NameTree::Create(doc, "Dests"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "Dests"); FX_SAFE_UINT32 count = name_tree ? name_tree->GetCount() : 0; RetainPtr pOldStyleDests = pRoot->GetDictFor("Dests"); if (pOldStyleDests) { @@ -1883,7 +1883,7 @@ FPDF_EXPORT FPDF_DEST FPDF_CALLCONV FPDF_GetNamedDest(FPDF_DOCUMENT document, return nullptr; } - auto name_tree = CPDF_NameTree::Create(doc, "Dests"); + auto name_tree = CPDF_NameTree::CreateForReading(doc, "Dests"); size_t name_tree_count = name_tree ? name_tree->GetCount() : 0; RetainPtr pDestObj; WideString wsName; diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 81feb76221..e36b7945a1 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -20,7 +20,9 @@ #include "fpdfsdk/fpdf_view_c_api_test.h" #include "public/cpp/fpdf_scopers.h" #include "public/fpdf_annot.h" +#include "public/fpdf_attachment.h" #include "public/fpdf_doc.h" +#include "public/fpdf_javascript.h" #include "public/fpdf_save.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" @@ -204,6 +206,51 @@ TEST(fpdf, CApiTest) { class FPDFViewEmbedderTest : public EmbedderTest { protected: + void CheckReadOnlyLayerWorkflowProducesEmptyDelta(const char* file_name) { + FileAccessForTesting base_access(file_name); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base) << file_name; + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer) << file_name; + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status) << file_name; + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + const int page_count = FPDF_GetPageCount(layer.get()); + ASSERT_GT(page_count, 0) << file_name; + for (int page_index = 0; page_index < page_count; ++page_index) { + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), page_index)); + ASSERT_TRUE(page) << file_name << " page " << page_index; + ScopedFPDFBitmap bitmap = RenderPage(page.get()); + ASSERT_TRUE(bitmap) << file_name << " page " << page_index; + + const int annot_count = FPDFPage_GetAnnotCount(page.get()); + for (int annot_index = 0; annot_index < annot_count; ++annot_index) { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), annot_index)); + ASSERT_TRUE(annot) << file_name << " annot " << annot_index; + } + + int link_pos = 0; + FPDF_LINK link = nullptr; + while (FPDFLink_Enumerate(page.get(), &link_pos, &link)) { + ASSERT_TRUE(link) << file_name << " page " << page_index; + } + } + + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)) + << file_name; + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status) << file_name; + EXPECT_TRUE(GetString().empty()) << file_name; + + EPDF_ReleaseBaseDocument(base); + } + void TestRenderPageBitmapWithMatrix(FPDF_PAGE page, int bitmap_width, int bitmap_height, @@ -768,51 +815,230 @@ TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerWorkflowsProduceEmptyDelta) { }; for (const char* file_name : kFiles) { - FileAccessForTesting base_access(file_name); + CheckReadOnlyLayerWorkflowProducesEmptyDelta(file_name); + } +} + +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerRenderCacheMatrixProducesEmptyDelta) { + static constexpr const char* kFiles[] = { + "form_object.pdf", + "form_object_with_text.pdf", + "form_object_with_image.pdf", + "form_object_with_path.pdf", + "shared_form_xobject_matrix.pdf", + "hello_world_2_pages_shared_resources_dict.pdf", + "jpx_lzw.pdf", + "rotated_image.pdf", + "simple_thumbnail.pdf", + "thumbnail_with_no_filters.pdf", + }; + + for (const char* file_name : kFiles) { + CheckReadOnlyLayerWorkflowProducesEmptyDelta(file_name); + } +} + +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerAnnotMatrixProducesEmptyDelta) { + static constexpr const char* kFiles[] = { + "annots.pdf", + "annotation_markup_multiline_no_ap.pdf", + "annotation_highlight_rollover_ap.pdf", + "annotation_ink_multiple.pdf", + "polygon_annot.pdf", + "line_annot.pdf", + "redact_annot.pdf", + "annotation_fileattachment.pdf", + }; + + for (const char* file_name : kFiles) { + CheckReadOnlyLayerWorkflowProducesEmptyDelta(file_name); + } +} + +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerCatalogMatrixProducesEmptyDelta) { + static constexpr const char* kFiles[] = { + "embedded_attachments.pdf", "named_dests.pdf", "page_labels.pdf", + "tagged_mcr_multipage.pdf", "two_signatures.pdf", + }; + + for (const char* file_name : kFiles) { + CheckReadOnlyLayerWorkflowProducesEmptyDelta(file_name); + } +} + +TEST_F(FPDFViewEmbedderTest, + ReadOnlyLayerMalformedOldStyleNamedDestsProducesEmptyDelta) { + FileAccessForTesting plain_access("named_dests_old_style.pdf"); + ScopedFPDFDocument plain(FPDF_LoadCustomDocument(&plain_access, nullptr)); + ASSERT_TRUE(plain); + EXPECT_EQ(2, FPDF_GetPageCount(plain.get())); + ScopedFPDFPage plain_page_0(FPDF_LoadPage(plain.get(), 0)); + EXPECT_TRUE(plain_page_0); + ScopedFPDFPage plain_page_1(FPDF_LoadPage(plain.get(), 1)); + EXPECT_FALSE(plain_page_1); + + FileAccessForTesting base_access("named_dests_old_style.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + EXPECT_EQ(2, FPDF_GetPageCount(layer.get())); + + EXPECT_EQ(2u, FPDF_CountNamedDests(layer.get())); + EXPECT_FALSE(FPDF_GetNamedDestByName(layer.get(), nullptr)); + EXPECT_FALSE(FPDF_GetNamedDestByName(layer.get(), "")); + EXPECT_FALSE(FPDF_GetNamedDestByName(layer.get(), "NoSuchName")); + EXPECT_TRUE(FPDF_GetNamedDestByName(layer.get(), kFirstAlternate)); + EXPECT_TRUE(FPDF_GetNamedDestByName(layer.get(), kLastAlternate)); + + char buffer[512]; + long size = sizeof(buffer); + ASSERT_TRUE(FPDF_GetNamedDest(layer.get(), 0, buffer, &size)); + ASSERT_EQ(static_cast(sizeof(kFirstAlternate) * 2), size); + EXPECT_EQ(kFirstAlternate, + GetPlatformString(reinterpret_cast(buffer))); + + ScopedFPDFPage layer_page_0(FPDF_LoadPage(layer.get(), 0)); + EXPECT_TRUE(layer_page_0); + ScopedFPDFPage layer_page_1(FPDF_LoadPage(layer.get(), 1)); + EXPECT_FALSE(layer_page_1); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + EXPECT_TRUE(GetString().empty()); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerNameTreeApisProduceEmptyDelta) { + { + FileAccessForTesting base_access("embedded_attachments.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); - ASSERT_TRUE(base) << file_name; + ASSERT_TRUE(base); EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; ScopedFPDFDocument layer( EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); - ASSERT_TRUE(layer) << file_name; - EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status) << file_name; - EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); - const int page_count = FPDF_GetPageCount(layer.get()); - ASSERT_GT(page_count, 0) << file_name; - for (int page_index = 0; page_index < page_count; ++page_index) { - ScopedFPDFPage page(FPDF_LoadPage(layer.get(), page_index)); - ASSERT_TRUE(page) << file_name << " page " << page_index; - ScopedFPDFBitmap bitmap = RenderPage(page.get()); - ASSERT_TRUE(bitmap) << file_name << " page " << page_index; + ASSERT_EQ(2, FPDFDoc_GetAttachmentCount(layer.get())); + EXPECT_TRUE(FPDFDoc_GetAttachment(layer.get(), 0)); + EXPECT_TRUE(FPDFDoc_GetAttachment(layer.get(), 1)); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); - const int annot_count = FPDFPage_GetAnnotCount(page.get()); - for (int annot_index = 0; annot_index < annot_count; ++annot_index) { - ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), annot_index)); - ASSERT_TRUE(annot) << file_name << " annot " << annot_index; - } + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + EXPECT_TRUE(GetString().empty()); - int link_pos = 0; - FPDF_LINK link = nullptr; - while (FPDFLink_Enumerate(page.get(), &link_pos, &link)) { - ASSERT_TRUE(link) << file_name << " page " << page_index; - } - } + EPDF_ReleaseBaseDocument(base); + } - EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + { + FileAccessForTesting base_access("bug_679649.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ASSERT_EQ(1, FPDFDoc_GetJavaScriptActionCount(layer.get())); + ScopedFPDFJavaScriptAction js(FPDFDoc_GetJavaScriptAction(layer.get(), 0)); + EXPECT_TRUE(js); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); ClearString(); EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; - ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)) - << file_name; - EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status) << file_name; - EXPECT_TRUE(GetString().empty()) << file_name; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + EXPECT_TRUE(GetString().empty()); EPDF_ReleaseBaseDocument(base); } } +TEST_F(FPDFViewEmbedderTest, ReadOnlySiblingLayersStayEmptyAfterPeerMutates) { + FileAccessForTesting base_access("embedded_images.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status_a = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_a( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_a)); + ASSERT_TRUE(layer_a); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_a); + + EPDFLayerOpenStatus status_b = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_b( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_b)); + ASSERT_TRUE(layer_b); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_b); + + EPDFLayerOpenStatus status_c = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_c( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_c)); + ASSERT_TRUE(layer_c); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_c); + + for (FPDF_DOCUMENT layer : {layer_a.get(), layer_b.get(), layer_c.get()}) { + ScopedFPDFPage page(FPDF_LoadPage(layer, 0)); + ASSERT_TRUE(page); + ScopedFPDFBitmap bitmap = RenderPage(page.get()); + ASSERT_TRUE(bitmap); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer)); + } + + { + ScopedFPDFPage page_b(FPDF_LoadPage(layer_b.get(), 0)); + ASSERT_TRUE(page_b); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page_b.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + EXPECT_GT(EPDFLayer_GetPromotedObjectCount(layer_b.get()), 0u); + } + + for (FPDF_DOCUMENT read_only_layer : {layer_a.get(), layer_c.get()}) { + ScopedFPDFPage page(FPDF_LoadPage(read_only_layer, 0)); + ASSERT_TRUE(page); + ScopedFPDFBitmap bitmap = RenderPage(page.get()); + ASSERT_TRUE(bitmap); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(read_only_layer)); + } + + ClearString(); + EPDFLayerSaveStatus save_status_a = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_a.get(), this, &save_status_a)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status_a); + EXPECT_TRUE(GetString().empty()); + + ClearString(); + EPDFLayerSaveStatus save_status_b = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_b.get(), this, &save_status_b)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status_b); + EXPECT_FALSE(GetString().empty()); + + ClearString(); + EPDFLayerSaveStatus save_status_c = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_c.get(), this, &save_status_c)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status_c); + EXPECT_TRUE(GetString().empty()); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From efe597b367f648d068c2e379faef3e2ea3d3079a Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 12 May 2026 11:36:31 +0300 Subject: [PATCH 17/56] Add some more tests --- fpdfsdk/fpdf_view_embeddertest.cpp | 343 +++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index e36b7945a1..5359fe0999 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -24,6 +24,7 @@ #include "public/fpdf_doc.h" #include "public/fpdf_javascript.h" #include "public/fpdf_save.h" +#include "public/fpdf_text.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/embedder_test_constants.h" @@ -251,6 +252,321 @@ class FPDFViewEmbedderTest : public EmbedderTest { EPDF_ReleaseBaseDocument(base); } + void CheckReadOnlyLayerParityProducesEmptyDelta(const char* file_name) { + FileAccessForTesting plain_access(file_name); + ScopedFPDFDocument plain(FPDF_LoadCustomDocument(&plain_access, nullptr)); + ASSERT_TRUE(plain) << file_name; + + FileAccessForTesting base_access(file_name); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base) << file_name; + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer) << file_name; + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status) << file_name; + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + CompareDocumentReadApis(plain.get(), layer.get(), file_name); + + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())) << file_name; + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)) + << file_name; + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status) << file_name; + EXPECT_TRUE(GetString().empty()) << file_name; + + EPDF_ReleaseBaseDocument(base); + } + + void CompareDocumentReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + const char* file_name) { + const int plain_page_count = FPDF_GetPageCount(plain); + EXPECT_EQ(plain_page_count, FPDF_GetPageCount(layer)) << file_name; + + CompareNamedDestReadApis(plain, layer, file_name); + CompareAttachmentReadApis(plain, layer, file_name); + CompareJavaScriptReadApis(plain, layer, file_name); + CompareBookmarkReadApis(plain, layer, file_name); + + for (int page_index = -1; page_index <= plain_page_count; ++page_index) { + ComparePageLabelReadApi(plain, layer, page_index, file_name); + } + + for (int page_index = 0; page_index < plain_page_count; ++page_index) { + FS_SIZEF plain_size; + FS_SIZEF layer_size; + const bool plain_has_size = + FPDF_GetPageSizeByIndexF(plain, page_index, &plain_size); + const bool layer_has_size = + FPDF_GetPageSizeByIndexF(layer, page_index, &layer_size); + EXPECT_EQ(plain_has_size, layer_has_size) + << file_name << " page " << page_index; + if (plain_has_size && layer_has_size) { + EXPECT_FLOAT_EQ(plain_size.width, layer_size.width) + << file_name << " page " << page_index; + EXPECT_FLOAT_EQ(plain_size.height, layer_size.height) + << file_name << " page " << page_index; + } + + ScopedFPDFPage plain_page(FPDF_LoadPage(plain, page_index)); + ScopedFPDFPage layer_page(FPDF_LoadPage(layer, page_index)); + EXPECT_EQ(!!plain_page, !!layer_page) + << file_name << " page " << page_index; + if (!plain_page || !layer_page) { + continue; + } + + CompareLoadedPageReadApis(plain, plain_page.get(), layer, + layer_page.get(), file_name, page_index); + } + } + + void CompareNamedDestReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + const char* file_name) { + const unsigned long plain_count = FPDF_CountNamedDests(plain); + ASSERT_EQ(plain_count, FPDF_CountNamedDests(layer)) << file_name; + + static constexpr const char* kNamesToProbe[] = { + "", "First", "Next", kFirstAlternate, kLastAlternate, "NoSuchName"}; + for (const char* name : kNamesToProbe) { + EXPECT_EQ(!!FPDF_GetNamedDestByName(plain, name), + !!FPDF_GetNamedDestByName(layer, name)) + << file_name << " named dest " << name; + } + + for (unsigned long index = 0; index < plain_count; ++index) { + char plain_buffer[512]; + char layer_buffer[512]; + long plain_size = sizeof(plain_buffer); + long layer_size = sizeof(layer_buffer); + const bool plain_has_dest = + FPDF_GetNamedDest(plain, index, plain_buffer, &plain_size); + const bool layer_has_dest = + FPDF_GetNamedDest(layer, index, layer_buffer, &layer_size); + EXPECT_EQ(plain_has_dest, layer_has_dest) + << file_name << " named dest index " << index; + EXPECT_EQ(plain_size, layer_size) + << file_name << " named dest index " << index; + if (plain_has_dest && layer_has_dest) { + EXPECT_EQ( + GetPlatformString(reinterpret_cast(plain_buffer)), + GetPlatformString(reinterpret_cast(layer_buffer))) + << file_name << " named dest index " << index; + } + } + } + + void CompareAttachmentReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + const char* file_name) { + const int plain_count = FPDFDoc_GetAttachmentCount(plain); + ASSERT_EQ(plain_count, FPDFDoc_GetAttachmentCount(layer)) << file_name; + for (int index = -1; index <= plain_count; ++index) { + EXPECT_EQ(!!FPDFDoc_GetAttachment(plain, index), + !!FPDFDoc_GetAttachment(layer, index)) + << file_name << " attachment " << index; + } + } + + void CompareJavaScriptReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + const char* file_name) { + const int plain_count = FPDFDoc_GetJavaScriptActionCount(plain); + ASSERT_EQ(plain_count, FPDFDoc_GetJavaScriptActionCount(layer)) + << file_name; + for (int index = -1; index <= plain_count; ++index) { + ScopedFPDFJavaScriptAction plain_js( + FPDFDoc_GetJavaScriptAction(plain, index)); + ScopedFPDFJavaScriptAction layer_js( + FPDFDoc_GetJavaScriptAction(layer, index)); + EXPECT_EQ(!!plain_js, !!layer_js) + << file_name << " JavaScript action " << index; + if (!plain_js || !layer_js) { + continue; + } + EXPECT_EQ(FPDFJavaScriptAction_GetName(plain_js.get(), nullptr, 0), + FPDFJavaScriptAction_GetName(layer_js.get(), nullptr, 0)) + << file_name << " JavaScript action " << index; + EXPECT_EQ(FPDFJavaScriptAction_GetScript(plain_js.get(), nullptr, 0), + FPDFJavaScriptAction_GetScript(layer_js.get(), nullptr, 0)) + << file_name << " JavaScript action " << index; + } + } + + void CompareBookmarkReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + const char* file_name) { + CompareBookmarkSubtreeReadApis( + plain, layer, FPDFBookmark_GetFirstChild(plain, nullptr), + FPDFBookmark_GetFirstChild(layer, nullptr), file_name, 0); + } + + void CompareBookmarkSubtreeReadApis(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + FPDF_BOOKMARK plain_bookmark, + FPDF_BOOKMARK layer_bookmark, + const char* file_name, + int depth) { + EXPECT_EQ(!!plain_bookmark, !!layer_bookmark) + << file_name << " bookmark depth " << depth; + if (!plain_bookmark || !layer_bookmark || depth >= 4) { + return; + } + + EXPECT_EQ(FPDFBookmark_GetTitle(plain_bookmark, nullptr, 0), + FPDFBookmark_GetTitle(layer_bookmark, nullptr, 0)) + << file_name << " bookmark depth " << depth; + EXPECT_EQ(FPDFBookmark_GetCount(plain_bookmark), + FPDFBookmark_GetCount(layer_bookmark)) + << file_name << " bookmark depth " << depth; + EXPECT_EQ(!!FPDFBookmark_GetDest(plain, plain_bookmark), + !!FPDFBookmark_GetDest(layer, layer_bookmark)) + << file_name << " bookmark depth " << depth; + EXPECT_EQ(!!FPDFBookmark_GetAction(plain_bookmark), + !!FPDFBookmark_GetAction(layer_bookmark)) + << file_name << " bookmark depth " << depth; + + CompareBookmarkSubtreeReadApis( + plain, layer, FPDFBookmark_GetFirstChild(plain, plain_bookmark), + FPDFBookmark_GetFirstChild(layer, layer_bookmark), file_name, + depth + 1); + CompareBookmarkSubtreeReadApis( + plain, layer, FPDFBookmark_GetNextSibling(plain, plain_bookmark), + FPDFBookmark_GetNextSibling(layer, layer_bookmark), file_name, depth); + } + + void ComparePageLabelReadApi(FPDF_DOCUMENT plain, + FPDF_DOCUMENT layer, + int page_index, + const char* file_name) { + char plain_buffer[128]; + char layer_buffer[128]; + const unsigned long plain_size = FPDF_GetPageLabel( + plain, page_index, plain_buffer, sizeof(plain_buffer)); + const unsigned long layer_size = FPDF_GetPageLabel( + layer, page_index, layer_buffer, sizeof(layer_buffer)); + EXPECT_EQ(plain_size, layer_size) + << file_name << " page label " << page_index; + if (plain_size > 0 && plain_size <= sizeof(plain_buffer)) { + EXPECT_EQ( + GetPlatformString(reinterpret_cast(plain_buffer)), + GetPlatformString(reinterpret_cast(layer_buffer))) + << file_name << " page label " << page_index; + } + } + + void CompareLoadedPageReadApis(FPDF_DOCUMENT plain_doc, + FPDF_PAGE plain_page, + FPDF_DOCUMENT layer_doc, + FPDF_PAGE layer_page, + const char* file_name, + int page_index) { + EXPECT_FLOAT_EQ(FPDF_GetPageWidthF(plain_page), + FPDF_GetPageWidthF(layer_page)) + << file_name << " page " << page_index; + EXPECT_FLOAT_EQ(FPDF_GetPageHeightF(plain_page), + FPDF_GetPageHeightF(layer_page)) + << file_name << " page " << page_index; + + CompareAnnotationReadApis(plain_page, layer_page, file_name, page_index); + CompareLinkReadApis(plain_doc, plain_page, layer_doc, layer_page, file_name, + page_index); + CompareTextReadApis(plain_page, layer_page, file_name, page_index); + + ScopedFPDFBitmap bitmap = RenderPage(layer_page); + ASSERT_TRUE(bitmap) << file_name << " page " << page_index; + } + + void CompareAnnotationReadApis(FPDF_PAGE plain_page, + FPDF_PAGE layer_page, + const char* file_name, + int page_index) { + const int plain_annot_count = FPDFPage_GetAnnotCount(plain_page); + ASSERT_EQ(plain_annot_count, FPDFPage_GetAnnotCount(layer_page)) + << file_name << " page " << page_index; + for (int annot_index = -1; annot_index <= plain_annot_count; + ++annot_index) { + ScopedFPDFAnnotation plain_annot( + FPDFPage_GetAnnot(plain_page, annot_index)); + ScopedFPDFAnnotation layer_annot( + FPDFPage_GetAnnot(layer_page, annot_index)); + EXPECT_EQ(!!plain_annot, !!layer_annot) + << file_name << " page " << page_index << " annot " << annot_index; + } + } + + void CompareLinkReadApis(FPDF_DOCUMENT plain_doc, + FPDF_PAGE plain_page, + FPDF_DOCUMENT layer_doc, + FPDF_PAGE layer_page, + const char* file_name, + int page_index) { + std::vector plain_links; + std::vector layer_links; + int pos = 0; + FPDF_LINK link = nullptr; + while (FPDFLink_Enumerate(plain_page, &pos, &link)) { + plain_links.push_back(link); + } + pos = 0; + link = nullptr; + while (FPDFLink_Enumerate(layer_page, &pos, &link)) { + layer_links.push_back(link); + } + ASSERT_EQ(plain_links.size(), layer_links.size()) + << file_name << " page " << page_index; + for (size_t i = 0; i < plain_links.size(); ++i) { + EXPECT_EQ(!!FPDFLink_GetDest(plain_doc, plain_links[i]), + !!FPDFLink_GetDest(layer_doc, layer_links[i])) + << file_name << " page " << page_index << " link " << i; + EXPECT_EQ(!!FPDFLink_GetAction(plain_links[i]), + !!FPDFLink_GetAction(layer_links[i])) + << file_name << " page " << page_index << " link " << i; + EXPECT_EQ(FPDFLink_CountQuadPoints(plain_links[i]), + FPDFLink_CountQuadPoints(layer_links[i])) + << file_name << " page " << page_index << " link " << i; + EXPECT_EQ(!!FPDFLink_GetAnnot(plain_page, plain_links[i]), + !!FPDFLink_GetAnnot(layer_page, layer_links[i])) + << file_name << " page " << page_index << " link " << i; + } + } + + void CompareTextReadApis(FPDF_PAGE plain_page, + FPDF_PAGE layer_page, + const char* file_name, + int page_index) { + ScopedFPDFTextPage plain_text(FPDFText_LoadPage(plain_page)); + ScopedFPDFTextPage layer_text(FPDFText_LoadPage(layer_page)); + EXPECT_EQ(!!plain_text, !!layer_text) + << file_name << " page " << page_index; + if (!plain_text || !layer_text) { + return; + } + + const int plain_char_count = FPDFText_CountChars(plain_text.get()); + ASSERT_EQ(plain_char_count, FPDFText_CountChars(layer_text.get())) + << file_name << " page " << page_index; + if (plain_char_count <= 0) { + return; + } + + EXPECT_EQ(FPDFText_GetUnicode(plain_text.get(), 0), + FPDFText_GetUnicode(layer_text.get(), 0)) + << file_name << " page " << page_index; + EXPECT_EQ(FPDFText_GetUnicode(plain_text.get(), plain_char_count - 1), + FPDFText_GetUnicode(layer_text.get(), plain_char_count - 1)) + << file_name << " page " << page_index; + EXPECT_EQ(FPDFText_CountRects(plain_text.get(), 0, plain_char_count), + FPDFText_CountRects(layer_text.get(), 0, plain_char_count)) + << file_name << " page " << page_index; + } + void TestRenderPageBitmapWithMatrix(FPDF_PAGE page, int bitmap_width, int bitmap_height, @@ -866,6 +1182,33 @@ TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerCatalogMatrixProducesEmptyDelta) { } } +TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerFixtureParityProducesEmptyDelta) { + static constexpr const char* kFiles[] = { + "annots_action_handling.pdf", + "bug_679649.pdf", + "calculate.pdf", + "document_aactions.pdf", + "embedded_attachments.pdf", + "embedded_images.pdf", + "find_text_consecutive.pdf", + "font_weight.pdf", + "hello_world_2_pages_split_streams.pdf", + "links_highlights_annots.pdf", + "multiple_form_types.pdf", + "named_dests_old_style.pdf", + "page_labels.pdf", + "tagged_actual_text.pdf", + "tagged_mcr_multipage.pdf", + "text_font.pdf", + "use_outlines.pdf", + "zero_length_stream.pdf", + }; + + for (const char* file_name : kFiles) { + CheckReadOnlyLayerParityProducesEmptyDelta(file_name); + } +} + TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerMalformedOldStyleNamedDestsProducesEmptyDelta) { FileAccessForTesting plain_access("named_dests_old_style.pdf"); From a3f16c270f8b199397c2427beaee06825ff04b2b Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 12 May 2026 12:57:45 +0300 Subject: [PATCH 18/56] Prune unreachable new PDF objects during save MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make `CPDF_Creator::WriteNewObjs()` reachability-aware so newly allocated indirect objects that are no longer referenced do not get written into saved PDFs. The save reachability set now includes normal document graph references plus trailer-owned roots such as `/Info` and non-inline `/Encrypt`, avoiding dangling trailer references while still pruning true orphans. Also refactor `EPDF_SetEncryption()` to use an inline encryption dictionary so it follows CPDF_Creator’s existing trailer-owned encrypt path, and update Bug1206 to assert render-only saves remain stable while reopened rendering still matches. --- core/fpdfapi/edit/cpdf_creator.cpp | 32 ++++++++ fpdfsdk/fpdf_annot_embeddertest.cpp | 24 +++--- fpdfsdk/fpdf_save_embeddertest.cpp | 114 ++++++++++++++++++++++++++++ fpdfsdk/fpdf_view.cpp | 8 +- 4 files changed, 165 insertions(+), 13 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index fe806bf2c7..07c86bbe7e 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_crypto_handler.h" @@ -136,6 +137,28 @@ ByteString FormatXrefOffset10(FX_FILESIZE offset) { return ByteString::Format("%010" PRId64, static_cast(offset)); } +std::set CollectSaveReachableObjects( + CPDF_Document* document, + const CPDF_Dictionary* encrypt_dict) { + std::set objects = GetObjectsWithReferences(document); + + // `GetObjectsWithReferences()` covers the normal document graph rooted at + // /Root. The save trailer may also reference dictionaries outside that graph. + // Keep those roots in sync with the trailer entries emitted in + // WriteDoc_Stage4(). + RetainPtr info = document->GetInfo(); + if (info && info->GetObjNum() != 0) { + objects.insert(info->GetObjNum()); + } + + if (encrypt_dict && !encrypt_dict->IsInline() && + encrypt_dict->GetObjNum() != 0) { + objects.insert(encrypt_dict->GetObjNum()); + } + + return objects; +} + } // namespace CPDF_Creator::CPDF_Creator(CPDF_Document* doc, @@ -223,8 +246,15 @@ bool CPDF_Creator::WriteOldObjs() { } bool CPDF_Creator::WriteNewObjs() { + const std::set objects_with_refs = + CollectSaveReachableObjects(document_, encrypt_dict_.Get()); + std::vector written_new_obj_nums; for (size_t i = cur_obj_num_; i < new_obj_num_array_.size(); ++i) { uint32_t objnum = new_obj_num_array_[i]; + if (!pdfium::Contains(objects_with_refs, objnum)) { + continue; + } + RetainPtr pObj = document_->GetIndirectObject(objnum); if (!pObj) { continue; @@ -234,7 +264,9 @@ bool CPDF_Creator::WriteNewObjs() { if (!WriteIndirectObj(pObj->GetObjNum(), pObj.Get())) { return false; } + written_new_obj_nums.push_back(objnum); } + new_obj_num_array_ = std::move(written_new_obj_nums); return true; } diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 44a0415b4e..5aa484fe4c 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -1997,8 +1997,6 @@ TEST_F(FPDFAnnotEmbedderTest, GetFormAnnotAndCheckFlagsComboBox) { } TEST_F(FPDFAnnotEmbedderTest, Bug1206) { - static constexpr size_t kExpectedMinimumOriginalSize = 1601; - ASSERT_TRUE(OpenDocument("bug_1206.pdf")); ScopedPage page = LoadScopedPage(0); @@ -2006,7 +2004,7 @@ TEST_F(FPDFAnnotEmbedderTest, Bug1206) { ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); const size_t original_size = GetString().size(); - EXPECT_LE(kExpectedMinimumOriginalSize, original_size); // Sanity check. + ASSERT_GT(original_size, 0u); ClearString(); for (size_t i = 0; i < 10; ++i) { @@ -2014,9 +2012,16 @@ TEST_F(FPDFAnnotEmbedderTest, Bug1206) { CompareBitmapWithExpectationSuffix(bitmap.get(), "bug_1206"); ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); - // TODO(https://crbug.com/42270200): This is wrong. The size should be - // equal, not bigger. - EXPECT_GT(GetString().size(), original_size); + EXPECT_EQ(original_size, GetString().size()); + + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_doc); + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + ScopedFPDFBitmap saved_bitmap = + RenderSavedPageWithFlags(saved_page.get(), FPDF_ANNOT); + CompareBitmapWithExpectationSuffix(saved_bitmap.get(), "bug_1206"); + ClearString(); } } @@ -2585,7 +2590,8 @@ TEST_F(FPDFAnnotEmbedderTest, GetFontSizeNegative) { } } -TEST_F(FPDFAnnotEmbedderTest, DirectAnnotationObjectNumberStaysZeroAfterRender) { +TEST_F(FPDFAnnotEmbedderTest, + DirectAnnotationObjectNumberStaysZeroAfterRender) { ASSERT_TRUE(OpenDocument("freetext_annotation_without_da.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); @@ -2600,8 +2606,8 @@ TEST_F(FPDFAnnotEmbedderTest, DirectAnnotationObjectNumberStaysZeroAfterRender) ASSERT_TRUE(bitmap); EXPECT_EQ(0u, EPDFAnnot_GetObjectNumber(annot.get())); - ASSERT_TRUE(EPDFAnnot_SetColor(annot.get(), FPDFANNOT_COLORTYPE_Color, 10, - 20, 30)); + ASSERT_TRUE( + EPDFAnnot_SetColor(annot.get(), FPDFANNOT_COLORTYPE_Color, 10, 20, 30)); EXPECT_EQ(0u, EPDFAnnot_GetObjectNumber(annot.get())); } diff --git a/fpdfsdk/fpdf_save_embeddertest.cpp b/fpdfsdk/fpdf_save_embeddertest.cpp index 471756c918..30583b56ee 100644 --- a/fpdfsdk/fpdf_save_embeddertest.cpp +++ b/fpdfsdk/fpdf_save_embeddertest.cpp @@ -6,8 +6,13 @@ #include #include +#include "core/fpdfapi/parser/cpdf_cross_ref_table.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fxcrt/fx_string.h" +#include "fpdfsdk/cpdfsdk_helpers.h" #include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_annot.h" #include "public/fpdf_edit.h" #include "public/fpdf_ppo.h" #include "public/fpdf_save.h" @@ -24,6 +29,23 @@ using testing::HasSubstr; using testing::Not; using testing::StartsWith; +namespace { + +bool HasSavedXRefEntryForObject(FPDF_DOCUMENT document, uint32_t objnum) { + CPDF_Document* cpdf_doc = CPDFDocumentFromFPDFDocument(document); + if (!cpdf_doc || !cpdf_doc->GetParser() || + !cpdf_doc->GetParser()->GetCrossRefTable()) { + return false; + } + + const CPDF_CrossRefTable::ObjectInfo* info = + cpdf_doc->GetParser()->GetCrossRefTable()->GetObjectInfo(objnum); + return info && (info->type == CPDF_CrossRefTable::ObjectType::kNormal || + info->type == CPDF_CrossRefTable::ObjectType::kCompressed); +} + +} // namespace + class FPDFSaveEmbedderTest : public EmbedderTest {}; TEST_F(FPDFSaveEmbedderTest, SaveSimpleDoc) { @@ -85,6 +107,98 @@ TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocIncremental) { EXPECT_GT(GetString().size(), 985u); } +TEST_F(FPDFSaveEmbedderTest, SaveAsCopyPrunesUnlinkedNewAnnotation) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + const uint32_t annot_objnum = EPDFAnnot_GetObjectNumber(annot.get()); + ASSERT_GT(annot_objnum, 0u); + ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + + annot.reset(); + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 0)); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_doc); + EXPECT_FALSE(HasSavedXRefEntryForObject(saved_doc.get(), annot_objnum)); + + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(saved_page.get())); +} + +TEST_F(FPDFSaveEmbedderTest, IncrementalSavePrunesUnlinkedNewAnnotation) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + const uint32_t annot_objnum = EPDFAnnot_GetObjectNumber(annot.get()); + ASSERT_GT(annot_objnum, 0u); + + annot.reset(); + ASSERT_TRUE(FPDFPage_RemoveAnnot(page.get(), 0)); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, FPDF_INCREMENTAL)); + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_doc); + EXPECT_FALSE(HasSavedXRefEntryForObject(saved_doc.get(), annot_objnum)); + + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(saved_page.get())); +} + +TEST_F(FPDFSaveEmbedderTest, SaveAsCopyKeepsLinkedNewAnnotation) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + const uint32_t annot_objnum = EPDFAnnot_GetObjectNumber(annot.get()); + ASSERT_GT(annot_objnum, 0u); + ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_doc); + EXPECT_TRUE(HasSavedXRefEntryForObject(saved_doc.get(), annot_objnum)); + + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + ASSERT_EQ(1, FPDFPage_GetAnnotCount(saved_page.get())); + ScopedFPDFAnnotation saved_annot(FPDFPage_GetAnnot(saved_page.get(), 0)); + ASSERT_TRUE(saved_annot); + EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(saved_annot.get())); +} + +TEST_F(FPDFSaveEmbedderTest, SetEncryptionRoundTripsWithInlineEncryptDict) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + ASSERT_TRUE(EPDF_SetEncryption(document(), "user", "owner", + EPDF_PERM_PRINT | EPDF_PERM_COPY)); + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ScopedSavedDoc saved_doc = OpenScopedSavedDocumentWithPassword("user"); + ASSERT_TRUE(saved_doc); + EXPECT_TRUE(EPDF_IsEncrypted(saved_doc.get())); + + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + ScopedFPDFBitmap bitmap = RenderSavedPage(saved_page.get()); + ASSERT_TRUE(bitmap); +} + TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocNoIncremental) { ASSERT_TRUE(OpenDocument("hello_world.pdf")); EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, FPDF_NO_INCREMENTAL, 14)); diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index a423735d47..b78c80a7c3 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -524,8 +524,10 @@ EPDF_SetEncryption(FPDF_DOCUMENT document, int32_t permissions = static_cast(BuildPermissionsForRevision(allowed_flags_32)); - // Create encrypt dictionary as indirect object - auto pEncryptDict = pDoc->NewIndirect(); + // Create the encrypt dictionary inline. CPDF_Creator::SetEncryption() owns + // the trailer-only reference and writes inline encrypt dictionaries as + // indirect objects during save. + auto pEncryptDict = pDoc->New(); pEncryptDict->SetNewFor("Filter", "Standard"); pEncryptDict->SetNewFor("V", 5); pEncryptDict->SetNewFor("R", 6); @@ -552,8 +554,6 @@ EPDF_SetEncryption(FPDF_DOCUMENT document, // Returns false if LoadDict fails or R != 6 if (!pSecurityHandler->OnCreateWithPasswords(pEncryptDict.Get(), user_pwd, owner_pwd)) { - // Cleanup the indirect object we created - pDoc->DeleteIndirectObject(pEncryptDict->GetObjNum()); return false; } From f769de77a8ec348b6a5dc19d068d8c520a14c349 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 15 May 2026 11:09:46 +0300 Subject: [PATCH 19/56] Add EPDF_LoadMemBaseDocument API Introduce EPDF_LoadMemBaseDocument to load a shareable base PDF document from a memory buffer. Refactor loading logic into LoadBaseDocumentImpl that accepts a RetainPtr so both file-access and in-memory paths share parsing code. Implement the in-memory path using CFX_ReadOnlySpanStream and UNSAFE_BUFFERS, and update public/fpdfview.h with the new API and documentation. Add test coverage: register the C API symbol in fpdf_view_c_api_test and add an embedder test that loads a PDF from memory. Also add the necessary include headers. --- fpdfsdk/epdf_base_document.cpp | 44 +++++++++++++++++++++++++----- fpdfsdk/fpdf_view_c_api_test.c | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 20 ++++++++++++++ public/fpdfview.h | 24 +++++++++++++++- 4 files changed, 81 insertions(+), 8 deletions(-) diff --git a/fpdfsdk/epdf_base_document.cpp b/fpdfsdk/epdf_base_document.cpp index 212b329c11..6aeba4f850 100644 --- a/fpdfsdk/epdf_base_document.cpp +++ b/fpdfsdk/epdf_base_document.cpp @@ -4,9 +4,17 @@ #include "public/fpdfview.h" +#include + +#include + #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fxcrt/cfx_read_only_span_stream.h" +#include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/fx_stream.h" #include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" #include "fpdfsdk/cpdfsdk_customaccess.h" #include "fpdfsdk/cpdfsdk_helpers.h" @@ -22,17 +30,16 @@ EPDF_BASE_DOCUMENT EPDFBaseDocumentFromCPDFBaseDocument( return reinterpret_cast(base); } -} // namespace - -FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV -EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { - if (!pFileAccess) { +EPDF_BASE_DOCUMENT LoadBaseDocumentImpl( + RetainPtr file_access, + FPDF_BYTESTRING password) { + if (!file_access) { return nullptr; } RetainPtr base = pdfium::MakeRetain(); - CPDF_Parser::Error error = base->LoadBaseDoc( - pdfium::MakeRetain(pFileAccess), password); + CPDF_Parser::Error error = + base->LoadBaseDoc(std::move(file_access), password); if (error != CPDF_Parser::SUCCESS) { ProcessParseError(error); return nullptr; @@ -41,6 +48,29 @@ EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { return EPDFBaseDocumentFromCPDFBaseDocument(base.Leak()); } +} // namespace + +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { + if (!pFileAccess) { + return nullptr; + } + + return LoadBaseDocumentImpl( + pdfium::MakeRetain(pFileAccess), password); +} + +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadMemBaseDocument(const void* data_buf, + size_t size, + FPDF_BYTESTRING password) { + // SAFETY: required from caller. + auto data_span = + UNSAFE_BUFFERS(pdfium::span(static_cast(data_buf), size)); + return LoadBaseDocumentImpl( + pdfium::MakeRetain(data_span), password); +} + FPDF_EXPORT void FPDF_CALLCONV EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base) { RetainPtr retained; diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 4957427151..c08cf2aaf9 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -535,6 +535,7 @@ int CheckPDFiumCApi() { CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); CHK(EPDF_LoadBaseDocument); + CHK(EPDF_LoadMemBaseDocument); CHK(EPDF_FreeBuffer); CHK(EPDF_SaveDocumentToOwnedBuffer); CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 5359fe0999..4b789cc9c7 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -719,6 +719,26 @@ class FPDFViewEmbedderTest : public EmbedderTest { } }; +TEST_F(FPDFViewEmbedderTest, LoadMemBaseDocument) { + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + std::vector file_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(file_bytes.empty()); + + EPDF_BASE_DOCUMENT base = + EPDF_LoadMemBaseDocument(file_bytes.data(), file_bytes.size(), nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + EXPECT_EQ(1, FPDF_GetPageCount(layer.get())); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + EPDF_ReleaseBaseDocument(base); +} + // Test for conversion of a point in device coordinates to page coordinates TEST_F(FPDFViewEmbedderTest, DeviceCoordinatesToPageCoordinates) { ASSERT_TRUE(OpenDocument("about_blank.pdf")); diff --git a/public/fpdfview.h b/public/fpdfview.h index 47c4143dbd..2270aa920a 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -575,8 +575,30 @@ FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); +// Function: EPDF_LoadMemBaseDocument +// Load and freeze a shareable base PDF document from memory. The +// returned handle is distinct from FPDF_DOCUMENT and cannot be used +// with ordinary document APIs such as FPDF_LoadPage(). +// Parameters: +// data_buf - Pointer to a buffer containing the PDF document. +// size - Number of bytes in the PDF document. +// password - Optional password for decrypting the PDF file. +// Return value: +// A handle to the loaded base document, or NULL on failure. +// Comments: +// The memory buffer must remain valid until the returned base document +// is released with EPDF_ReleaseBaseDocument(). +// +// See the comments for FPDF_LoadDocument() regarding the encoding for +// |password|. +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadMemBaseDocument(const void* data_buf, + size_t size, + FPDF_BYTESTRING password); + // Function: EPDF_ReleaseBaseDocument -// Release a base document returned by EPDF_LoadBaseDocument(). +// Release a base document returned by EPDF_LoadBaseDocument() or +// EPDF_LoadMemBaseDocument(). FPDF_EXPORT void FPDF_CALLCONV EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base); From df004474365b641417c1eb0f276399cae0cd0006 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 15 May 2026 11:43:23 +0300 Subject: [PATCH 20/56] Add EPDF_LoadMemBaseDocument64 and helpers Introduce a size_t-based API for loading base documents from memory: add internal LoadMemBaseDocumentImpl and a public EPDF_LoadMemBaseDocument64 that accepts size_t. Preserve the existing EPDF_LoadMemBaseDocument(int) for backward compatibility but add a guard to reject negative sizes. Update tests to exercise the new API and register it in the C API test. Also add documentation for EPDF_LoadMemBaseDocument64 in the public header and update the release comment to reference both variants. --- fpdfsdk/epdf_base_document.cpp | 28 ++++++++++++++++++++++------ fpdfsdk/fpdf_view_c_api_test.c | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 23 ++++++++++++++++++++++- public/fpdfview.h | 25 +++++++++++++++++++++++-- 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/fpdfsdk/epdf_base_document.cpp b/fpdfsdk/epdf_base_document.cpp index 6aeba4f850..2f62be0c2f 100644 --- a/fpdfsdk/epdf_base_document.cpp +++ b/fpdfsdk/epdf_base_document.cpp @@ -48,6 +48,16 @@ EPDF_BASE_DOCUMENT LoadBaseDocumentImpl( return EPDFBaseDocumentFromCPDFBaseDocument(base.Leak()); } +EPDF_BASE_DOCUMENT LoadMemBaseDocumentImpl(const void* data_buf, + size_t size, + FPDF_BYTESTRING password) { + // SAFETY: required from caller. + auto data_span = + UNSAFE_BUFFERS(pdfium::span(static_cast(data_buf), size)); + return LoadBaseDocumentImpl( + pdfium::MakeRetain(data_span), password); +} + } // namespace FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV @@ -62,13 +72,19 @@ EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV EPDF_LoadMemBaseDocument(const void* data_buf, - size_t size, + int size, FPDF_BYTESTRING password) { - // SAFETY: required from caller. - auto data_span = - UNSAFE_BUFFERS(pdfium::span(static_cast(data_buf), size)); - return LoadBaseDocumentImpl( - pdfium::MakeRetain(data_span), password); + if (size < 0) { + return nullptr; + } + return LoadMemBaseDocumentImpl(data_buf, static_cast(size), password); +} + +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadMemBaseDocument64(const void* data_buf, + size_t size, + FPDF_BYTESTRING password) { + return LoadMemBaseDocumentImpl(data_buf, size, password); } FPDF_EXPORT void FPDF_CALLCONV diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index c08cf2aaf9..ab1d8d8e3a 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -536,6 +536,7 @@ int CheckPDFiumCApi() { CHK(FPDF_InitLibraryWithConfig); CHK(EPDF_LoadBaseDocument); CHK(EPDF_LoadMemBaseDocument); + CHK(EPDF_LoadMemBaseDocument64); CHK(EPDF_FreeBuffer); CHK(EPDF_SaveDocumentToOwnedBuffer); CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 4b789cc9c7..7d1f7cb4be 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -724,8 +724,29 @@ TEST_F(FPDFViewEmbedderTest, LoadMemBaseDocument) { std::vector file_bytes = GetFileContents(pdf_path.c_str()); ASSERT_FALSE(file_bytes.empty()); + EPDF_BASE_DOCUMENT base = EPDF_LoadMemBaseDocument( + file_bytes.data(), static_cast(file_bytes.size()), nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + ASSERT_TRUE(layer); + + EXPECT_EQ(1, FPDF_GetPageCount(layer.get())); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LoadMemBaseDocument64) { + const std::string pdf_path = PathService::GetTestFilePath("rectangles.pdf"); + std::vector file_bytes = GetFileContents(pdf_path.c_str()); + ASSERT_FALSE(file_bytes.empty()); + EPDF_BASE_DOCUMENT base = - EPDF_LoadMemBaseDocument(file_bytes.data(), file_bytes.size(), nullptr); + EPDF_LoadMemBaseDocument64(file_bytes.data(), file_bytes.size(), nullptr); ASSERT_TRUE(base); EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; diff --git a/public/fpdfview.h b/public/fpdfview.h index 2270aa920a..ea96a4aa99 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -593,12 +593,33 @@ EPDF_LoadBaseDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); // |password|. FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV EPDF_LoadMemBaseDocument(const void* data_buf, - size_t size, + int size, FPDF_BYTESTRING password); +// Function: EPDF_LoadMemBaseDocument64 +// Load and freeze a shareable base PDF document from memory. The +// returned handle is distinct from FPDF_DOCUMENT and cannot be used +// with ordinary document APIs such as FPDF_LoadPage(). +// Parameters: +// data_buf - Pointer to a buffer containing the PDF document. +// size - Number of bytes in the PDF document. +// password - Optional password for decrypting the PDF file. +// Return value: +// A handle to the loaded base document, or NULL on failure. +// Comments: +// The memory buffer must remain valid until the returned base document +// is released with EPDF_ReleaseBaseDocument(). +// +// See the comments for FPDF_LoadDocument() regarding the encoding for +// |password|. +FPDF_EXPORT EPDF_BASE_DOCUMENT FPDF_CALLCONV +EPDF_LoadMemBaseDocument64(const void* data_buf, + size_t size, + FPDF_BYTESTRING password); + // Function: EPDF_ReleaseBaseDocument // Release a base document returned by EPDF_LoadBaseDocument() or -// EPDF_LoadMemBaseDocument(). +// EPDF_LoadMemBaseDocument()/EPDF_LoadMemBaseDocument64(). FPDF_EXPORT void FPDF_CALLCONV EPDF_ReleaseBaseDocument(EPDF_BASE_DOCUMENT base); From f66d083262e0cd562ef59dc25439abc0e75eda84 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 15 May 2026 14:17:25 +0300 Subject: [PATCH 21/56] Add GetPageObjectNumberByIndex API and tests Introduce EPDFDoc_GetPageObjectNumberByIndex to return a page dictionary's indirect object number by zero-based page index without constructing a CPDF_Page (returns 0 for invalid indices, XFA pages, or direct objects). Add the function declaration to public/fpdfview.h, implement it in fpdfsdk/fpdf_view.cpp (with PDF_ENABLE_XFA guard), register it in the C API test, and add an embedder test verifying null/invalid inputs, non-parsing behavior, and consistency with EPDFPage_GetObjectNumber after loading the page. --- fpdfsdk/fpdf_view.cpp | 19 +++++++++++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 24 ++++++++++++++++++++++++ public/fpdfview.h | 14 ++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index b78c80a7c3..8a4adfb560 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -709,6 +709,25 @@ EPDFDoc_LoadPageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num) { return LoadPageByValidatedIndex(document, doc, doc->GetPageIndex(obj_num)); } +FPDF_EXPORT unsigned int FPDF_CALLCONV +EPDFDoc_GetPageObjectNumberByIndex(FPDF_DOCUMENT document, int page_index) { + auto* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || page_index < 0 || page_index >= FPDF_GetPageCount(document)) { + return 0; + } + +#ifdef PDF_ENABLE_XFA + // XFA pages do not have CPDF_Page dictionaries. Match + // EPDFPage_GetObjectNumber()'s documented XFA behavior and return 0. + if (doc->GetExtension()) { + return 0; + } +#endif // PDF_ENABLE_XFA + + RetainPtr dict = doc->GetPageDictionary(page_index); + return dict ? dict->GetObjNum() : 0; +} + FPDF_EXPORT unsigned int FPDF_CALLCONV EPDFPage_GetObjectNumber(FPDF_PAGE page) { // Note: CPDFPageFromFPDFPage() returns null for XFA pages, so this function diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index ab1d8d8e3a..a20af2e314 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -537,6 +537,7 @@ int CheckPDFiumCApi() { CHK(EPDF_LoadBaseDocument); CHK(EPDF_LoadMemBaseDocument); CHK(EPDF_LoadMemBaseDocument64); + CHK(EPDFDoc_GetPageObjectNumberByIndex); CHK(EPDF_FreeBuffer); CHK(EPDF_SaveDocumentToOwnedBuffer); CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 7d1f7cb4be..78371d327b 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -2457,6 +2457,30 @@ TEST_F(FPDFViewEmbedderTest, FPDFGetPageSizeByIndexF) { EXPECT_EQ(1u, doc->GetParsedPageCountForTesting()); } +TEST_F(FPDFViewEmbedderTest, EPDFDocGetPageObjectNumberByIndex) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + + EXPECT_EQ(0u, EPDFDoc_GetPageObjectNumberByIndex(nullptr, 0)); + + // Page -1 doesn't exist. + EXPECT_EQ(0u, EPDFDoc_GetPageObjectNumberByIndex(document(), -1)); + + // Page 1 doesn't exist. + EXPECT_EQ(0u, EPDFDoc_GetPageObjectNumberByIndex(document(), 1)); + + const unsigned int objnum = + EPDFDoc_GetPageObjectNumberByIndex(document(), 0); + EXPECT_NE(0u, objnum); + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + EXPECT_EQ(0u, doc->GetParsedPageCountForTesting()); + + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + EXPECT_EQ(objnum, EPDFPage_GetObjectNumber(page.get())); + EXPECT_EQ(1u, doc->GetParsedPageCountForTesting()); +} + TEST_F(FPDFViewEmbedderTest, FPDFGetPageSizeByIndex) { ASSERT_TRUE(OpenDocument("rectangles.pdf")); diff --git a/public/fpdfview.h b/public/fpdfview.h index ea96a4aa99..e5ec75ab07 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -1776,6 +1776,20 @@ FPDF_EXPORT FPDF_RESULT FPDF_CALLCONV FPDF_BStr_Clear(FPDF_BSTR* bstr); FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV EPDFDoc_LoadPageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num); +// Experimental EmbedPDF Extension API. +// Get the PDF indirect object number of a page's dictionary by page index. +// Unlike FPDF_LoadPage(), this does not construct a page object or parse page +// content. +// +// document - handle to the document. +// page_index - zero-based page index. +// +// Returns the page dictionary object number (> 0) on success, or 0 if the +// document/index is invalid, the page dictionary is a direct object, or the +// page is an XFA page. +FPDF_EXPORT unsigned int FPDF_CALLCONV +EPDFDoc_GetPageObjectNumberByIndex(FPDF_DOCUMENT document, int page_index); + // Experimental EmbedPDF Extension API. // Get the PDF indirect object number of a page's dictionary. // From 1bdc674caf62dbb086cace7d5c2814b34120010c Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 17 May 2026 10:59:30 +0300 Subject: [PATCH 22/56] Const-correct annot APIs; add annot index Make annotation dictionary parameters const-correct by changing GetAnnotAP, GetAnnotAPNoFallback, and HasAPStream to accept const CPDF_Dictionary*. Update FPDFAnnot_GetColor to use the const-returning GetAnnotDictFromFPDFAnnotation and pass the const dict to HasAPStream. Add an annot_index parameter to RawAnnotContext, forward it to the CPDF_AnnotContext base, and update the creation site to pass the index. These changes improve const-safety and propagate the annotation index into the annot context. --- core/fpdfdoc/cpdf_annot.cpp | 4 ++-- core/fpdfdoc/cpdf_annot.h | 4 ++-- fpdfsdk/fpdf_annot.cpp | 15 ++++++++------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index d8bc6a2e25..3d8926c83c 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp @@ -250,13 +250,13 @@ bool CPDF_Annot::IsHidden() const { return !!(GetFlags() & pdfium::annotation_flags::kHidden); } -RetainPtr GetAnnotAP(CPDF_Dictionary* pAnnotDict, +RetainPtr GetAnnotAP(const CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode eMode) { DCHECK(pAnnotDict); return GetAnnotAPInternal(pAnnotDict, eMode, true); } -RetainPtr GetAnnotAPNoFallback(CPDF_Dictionary* pAnnotDict, +RetainPtr GetAnnotAPNoFallback(const CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode eMode) { DCHECK(pAnnotDict); return GetAnnotAPInternal(pAnnotDict, eMode, false); diff --git a/core/fpdfdoc/cpdf_annot.h b/core/fpdfdoc/cpdf_annot.h index 5a41be69d2..9285f1b6a2 100644 --- a/core/fpdfdoc/cpdf_annot.h +++ b/core/fpdfdoc/cpdf_annot.h @@ -247,12 +247,12 @@ class CPDF_Annot { // Get the AP in an annotation dict for a given appearance mode. // If |eMode| is not Normal and there is not AP for that mode, falls back to // the Normal AP. -RetainPtr GetAnnotAP(CPDF_Dictionary* pAnnotDict, +RetainPtr GetAnnotAP(const CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode eMode); // Get the AP in an annotation dict for a given appearance mode. // No fallbacks to Normal like in GetAnnotAP. -RetainPtr GetAnnotAPNoFallback(CPDF_Dictionary* pAnnotDict, +RetainPtr GetAnnotAPNoFallback(const CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode eMode); #endif // CORE_FPDFDOC_CPDF_ANNOT_H_ diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 4db7fa00b7..4de355a23d 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -502,8 +502,9 @@ class RawAnnotContext final : public CPDF_AnnotContext { public: // Takes ownership of |unparsed_page| by value (RetainPtr). RawAnnotContext(RetainPtr dict, - RetainPtr unparsed_page) - : CPDF_AnnotContext(dict, unparsed_page.Get()), + RetainPtr unparsed_page, + int annot_index) + : CPDF_AnnotContext(dict, unparsed_page.Get(), annot_index), owned_page_(std::move(unparsed_page)) {} private: @@ -572,7 +573,7 @@ bool IsNameValidForSubtype(FPDF_ANNOT_NAME name, } } -bool HasAPStream(CPDF_Dictionary* pAnnotDict) { +bool HasAPStream(const CPDF_Dictionary* pAnnotDict) { return !!GetAnnotAP(pAnnotDict, CPDF_Annot::AppearanceMode::kNormal); } @@ -1432,8 +1433,7 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_GetColor(FPDF_ANNOTATION annot, unsigned int* G, unsigned int* B, unsigned int* A) { - RetainPtr pAnnotDict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); if (!pAnnotDict || !R || !G || !B || !A) { return false; @@ -1442,7 +1442,7 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_GetColor(FPDF_ANNOTATION annot, // For annotations with their appearance streams already defined, the path // stream's own color definitions take priority over the annotation color // definitions retrieved by this method, hence this method will simply fail. - if (HasAPStream(pAnnotDict.Get())) { + if (HasAPStream(pAnnotDict)) { return false; } @@ -3710,7 +3710,8 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { // Create the context, which now takes the RetainPtr directly. auto ctx = - std::make_unique(std::move(annot_dict), std::move(page)); + std::make_unique(std::move(annot_dict), std::move(page), + index); // The lifetime is now perfectly managed by smart pointers. return FPDFAnnotationFromCPDFAnnotContext(ctx.release()); From ac54d56e0bc6961ec551c2e642952df02b795ecb Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 17 May 2026 11:06:32 +0300 Subject: [PATCH 23/56] Fix some readonly paths --- fpdfsdk/fpdf_annot.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 4de355a23d..5b09d34b80 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -1932,8 +1932,7 @@ FPDFAnnot_GetAP(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode, FPDF_WCHAR* buffer, unsigned long buflen) { - RetainPtr pAnnotDict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); if (!pAnnotDict) { return 0; } @@ -1945,7 +1944,7 @@ FPDFAnnot_GetAP(FPDF_ANNOTATION annot, CPDF_Annot::AppearanceMode mode = static_cast(appearanceMode); - RetainPtr pStream = GetAnnotAPNoFallback(pAnnotDict.Get(), mode); + RetainPtr pStream = GetAnnotAPNoFallback(pAnnotDict, mode); // SAFETY: required from caller. return Utf16EncodeMaybeCopyAndReturnLength( pStream ? pStream->GetUnicodeText() : WideString(), @@ -2439,14 +2438,14 @@ FPDFAnnot_GetFileAttachment(FPDF_ANNOTATION annot) { return nullptr; } - RetainPtr annot_dict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); if (!annot_dict) { return nullptr; } + RetainPtr file_spec = annot_dict->GetDirectObjectFor("FS"); return FPDFAttachmentFromCPDFObject( - annot_dict->GetMutableDirectObjectFor("FS")); + const_cast(file_spec.Get())); } FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV @@ -3499,8 +3498,7 @@ EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_VERTICAL_ALIGNMENT FPDF_CALLCONV EPDFAnnot_GetVerticalAlignment(FPDF_ANNOTATION annot) { - RetainPtr annot_dict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); if (!annot_dict) { return FPDF_VERTICAL_ALIGNMENT_TOP; } @@ -4975,8 +4973,7 @@ EPDFAnnot_GetAPMatrix(FPDF_ANNOTATION annot, FPDF_EXPORT int FPDF_CALLCONV EPDFAnnot_GetAvailableAppearanceModes(FPDF_ANNOTATION annot) { - RetainPtr pAnnotDict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); if (!pAnnotDict) { return 0; } @@ -5003,14 +5000,13 @@ EPDFAnnot_GetAvailableAppearanceModes(FPDF_ANNOTATION annot) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_HasAppearanceStream(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode) { - RetainPtr pAnnotDict = - GetMutableAnnotDictFromFPDFAnnotation(annot); + const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); if (!pAnnotDict) { return false; } auto mode = static_cast(appearanceMode); - return !!GetAnnotAP(pAnnotDict.Get(), mode); + return !!GetAnnotAP(pAnnotDict, mode); } static ByteString GetMKColorKey(EPDF_MK_COLORTYPE type) { From 19fbb6d780a6dc0635ab69e82da1a627a2c800df Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 17 May 2026 23:19:22 +0300 Subject: [PATCH 24/56] Honor layer overlays when collecting objects Add ObjectTreeReferenceResolveMode to control how CPDF_Reference targets are resolved (through their holder or via the traversed document). Update ObjectTreeTraverser and GetObjectsWithReferences to accept this mode (defaulting to the previous behavior). Use kEffectiveDocument when collecting reachable objects for layer documents so overlay/promoted objects from a layer override the frozen base graph and are included in saves. Also add a unit test (LayerArtifactIncludesNewAnnotObjectBodies) to verify layer artifacts include newly created annotation object bodies, and add a clarifying comment in CPDF_Creator::WriteOldObjs about incremental vs full saves. --- core/fpdfapi/edit/cpdf_creator.cpp | 12 ++- .../parser/object_tree_traversal_util.cpp | 29 +++++--- .../parser/object_tree_traversal_util.h | 25 ++++++- fpdfsdk/fpdf_view_embeddertest.cpp | 74 +++++++++++++++++++ 4 files changed, 128 insertions(+), 12 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 07c86bbe7e..025c9b1ff2 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -140,7 +140,15 @@ ByteString FormatXrefOffset10(FX_FILESIZE offset) { std::set CollectSaveReachableObjects( CPDF_Document* document, const CPDF_Dictionary* encrypt_dict) { - std::set objects = GetObjectsWithReferences(document); + // CPDF_LayerDocument overlays new/promoted objects on a frozen base. + // References inherited from the base graph can still point through base + // holders, so resolving through the holder would skip overlay replacements. + // Walk through the layer document instead so the effective graph is what gets + // saved. + std::set objects = GetObjectsWithReferences( + document, document->IsLayerDocument() + ? ObjectTreeReferenceResolveMode::kEffectiveDocument + : ObjectTreeReferenceResolveMode::kReferenceHolder); // `GetObjectsWithReferences()` covers the normal document graph rooted at // /Root. The save trailer may also reference dictionaries outside that graph. @@ -225,6 +233,8 @@ bool CPDF_Creator::WriteOldObjs() { return true; } + // WriteOldObjs() only runs for full saves. Layer saves are incremental and + // use CollectSaveReachableObjects() when writing their overlay objects. const std::set objects_with_refs = GetObjectsWithReferences(document_); uint32_t last_object_number_written = 0; diff --git a/core/fpdfapi/parser/object_tree_traversal_util.cpp b/core/fpdfapi/parser/object_tree_traversal_util.cpp index eebcff1e4e..331437d001 100644 --- a/core/fpdfapi/parser/object_tree_traversal_util.cpp +++ b/core/fpdfapi/parser/object_tree_traversal_util.cpp @@ -25,8 +25,9 @@ namespace { class ObjectTreeTraverser { public: - explicit ObjectTreeTraverser(const CPDF_Document* document) - : document_(document) { + ObjectTreeTraverser(const CPDF_Document* document, + ObjectTreeReferenceResolveMode resolve_mode) + : document_(document), resolve_mode_(resolve_mode) { const CPDF_Parser* parser = document_->GetParser(); const CPDF_Dictionary* trailer = parser ? parser->GetTrailer() : nullptr; const CPDF_Dictionary* root = trailer ? trailer : document_->GetRoot(); @@ -83,11 +84,17 @@ class ObjectTreeTraverser { const uint32_t referenced_object_number = ref_object->GetRefObjNum(); RetainPtr referenced_object; - if (ref_object->HasIndirectObjectHolder()) { - // Calling GetIndirectObject() does not work for normal references. + if (resolve_mode_ == + ObjectTreeReferenceResolveMode::kEffectiveDocument) { + referenced_object = + document_->GetIndirectObject(referenced_object_number); + } else if (ref_object->HasIndirectObjectHolder()) { + // In kReferenceHolder mode, go through the reference's holder so + // lazy parsing can pull the referenced object off disk on demand. referenced_object = ref_object->GetDirect(); } else { - // Calling GetDirect() does not work for references from trailers. + // Inlined trailer references have no holder, so GetDirect() cannot + // resolve them. referenced_object = document_->GetIndirectObject(referenced_object_number); } @@ -171,6 +178,7 @@ class ObjectTreeTraverser { } UnownedPtr const document_; + const ObjectTreeReferenceResolveMode resolve_mode_; // Queue of objects to traverse. // - Pointers in the queue are non-null. @@ -196,8 +204,10 @@ class ObjectTreeTraverser { } // namespace -std::set GetObjectsWithReferences(const CPDF_Document* document) { - ObjectTreeTraverser traverser(document); +std::set GetObjectsWithReferences( + const CPDF_Document* document, + ObjectTreeReferenceResolveMode resolve_mode) { + ObjectTreeTraverser traverser(document, resolve_mode); traverser.Traverse(); std::set results; @@ -208,8 +218,9 @@ std::set GetObjectsWithReferences(const CPDF_Document* document) { } std::set GetObjectsWithMultipleReferences( - const CPDF_Document* document) { - ObjectTreeTraverser traverser(document); + const CPDF_Document* document, + ObjectTreeReferenceResolveMode resolve_mode) { + ObjectTreeTraverser traverser(document, resolve_mode); traverser.Traverse(); std::set results; diff --git a/core/fpdfapi/parser/object_tree_traversal_util.h b/core/fpdfapi/parser/object_tree_traversal_util.h index e9db96dce9..1ef6f0624d 100644 --- a/core/fpdfapi/parser/object_tree_traversal_util.h +++ b/core/fpdfapi/parser/object_tree_traversal_util.h @@ -11,12 +11,31 @@ class CPDF_Document; +enum class ObjectTreeReferenceResolveMode { + // Resolve references through the holder stored on each CPDF_Reference. This + // preserves the historical traversal behavior for ordinary documents. + kReferenceHolder, + + // Resolve all references through the document being traversed. This is needed + // when the document can override referenced objects, such as a layer document + // whose overlay should take precedence over the frozen base graph. + kEffectiveDocument, +}; + // Traverses `document` starting with its trailer, if it has one, or starting at // the catalog, which always exists. The trailer should have a reference to the // catalog. The traversal avoids cycles. +// +// In `kReferenceHolder` mode, references are followed through their +// CPDF_IndirectObjectHolder. In `kEffectiveDocument` mode, references are +// resolved through `document` so any overlay it provides is honored. +// // Returns all the PDF objects (not CPDF_Objects) the traversal reached as a set // of object numbers. -std::set GetObjectsWithReferences(const CPDF_Document* document); +std::set GetObjectsWithReferences( + const CPDF_Document* document, + ObjectTreeReferenceResolveMode resolve_mode = + ObjectTreeReferenceResolveMode::kReferenceHolder); // Same as GetObjectsWithReferences(), but only returns the objects with // multiple references. References that would create a cycle are ignored. @@ -41,6 +60,8 @@ std::set GetObjectsWithReferences(const CPDF_Document* document); // references (B). Since (B) -> (C) -> (B) creates a cycle, the (C) -> (B) // reference does not count. std::set GetObjectsWithMultipleReferences( - const CPDF_Document* document); + const CPDF_Document* document, + ObjectTreeReferenceResolveMode resolve_mode = + ObjectTreeReferenceResolveMode::kReferenceHolder); #endif // CORE_FPDFAPI_PARSER_OBJECT_TREE_TRAVERSAL_UTIL_H_ diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 78371d327b..c4d296dfc0 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -1750,6 +1750,80 @@ TEST_F(FPDFViewEmbedderTest, LayerOwnedBufferAndArtifactReplay) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerArtifactIncludesNewAnnotObjectBodies) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + std::vector annot_objnums; + for (int i = 0; i < 5; ++i) { + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_TEXT)); + ASSERT_TRUE(annot); + const uint32_t objnum = EPDFAnnot_GetObjectNumber(annot.get()); + ASSERT_GT(objnum, 0u); + annot_objnums.push_back(objnum); + } + EXPECT_EQ(5, FPDFPage_GetAnnotCount(page.get())); + + unsigned long artifact_size = 0; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + void* artifact_buffer = EPDFLayer_SaveLayerArtifactToOwnedBuffer( + layer.get(), &artifact_size, &save_status); + ASSERT_TRUE(artifact_buffer); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string artifact(static_cast(artifact_buffer), + artifact_size); + EPDF_FreeBuffer(artifact_buffer); + ASSERT_FALSE(artifact.empty()); + + for (uint32_t objnum : annot_objnums) { + const std::string object_reference = std::to_string(objnum) + " 0 R"; + const std::string object_header = std::to_string(objnum) + " 0 obj"; + EXPECT_NE(std::string::npos, artifact.find(object_reference)) + << "Layer artifact should reference newly created annotation object " + << objnum << "."; + EXPECT_NE(std::string::npos, artifact.find(object_header)) + << "Layer artifact references annotation object " << objnum + << " but does not contain its object body."; + } + + EPDF_ReleaseBaseDocument(base); + + FileAccessForTesting replay_base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT replay_base = + EPDF_LoadBaseDocument(&replay_base_access, nullptr); + ASSERT_TRUE(replay_base); + + FPDF_FILEACCESS artifact_access = {}; + artifact_access.m_FileLen = artifact.size(); + artifact_access.m_GetBlock = GetBlockFromString; + artifact_access.m_Param = &artifact; + EPDFLayerOpenStatus artifact_open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument artifact_replayed(EPDFLayer_OpenLayerArtifact( + replay_base, &artifact_access, nullptr, &artifact_open_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, artifact_open_status); + ASSERT_TRUE(artifact_replayed); + ScopedFPDFPage artifact_page(FPDF_LoadPage(artifact_replayed.get(), 0)); + ASSERT_TRUE(artifact_page); + ASSERT_EQ(5, FPDFPage_GetAnnotCount(artifact_page.get())); + for (int i = 0; i < 5; ++i) { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(artifact_page.get(), i)); + ASSERT_TRUE(annot); + EXPECT_EQ(FPDF_ANNOT_TEXT, FPDFAnnot_GetSubtype(annot.get())); + } + + EPDF_ReleaseBaseDocument(replay_base); +} + TEST_F(FPDFViewEmbedderTest, LayerReplaySoakSmoke) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From b57a70cbac80e3efbe67b3e3a098c626cb17a031 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 18 May 2026 16:32:16 +0300 Subject: [PATCH 25/56] Add redaction API and form XObject helper Introduce EmbedPDF redaction support and a reusable helper to append Form XObjects to a page. - Add public API (public/epdf_redact.h) exposing EPDFAnnot_ApplyRedaction, EPDFAnnot_ApplyRedactionWithReport, EPDFPage_ApplyRedactions, and EPDFPage_ApplyRedactionsWithReport to apply redaction annotations and report removed annotations. - Implement redaction logic in fpdfsdk/epdf_redact.cpp: collects redaction areas, removes text, flattens optional RO streams, detaches widget entries from AcroForm, cascades popup removals, and writes removal reports with /NM UTF-8 handling. - Add page content helper (fpdfsdk/epdf_page_content_helpers.*) to append Form XObjects to pages and use it from fpdfsdk/fpdf_annot.cpp (replacing inlined flattening code). - Update BUILD.gn to include new sources and update public/fpdf_annot.h to expose the new API header. - Add tests and resources to cover redaction behaviors (removal, reporting, popup cascade, widget handling, preservation of sibling REDACTs, and touch-only annotations). These changes centralize redaction behavior, provide reporting for removed annotations, and factor Form XObject flattening into a reusable helper. --- fpdfsdk/BUILD.gn | 3 + fpdfsdk/epdf_page_content_helpers.cpp | 66 ++ fpdfsdk/epdf_page_content_helpers.h | 18 + fpdfsdk/epdf_redact.cpp | 613 ++++++++++++++++++ fpdfsdk/fpdf_annot.cpp | 246 +------ fpdfsdk/fpdf_annot_embeddertest.cpp | 186 ++++++ public/epdf_redact.h | 107 +++ public/fpdf_annot.h | 37 +- testing/resources/redact_annot.in | 31 +- testing/resources/redact_annot.pdf | Bin 683 -> 1119 bytes testing/resources/redact_apply_all_visible.in | 100 +++ .../resources/redact_apply_all_visible.pdf | Bin 0 -> 1588 bytes testing/resources/redact_popup_cascade.in | 83 +++ testing/resources/redact_popup_cascade.pdf | Bin 0 -> 1272 bytes testing/resources/redact_preserve_sibling.in | 87 +++ testing/resources/redact_preserve_sibling.pdf | Bin 0 -> 1379 bytes testing/resources/redact_remove_annots.in | 75 +++ testing/resources/redact_remove_annots.pdf | Bin 0 -> 1146 bytes testing/resources/redact_text_middle.in | 58 ++ testing/resources/redact_text_middle.pdf | Bin 0 -> 889 bytes testing/resources/redact_touch_only.in | 75 +++ testing/resources/redact_touch_only.pdf | Bin 0 -> 1144 bytes 22 files changed, 1507 insertions(+), 278 deletions(-) create mode 100644 fpdfsdk/epdf_page_content_helpers.cpp create mode 100644 fpdfsdk/epdf_page_content_helpers.h create mode 100644 fpdfsdk/epdf_redact.cpp create mode 100644 public/epdf_redact.h create mode 100644 testing/resources/redact_apply_all_visible.in create mode 100644 testing/resources/redact_apply_all_visible.pdf create mode 100644 testing/resources/redact_popup_cascade.in create mode 100644 testing/resources/redact_popup_cascade.pdf create mode 100644 testing/resources/redact_preserve_sibling.in create mode 100644 testing/resources/redact_preserve_sibling.pdf create mode 100644 testing/resources/redact_remove_annots.in create mode 100644 testing/resources/redact_remove_annots.pdf create mode 100644 testing/resources/redact_text_middle.in create mode 100644 testing/resources/redact_text_middle.pdf create mode 100644 testing/resources/redact_touch_only.in create mode 100644 testing/resources/redact_touch_only.pdf diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 99aacb3175..6132162e33 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -10,8 +10,11 @@ source_set("fpdfsdk") { "epdf_base_document.cpp", "epdf_layer.cpp", "epdf_outline.cpp", + "epdf_page_content_helpers.cpp", + "epdf_page_content_helpers.h", "epdf_png_shim.cpp", "epdf_jpeg_shim.cpp", + "epdf_redact.cpp", "cpdfsdk_annot.cpp", "cpdfsdk_annot.h", "cpdfsdk_annotiteration.cpp", diff --git a/fpdfsdk/epdf_page_content_helpers.cpp b/fpdfsdk/epdf_page_content_helpers.cpp new file mode 100644 index 0000000000..857a65f544 --- /dev/null +++ b/fpdfsdk/epdf_page_content_helpers.cpp @@ -0,0 +1,66 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "fpdfsdk/epdf_page_content_helpers.h" + +#include + +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_stream.h" + +void EpdfAppendFormXObjectToPage(CPDF_Page* page, + RetainPtr form_stream, + const CFX_FloatRect& target_rect) { + if (!page || !form_stream) { + return; + } + + CPDF_Document* doc = page->GetDocument(); + if (!doc) { + return; + } + + RetainPtr form_dict = form_stream->GetDict(); + if (!form_dict) { + return; + } + + CFX_FloatRect form_bbox = form_dict->GetRectFor("BBox"); + form_bbox.Normalize(); + if (form_bbox.IsEmpty()) { + form_bbox = target_rect; + } + + float scale_x = 1.0f; + float scale_y = 1.0f; + if (form_bbox.Width() > 0) { + scale_x = target_rect.Width() / form_bbox.Width(); + } + if (form_bbox.Height() > 0) { + scale_y = target_rect.Height() / form_bbox.Height(); + } + + CFX_Matrix form_matrix; + form_matrix.a = scale_x; + form_matrix.d = scale_y; + form_matrix.e = target_rect.left - form_bbox.left * scale_x; + form_matrix.f = target_rect.bottom - form_bbox.bottom * scale_y; + + auto form = std::make_unique( + doc, page->GetMutableResources(), + pdfium::WrapRetain(const_cast(form_stream.Get()))); + form->ParseContent(); + + auto form_obj = std::make_unique( + CPDF_PageObject::kNoContentStream, std::move(form), form_matrix); + + form_obj->CalcBoundingBox(); + form_obj->SetDirty(true); + page->AppendPageObject(std::move(form_obj)); +} diff --git a/fpdfsdk/epdf_page_content_helpers.h b/fpdfsdk/epdf_page_content_helpers.h new file mode 100644 index 0000000000..bf49df5101 --- /dev/null +++ b/fpdfsdk/epdf_page_content_helpers.h @@ -0,0 +1,18 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FPDFSDK_EPDF_PAGE_CONTENT_HELPERS_H_ +#define FPDFSDK_EPDF_PAGE_CONTENT_HELPERS_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/retain_ptr.h" + +class CPDF_Page; +class CPDF_Stream; + +void EpdfAppendFormXObjectToPage(CPDF_Page* page, + RetainPtr form_stream, + const CFX_FloatRect& target_rect); + +#endif // FPDFSDK_EPDF_PAGE_CONTENT_HELPERS_H_ diff --git a/fpdfsdk/epdf_redact.cpp b/fpdfsdk/epdf_redact.cpp new file mode 100644 index 0000000000..d025043021 --- /dev/null +++ b/fpdfsdk/epdf_redact.cpp @@ -0,0 +1,613 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_redact.h" + +#include +#include +#include +#include +#include + +#include "constants/annotation_common.h" +#include "core/fpdfapi/edit/cpdf_text_redactor.h" +#include "core/fpdfapi/page/cpdf_annotcontext.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_interactiveform.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "fpdfsdk/cpdfsdk_helpers.h" +#include "fpdfsdk/epdf_page_content_helpers.h" + +namespace { + +const CPDF_Dictionary* GetAnnotDictFromFPDFAnnotation( + const FPDF_ANNOTATION annot) { + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + return context ? context->GetAnnotDict() : nullptr; +} + +std::vector GetRedactRectsFromAnnotDict( + const CPDF_Dictionary* annot_dict) { + std::vector rects; + if (!annot_dict) { + return rects; + } + + RetainPtr quad_points_array = + annot_dict->GetArrayFor("QuadPoints"); + if (quad_points_array && quad_points_array->size() >= 8) { + size_t quad_count = CPDF_Annot::QuadPointCount(quad_points_array.Get()); + for (size_t i = 0; i < quad_count; ++i) { + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(annot_dict, i); + rect.Normalize(); + if (!rect.IsEmpty()) { + rects.push_back(rect); + } + } + if (!rects.empty()) { + return rects; + } + } + + CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + rect.Normalize(); + if (!rect.IsEmpty()) { + rects.push_back(rect); + } + + return rects; +} + +struct RemovedAnnotCandidate { + size_t index = 0; + uint32_t object_number = 0; + ByteString nm_utf8; + RetainPtr dict; +}; + +struct RedactionReportBuffers { + EPDF_RemovedAnnotInfo* removed = nullptr; + uint32_t removed_capacity = 0; + char* nm_utf8_pool = nullptr; + uint32_t nm_utf8_pool_capacity = 0; + uint32_t* written_count = nullptr; + uint32_t* total_count = nullptr; + uint32_t* nm_utf8_bytes_used = nullptr; +}; + +uint32_t GetAnnotObjectNumber(const CPDF_Object* entry, + const CPDF_Dictionary* dict) { + if (entry && entry->IsReference()) { + return entry->AsReference()->GetRefObjNum(); + } + return dict ? dict->GetObjNum() : 0; +} + +ByteString GetAnnotNMUtf8(const CPDF_Dictionary* dict) { + if (!dict || !dict->KeyExist("NM")) { + return ByteString(); + } + return dict->GetUnicodeTextFor("NM").ToUTF8(); +} + +bool RectsIntersectWithPositiveArea(CFX_FloatRect a, CFX_FloatRect b) { + a.Normalize(); + b.Normalize(); + a.Intersect(b); + return !a.IsEmpty(); +} + +bool AnnotIntersectsAny(const CPDF_Dictionary* annot_dict, + pdfium::span redact_rects) { + if (!annot_dict) { + return false; + } + CFX_FloatRect annot_rect = + annot_dict->GetRectFor(pdfium::annotation::kRect); + annot_rect.Normalize(); + if (annot_rect.IsEmpty()) { + return false; + } + for (const CFX_FloatRect& redact_rect : redact_rects) { + if (RectsIntersectWithPositiveArea(annot_rect, redact_rect)) { + return true; + } + } + return false; +} + +bool CandidateExistsAtIndex( + const std::vector& candidates, + size_t index) { + return pdfium::Contains(candidates, index, &RemovedAnnotCandidate::index); +} + +bool AddRemovalCandidate(CPDF_Page* page, + size_t index, + std::vector* candidates) { + if (!page || !candidates || CandidateExistsAtIndex(*candidates, index)) { + return false; + } + RetainPtr annots = page->GetMutableAnnotsArray(); + if (!annots || index >= annots->size()) { + return false; + } + RetainPtr entry = annots->GetMutableObjectAt(index); + RetainPtr dict = + ToDictionary(entry ? entry->GetMutableDirect() : nullptr); + if (!dict) { + return false; + } + + RemovedAnnotCandidate candidate; + candidate.index = index; + candidate.object_number = GetAnnotObjectNumber(entry.Get(), dict.Get()); + candidate.nm_utf8 = GetAnnotNMUtf8(dict.Get()); + candidate.dict = std::move(dict); + candidates->push_back(std::move(candidate)); + return true; +} + +int FindAnnotIndexOnPageByObjNumOrDict(const CPDF_Page* page, + const CPDF_Dictionary* annot_dict) { + if (!page || !annot_dict) { + return -1; + } + RetainPtr annots = page->GetAnnotsArray(); + if (!annots) { + return -1; + } + const uint32_t target_objnum = annot_dict->GetObjNum(); + for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr current = annots->GetDictAt(i); + if (!current) { + continue; + } + if (current.Get() == annot_dict || + (target_objnum != 0 && current->GetObjNum() == target_objnum)) { + return static_cast(i); + } + } + return -1; +} + +void AddPopupCascade(CPDF_Page* page, + std::vector* candidates) { + if (!page || !candidates) { + return; + } + for (size_t i = 0; i < candidates->size(); ++i) { + RetainPtr popup = + candidates->at(i).dict ? candidates->at(i).dict->GetDictFor("Popup") + : nullptr; + if (!popup) { + continue; + } + const int popup_index = + FindAnnotIndexOnPageByObjNumOrDict(page, popup.Get()); + if (popup_index >= 0) { + AddRemovalCandidate(page, static_cast(popup_index), candidates); + } + } +} + +bool RemoveDictFromArray(CPDF_Array* array, const CPDF_Dictionary* dict) { + if (!array || !dict) { + return false; + } + bool removed = false; + const uint32_t objnum = dict->GetObjNum(); + for (size_t i = array->size(); i > 0; --i) { + RetainPtr item = array->GetDictAt(i - 1); + if (item && + (item.Get() == dict || (objnum != 0 && item->GetObjNum() == objnum))) { + array->RemoveAt(i - 1); + removed = true; + } + } + return removed; +} + +RetainPtr GetAcroFormFields(CPDF_Document* doc) { + if (!doc) { + return nullptr; + } + RetainPtr root = doc->GetMutableRoot(); + if (!root) { + return nullptr; + } + RetainPtr acro_form = root->GetMutableDictFor("AcroForm"); + return acro_form ? acro_form->GetMutableArrayFor("Fields") : nullptr; +} + +bool DetachWidgetFromAcroForm(CPDF_Document* doc, + CPDF_Dictionary* widget_dict) { + if (!doc || !widget_dict || + widget_dict->GetNameFor(pdfium::annotation::kSubtype) != "Widget") { + return false; + } + + bool changed = false; + RetainPtr parent = widget_dict->GetMutableDictFor("Parent"); + if (!parent) { + RetainPtr fields = GetAcroFormFields(doc); + return fields ? RemoveDictFromArray(fields.Get(), widget_dict) : false; + } + + RetainPtr kids = parent->GetMutableArrayFor("Kids"); + if (kids) { + changed |= RemoveDictFromArray(kids.Get(), widget_dict); + } + + RetainPtr current = parent; + while (current) { + RetainPtr current_kids = current->GetMutableArrayFor("Kids"); + if (current_kids && !current_kids->IsEmpty()) { + break; + } + + RetainPtr next_parent = + current->GetMutableDictFor("Parent"); + if (next_parent) { + RetainPtr parent_kids = + next_parent->GetMutableArrayFor("Kids"); + if (parent_kids) { + changed |= RemoveDictFromArray(parent_kids.Get(), current.Get()); + } + current = std::move(next_parent); + continue; + } + + RetainPtr fields = GetAcroFormFields(doc); + if (fields) { + changed |= RemoveDictFromArray(fields.Get(), current.Get()); + } + break; + } + + return changed; +} + +void DetachWidgetsFromAcroForm( + CPDF_Page* page, + const std::vector& candidates) { + if (!page) { + return; + } + CPDF_Document* doc = page->GetDocument(); + if (!doc) { + return; + } + bool changed = false; + for (const RemovedAnnotCandidate& candidate : candidates) { + if (candidate.dict && + candidate.dict->GetNameFor(pdfium::annotation::kSubtype) == "Widget") { + changed |= DetachWidgetFromAcroForm(doc, candidate.dict.Get()); + } + } + if (changed) { + CPDF_InteractiveForm form(doc); + form.FixPageFields(page); + } +} + +void WriteRemovalReport(const std::vector& candidates, + const RedactionReportBuffers* report) { + if (!report) { + return; + } + + const uint32_t total = + pdfium::checked_cast(candidates.size()); + uint32_t written = 0; + uint32_t nm_bytes_used = 0; + const uint32_t capacity = report->removed ? report->removed_capacity : 0; + const uint32_t limit = std::min(total, capacity); + + for (; written < limit; ++written) { + const RemovedAnnotCandidate& candidate = candidates[written]; + EPDF_RemovedAnnotInfo& out = report->removed[written]; + out.object_number = candidate.object_number; + out.index_at_removal = + pdfium::checked_cast(candidate.index); + out.nm_utf8_offset = 0; + out.nm_utf8_len = 0; + + const uint32_t nm_len = + pdfium::checked_cast(candidate.nm_utf8.GetLength()); + if (nm_len == 0) { + continue; + } + if (!report->nm_utf8_pool || + nm_len > report->nm_utf8_pool_capacity - nm_bytes_used) { + out.nm_utf8_len = EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW; + continue; + } + + out.nm_utf8_offset = nm_bytes_used; + out.nm_utf8_len = nm_len; + memcpy(report->nm_utf8_pool + nm_bytes_used, candidate.nm_utf8.c_str(), + nm_len); + nm_bytes_used += nm_len; + } + + if (report->written_count) { + *report->written_count = written; + } + if (report->total_count) { + *report->total_count = total; + } + if (report->nm_utf8_bytes_used) { + *report->nm_utf8_bytes_used = nm_bytes_used; + } +} + +void RemoveCandidatesFromPage( + CPDF_Page* page, + const std::vector& candidates) { + if (!page) { + return; + } + RetainPtr annots = page->GetMutableAnnotsArray(); + if (!annots) { + return; + } + CPDF_Document* doc = page->GetDocument(); + for (auto it = candidates.rbegin(); it != candidates.rend(); ++it) { + if (it->index >= annots->size()) { + continue; + } + annots->RemoveAt(it->index); + if (doc && it->object_number) { + doc->DeleteIndirectObject(it->object_number); + } + } +} + +void SortCandidatesByOriginalIndex( + std::vector* candidates) { + std::sort(candidates->begin(), candidates->end(), + [](const RemovedAnnotCandidate& a, + const RemovedAnnotCandidate& b) { return a.index < b.index; }); +} + +bool ApplySingleRedactionCore(CPDF_Page* page, + const CPDF_Dictionary* redact_dict, + const RedactionReportBuffers* report) { + if (!page || !redact_dict) { + return false; + } + + std::vector rects = GetRedactRectsFromAnnotDict(redact_dict); + if (rects.empty()) { + return false; + } + + std::vector removals; + RetainPtr annots = page->GetMutableAnnotsArray(); + if (annots) { + for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr entry = annots->GetMutableObjectAt(i); + RetainPtr annot_dict = + ToDictionary(entry ? entry->GetMutableDirect() : nullptr); + if (!annot_dict) { + continue; + } + if (annot_dict->GetNameFor(pdfium::annotation::kSubtype) == "Redact") { + continue; + } + if (AnnotIntersectsAny(annot_dict.Get(), pdfium::span(rects))) { + AddRemovalCandidate(page, i, &removals); + } + } + + AddPopupCascade(page, &removals); + + const int redact_index = + FindAnnotIndexOnPageByObjNumOrDict(page, redact_dict); + if (redact_index >= 0) { + AddRemovalCandidate(page, static_cast(redact_index), &removals); + } + } + + SortCandidatesByOriginalIndex(&removals); + + RedactTextInRects(page, pdfium::span(rects), + /*recurse_forms=*/true, + /*draw_black_boxes=*/false); + + RetainPtr ro_stream = redact_dict->GetStreamFor("RO"); + if (ro_stream) { + CFX_FloatRect annot_rect = + redact_dict->GetRectFor(pdfium::annotation::kRect); + annot_rect.Normalize(); + EpdfAppendFormXObjectToPage(page, ro_stream, annot_rect); + } + + DetachWidgetsFromAcroForm(page, removals); + WriteRemovalReport(removals, report); + RemoveCandidatesFromPage(page, removals); + return true; +} + +bool ApplyAllRedactionsCore(CPDF_Page* page, + const RedactionReportBuffers* report) { + if (!page) { + return false; + } + + RetainPtr annots = page->GetMutableAnnotsArray(); + if (!annots || annots->IsEmpty()) { + return false; + } + + std::vector all_rects; + std::vector, CFX_FloatRect>> + ro_streams; + std::vector removals; + + for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr entry = annots->GetMutableObjectAt(i); + RetainPtr annot_dict = + ToDictionary(entry ? entry->GetMutableDirect() : nullptr); + if (!annot_dict || + annot_dict->GetNameFor(pdfium::annotation::kSubtype) != "Redact") { + continue; + } + + AddRemovalCandidate(page, i, &removals); + + std::vector rects = + GetRedactRectsFromAnnotDict(annot_dict.Get()); + for (const CFX_FloatRect& rect : rects) { + all_rects.push_back(rect); + } + + RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); + if (ro_stream) { + CFX_FloatRect annot_rect = + annot_dict->GetRectFor(pdfium::annotation::kRect); + annot_rect.Normalize(); + ro_streams.push_back({ro_stream, annot_rect}); + } + } + + if (all_rects.empty()) { + return false; + } + + for (size_t i = 0; i < annots->size(); ++i) { + RetainPtr entry = annots->GetMutableObjectAt(i); + RetainPtr annot_dict = + ToDictionary(entry ? entry->GetMutableDirect() : nullptr); + if (!annot_dict) { + continue; + } + if (annot_dict->GetNameFor(pdfium::annotation::kSubtype) == "Redact") { + continue; + } + if (AnnotIntersectsAny(annot_dict.Get(), pdfium::span(all_rects))) { + AddRemovalCandidate(page, i, &removals); + } + } + + AddPopupCascade(page, &removals); + SortCandidatesByOriginalIndex(&removals); + + RedactTextInRects(page, pdfium::span(all_rects), + /*recurse_forms=*/true, + /*draw_black_boxes=*/false); + + for (const auto& [ro_stream, annot_rect] : ro_streams) { + EpdfAppendFormXObjectToPage(page, ro_stream, annot_rect); + } + + DetachWidgetsFromAcroForm(page, removals); + WriteRemovalReport(removals, report); + RemoveCandidatesFromPage(page, removals); + return true; +} + +} // namespace + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { + return EPDFAnnot_ApplyRedactionWithReport( + page, annot, nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ApplyRedactionWithReport( + FPDF_PAGE page, + FPDF_ANNOTATION annot, + EPDF_RemovedAnnotInfo* out_removed, + uint32_t out_removed_capacity, + char* nm_utf8_pool, + uint32_t nm_utf8_pool_capacity, + uint32_t* out_written_count, + uint32_t* out_total_count, + uint32_t* out_nm_utf8_bytes_used) { + if (out_written_count) { + *out_written_count = 0; + } + if (out_total_count) { + *out_total_count = 0; + } + if (out_nm_utf8_bytes_used) { + *out_nm_utf8_bytes_used = 0; + } + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) { + return false; + } + + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict || + annot_dict->GetNameFor(pdfium::annotation::kSubtype) != "Redact") { + return false; + } + + RedactionReportBuffers report = { + out_removed, + out_removed_capacity, + nm_utf8_pool, + nm_utf8_pool_capacity, + out_written_count, + out_total_count, + out_nm_utf8_bytes_used, + }; + return ApplySingleRedactionCore(pPage, annot_dict, &report); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_ApplyRedactions(FPDF_PAGE page) { + return EPDFPage_ApplyRedactionsWithReport(page, nullptr, 0, nullptr, 0, + nullptr, nullptr, nullptr); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFPage_ApplyRedactionsWithReport( + FPDF_PAGE page, + EPDF_RemovedAnnotInfo* out_removed, + uint32_t out_removed_capacity, + char* nm_utf8_pool, + uint32_t nm_utf8_pool_capacity, + uint32_t* out_written_count, + uint32_t* out_total_count, + uint32_t* out_nm_utf8_bytes_used) { + if (out_written_count) { + *out_written_count = 0; + } + if (out_total_count) { + *out_total_count = 0; + } + if (out_nm_utf8_bytes_used) { + *out_nm_utf8_bytes_used = 0; + } + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) { + return false; + } + + RedactionReportBuffers report = { + out_removed, + out_removed_capacity, + nm_utf8_pool, + nm_utf8_pool_capacity, + out_written_count, + out_total_count, + out_nm_utf8_bytes_used, + }; + return ApplyAllRedactionsCore(pPage, &report); +} diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 5b09d34b80..2d8d1c2534 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -17,7 +18,6 @@ #include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" #include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h" #include "core/fpdfapi/edit/cpdf_pageorganizer.h" -#include "core/fpdfapi/edit/cpdf_text_redactor.h" #include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/page/cpdf_form.h" #include "core/fpdfapi/page/cpdf_formobject.h" @@ -53,6 +53,7 @@ #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_interactiveform.h" +#include "fpdfsdk/epdf_page_content_helpers.h" namespace { @@ -4124,103 +4125,6 @@ EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot) { namespace { -// Helper to extract redaction rectangles from a REDACT annotation. -// Returns QuadPoints if present, otherwise falls back to Rect. -std::vector GetRedactRectsFromAnnotDict( - const CPDF_Dictionary* annot_dict) { - std::vector rects; - if (!annot_dict) { - return rects; - } - - // Try QuadPoints first (for text-based redactions) - RetainPtr quad_points_array = - annot_dict->GetArrayFor("QuadPoints"); - if (quad_points_array && quad_points_array->size() >= 8) { - size_t quad_count = CPDF_Annot::QuadPointCount(quad_points_array.Get()); - for (size_t i = 0; i < quad_count; ++i) { - CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(annot_dict, i); - rect.Normalize(); - if (!rect.IsEmpty()) { - rects.push_back(rect); - } - } - if (!rects.empty()) { - return rects; - } - } - - // Fall back to Rect (for area-based redactions) - CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); - rect.Normalize(); - if (!rect.IsEmpty()) { - rects.push_back(rect); - } - - return rects; -} - -// Internal helper to flatten any Form XObject stream to page content. -// Used by EPDFAnnot_Flatten (for AP/N) and EPDFAnnot_ApplyRedaction (for RO). -void FlattenFormXObjectToPage(CPDF_Page* page, - RetainPtr form_stream, - const CFX_FloatRect& target_rect) { - if (!page || !form_stream) { - return; - } - - CPDF_Document* doc = page->GetDocument(); - if (!doc) { - return; - } - - // Get the form dictionary from the stream - RetainPtr form_dict = form_stream->GetDict(); - if (!form_dict) { - return; - } - - // Get the BBox from the form stream - CFX_FloatRect form_bbox = form_dict->GetRectFor("BBox"); - form_bbox.Normalize(); - if (form_bbox.IsEmpty()) { - form_bbox = target_rect; - } - - // Calculate the transformation matrix to position the form at the target rect - // The form's content is defined in BBox coordinates, we need to map it to - // target_rect - float scale_x = 1.0f; - float scale_y = 1.0f; - if (form_bbox.Width() > 0) { - scale_x = target_rect.Width() / form_bbox.Width(); - } - if (form_bbox.Height() > 0) { - scale_y = target_rect.Height() / form_bbox.Height(); - } - - CFX_Matrix form_matrix; - form_matrix.a = scale_x; - form_matrix.d = scale_y; - form_matrix.e = target_rect.left - form_bbox.left * scale_x; - form_matrix.f = target_rect.bottom - form_bbox.bottom * scale_y; - - // Create a CPDF_Form from the stream - auto form = std::make_unique( - doc, page->GetMutableResources(), - pdfium::WrapRetain(const_cast(form_stream.Get()))); - form->ParseContent(); - - // Create a FormObject that wraps the form - auto form_obj = std::make_unique( - CPDF_PageObject::kNoContentStream, std::move(form), form_matrix); - - form_obj->CalcBoundingBox(); - form_obj->SetDirty(true); - - page->AppendPageObject(std::move(form_obj)); -} - // Find the index of an annotation in the page's annotation array. // Returns -1 if not found. int GetAnnotIndexOnPage(const CPDF_Page* page, @@ -4244,150 +4148,6 @@ int GetAnnotIndexOnPage(const CPDF_Page* page, } // namespace -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { - return false; - } - - // Must be a REDACT annotation - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_REDACT) { - return false; - } - - const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) { - return false; - } - - // 1. Extract redaction rectangles from QuadPoints or Rect - std::vector rects = GetRedactRectsFromAnnotDict(annot_dict); - if (rects.empty()) { - return false; - } - - // 2. Remove content using existing redactor (no black boxes - we use RO) - RedactTextInRects(pPage, pdfium::span(rects), - /*recurse_forms=*/true, - /*draw_black_boxes=*/false); - - // 3. Flatten RO stream if present - RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); - if (ro_stream) { - CFX_FloatRect annot_rect = - annot_dict->GetRectFor(pdfium::annotation::kRect); - annot_rect.Normalize(); - FlattenFormXObjectToPage(pPage, ro_stream, annot_rect); - } - // If no RO: content is removed but no overlay is added - - // 4. Remove the annotation from the page - int annot_index = GetAnnotIndexOnPage(pPage, annot_dict); - if (annot_index >= 0) { - RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (annots) { - RetainPtr entry = annots->GetMutableObjectAt(annot_index); - uint32_t objnum = 0; - if (entry && entry->IsReference()) { - objnum = entry->AsReference()->GetRefObjNum(); - } else if (entry) { - objnum = entry->GetObjNum(); - } - annots->RemoveAt(annot_index); - if (objnum) { - pPage->GetDocument()->DeleteIndirectObject(objnum); - } - } - } - - return true; -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_ApplyRedactions(FPDF_PAGE page) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { - return false; - } - - // First pass: collect all redaction areas, RO streams, indices, and objnums - std::vector all_rects; - std::vector, CFX_FloatRect>> - ro_streams; - std::vector> redact_index_objnums; - - RetainPtr annot_list = pPage->GetMutableAnnotsArray(); - if (!annot_list || annot_list->IsEmpty()) { - return false; - } - - for (size_t i = 0; i < annot_list->size(); ++i) { - RetainPtr entry = annot_list->GetMutableObjectAt(i); - RetainPtr annot_dict = - ToDictionary(entry ? entry->GetMutableDirect() : nullptr); - if (!annot_dict) { - continue; - } - - // Check if this is a REDACT annotation - ByteString subtype = annot_dict->GetNameFor(pdfium::annotation::kSubtype); - if (subtype != "Redact") { - continue; - } - - // Track index and indirect object number for later removal - uint32_t objnum = 0; - if (entry && entry->IsReference()) { - objnum = entry->AsReference()->GetRefObjNum(); - } else if (annot_dict) { - objnum = annot_dict->GetObjNum(); - } - redact_index_objnums.push_back({i, objnum}); - - // Extract rectangles - std::vector rects = - GetRedactRectsFromAnnotDict(annot_dict.Get()); - for (const auto& rect : rects) { - all_rects.push_back(rect); - } - - // Collect RO stream if present - RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); - if (ro_stream) { - CFX_FloatRect annot_rect = - annot_dict->GetRectFor(pdfium::annotation::kRect); - annot_rect.Normalize(); - ro_streams.push_back({ro_stream, annot_rect}); - } - } - - if (all_rects.empty()) { - return false; - } - - // Remove content for all redaction areas at once - RedactTextInRects(pPage, pdfium::span(all_rects), - /*recurse_forms=*/true, - /*draw_black_boxes=*/false); - - // Flatten all RO streams - for (const auto& [ro_stream, annot_rect] : ro_streams) { - FlattenFormXObjectToPage(pPage, ro_stream, annot_rect); - } - - // Remove all REDACT annotations (in reverse order to maintain indices) - // and delete the underlying indirect objects to avoid orphans in the xref. - for (auto it = redact_index_objnums.rbegin(); - it != redact_index_objnums.rend(); ++it) { - annot_list->RemoveAt(it->first); - if (it->second) { - pPage->GetDocument()->DeleteIndirectObject(it->second); - } - } - - return true; -} - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, FPDF_ANNOTATION annot) { CPDF_Page* pPage = CPDFPageFromFPDFPage(page); @@ -4415,7 +4175,7 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); - FlattenFormXObjectToPage(pPage, ap_stream, annot_rect); + EpdfAppendFormXObjectToPage(pPage, ap_stream, annot_rect); // Remove the annotation from the page int annot_index = GetAnnotIndexOnPage(pPage, annot_dict); diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 5aa484fe4c..19ad4ec52d 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -7,6 +7,8 @@ #include #include +#include +#include #include #include #include @@ -29,6 +31,7 @@ #include "public/fpdf_attachment.h" #include "public/fpdf_edit.h" #include "public/fpdf_formfill.h" +#include "public/fpdf_text.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/embedder_test_constants.h" @@ -48,6 +51,58 @@ const wchar_t kStreamData[] = L"223.7 732.4 c 232.6 729.9 242.0 730.8 251.2 730.8 c 257.5 730.8 " L"263.0 732.9 269.0 734.4 c S"; +std::wstring ExtractPageText(FPDF_PAGE page) { + ScopedFPDFTextPage text_page(FPDFText_LoadPage(page)); + if (!text_page) { + ADD_FAILURE() << "Failed to load text page"; + return L""; + } + + const int char_count = FPDFText_CountChars(text_page.get()); + std::vector buffer(char_count + 1); + EXPECT_GT(FPDFText_GetText(text_page.get(), 0, char_count, buffer.data()), + 0); + return GetPlatformWString(buffer.data()); +} + +struct RedactionReport { + std::vector object_numbers; + uint32_t written_count = 0; + uint32_t total_count = 0; + uint32_t nm_utf8_bytes_used = 0; +}; + +RedactionReport ApplyRedactionWithReport(FPDF_PAGE page, + FPDF_ANNOTATION annot) { + std::array removed = {}; + std::array nm_utf8_pool = {}; + RedactionReport report; + + EXPECT_TRUE(EPDFAnnot_ApplyRedactionWithReport( + page, annot, removed.data(), removed.size(), nm_utf8_pool.data(), + nm_utf8_pool.size(), &report.written_count, &report.total_count, + &report.nm_utf8_bytes_used)); + + for (uint32_t i = 0; i < report.written_count; ++i) + report.object_numbers.push_back(removed[i].object_number); + return report; +} + +RedactionReport ApplyPageRedactionsWithReport(FPDF_PAGE page) { + std::array removed = {}; + std::array nm_utf8_pool = {}; + RedactionReport report; + + EXPECT_TRUE(EPDFPage_ApplyRedactionsWithReport( + page, removed.data(), removed.size(), nm_utf8_pool.data(), + nm_utf8_pool.size(), &report.written_count, &report.total_count, + &report.nm_utf8_bytes_used)); + + for (uint32_t i = 0; i < report.written_count; ++i) + report.object_numbers.push_back(removed[i].object_number); + return report; +} + void VerifyFocusableAnnotSubtypes( FPDF_FORMHANDLE form_handle, pdfium::span expected_subtypes) { @@ -3267,6 +3322,137 @@ TEST_F(FPDFAnnotEmbedderTest, Redactannotation) { } } +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionRemovesTextInMiddleOfSentence) { + ASSERT_TRUE(OpenDocument("redact_text_middle.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + std::wstring before = ExtractPageText(page.get()); + EXPECT_NE(std::wstring::npos, before.find(L"hello")); + EXPECT_NE(std::wstring::npos, before.find(L"secret")); + EXPECT_NE(std::wstring::npos, before.find(L"world")); + ScopedFPDFBitmap before_bitmap = RenderLoadedPage(page.get()); + ASSERT_TRUE(before_bitmap); + const std::string before_hash = HashBitmap(before_bitmap.get()); + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get())); + } + + ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + + ASSERT_TRUE(OpenSavedDocument()); + FPDF_PAGE saved_page = LoadSavedPage(0); + ASSERT_TRUE(saved_page); + + std::wstring after = ExtractPageText(saved_page); + ScopedFPDFBitmap after_bitmap = RenderSavedPage(saved_page); + ASSERT_TRUE(after_bitmap); + const std::string after_hash = HashBitmap(after_bitmap.get()); + CloseSavedPage(saved_page); + EXPECT_NE(std::wstring::npos, after.find(L"hello")); + EXPECT_EQ(std::wstring::npos, after.find(L"secret")); + EXPECT_NE(std::wstring::npos, after.find(L"world")); + EXPECT_NE(before_hash, after_hash); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionReportsIntersectingAnnotation) { + ASSERT_TRUE(OpenDocument("redact_remove_annots.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(2, FPDFPage_GetAnnotCount(page.get())); + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); + EXPECT_EQ(2u, report.written_count); + EXPECT_EQ(2u, report.total_count); + EXPECT_THAT(report.object_numbers, testing::UnorderedElementsAre(5u, 6u)); + } + + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionPreservesSiblingRedactions) { + ASSERT_TRUE(OpenDocument("redact_preserve_sibling.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(3, FPDFPage_GetAnnotCount(page.get())); + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); + EXPECT_EQ(2u, report.written_count); + EXPECT_EQ(2u, report.total_count); + EXPECT_THAT(report.object_numbers, testing::UnorderedElementsAre(5u, 7u)); + } + + ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + ScopedFPDFAnnotation remaining(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(remaining); + EXPECT_EQ(FPDF_ANNOT_REDACT, FPDFAnnot_GetSubtype(remaining.get())); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionDoesNotRemoveTouchOnlyAnnotation) { + ASSERT_TRUE(OpenDocument("redact_touch_only.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(2, FPDFPage_GetAnnotCount(page.get())); + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); + EXPECT_EQ(1u, report.written_count); + EXPECT_EQ(1u, report.total_count); + EXPECT_THAT(report.object_numbers, testing::ElementsAre(5u)); + } + + ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); + ScopedFPDFAnnotation remaining(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(remaining); + EXPECT_EQ(FPDF_ANNOT_SQUARE, FPDFAnnot_GetSubtype(remaining.get())); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionCascadesPopupRemoval) { + ASSERT_TRUE(OpenDocument("redact_popup_cascade.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(3, FPDFPage_GetAnnotCount(page.get())); + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); + EXPECT_EQ(3u, report.written_count); + EXPECT_EQ(3u, report.total_count); + EXPECT_THAT(report.object_numbers, + testing::UnorderedElementsAre(5u, 6u, 7u)); + } + + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyPageRedactionsReportsAllRemovedAnnotations) { + ASSERT_TRUE(OpenDocument("redact_apply_all_visible.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(4, FPDFPage_GetAnnotCount(page.get())); + + RedactionReport report = ApplyPageRedactionsWithReport(page.get()); + EXPECT_EQ(4u, report.written_count); + EXPECT_EQ(4u, report.total_count); + EXPECT_THAT(report.object_numbers, + testing::UnorderedElementsAre(5u, 6u, 7u, 8u)); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); +} + TEST_F(FPDFAnnotEmbedderTest, PolygonAnnotation) { ASSERT_TRUE(OpenDocument("polygon_annot.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/public/epdf_redact.h b/public/epdf_redact.h new file mode 100644 index 0000000000..e0f62b68a3 --- /dev/null +++ b/public/epdf_redact.h @@ -0,0 +1,107 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PUBLIC_EPDF_REDACT_H_ +#define PUBLIC_EPDF_REDACT_H_ + +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Experimental EmbedPDF Extension API. +// Report entry produced by redaction APIs that delete annotations. +// +// `object_number` is 0 when the removed annotation was a direct object. +// `nm_utf8_len` is 0 when no /NM was present. It is +// EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW when /NM existed but the caller's +// UTF-8 byte pool had no room for it. +#define EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW 0xFFFFFFFFu + +typedef struct { + uint32_t object_number; + uint32_t index_at_removal; + uint32_t nm_utf8_offset; + uint32_t nm_utf8_len; +} EPDF_RemovedAnnotInfo; + +// Experimental EmbedPDF Extension API. +// Apply a redact annotation, permanently removing content underneath. +// If the annotation has an RO (Redact Overlay) stream, it will be flattened +// as page content (filled rectangles with overlay text). +// If no RO stream exists, content is simply removed with no overlay. +// The annotation is automatically removed from the page after applying. +// +// The caller is responsible for: +// 1. Closing the annotation handle with FPDFPage_CloseAnnot after this call +// 2. Calling FPDFPage_GenerateContent to persist changes +// +// page - handle to the page containing the annotation +// annot - handle to a REDACT annotation +// +// Returns TRUE on success, FALSE if not a REDACT annotation or on error. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot); + +// Experimental EmbedPDF Extension API. +// Same as EPDFAnnot_ApplyRedaction(), but also reports every annotation that +// was removed. This includes annotations whose /Rect intersects the redaction +// area, popup annotations cascaded from removed parents, and the originating +// REDACT annotation itself. Sibling REDACT annotations are preserved. +// +// The caller owns both output buffers. `out_written_count` is the number of +// records safely written to `out_removed`; `out_total_count` is the total +// number of annotations removed. If total > written, the report was truncated. +// /NM values are normalized to UTF-8 and written into `nm_utf8_pool`. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ApplyRedactionWithReport( + FPDF_PAGE page, + FPDF_ANNOTATION annot, + EPDF_RemovedAnnotInfo* out_removed, + uint32_t out_removed_capacity, + char* nm_utf8_pool, + uint32_t nm_utf8_pool_capacity, + uint32_t* out_written_count, + uint32_t* out_total_count, + uint32_t* out_nm_utf8_bytes_used); + +// Experimental EmbedPDF Extension API. +// Apply all redact annotations on a page, permanently removing content +// underneath each one. For each annotation with an RO stream, the overlay +// is flattened as page content. Annotations without RO simply have content +// removed with no overlay. +// All REDACT annotations are automatically removed from the page after applying. +// +// The caller is responsible for: +// 1. Calling FPDFPage_GenerateContent to persist changes +// +// page - handle to a page +// +// Returns TRUE if any redactions were applied, FALSE otherwise. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFPage_ApplyRedactions(FPDF_PAGE page); + +// Experimental EmbedPDF Extension API. +// Same as EPDFPage_ApplyRedactions(), but reports removed annotations using +// the same buffer contract as EPDFAnnot_ApplyRedactionWithReport(). +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFPage_ApplyRedactionsWithReport( + FPDF_PAGE page, + EPDF_RemovedAnnotInfo* out_removed, + uint32_t out_removed_capacity, + char* nm_utf8_pool, + uint32_t nm_utf8_pool_capacity, + uint32_t* out_written_count, + uint32_t* out_total_count, + uint32_t* out_nm_utf8_bytes_used); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_EPDF_REDACT_H_ diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index db493ca3d0..a767537cfe 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -13,6 +13,9 @@ // NOLINTNEXTLINE(build/include) #include "fpdf_formfill.h" +// NOLINTNEXTLINE(build/include) +#include "epdf_redact.h" + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -1782,40 +1785,6 @@ EPDFAnnot_SetOverlayTextRepeat(FPDF_ANNOTATION annot, FPDF_BOOL repeat); FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot); -// Experimental EmbedPDF Extension API. -// Apply a redact annotation, permanently removing content underneath. -// If the annotation has an RO (Redact Overlay) stream, it will be flattened -// as page content (filled rectangles with overlay text). -// If no RO stream exists, content is simply removed with no overlay. -// The annotation is automatically removed from the page after applying. -// -// The caller is responsible for: -// 1. Closing the annotation handle with FPDFPage_CloseAnnot after this call -// 2. Calling FPDFPage_GenerateContent to persist changes -// -// page - handle to the page containing the annotation -// annot - handle to a REDACT annotation -// -// Returns TRUE on success, FALSE if not a REDACT annotation or on error. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot); - -// Experimental EmbedPDF Extension API. -// Apply all redact annotations on a page, permanently removing content -// underneath each one. For each annotation with an RO stream, the overlay -// is flattened as page content. Annotations without RO simply have content -// removed with no overlay. -// All REDACT annotations are automatically removed from the page after applying. -// -// The caller is responsible for: -// 1. Calling FPDFPage_GenerateContent to persist changes -// -// page - handle to a page -// -// Returns TRUE if any redactions were applied, FALSE otherwise. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_ApplyRedactions(FPDF_PAGE page); - // Experimental EmbedPDF Extension API. // Flatten an annotation's normal appearance (AP/N) to page content. // The annotation's appearance becomes part of the page itself. diff --git a/testing/resources/redact_annot.in b/testing/resources/redact_annot.in index 99b7b4e8e9..e3e1de1341 100644 --- a/testing/resources/redact_annot.in +++ b/testing/resources/redact_annot.in @@ -15,6 +15,11 @@ endobj /Parent 2 0 R /Contents 4 0 R /MediaBox [0 0 612 792] + /Resources << + /Font << + /F1 6 0 R + >> + >> /Annots [ 5 0 R ] @@ -25,6 +30,22 @@ endobj {{streamlen}} >> stream +q +0.97 0.98 1 rg +0 0 612 792 re f +0.9 0.94 1 rg +285 526 72 20 re f +Q +BT +/F1 18 Tf +72 700 Td +(Visible redaction annotation fixture) Tj +/F1 12 Tf +72 660 Td +(The red annotation below marks the area that would be redacted.) Tj +293 533 Td +(target) Tj +ET endstream endobj {{object 5 0}} << @@ -32,12 +53,20 @@ endobj /Subtype /Redact /NM (Redact-1) /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (REDACT) /QuadPoints [293 542 349 542 293 530 349 530] /P 3 0 R - /C [1 0.90196 0] /Rect [293 530 349 542] >> endobj +{{object 6 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj {{xref}} {{trailer}} {{startxref}} diff --git a/testing/resources/redact_annot.pdf b/testing/resources/redact_annot.pdf index 76c26078b2c614ac8740ee497fc3a9e9bfdf9fd9..a433bb6624c96d1cb0b5fadb4a5ce060cdf472bc 100644 GIT binary patch delta 551 zcmZ8ey-ve05LS_pkl%pq7!V*N;y5%(B~-*u5lo0;Ap~M@nrjJ!1RR%^0r3i;JO&TL z$iTpBFmiT)0T1?l_xU^fzI&bhoO}Lg_pvI+dVm#dY%rkZ?UjZ31s3`c0*AgMyInfE z-Iw>?lUR=#!OCbXoR8VExq2*B5p%lgb)c3yt#11 zwk5OA`7y{LBPQY;WXhILvMNh*q-&`fn5-;76;DNJl#7Si)QmN*fV^tt;zu5aja*(j zDT)3x3FhSlZj`>Rz!0sd2?~^fNjc6_NPZu~bj=kOodDWF;J#y&9^ssE`JSwoT4&x4 zocq);zaV?O146d_1|8m`&eem&se$EwZ+B})uGEjM&HAmiAg!}ya@E-F$%k8P{I_L} z$BA(XoAzyHTUF?$> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 160 120] + /Resources << + /Font << + /F1 9 0 R + >> + >> + /Contents 4 0 R + /Annots [5 0 R 6 0 R 7 0 R 8 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +0.97 0.97 1 rg +0 0 160 120 re f +1 0.9 0.9 rg +20 20 30 25 re f +0.9 1 0.9 rg +95 20 30 25 re f +Q +BT +/F1 9 Tf +10 98 Td +(apply all redactions removes both targets) Tj +ET +endstream +endobj +{{object 5 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-left) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (LEFT) + /QuadPoints [15 50 55 50 15 15 55 15] + /Rect [15 15 55 50] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Square + /NM (Square-left) + /F 4 + /C [0.8 0 0] + /IC [1 0.9 0.9] + /Border [0 0 2] + /Rect [20 20 50 45] +>> +endobj +{{object 7 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-right) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (RIGHT) + /QuadPoints [90 50 130 50 90 15 130 15] + /Rect [90 15 130 50] +>> +endobj +{{object 8 0}} << + /Type /Annot + /Subtype /Square + /NM (Square-right) + /F 4 + /C [0 0.55 0] + /IC [0.9 1 0.9] + /Border [0 0 2] + /Rect [95 20 125 45] +>> +endobj +{{object 9 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_apply_all_visible.pdf b/testing/resources/redact_apply_all_visible.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5725b06a855fb1e63b6fb6c8cf47a2e7eab15daa GIT binary patch literal 1588 zcmbVMO>g2b5WV|X%mt}E6cQkONL8h!3)^bjZ40@f9$aE*sx+pKsY-v%9`+Zm_6O`6 zn-ZXCkv0M+^X#$TyctjB_UqszthPnv=kH&CL`VVYhbKBc6-2doIagFWmsVza#=xzd zseSty{zPnXt&&vs z^c#%>c!e$e>%l#*9I8Su%mnltcOU}|&y~SuNL@Y}i-|yfHGp7laYjMS)okrco@?0S zhyiN3vF*kVkDJ`tr{sR6@|k@Etrmw@Sfk{#co9Lh3wItuGBdHkoQ$F=i(Uma{4rY( z2)_o#$j>tFS75dq?abbZUMzfUF?I^5+o3oSM{+*TmL#(bnJUBY4symj-cOeUAHdb4zN)gQ#p?`|QJTb*)N#$iNJK#?2q%_fhlq))6{;n4_t zmSxF_I~>61Wg(6F2*6wW0tl*{{4#`f(j1YVHio~AZ+O9Ag<)*zTf*A{vml3~*eme9D4=c?sVya5SN=aG_E#dr zb=lUKFZ(V#ZV8;~b@_5xyWZ53g>ns}cA>IYWz&h=$k&@uQ{3Ay5W)JPRunZNn$jAB zc5asP5^F&uem1bMf!f)@8X@TJU{T|s$I@1nTZ=#KUVAjYqL&f?= hKhzpM8iH|mtc}ul#j&~`CXIE`gLOw#D*c;*_zQN*hynlr literal 0 HcmV?d00001 diff --git a/testing/resources/redact_popup_cascade.in b/testing/resources/redact_popup_cascade.in new file mode 100644 index 0000000000..e52830b8a1 --- /dev/null +++ b/testing/resources/redact_popup_cascade.in @@ -0,0 +1,83 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 120 120] + /Resources << + /Font << + /F1 8 0 R + >> + >> + /Contents 4 0 R + /Annots [5 0 R 6 0 R 7 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +1 0.98 0.9 rg +0 0 120 120 re f +1 0.9 0.2 rg +20 20 15 15 re f +Q +BT +/F1 8 Tf +5 104 Td +(popup cascades with note) Tj +ET +endstream +endobj +{{object 5 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-popup-parent) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (POPUP) + /QuadPoints [10 50 50 50 10 10 50 10] + /Rect [10 10 50 50] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Text + /NM (Text-parent) + /F 4 + /C [1 0.75 0] + /Rect [20 20 35 35] + /Contents (comment) + /Popup 7 0 R +>> +endobj +{{object 7 0}} << + /Type /Annot + /Subtype /Popup + /Rect [70 70 100 100] + /Parent 6 0 R + /Open true +>> +endobj +{{object 8 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_popup_cascade.pdf b/testing/resources/redact_popup_cascade.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e68070121658911e3f17ab9eb811b3c4ff936c8 GIT binary patch literal 1272 zcmah}&2HL25WeqI%ms-Y0$#BBk)lY22DNHa9O9l(4jX%+j=<~M>y-3qdgv2YeSpr) z8nE0}vHY|1&CJd>KkH8Tc5x|tW6}BX>*sGF!2|R71XouApdY>D8v1i()y`}Q2-Q}X zFhHY~xV{!TOVC)5+;(D1a+#Ydvmj~tAx%nH56SzX;ZDH6++Dyzqq~cUTiog-RWoyd zwTE7Ez|R9&u5@XtB1U@59g&4W&src+!h}MjF#wXUUq~>s7^4Kg*7o0InL&9S5C9{7 zkLlfHP1a}DA9c31UqH$UC05!(tG)P2p<(0Hs2z|NbD?wsx>YbxhRb-S+~ zEw_246BS#6KHWmsNtYb!GFQ}v3(_sXr_UVLG%6mK{yj>Ro0FE$y4b0gNFOY8!)5q6 zWXHQoC80^F&}->IaJ+HtMCsgDI<{> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 100 100] + /Resources << + /Font << + /F1 8 0 R + >> + >> + /Contents 4 0 R + /Annots [5 0 R 6 0 R 7 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +0.98 0.98 0.94 rg +0 0 100 100 re f +0.9 0.95 1 rg +20 20 30 30 re f +Q +BT +/F1 8 Tf +5 86 Td +(sibling redaction stays visible) Tj +ET +endstream +endobj +{{object 5 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-primary) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (PRIMARY) + /QuadPoints [10 40 40 40 10 10 40 10] + /Rect [10 10 40 40] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-sibling) + /F 4 + /C [1 0.5 0] + /IC [0 0 0] + /OverlayText (SIBLING) + /QuadPoints [15 35 35 35 15 15 35 15] + /Rect [15 15 35 35] +>> +endobj +{{object 7 0}} << + /Type /Annot + /Subtype /Square + /NM (Square-target) + /F 4 + /C [0 0.25 1] + /IC [0.85 0.93 1] + /Border [0 0 2] + /Rect [20 20 50 50] +>> +endobj +{{object 8 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_preserve_sibling.pdf b/testing/resources/redact_preserve_sibling.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7524d56d1f9ad52c196f8ba5919063ffcdb3e142 GIT binary patch literal 1379 zcmbVM-EP`26u$RUoEs#1L5K;VAXSwLD;rvAX~@lldSQrRsc76frh+}qF7|}e9$@F# zfka_arA5a0d_Kqi&Yv5zPvaK%E?MK}?_Yly2Ore(8LqAvKs!FXN@$OS5nHt(U?w&) zhYl)5?E0F?EJ0;Pa^1*klF3NzG6S5JU(+OqML^b16>|dqW$rH263yL>c*ImDsTis~ zEPS-$zWqIsW+Zd9(<`KBxg#=GXjup(a_H05s0@JQiwOy42JgtBTkN)PvP_}82nm3m zoiAywvL@}4^_|Q%<~#7tfE>$>mg0rIG2a{DoyF7zyMWnMx_(3+_YrIB@Mm?hc6L%2(S)N9L2^ z-Q@oBxg#M2$H6g`cFn`0Fs&m;G(fa$9V)Aj9htxFgqFvAIH_fX-bhpP1H@H*_)gJ_76a!V#z-lA(=aylnzZNX4~cHs#uwUHKRGgFjmGW6nEeIJXjbO{ literal 0 HcmV?d00001 diff --git a/testing/resources/redact_remove_annots.in b/testing/resources/redact_remove_annots.in new file mode 100644 index 0000000000..7f0d277fb5 --- /dev/null +++ b/testing/resources/redact_remove_annots.in @@ -0,0 +1,75 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 100 100] + /Resources << + /Font << + /F1 7 0 R + >> + >> + /Contents 4 0 R + /Annots [5 0 R 6 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +0.96 0.98 1 rg +0 0 100 100 re f +0.85 0.92 1 rg +20 20 30 30 re f +Q +BT +/F1 8 Tf +5 86 Td +(intersecting square is removed) Tj +ET +endstream +endobj +{{object 5 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-target) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (REDACT) + /QuadPoints [10 40 40 40 10 10 40 10] + /Rect [10 10 40 40] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Square + /NM (Square-target) + /F 4 + /C [0 0.25 1] + /IC [0.85 0.93 1] + /Border [0 0 2] + /Rect [20 20 50 50] +>> +endobj +{{object 7 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_remove_annots.pdf b/testing/resources/redact_remove_annots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d30988ccab083ce36d90fc14abf611b59c4bb35d GIT binary patch literal 1146 zcmah}OK#gR5Z&_>voVk?B8mD%27&;wW1~fz#<8_CvS2J)Rp5vXMH@~|(?w5M^Z=b9 zWm`}KRFGxO;|%%Ud^DKdPA|B3$p$}v|N6r?1fZUt;p&P3`1#up3I13Zu~8)fGf~P0 zLUfw5>uVQWXs>BZ_|PgcI;lxI0iw40k8u7I(6!#7OO7 z8DJC-?C+60=dw{-y+V4HJ0eqsk*z@{hf6vdodJ-1`#^%V!800&+g1Ojt`*wLgaAnC z+2u=qC%#{0U7GK}!;~a7MoaO+URmG`G0+=kz(JR+!xprJHLhp4y*CWqdKduSk-hEu z0~_UxIA@TrSpr!KdBM&qSSW=q=HtnC$B5}^T-$}g@Z@JtX z++cEhGtO<~!&VeCh2$}-Jb?Icv3@E=A8=he-R6tl!FLoeJlb=dtn0n zq@%4#)M6v03#pyHux&Ep=ZcjCkRa>R7*Kch`B4uNmt&48_jVXYqLH>k{ZDeUlcrjU z&R%;hu}2_d!SRALNumVSaKt#4l`g1HSepHV@d(S+^NRvx+rwh)u|Ae&IGsJeEbd@N ni)w>OavzMjQaJ0F2bwZ}QN2r)V8=peV>J!=kPQZt`ziYi0bv~s literal 0 HcmV?d00001 diff --git a/testing/resources/redact_text_middle.in b/testing/resources/redact_text_middle.in new file mode 100644 index 0000000000..b60f20b855 --- /dev/null +++ b/testing/resources/redact_text_middle.in @@ -0,0 +1,58 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 300 200] + /Resources << + /Font << + /F1 4 0 R + >> + >> + /Contents 5 0 R + /Annots [6 0 R] +>> +endobj +{{object 4 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Courier +>> +endobj +{{object 5 0}} << + {{streamlen}} +>> +stream +BT +/F1 20 Tf +50 100 Td +(hello secret world) Tj +ET +endstream +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-secret) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (REDACT) + /QuadPoints [120 122 195 122 120 94 195 94] + /Rect [120 94 195 122] +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_text_middle.pdf b/testing/resources/redact_text_middle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d2e2d844cfd0f9e1d85dff770876d6f8f836659c GIT binary patch literal 889 zcmZuw%TD7!5WLS<^d%A;ATxd>L_$a;BogA44Zc|%hPV@qj0cS;5crxs>=zDlB!9ri`%_s5@4p+JJUe}v;>0np9fo)Nku?Q~_9oS5n*HV_eL zCQeQS)&+qD$GaqtWXi~_Y6ps6FUq2UJZARY7M&A6(L+OvL=PRQ#1$5$9-1}el31~n z5J`E*$Qd?fW#=T%Yp2Y_5VH+9RFH6M0t1lv_C^A0M?D%y+ppczx;7N&Jx**ZW&W;G z?!x_VSNG1_#isdjhq^(pfjzJ#+O3(n*QU}X)=T#Q$$$}!v#6iMFcT~}l8`M#DnZe# zSt0fwu&N9+IJfBF)!3@ohwM>|Gu}qaZTG_ZH%-Da{cQi~onfKpeuV2Q*bC7?sK3v^ z2_*a&LC%LGn0-zWFCauWFK8?Mmf_k_f$`btDD%u;D_u-Y$=>FQ22oK2YLJE}#e>9$ zgQQ*H+yz{lC-}DcYl{mZp)cgu1-&$lQ&_-PPLZ*ELA}ZKj=tqoOtb9ZV);X^|Gi$) sCtv?@oz-Q9w*6mb#?VnGU-*!9Z_9TixqhYEI> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 100 100] + /Resources << + /Font << + /F1 7 0 R + >> + >> + /Contents 4 0 R + /Annots [5 0 R 6 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +q +0.98 0.98 0.98 rg +0 0 100 100 re f +0.88 1 0.88 rg +30 10 30 30 re f +Q +BT +/F1 8 Tf +5 86 Td +(edge touch is not overlap) Tj +ET +endstream +endobj +{{object 5 0}} << + /Type /Annot + /Subtype /Redact + /NM (Redact-touch) + /F 4 + /C [1 0 0] + /IC [0 0 0] + /OverlayText (TOUCH) + /QuadPoints [10 40 30 40 10 10 30 10] + /Rect [10 10 30 40] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Square + /NM (Square-touching) + /F 4 + /C [0 0.55 0] + /IC [0.88 1 0.88] + /Border [0 0 2] + /Rect [30 10 60 40] +>> +endobj +{{object 7 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/redact_touch_only.pdf b/testing/resources/redact_touch_only.pdf new file mode 100644 index 0000000000000000000000000000000000000000..908dfd3e3c981ae4490d674ffa5cf42cb004e385 GIT binary patch literal 1144 zcmah}!EV|>5WVkL%ms-Y0yfyjNKvFhgHp9A1l$wKVS@+95%nhPbwv6#J@gB!en4h+ z9c;OkYQfm^cEkBf7EFcH0-)MczT7WG5?E0;k zC4ykK!ufuGBQ@{;-aQuxqN-$aULP z_r|t)jj7xjhQ8iF-+AYDpECv*5b$jdTb>cm*8CHBEX#RIOXD@cqk(?1{5HR~iMN$Z zS1RWUZ%JTa1(Ky_r`LDsYup(d;n0B4X2iG&|Cg|NuB66y3C?p8@*?Y~Al8GBD$@vQ z+F`Mo(kW^ua8!>NGjx55SV@~9&sLWqPav~7)tGB0ekJwBBd5%nwu~ i_qkXr8b+QDK4Zg8{sT#ZJrq(Kt7+=fho*P6T!=TC2OEt5 literal 0 HcmV?d00001 From 66cb1475104c86c27625dd012443f776185c4a94 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 24 May 2026 18:33:05 +0300 Subject: [PATCH 26/56] Add EPDFLayer_SaveLayerArtifact API Introduce a streaming API to write layer artifacts without materializing the whole artifact in memory. - Add HashingTempFileWriter, a temporary-file-based FPDF_FILEWRITE that computes SHA-256 while writing, can finalize to get the digest, and can replay its contents to another FPDF_FILEWRITE. - Add BuildLayerArtifactHeader and WriteBytes helpers to assemble the artifact header and safely write byte spans to an FPDF_FILEWRITE. - Implement EPDFLayer_SaveLayerArtifact which saves a layer delta into a temp writer, finalizes the SHA-256, builds the layer artifact header, and streams header+delta to the provided FPDF_FILEWRITE while reporting status. - Refactor EPDFLayer_SaveLayerArtifactToOwnedBuffer to reuse BuildLayerArtifactHeader. - Add the public declaration and docs for EPDFLayer_SaveLayerArtifact to public/fpdf_save.h. - Update tests and test registry: add check for EPDFLayer_SaveLayerArtifact in fpdf_view_c_api_test.c and extend LayerOwnedBufferAndArtifactReplay test to exercise streaming save and replay validation; also a minor formatting tweak in another test. - Add include where needed. This change enables native/server code paths to write artifacts without holding the full artifact in memory and ensures the delta is integrity-protected via SHA-256. --- fpdfsdk/epdf_layer.cpp | 180 +++++++++++++++++++++++++++-- fpdfsdk/fpdf_view_c_api_test.c | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 29 ++++- public/fpdf_save.h | 17 +++ 4 files changed, 213 insertions(+), 14 deletions(-) diff --git a/fpdfsdk/epdf_layer.cpp b/fpdfsdk/epdf_layer.cpp index 56fb0856a6..ed3d881ce1 100644 --- a/fpdfsdk/epdf_layer.cpp +++ b/fpdfsdk/epdf_layer.cpp @@ -5,6 +5,7 @@ #include "public/fpdfview.h" #include +#include #include #include #include @@ -83,6 +84,92 @@ struct MemoryFileWriter : public FPDF_FILEWRITE { } }; +struct HashingTempFileWriter : public FPDF_FILEWRITE { + FILE* file = nullptr; + CRYPT_sha2_context sha_context = {}; + uint64_t size = 0; + bool failed = false; + bool finalized = false; + + HashingTempFileWriter() { + version = 1; + file = std::tmpfile(); + CRYPT_SHA256Start(&sha_context); + WriteBlock = [](FPDF_FILEWRITE* self, const void* buf, + unsigned long block_size) -> int { + auto* writer = static_cast(self); + if (!writer || !writer->file || writer->failed || writer->finalized) { + return 0; + } + if (writer->size + block_size < writer->size) { + writer->failed = true; + return 0; + } + if (block_size == 0) { + return 1; + } + const size_t written = fwrite(buf, 1, block_size, writer->file); + if (written != block_size) { + writer->failed = true; + return 0; + } + CRYPT_SHA256Update(&writer->sha_context, + UNSAFE_BUFFERS(pdfium::span( + static_cast(buf), block_size))); + writer->size += block_size; + return 1; + }; + } + + ~HashingTempFileWriter() { + if (file) { + fclose(file); + } + } + + bool IsValid() const { return file && !failed; } + + std::optional> FinishSha256() { + if (!IsValid() || finalized) { + return std::nullopt; + } + if (fflush(file) != 0) { + failed = true; + return std::nullopt; + } + finalized = true; + std::array digest = {}; + CRYPT_SHA256Finish(&sha_context, digest); + return digest; + } + + bool ReplayTo(FPDF_FILEWRITE* out) { + if (!out || !IsValid() || !finalized) { + return false; + } + if (fseek(file, 0, SEEK_SET) != 0) { + return false; + } + + std::array buffer = {}; + uint64_t remaining = size; + while (remaining > 0) { + const size_t chunk_size = + static_cast(std::min(buffer.size(), remaining)); + const size_t read = fread(buffer.data(), 1, chunk_size, file); + if (read != chunk_size) { + return false; + } + if (!out->WriteBlock(out, buffer.data(), + static_cast(chunk_size))) { + return false; + } + remaining -= chunk_size; + } + return true; + } +}; + CPDF_BaseDocument* CPDFBaseDocumentFromEPDFBaseDocument( EPDF_BASE_DOCUMENT base) { return reinterpret_cast(base); @@ -182,6 +269,40 @@ void AppendUint64LE(std::vector* buffer, uint64_t value) { } } +std::vector BuildLayerArtifactHeader( + CPDF_BaseDocument* base_doc, + uint64_t delta_size, + const std::array& delta_sha) { + std::vector artifact; + artifact.reserve(kLayerArtifactHeaderSize); + artifact.insert(artifact.end(), kLayerArtifactMagic, kLayerArtifactMagic + 8); + AppendUint32LE(&artifact, kLayerArtifactVersion); + AppendUint32LE(&artifact, kLayerArtifactHeaderSize); + AppendUint64LE(&artifact, static_cast(base_doc->GetRawBaseSize())); + AppendUint64LE(&artifact, + static_cast(base_doc->GetLayerAppendBaseOffset())); + AppendUint64LE(&artifact, delta_size); + const std::array& base_sha = + base_doc->GetRawBaseSha256(); + artifact.insert(artifact.end(), base_sha.begin(), base_sha.end()); + artifact.insert(artifact.end(), delta_sha.begin(), delta_sha.end()); + return artifact; +} + +bool WriteBytes(FPDF_FILEWRITE* file_write, pdfium::span bytes) { + if (!file_write) { + return false; + } + if (bytes.empty()) { + return true; + } + if (bytes.size() > std::numeric_limits::max()) { + return false; + } + return file_write->WriteBlock(file_write, bytes.data(), + static_cast(bytes.size())); +} + uint32_t ReadUint32LE(const uint8_t* data) { return static_cast(data[0]) | (static_cast(data[1]) << 8) | @@ -418,6 +539,51 @@ EPDFLayer_SaveDeltaToOwnedBuffer(FPDF_DOCUMENT layer, return CopyToOwnedBuffer(pdfium::as_byte_span(writer.data), out_size); } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_SaveLayerArtifact(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status) { + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSaveFailed); + if (!file_write) { + return false; + } + + CPDF_Document* document = CPDFDocumentFromFPDFDocument(layer); + CPDF_LayerDocument* layer_doc = CPDF_LayerDocument::FromDocument(document); + CPDF_BaseDocument* base_doc = + layer_doc ? layer_doc->GetBaseDocument() : nullptr; + if (!layer_doc || !base_doc) { + return false; + } + + HashingTempFileWriter delta_writer; + if (!delta_writer.IsValid()) { + return false; + } + + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + if (!EPDFLayer_SaveDelta(layer, &delta_writer, &save_status)) { + SetSaveStatus(out_status, save_status); + return false; + } + + std::optional> delta_sha = + delta_writer.FinishSha256(); + if (!delta_sha) { + return false; + } + + const std::vector header = + BuildLayerArtifactHeader(base_doc, delta_writer.size, *delta_sha); + if (!WriteBytes(file_write, pdfium::span(header)) || + !delta_writer.ReplayTo(file_write)) { + return false; + } + + SetSaveStatus(out_status, EPDFLayerSaveStatus_kSuccess); + return true; +} + FPDF_EXPORT void* FPDF_CALLCONV EPDFLayer_SaveLayerArtifactToOwnedBuffer(FPDF_DOCUMENT layer, unsigned long* out_size, @@ -452,19 +618,9 @@ EPDFLayer_SaveLayerArtifactToOwnedBuffer(FPDF_DOCUMENT layer, return nullptr; } - std::vector artifact; + std::vector artifact = BuildLayerArtifactHeader( + base_doc, static_cast(delta_writer.data.size()), *delta_sha); artifact.reserve(kLayerArtifactHeaderSize + delta_writer.data.size()); - artifact.insert(artifact.end(), kLayerArtifactMagic, kLayerArtifactMagic + 8); - AppendUint32LE(&artifact, kLayerArtifactVersion); - AppendUint32LE(&artifact, kLayerArtifactHeaderSize); - AppendUint64LE(&artifact, static_cast(base_doc->GetRawBaseSize())); - AppendUint64LE(&artifact, - static_cast(base_doc->GetLayerAppendBaseOffset())); - AppendUint64LE(&artifact, static_cast(delta_writer.data.size())); - const std::array& base_sha = - base_doc->GetRawBaseSha256(); - artifact.insert(artifact.end(), base_sha.begin(), base_sha.end()); - artifact.insert(artifact.end(), delta_sha->begin(), delta_sha->end()); artifact.insert(artifact.end(), delta_writer.data.begin(), delta_writer.data.end()); diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index a20af2e314..b9f19dd83e 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -548,6 +548,7 @@ int CheckPDFiumCApi() { CHK(EPDFLayer_OpenLayerArtifact); CHK(EPDFLayer_SaveDelta); CHK(EPDFLayer_SaveDeltaToOwnedBuffer); + CHK(EPDFLayer_SaveLayerArtifact); CHK(EPDFLayer_SaveLayerArtifactToOwnedBuffer); CHK(EPDF_ReleaseBaseDocument); CHK(FPDF_LoadCustomDocument); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index c4d296dfc0..6968fc4841 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -1734,6 +1734,16 @@ TEST_F(FPDFViewEmbedderTest, LayerOwnedBufferAndArtifactReplay) { artifact_size); EPDF_FreeBuffer(artifact_buffer); + ClearString(); + save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveLayerArtifact(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string streamed_artifact = GetString(); + ASSERT_FALSE(streamed_artifact.empty()); + + // Independent saves may produce different trailer /ID values. Layer + // artifact correctness is replay validity, not byte-for-byte equality + // between separately generated artifacts. FPDF_FILEACCESS artifact_access = {}; artifact_access.m_FileLen = artifact.size(); artifact_access.m_GetBlock = GetBlockFromString; @@ -1747,6 +1757,22 @@ TEST_F(FPDFViewEmbedderTest, LayerOwnedBufferAndArtifactReplay) { ASSERT_TRUE(artifact_page); EXPECT_EQ(1, FPDFPage_GetAnnotCount(artifact_page.get())); + FPDF_FILEACCESS streamed_artifact_access = {}; + streamed_artifact_access.m_FileLen = streamed_artifact.size(); + streamed_artifact_access.m_GetBlock = GetBlockFromString; + streamed_artifact_access.m_Param = &streamed_artifact; + EPDFLayerOpenStatus streamed_artifact_open_status = + EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument streamed_artifact_replayed( + EPDFLayer_OpenLayerArtifact(base, &streamed_artifact_access, nullptr, + &streamed_artifact_open_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, streamed_artifact_open_status); + ASSERT_TRUE(streamed_artifact_replayed); + ScopedFPDFPage streamed_artifact_page( + FPDF_LoadPage(streamed_artifact_replayed.get(), 0)); + ASSERT_TRUE(streamed_artifact_page); + EXPECT_EQ(1, FPDFPage_GetAnnotCount(streamed_artifact_page.get())); + EPDF_ReleaseBaseDocument(base); } @@ -2542,8 +2568,7 @@ TEST_F(FPDFViewEmbedderTest, EPDFDocGetPageObjectNumberByIndex) { // Page 1 doesn't exist. EXPECT_EQ(0u, EPDFDoc_GetPageObjectNumberByIndex(document(), 1)); - const unsigned int objnum = - EPDFDoc_GetPageObjectNumberByIndex(document(), 0); + const unsigned int objnum = EPDFDoc_GetPageObjectNumberByIndex(document(), 0); EXPECT_NE(0u, objnum); CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); diff --git a/public/fpdf_save.h b/public/fpdf_save.h index 72a5dfcfa2..ea84444703 100644 --- a/public/fpdf_save.h +++ b/public/fpdf_save.h @@ -137,6 +137,23 @@ EPDFLayer_SaveDelta(FPDF_DOCUMENT layer, FPDF_FILEWRITE* file_write, EPDFLayerSaveStatus* out_status); +// Function: EPDFLayer_SaveLayerArtifact +// Saves a server-facing layer artifact containing base identity +// metadata and the raw layer delta. Unlike the owned-buffer variant, +// this writes to the caller-supplied FPDF_FILEWRITE and is suitable +// for native/server paths that should avoid materializing the whole +// artifact in memory. +// Parameters: +// layer - A layer document returned by EPDFLayer_OpenLayer(). +// file_write - A pointer to a custom file write structure. +// out_status - Optional detailed save status. +// Return value: +// TRUE if succeed, FALSE if failed. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFLayer_SaveLayerArtifact(FPDF_DOCUMENT layer, + FPDF_FILEWRITE* file_write, + EPDFLayerSaveStatus* out_status); + // Function: EPDFLayer_SaveDeltaToOwnedBuffer // Saves only a layer document's current overlay delta into an owned // memory buffer. The caller must release the returned buffer with From 211d129a09feface541138c5c2480775a4ac8c6a Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 27 May 2026 14:05:04 +0300 Subject: [PATCH 27/56] Add password-probe and runtime owner APIs Introduce non-mutating password probe and a per-handle runtime owner-unlocked override. Adds CPDF_SecurityHandler::GetPermissionsForPasswordProbe, CheckPasswordNoMutate, and SetRuntimeOwnerUnlocked, plus public C APIs EPDF_CheckPasswordPermissions and EPDF_SetRuntimeOwnerPermissions. Implementations in fpdf_view.cpp and header declarations in public/fpdfview.h; tests updated/added in cpdf_security_handler_embeddertest.cpp and fpdf_view_c_api_test.c. These changes let embedders verify what permissions a password proves without changing the document's owner-unlocked state and allow embedder-managed sessions to temporarily treat a handle as owner-unlocked. --- core/fpdfapi/parser/cpdf_security_handler.cpp | 25 ++++++ core/fpdfapi/parser/cpdf_security_handler.h | 10 +++ .../cpdf_security_handler_embeddertest.cpp | 71 +++++++++++++++ fpdfsdk/fpdf_view.cpp | 87 +++++++++++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 2 + public/fpdfview.h | 50 +++++++++++ 6 files changed, 245 insertions(+) diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp index debcaddfca..be1a71e11c 100644 --- a/core/fpdfapi/parser/cpdf_security_handler.cpp +++ b/core/fpdfapi/parser/cpdf_security_handler.cpp @@ -230,6 +230,17 @@ uint32_t CPDF_SecurityHandler::GetPermissions(bool get_owner_perms) const { return dwPermission; } +uint32_t CPDF_SecurityHandler::GetPermissionsForPasswordProbe( + bool owner) const { + uint32_t dwPermission = owner ? 0xFFFFFFFF : permissions_; + if (encrypt_dict_ && + encrypt_dict_->GetByteStringFor("Filter") == "Standard") { + dwPermission &= 0xFFFFFFFC; + dwPermission |= 0xFFFFF0C0; + } + return dwPermission; +} + bool CPDF_SecurityHandler::UnlockOwner(const ByteString& password) { if (owner_unlocked_) { return true; // Already unlocked @@ -246,6 +257,20 @@ bool CPDF_SecurityHandler::UnlockOwner(const ByteString& password) { return false; } +bool CPDF_SecurityHandler::CheckPasswordNoMutate(const ByteString& password, + bool bOwner) { + const PasswordEncodingConversion saved_conversion = + password_encoding_conversion_; + const std::array saved_key = encrypt_key_; + + password_encoding_conversion_ = kUnknown; + const bool valid = CheckPassword(password, bOwner); + + password_encoding_conversion_ = saved_conversion; + encrypt_key_ = saved_key; + return valid; +} + static bool LoadCryptInfo(const CPDF_Dictionary* pEncryptDict, const ByteString& name, CPDF_CryptoHandler::Cipher* cipher, diff --git a/core/fpdfapi/parser/cpdf_security_handler.h b/core/fpdfapi/parser/cpdf_security_handler.h index 702dcb447e..e15985a266 100644 --- a/core/fpdfapi/parser/cpdf_security_handler.h +++ b/core/fpdfapi/parser/cpdf_security_handler.h @@ -40,6 +40,7 @@ class CPDF_SecurityHandler final : public Retainable { // When `get_owner_perms` is true, returns full permissions if unlocked by // owner. uint32_t GetPermissions(bool get_owner_perms) const; + uint32_t GetPermissionsForPasswordProbe(bool owner) const; bool IsMetadataEncrypted() const; CPDF_CryptoHandler* GetCryptoHandler() const { return crypto_handler_.get(); } @@ -54,6 +55,15 @@ class CPDF_SecurityHandler final : public Retainable { // Returns false if password is invalid, empty, or document isn't encrypted. bool UnlockOwner(const ByteString& password); + // Checks a password without changing the document's current unlock state. + // This is for app-level authorization probes; it must not be used to decrypt + // content for normal document operation. + bool CheckPasswordNoMutate(const ByteString& password, bool bOwner); + + // Runtime policy override used by EmbedPDF after app-level authorization has + // been handled outside PDFium. This changes only this opened document handle. + void SetRuntimeOwnerUnlocked(bool enabled) { owner_unlocked_ = enabled; } + // Returns true if owner permissions are currently unlocked. bool IsOwnerUnlocked() const { return owner_unlocked_; } diff --git a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp index 5cbf93f2b2..4c8789a8e7 100644 --- a/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp +++ b/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp @@ -138,6 +138,77 @@ TEST_F(CPDFSecurityHandlerEmbedderTest, OwnerPassword) { EXPECT_EQ(0xFFFFF2C0, FPDF_GetDocUserPermissions(document())); } +TEST_F(CPDFSecurityHandlerEmbedderTest, + CheckPasswordPermissionsIgnoresCurrentOwnerUnlockState) { + ASSERT_TRUE(OpenDocumentWithPassword("encrypted.pdf", "5678")); + ASSERT_TRUE(EPDF_IsOwnerUnlocked(document())); + ASSERT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); + + int kind = -1; + unsigned int user_permissions = 0; + unsigned int effective_permissions = 0; + int revision = -1; + EXPECT_TRUE(EPDF_CheckPasswordPermissions(document(), "1234", &kind, + &user_permissions, + &effective_permissions, &revision)); + EXPECT_EQ(EPDF_PASSWORD_PERMISSION_USER, kind); + EXPECT_EQ(0xFFFFF2C0u, user_permissions); + EXPECT_EQ(0xFFFFF2C0u, effective_permissions); + EXPECT_GE(revision, 0); + + EXPECT_TRUE(EPDF_CheckPasswordPermissions(document(), "5678", &kind, + &user_permissions, + &effective_permissions, &revision)); + EXPECT_EQ(EPDF_PASSWORD_PERMISSION_OWNER, kind); + EXPECT_EQ(0xFFFFF2C0u, user_permissions); + EXPECT_EQ(0xFFFFFFFCu, effective_permissions); +} + +TEST_F(CPDFSecurityHandlerEmbedderTest, + CheckPasswordPermissionsDoesNotUnlockOwner) { + ASSERT_TRUE(OpenDocumentWithPassword("encrypted.pdf", "1234")); + ASSERT_FALSE(EPDF_IsOwnerUnlocked(document())); + ASSERT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); + + int kind = -1; + unsigned int user_permissions = 0; + unsigned int effective_permissions = 0; + int revision = -1; + EXPECT_TRUE(EPDF_CheckPasswordPermissions(document(), "5678", &kind, + &user_permissions, + &effective_permissions, &revision)); + EXPECT_EQ(EPDF_PASSWORD_PERMISSION_OWNER, kind); + EXPECT_EQ(0xFFFFF2C0u, user_permissions); + EXPECT_EQ(0xFFFFFFFCu, effective_permissions); + EXPECT_FALSE(EPDF_IsOwnerUnlocked(document())); + EXPECT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbedderTest, SetRuntimeOwnerPermissions) { + ASSERT_TRUE(OpenDocumentWithPassword("encrypted.pdf", "1234")); + ASSERT_FALSE(EPDF_IsOwnerUnlocked(document())); + ASSERT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); + + EXPECT_TRUE(EPDF_SetRuntimeOwnerPermissions(document(), true)); + EXPECT_TRUE(EPDF_IsOwnerUnlocked(document())); + EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); + + int kind = -1; + unsigned int user_permissions = 0; + unsigned int effective_permissions = 0; + int revision = -1; + EXPECT_TRUE(EPDF_CheckPasswordPermissions(document(), "1234", &kind, + &user_permissions, + &effective_permissions, &revision)); + EXPECT_EQ(EPDF_PASSWORD_PERMISSION_USER, kind); + EXPECT_EQ(0xFFFFF2C0u, user_permissions); + EXPECT_EQ(0xFFFFF2C0u, effective_permissions); + + EXPECT_TRUE(EPDF_SetRuntimeOwnerPermissions(document(), false)); + EXPECT_FALSE(EPDF_IsOwnerUnlocked(document())); + EXPECT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); +} + TEST_F(CPDFSecurityHandlerEmbedderTest, PasswordAfterGenerateSave) { constexpr char kBasename[] = "encrypted"; { diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 8a4adfb560..70a128e029 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -611,6 +611,93 @@ EPDF_UnlockOwnerPermissions(FPDF_DOCUMENT document, return security_handler->UnlockOwner(password); } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_CheckPasswordPermissions(FPDF_DOCUMENT document, + FPDF_BYTESTRING password, + int* out_kind, + unsigned int* out_user_permissions, + unsigned int* out_effective_permissions, + int* out_security_handler_revision) { + if (!out_kind || !out_user_permissions || !out_effective_permissions || + !out_security_handler_revision) { + return false; + } + + *out_kind = EPDF_PASSWORD_PERMISSION_INVALID; + *out_user_permissions = 0; + *out_effective_permissions = 0; + *out_security_handler_revision = -1; + + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) { + return false; + } + + CPDF_Parser* pParser = pDoc->GetParser(); + if (!pParser) { + return false; + } + + const auto& security_handler = pParser->GetSecurityHandler(); + if (!security_handler) { + *out_kind = EPDF_PASSWORD_PERMISSION_NONE; + *out_user_permissions = 0xFFFFFFFF; + *out_effective_permissions = 0xFFFFFFFF; + return true; + } + + RetainPtr encrypt_dict = pParser->GetEncryptDict(); + *out_security_handler_revision = + encrypt_dict ? encrypt_dict->GetIntegerFor("R") : -1; + + const unsigned int user_permissions = static_cast( + security_handler->GetPermissionsForPasswordProbe(/*owner=*/false)); + *out_user_permissions = user_permissions; + + ByteString raw_password(password ? password : ""); + + // This is a password probe, not a document-state probe. Do not use + // IsOwnerUnlocked(), UnlockOwner(), or FPDF_GetDocPermissions() here; those + // depend on or mutate the current handle state. Match PDFium's open path by + // checking a non-empty password against owner credentials first. + if (!raw_password.IsEmpty() && + security_handler->CheckPasswordNoMutate(raw_password, /*bOwner=*/true)) { + *out_kind = EPDF_PASSWORD_PERMISSION_OWNER; + *out_effective_permissions = static_cast( + security_handler->GetPermissionsForPasswordProbe(/*owner=*/true)); + return true; + } + + if (security_handler->CheckPasswordNoMutate(raw_password, /*bOwner=*/false)) { + *out_kind = EPDF_PASSWORD_PERMISSION_USER; + *out_effective_permissions = user_permissions; + return true; + } + + return false; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_SetRuntimeOwnerPermissions(FPDF_DOCUMENT document, FPDF_BOOL enabled) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) { + return false; + } + + CPDF_Parser* pParser = pDoc->GetParser(); + if (!pParser) { + return false; + } + + const auto& security_handler = pParser->GetSecurityHandler(); + if (!security_handler) { + return false; + } + + security_handler->SetRuntimeOwnerUnlocked(!!enabled); + return true; +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_IsEncrypted(FPDF_DOCUMENT document) { CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); if (!pDoc) { diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index b9f19dd83e..558f340f0b 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -510,6 +510,8 @@ int CheckPDFiumCApi() { #ifdef PDF_ENABLE_V8 CHK(FPDF_GetArrayBufferAllocatorSharedInstance); #endif + CHK(EPDF_CheckPasswordPermissions); + CHK(EPDF_SetRuntimeOwnerPermissions); CHK(FPDF_GetDocPermissions); CHK(FPDF_GetDocUserPermissions); CHK(FPDF_GetFileVersion); diff --git a/public/fpdfview.h b/public/fpdfview.h index e5ec75ab07..4b79a39617 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -827,6 +827,42 @@ EPDF_SetEncryption(FPDF_DOCUMENT document, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_RemoveEncryption(FPDF_DOCUMENT document); +#define EPDF_PASSWORD_PERMISSION_INVALID 0 +#define EPDF_PASSWORD_PERMISSION_NONE 1 +#define EPDF_PASSWORD_PERMISSION_USER 2 +#define EPDF_PASSWORD_PERMISSION_OWNER 3 + +// Experimental EmbedPDF Extension API. +// Checks what permissions the given password proves without changing the +// document's current owner-unlocked state. +// +// document - handle to a document +// password - raw password to check +// out_kind - receives EPDF_PASSWORD_PERMISSION_* +// out_user_permissions - receives the document's user permission bits +// out_effective_permissions - receives permissions implied by |password| +// out_security_handler_revision - receives the security handler revision +// +// Returns TRUE if: +// - document is not encrypted (kind NONE, full permissions, revision -1) +// - password is valid as user or owner +// +// Returns FALSE if: +// - document is NULL +// - any out pointer is NULL +// - document has no parser +// - password is invalid for an encrypted document +// +// This is a password probe, not a runtime permission override. It must not be +// used as evidence that the current document handle is owner-unlocked. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_CheckPasswordPermissions(FPDF_DOCUMENT document, + FPDF_BYTESTRING password, + int* out_kind, + unsigned int* out_user_permissions, + unsigned int* out_effective_permissions, + int* out_security_handler_revision); + // Experimental EmbedPDF Extension API. // Attempts to unlock owner permissions on an already-opened encrypted document. // @@ -845,6 +881,20 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_UnlockOwnerPermissions(FPDF_DOCUMENT document, FPDF_BYTESTRING owner_password); +// Experimental EmbedPDF Extension API. +// Runtime policy override for EmbedPDF-managed sessions. +// +// document - handle to a document +// enabled - TRUE to make PDFium internals behave as owner-unlocked, FALSE to +// restore the normal user-permission state for this handle +// +// This does not prove an owner password and does not authorize the caller. +// Callers must enforce JWT/PDF permission policy outside PDFium. This exists so +// high-level PDFium subsystems that consult permissions (notably forms) do not +// silently block operations after app-level authorization has already happened. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_SetRuntimeOwnerPermissions(FPDF_DOCUMENT document, FPDF_BOOL enabled); + // Experimental EmbedPDF Extension API. // Checks if a document is encrypted. // From 25b803a41efd6bd125a8de41a0820ed5c9d8bcb1 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 27 May 2026 23:04:45 +0300 Subject: [PATCH 28/56] Add EMBD_Metadata API for annotation embed data Introduce support for an /EMBD_Metadata dictionary on annotations and provide a full API to read/write app-specific metadata. Adds helpers to access EMBD_Metadata keys (Rotation, UnrotatedRect, VerticalAlignment, CustomJSON) and integrates them into shape rotation, vertical alignment, stamp-fitting and rendering paths (GetShapeRotationInfo, EPDFAnnot_UpdateAppearanceToRect, EPDF_RenderAnnotBitmapUnrotated, etc.). Public API additions: EPDFAnnot_HasEmbedMetadata, EPDFAnnot_ClearEmbedMetadata, EPDFAnnot_ClearEmbedMetadataKey, EPDFAnnot_Set/GetEmbedMetadataString/Number/Boolean/Rect, EPDFAnnot_Set/GetEmbedMetadataJSON and EPDFDocument_ClearEmbedMetadata. Adds tests exercising the new metadata API and fixes minor formatting/whitespace issues. Deprecated/removed older EPDFRotate/EPDFUnrotatedRect/EPDF:VerticalAlignment helpers in favor of the unified EMBD_Metadata approach. --- core/fpdfdoc/cpdf_generateap.cpp | 40 ++- fpdfsdk/fpdf_annot.cpp | 439 ++++++++++++++++++++-------- fpdfsdk/fpdf_annot_embeddertest.cpp | 74 ++++- fpdfsdk/fpdf_view.cpp | 8 +- public/fpdf_annot.h | 381 +++++++++++++----------- public/fpdfview.h | 6 +- 6 files changed, 629 insertions(+), 319 deletions(-) diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index b5c03b2990..e399eb0635 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -436,8 +436,36 @@ AnnotationDimensionsAndColor GetAnnotationDimensionsAndColor( }; } +constexpr char kEmbedMetadataKey[] = "EMBD_Metadata"; +constexpr char kEmbedMetadataRotationKey[] = "Rotation"; +constexpr char kEmbedMetadataUnrotatedRectKey[] = "UnrotatedRect"; +constexpr char kEmbedMetadataVerticalAlignmentKey[] = "VerticalAlignment"; + +RetainPtr GetEmbedMetadataDict( + const CPDF_Dictionary* annot_dict) { + return annot_dict ? annot_dict->GetDictFor(kEmbedMetadataKey) : nullptr; +} + +float GetEmbedMetadataFloatFor(const CPDF_Dictionary* annot_dict, + ByteStringView key) { + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + return metadata ? metadata->GetFloatFor(key) : 0.0f; +} + +CFX_FloatRect GetEmbedMetadataRectFor(const CPDF_Dictionary* annot_dict, + ByteStringView key) { + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + return metadata ? metadata->GetRectFor(key) : CFX_FloatRect(); +} + +int GetEmbedMetadataIntegerFor(const CPDF_Dictionary* annot_dict, + ByteStringView key) { + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + return metadata ? metadata->GetIntegerFor(key) : 0; +} + // Rotation info for shape annotations (Square, Circle) using EmbedPDF's -// custom /EPDFRotate and /EPDFUnrotatedRect entries. +// /EMBD_Metadata rotation fields. struct ShapeRotationInfo { CFX_FloatRect bbox; // BBox for the AP stream (unrotated rect in page coords) CFX_Matrix matrix; // Transforms from local BBox space to page/AABB space @@ -450,14 +478,16 @@ ShapeRotationInfo GetShapeRotationInfo(const CPDF_Dictionary* annot_dict) { info.matrix = CFX_Matrix(); info.bbox = annot_dict->GetRectFor(pdfium::annotation::kRect); - float rotate_deg = annot_dict->GetFloatFor("EPDFRotate"); + float rotate_deg = + GetEmbedMetadataFloatFor(annot_dict, kEmbedMetadataRotationKey); // Normalize to [0, 360) rotate_deg = fmod(fmod(rotate_deg, 360.0f) + 360.0f, 360.0f); if (rotate_deg < 0.01f || rotate_deg > 359.99f) { return info; // No rotation } - CFX_FloatRect unrotated = annot_dict->GetRectFor("EPDFUnrotatedRect"); + CFX_FloatRect unrotated = + GetEmbedMetadataRectFor(annot_dict, kEmbedMetadataUnrotatedRectKey); if (unrotated.IsEmpty()) { return info; // No unrotated rect stored -> no rotation in AP } @@ -789,8 +819,8 @@ RetainPtr GetDashArray(const CPDF_Dictionary* dict) { inline CPDF_Annot::VerticalAlignment GetVerticalAlign( const CPDF_Dictionary* annot_dict) { - const int v = - annot_dict ? annot_dict->GetIntegerFor("EPDF:VerticalAlignment") : 0; + const int v = GetEmbedMetadataIntegerFor(annot_dict, + kEmbedMetadataVerticalAlignmentKey); if (v < static_cast(CPDF_Annot::VerticalAlignment::kTop) || v > static_cast(CPDF_Annot::VerticalAlignment::kBottom)) { return CPDF_Annot::VerticalAlignment::kTop; // fallback diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 2d8d1c2534..8659c21a9e 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -694,6 +694,52 @@ RetainPtr GetMutableAnnotDictFromFPDFAnnotation( return context ? context->GetMutableAnnotDict() : nullptr; } +constexpr char kEmbedMetadataKey[] = "EMBD_Metadata"; +constexpr char kEmbedMetadataCustomJSONKey[] = "CustomJSON"; + +RetainPtr GetEmbedMetadataDict( + const CPDF_Dictionary* annot_dict) { + return annot_dict ? annot_dict->GetDictFor(kEmbedMetadataKey) : nullptr; +} + +RetainPtr GetOrCreateEmbedMetadataDict( + RetainPtr annot_dict) { + if (!annot_dict) { + return nullptr; + } + + RetainPtr metadata = + annot_dict->GetMutableDictFor(kEmbedMetadataKey); + if (!metadata) { + metadata = annot_dict->SetNewFor(kEmbedMetadataKey); + } + return metadata; +} + +bool EmbedMetadataIsEmpty(const CPDF_Dictionary* metadata) { + return !metadata || metadata->size() == 0; +} + +void RemoveEmbedMetadataIfEmpty(RetainPtr annot_dict) { + RetainPtr metadata = + GetEmbedMetadataDict(annot_dict.Get()); + if (EmbedMetadataIsEmpty(metadata.Get())) { + annot_dict->RemoveFor(kEmbedMetadataKey); + } +} + +float GetEmbedMetadataFloatFor(const CPDF_Dictionary* annot_dict, + ByteStringView key) { + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + return metadata ? metadata->GetFloatFor(key) : 0.0f; +} + +CFX_FloatRect GetEmbedMetadataRectFor(const CPDF_Dictionary* annot_dict, + ByteStringView key) { + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + return metadata ? metadata->GetRectFor(key) : CFX_FloatRect(); +} + static uint32_t EnsureIndirect(CPDF_Document* doc, RetainPtr dict) { uint32_t objnum = dict->GetObjNum(); @@ -1847,6 +1893,267 @@ EPDFAnnot_SetNumberValue(FPDF_ANNOTATION annot, return true; } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_HasEmbedMetadata(FPDF_ANNOTATION annot) { + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); + return !!GetEmbedMetadataDict(annot_dict); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ClearEmbedMetadata(FPDF_ANNOTATION annot) { + RetainPtr annot_dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict) { + return false; + } + + annot_dict->RemoveFor(kEmbedMetadataKey); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ClearEmbedMetadataKey(FPDF_ANNOTATION annot, FPDF_BYTESTRING key) { + RetainPtr annot_dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict || !key) { + return false; + } + + RetainPtr metadata = + annot_dict->GetMutableDictFor(kEmbedMetadataKey); + if (!metadata) { + return true; + } + + metadata->RemoveFor(key); + RemoveEmbedMetadataIfEmpty(annot_dict); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataString(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value) { + if (!key) { + return false; + } + + RetainPtr metadata = GetOrCreateEmbedMetadataDict( + GetMutableAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + metadata->SetNewFor( + key, UNSAFE_BUFFERS(WideStringFromFPDFWideString(value).AsStringView())); + return true; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataString(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen) { + if (!key) { + return 0; + } + + const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict) { + return 0; + } + + RetainPtr metadata = GetEmbedMetadataDict(annot_dict); + // SAFETY: required from caller. + return Utf16EncodeMaybeCopyAndReturnLength( + metadata ? metadata->GetUnicodeTextFor(key) : WideString(), + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataNumber(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + float value) { + if (!key) { + return false; + } + + RetainPtr metadata = GetOrCreateEmbedMetadataDict( + GetMutableAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + metadata->SetNewFor(key, value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataNumber(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + float* value) { + if (!key || !value) { + return false; + } + + RetainPtr metadata = + GetEmbedMetadataDict(GetAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + RetainPtr object = metadata->GetObjectFor(key); + if (!object || object->GetType() != CPDF_Object::Type::kNumber) { + return false; + } + + *value = object->GetNumber(); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataBoolean(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_BOOL value) { + if (!key) { + return false; + } + + RetainPtr metadata = GetOrCreateEmbedMetadataDict( + GetMutableAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + metadata->SetNewFor(key, !!value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataBoolean(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_BOOL* value) { + if (!key || !value) { + return false; + } + + RetainPtr metadata = + GetEmbedMetadataDict(GetAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + RetainPtr object = metadata->GetObjectFor(key); + if (!object || object->GetType() != CPDF_Object::Type::kBoolean) { + return false; + } + + *value = object->GetInteger() != 0; + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataRect(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + const FS_RECTF* rect) { + if (!key) { + return false; + } + + RetainPtr annot_dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict) { + return false; + } + + if (!rect) { + RetainPtr metadata = + annot_dict->GetMutableDictFor(kEmbedMetadataKey); + if (metadata) { + metadata->RemoveFor(key); + RemoveEmbedMetadataIfEmpty(annot_dict); + } + return true; + } + + RetainPtr metadata = + GetOrCreateEmbedMetadataDict(annot_dict); + if (!metadata) { + return false; + } + + metadata->SetRectFor(key, CFXFloatRectFromFSRectF(*rect)); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataRect(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FS_RECTF* rect) { + if (!key || !rect) { + return false; + } + + RetainPtr metadata = + GetEmbedMetadataDict(GetAnnotDictFromFPDFAnnotation(annot)); + if (!metadata) { + return false; + } + + RetainPtr object = metadata->GetObjectFor(key); + if (!object || object->GetType() != CPDF_Object::Type::kArray) { + return false; + } + + *rect = FSRectFFromCFXFloatRect(metadata->GetRectFor(key)); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataJSON(FPDF_ANNOTATION annot, FPDF_WIDESTRING json) { + return EPDFAnnot_SetEmbedMetadataString(annot, kEmbedMetadataCustomJSONKey, + json); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataJSON(FPDF_ANNOTATION annot, + FPDF_WCHAR* buffer, + unsigned long buflen) { + return EPDFAnnot_GetEmbedMetadataString(annot, kEmbedMetadataCustomJSONKey, + buffer, buflen); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDocument_ClearEmbedMetadata(FPDF_DOCUMENT document) { + CPDF_Document* pdf = CPDFDocumentFromFPDFDocument(document); + if (!pdf) { + return false; + } + + for (int page_index = 0; page_index < pdf->GetPageCount(); ++page_index) { + RetainPtr page_dict = + pdf->GetMutablePageDictionary(page_index); + if (!page_dict) { + continue; + } + + RetainPtr annots = page_dict->GetMutableArrayFor("Annots"); + if (!annots) { + continue; + } + + for (size_t annot_index = 0; annot_index < annots->size(); ++annot_index) { + RetainPtr annot_dict = + annots->GetMutableDictAt(annot_index); + if (annot_dict) { + annot_dict->RemoveFor(kEmbedMetadataKey); + } + } + } + + return true; +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_SetAP(FPDF_ANNOTATION annot, FPDF_ANNOT_APPEARANCEMODE appearanceMode, @@ -3469,59 +3776,6 @@ EPDFAnnot_GetTextAlignment(FPDF_ANNOTATION annot) { return kDefaultAlignment; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, - FPDF_VERTICAL_ALIGNMENT alignment) { - RetainPtr annot_dict = - GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) { - return false; - } - - // This property is only valid for FreeText annotations. - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { - return false; - } - - // Validate the enum range to ensure a valid value is passed. - if (alignment < FPDF_VERTICAL_ALIGNMENT_TOP || - alignment > FPDF_VERTICAL_ALIGNMENT_BOTTOM) { - return false; - } - - // Set the /EPDF:VerticalAlignment key in the annotation dictionary to the - // integer value of the enum. - annot_dict->SetNewFor("EPDF:VerticalAlignment", - static_cast(alignment)); - - return true; -} - -FPDF_EXPORT FPDF_VERTICAL_ALIGNMENT FPDF_CALLCONV -EPDFAnnot_GetVerticalAlignment(FPDF_ANNOTATION annot) { - const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) { - return FPDF_VERTICAL_ALIGNMENT_TOP; - } - - // This property is only valid for FreeText annotations. - if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { - return FPDF_VERTICAL_ALIGNMENT_TOP; - } - - // GetIntegerFor() conveniently returns 0 if the key doesn't exist, - // which matches the PDF specification's default. - int alignment_value = annot_dict->GetIntegerFor("EPDF:VerticalAlignment"); - - // Validate the value is within the known enum range before casting. - if (alignment_value >= FPDF_VERTICAL_ALIGNMENT_TOP && - alignment_value <= FPDF_VERTICAL_ALIGNMENT_BOTTOM) { - return static_cast(alignment_value); - } - - return FPDF_VERTICAL_ALIGNMENT_TOP; -} - FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { if (!page || !nm || !*nm) { @@ -3708,9 +3962,8 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { auto page = pdfium::MakeRetain(pdf, page_dict); // Create the context, which now takes the RetainPtr directly. - auto ctx = - std::make_unique(std::move(annot_dict), std::move(page), - index); + auto ctx = std::make_unique(std::move(annot_dict), + std::move(page), index); // The lifetime is now perfectly managed by smart pointers. return FPDFAnnotationFromCPDFAnnotContext(ctx.release()); @@ -3833,12 +4086,12 @@ EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit) { return false; } - // 1) Check for EPDFRotate + EPDFUnrotatedRect first. - float rotate_deg = ad->GetFloatFor("EPDFRotate"); + // 1) Check for /EMBD_Metadata rotation + unrotated rect first. + float rotate_deg = GetEmbedMetadataFloatFor(ad.Get(), "Rotation"); rotate_deg = fmod(fmod(rotate_deg, 360.0f) + 360.0f, 360.0f); bool has_rotation = (rotate_deg > 0.01f && rotate_deg < 359.99f); - CFX_FloatRect unrotated = ad->GetRectFor("EPDFUnrotatedRect"); + CFX_FloatRect unrotated = GetEmbedMetadataRectFor(ad.Get(), "UnrotatedRect"); bool use_rotation = has_rotation && !unrotated.IsEmpty(); // Use unrotated rect for image fitting when rotated, otherwise /Rect. @@ -4569,74 +4822,6 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, return exported_doc; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetExtendedRotation(FPDF_ANNOTATION annot, float rotation) { - RetainPtr dict = - GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) { - return false; - } - - if (rotation == 0.0f) { - dict->RemoveFor("EPDFRotate"); - } else { - dict->SetNewFor("EPDFRotate", rotation); - } - return true; -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetExtendedRotation(FPDF_ANNOTATION annot, float* rotation) { - if (!rotation) { - return false; - } - - const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) { - return false; - } - - *rotation = dict->GetFloatFor("EPDFRotate"); - return true; -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetUnrotatedRect(FPDF_ANNOTATION annot, const FS_RECTF* rect) { - RetainPtr dict = - GetMutableAnnotDictFromFPDFAnnotation(annot); - if (!dict) { - return false; - } - - if (!rect) { - dict->RemoveFor("EPDFUnrotatedRect"); - return true; - } - - CFX_FloatRect float_rect = CFXFloatRectFromFSRectF(*rect); - if (float_rect.IsEmpty()) { - dict->RemoveFor("EPDFUnrotatedRect"); - } else { - dict->SetRectFor("EPDFUnrotatedRect", float_rect); - } - return true; -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetUnrotatedRect(FPDF_ANNOTATION annot, FS_RECTF* rect) { - if (!rect) { - return false; - } - - const CPDF_Dictionary* dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!dict) { - return false; - } - - *rect = FSRectFFromCFXFloatRect(dict->GetRectFor("EPDFUnrotatedRect")); - return true; -} - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetRect(FPDF_ANNOTATION annot, FS_RECTF* rect) { if (!FPDFAnnot_GetRect(annot, rect)) { diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 19ad4ec52d..47449aed4e 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -60,8 +60,7 @@ std::wstring ExtractPageText(FPDF_PAGE page) { const int char_count = FPDFText_CountChars(text_page.get()); std::vector buffer(char_count + 1); - EXPECT_GT(FPDFText_GetText(text_page.get(), 0, char_count, buffer.data()), - 0); + EXPECT_GT(FPDFText_GetText(text_page.get(), 0, char_count, buffer.data()), 0); return GetPlatformWString(buffer.data()); } @@ -83,8 +82,9 @@ RedactionReport ApplyRedactionWithReport(FPDF_PAGE page, nm_utf8_pool.size(), &report.written_count, &report.total_count, &report.nm_utf8_bytes_used)); - for (uint32_t i = 0; i < report.written_count; ++i) + for (uint32_t i = 0; i < report.written_count; ++i) { report.object_numbers.push_back(removed[i].object_number); + } return report; } @@ -98,8 +98,9 @@ RedactionReport ApplyPageRedactionsWithReport(FPDF_PAGE page) { nm_utf8_pool.size(), &report.written_count, &report.total_count, &report.nm_utf8_bytes_used)); - for (uint32_t i = 0; i < report.written_count; ++i) + for (uint32_t i = 0; i < report.written_count; ++i) { report.object_numbers.push_back(removed[i].object_number); + } return report; } @@ -1608,6 +1609,71 @@ TEST_F(FPDFAnnotEmbedderTest, GetNumberValue) { } } +TEST_F(FPDFAnnotEmbedderTest, EmbedMetadata) { + ASSERT_TRUE(OpenDocument("text_form_multiple.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + + EXPECT_FALSE(EPDFAnnot_HasEmbedMetadata(annot.get())); + + ScopedFPDFWideString user_id = GetFPDFWideString(L"44"); + EXPECT_TRUE( + EPDFAnnot_SetEmbedMetadataString(annot.get(), "UserID", user_id.get())); + + unsigned long length_bytes = + EPDFAnnot_GetEmbedMetadataString(annot.get(), "UserID", nullptr, 0); + ASSERT_EQ(6u, length_bytes); + std::vector string_buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, + EPDFAnnot_GetEmbedMetadataString( + annot.get(), "UserID", string_buffer.data(), length_bytes)); + EXPECT_EQ(L"44", GetPlatformWString(string_buffer.data())); + + EXPECT_TRUE(EPDFAnnot_SetEmbedMetadataNumber(annot.get(), "Rotation", 12.5f)); + float number_value = 0.0f; + EXPECT_TRUE( + EPDFAnnot_GetEmbedMetadataNumber(annot.get(), "Rotation", &number_value)); + EXPECT_FLOAT_EQ(12.5f, number_value); + + EXPECT_TRUE(EPDFAnnot_SetEmbedMetadataBoolean(annot.get(), "Archived", true)); + FPDF_BOOL boolean_value = false; + EXPECT_TRUE(EPDFAnnot_GetEmbedMetadataBoolean(annot.get(), "Archived", + &boolean_value)); + EXPECT_TRUE(boolean_value); + + const FS_RECTF rect{1.0f, 2.0f, 3.0f, 4.0f}; + EXPECT_TRUE( + EPDFAnnot_SetEmbedMetadataRect(annot.get(), "UnrotatedRect", &rect)); + FS_RECTF rect_value; + EXPECT_TRUE(EPDFAnnot_GetEmbedMetadataRect(annot.get(), "UnrotatedRect", + &rect_value)); + EXPECT_FLOAT_EQ(rect.left, rect_value.left); + EXPECT_FLOAT_EQ(rect.bottom, rect_value.bottom); + EXPECT_FLOAT_EQ(rect.right, rect_value.right); + EXPECT_FLOAT_EQ(rect.top, rect_value.top); + + ScopedFPDFWideString json = GetFPDFWideString(L"{\"source\":\"test\"}"); + EXPECT_TRUE(EPDFAnnot_SetEmbedMetadataJSON(annot.get(), json.get())); + length_bytes = EPDFAnnot_GetEmbedMetadataJSON(annot.get(), nullptr, 0); + ASSERT_EQ(36u, length_bytes); + string_buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, EPDFAnnot_GetEmbedMetadataJSON( + annot.get(), string_buffer.data(), length_bytes)); + EXPECT_EQ(L"{\"source\":\"test\"}", GetPlatformWString(string_buffer.data())); + + EXPECT_TRUE(EPDFAnnot_HasEmbedMetadata(annot.get())); + EXPECT_TRUE(EPDFAnnot_ClearEmbedMetadataKey(annot.get(), "UserID")); + EXPECT_TRUE(EPDFAnnot_HasEmbedMetadata(annot.get())); + EXPECT_EQ( + 2u, EPDFAnnot_GetEmbedMetadataString(annot.get(), "UserID", nullptr, 0)); + + EXPECT_TRUE(EPDFAnnot_ClearEmbedMetadata(annot.get())); + EXPECT_FALSE(EPDFAnnot_HasEmbedMetadata(annot.get())); +} + TEST_F(FPDFAnnotEmbedderTest, GetSetAP) { // Open a file with four annotations and load its first page. ASSERT_TRUE(OpenDocument("annotation_stamp_with_ap.pdf")); diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 70a128e029..536e415a4a 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -1264,10 +1264,12 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, // Read the raw BBox WITHOUT applying the AP Matrix. CFX_FloatRect form_bbox = pForm->GetDict()->GetRectFor("BBox"); - // Use EPDFUnrotatedRect as the target rect for MatchRect. - // Falls back to /Rect if EPDFUnrotatedRect is not set. + // Use /EMBD_Metadata /UnrotatedRect as the target rect for MatchRect. + // Falls back to /Rect if EmbedPDF metadata is not set. + RetainPtr metadata = + pAnnot->GetAnnotDict()->GetDictFor("EMBD_Metadata"); CFX_FloatRect target = - pAnnot->GetAnnotDict()->GetRectFor("EPDFUnrotatedRect"); + metadata ? metadata->GetRectFor("UnrotatedRect") : CFX_FloatRect(); if (target.IsEmpty()) { target = pAnnot->GetRect(); } diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index a767537cfe..a9d7c84db4 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -103,13 +103,13 @@ typedef enum FPDFANNOT_COLORTYPE { } FPDFANNOT_COLORTYPE; typedef enum FPDF_ANNOT_BORDER_STYLE { - FPDF_ANNOT_BS_UNKNOWN = 0, - FPDF_ANNOT_BS_SOLID, - FPDF_ANNOT_BS_DASHED, - FPDF_ANNOT_BS_BEVELED, - FPDF_ANNOT_BS_INSET, - FPDF_ANNOT_BS_UNDERLINE, - FPDF_ANNOT_BS_CLOUDY + FPDF_ANNOT_BS_UNKNOWN = 0, + FPDF_ANNOT_BS_SOLID, + FPDF_ANNOT_BS_DASHED, + FPDF_ANNOT_BS_BEVELED, + FPDF_ANNOT_BS_INSET, + FPDF_ANNOT_BS_UNDERLINE, + FPDF_ANNOT_BS_CLOUDY } FPDF_ANNOT_BORDER_STYLE; typedef enum FPDF_BLENDMODE { @@ -231,7 +231,7 @@ typedef enum FPDF_ANNOT_NAME { typedef enum EPDF_STAMP_FIT { EPDF_STAMP_FIT_CONTAIN = 0, // preserve aspect, fully visible - EPDF_STAMP_FIT_COVER = 1, // preserve aspect, fill box, might crop + EPDF_STAMP_FIT_COVER = 1, // preserve aspect, fill box, might crop EPDF_STAMP_FIT_STRETCH = 2 // ignore aspect, fill box } EPDF_STAMP_FIT; @@ -757,6 +757,97 @@ EPDFAnnot_SetNumberValue(FPDF_ANNOTATION annot, FPDF_BYTESTRING key, float value); +// Experimental EmbedPDF Extension API. +// Returns true if |annot| has an /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_HasEmbedMetadata(FPDF_ANNOTATION annot); + +// Experimental EmbedPDF Extension API. +// Removes the /EMBD_Metadata dictionary from |annot|. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ClearEmbedMetadata(FPDF_ANNOTATION annot); + +// Experimental EmbedPDF Extension API. +// Removes |key| from |annot|'s /EMBD_Metadata dictionary. If the metadata +// dictionary becomes empty, /EMBD_Metadata is removed too. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ClearEmbedMetadataKey(FPDF_ANNOTATION annot, FPDF_BYTESTRING key); + +// Experimental EmbedPDF Extension API. +// Set a UTF-16LE string in |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataString(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value); + +// Experimental EmbedPDF Extension API. +// Get a UTF-16LE string from |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataString(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Set a number in |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataNumber(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + float value); + +// Experimental EmbedPDF Extension API. +// Get a number from |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataNumber(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + float* value); + +// Experimental EmbedPDF Extension API. +// Set a boolean in |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataBoolean(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_BOOL value); + +// Experimental EmbedPDF Extension API. +// Get a boolean from |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataBoolean(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_BOOL* value); + +// Experimental EmbedPDF Extension API. +// Set a rect in |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataRect(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + const FS_RECTF* rect); + +// Experimental EmbedPDF Extension API. +// Get a rect from |annot|'s /EMBD_Metadata dictionary. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataRect(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FS_RECTF* rect); + +// Experimental EmbedPDF Extension API. +// Set the arbitrary app-specific JSON bucket in /EMBD_Metadata /CustomJSON. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetEmbedMetadataJSON(FPDF_ANNOTATION annot, FPDF_WIDESTRING json); + +// Experimental EmbedPDF Extension API. +// Get the arbitrary app-specific JSON bucket from /EMBD_Metadata /CustomJSON. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAnnot_GetEmbedMetadataJSON(FPDF_ANNOTATION annot, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Removes /EMBD_Metadata from every annotation in |document|. This does not +// remove standard annotation fields or appearance streams. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDocument_ClearEmbedMetadata(FPDF_DOCUMENT document); + // Experimental API. // Set the AP (appearance string) in |annot|'s dictionary for a given // |appearanceMode|. @@ -837,8 +928,7 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFAnnot_SetFlags(FPDF_ANNOTATION annot, // // Returns the annotation flags specific to interactive forms. FPDF_EXPORT int FPDF_CALLCONV -FPDFAnnot_GetFormFieldFlags(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot); +FPDFAnnot_GetFormFieldFlags(FPDF_FORMHANDLE handle, FPDF_ANNOTATION annot); // Experimental API. // Sets the form field flags for an interactive form annotation. @@ -1195,7 +1285,6 @@ FPDFAnnot_GetFileAttachment(FPDF_ANNOTATION annot); FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFAnnot_AddFileAttachment(FPDF_ANNOTATION annot, FPDF_WIDESTRING name); - // Experimental EmbedPDF Extension API. // Get the color of an annotation. If no color is specified, default to yellow // for highlight annotation, black for all else. @@ -1205,12 +1294,11 @@ FPDFAnnot_AddFileAttachment(FPDF_ANNOTATION annot, FPDF_WIDESTRING name); // R, G, B - buffer to hold the RGB value of the color. Ranges from 0 to 255. // // Returns true if successful. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetColor(FPDF_ANNOTATION annot, - FPDFANNOT_COLORTYPE type, - unsigned int* R, - unsigned int* G, - unsigned int* B); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetColor(FPDF_ANNOTATION annot, + FPDFANNOT_COLORTYPE type, + unsigned int* R, + unsigned int* G, + unsigned int* B); // Experimental EmbedPDF Extension API. // Set the color of an annotation. @@ -1220,12 +1308,11 @@ EPDFAnnot_GetColor(FPDF_ANNOTATION annot, // R, G, B - buffer to hold the RGB value of the color. Ranges from 0 to 255. // // Returns true if successful. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetColor(FPDF_ANNOTATION annot, - FPDFANNOT_COLORTYPE type, - unsigned int R, - unsigned int G, - unsigned int B); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetColor(FPDF_ANNOTATION annot, + FPDFANNOT_COLORTYPE type, + unsigned int R, + unsigned int G, + unsigned int B); // Experimental EmbedPDF Extension API. // Set the opacity of an annotaion. @@ -1246,8 +1333,7 @@ EPDFAnnot_SetOpacity(FPDF_ANNOTATION annot, // // Returns true if succesful. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetOpacity(FPDF_ANNOTATION annot, - unsigned int* alpha /* 0-255 */); +EPDFAnnot_GetOpacity(FPDF_ANNOTATION annot, unsigned int* alpha /* 0-255 */); // Experimental EmbedPDF Extension API. // Clear the color of an annotation. @@ -1256,7 +1342,8 @@ EPDFAnnot_GetOpacity(FPDF_ANNOTATION annot, // type - type of the color to be cleared. // // Returns true if successful. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ClearColor(FPDF_ANNOTATION annot, FPDFANNOT_COLORTYPE type); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_ClearColor(FPDF_ANNOTATION annot, FPDFANNOT_COLORTYPE type); // Experimental EmbedPDF Extension API. // Get the border style and width of an annotation. This function handles both @@ -1276,7 +1363,10 @@ EPDFAnnot_GetBorderStyle(FPDF_ANNOTATION annot, float* width); // width - the border width to be set. // // Returns true if successful. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetBorderStyle(FPDF_ANNOTATION annot, FPDF_ANNOT_BORDER_STYLE style, float width); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetBorderStyle(FPDF_ANNOTATION annot, + FPDF_ANNOT_BORDER_STYLE style, + float width); // Experimental EmbedPDF Extension API. // Get the intensity of a cloudy border effect. @@ -1336,10 +1426,10 @@ EPDFAnnot_GetRectangleDifferences(FPDF_ANNOTATION annot, // Returns true on success, false on failure. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetRectangleDifferences(FPDF_ANNOTATION annot, - float left, - float bottom, - float right, - float top); + float left, + float bottom, + float right, + float top); // Experimental EmbedPDF Extension API. // Remove the rectangle differences (/RD) entry from a supported annotation. @@ -1384,10 +1474,10 @@ EPDFAnnot_GetBorderDashPattern(FPDF_ANNOTATION annot, // EPDFAnnot_GetBorderDashPatternCount(). // // Returns true on success. - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV - EPDFAnnot_SetBorderDashPattern(FPDF_ANNOTATION annot, - const float* dash_array, - unsigned long count); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetBorderDashPattern(FPDF_ANNOTATION annot, + const float* dash_array, + unsigned long count); // Experimental EmbedPDF Extension API. // Generates or regenerates the appearance stream for a given annotation @@ -1426,20 +1516,20 @@ EPDFAnnot_GetBlendMode(FPDF_ANNOTATION annot); // ASCII byte string *without* the leading slash. If the caller includes a // leading '/', it is stripped. Returns false on invalid input or failure. // Succeeds regardless of subtype (permissive; /IT is just metadata). -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetIntent(FPDF_ANNOTATION annot, FPDF_BYTESTRING intent); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetIntent(FPDF_ANNOTATION annot, + FPDF_BYTESTRING intent); // Retrieves the Intent (/IT) name of an annotation as UTF-16 (without a // leading slash). Returns the number of 16-bit code units required (excluding // terminating NUL). If `buffer` is non-null and `buflen` large enough, copies -// the UTF-16 data and NUL-terminates it (same pattern as FPDFAnnot_GetStringValue). -// Returns 0 if annotation invalid, no /IT entry, or empty. +// the UTF-16 data and NUL-terminates it (same pattern as +// FPDFAnnot_GetStringValue). Returns 0 if annotation invalid, no /IT entry, or +// empty. FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetIntent(FPDF_ANNOTATION annot, FPDF_WCHAR* buffer, unsigned long buflen); - // Get the rich (formatted) text stored in the annotation’s /RC entry. // Returns the number of 16‑bit characters required (including the // terminating NUL). Call once with `buffer == nullptr` to get the size. @@ -1451,8 +1541,8 @@ EPDFAnnot_GetRichContent(FPDF_ANNOTATION annot, // Experimental EmbedPDF Extension API. // Set the line endings of a Line, Polyline, or FreeText annotation. // For Line/Polyline: writes /LE as a 2-element array [start_style, end_style]. -// For FreeText: writes /LE as a single name using end_style (Acrobat convention); -// start_style is ignored. +// For FreeText: writes /LE as a single name using end_style (Acrobat +// convention); start_style is ignored. // // annot - handle to an annotation. // start_style - the start line ending style (ignored for FreeText). @@ -1460,8 +1550,8 @@ EPDFAnnot_GetRichContent(FPDF_ANNOTATION annot, // FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetLineEndings(FPDF_ANNOTATION annot, - FPDF_ANNOT_LINE_END start_style, - FPDF_ANNOT_LINE_END end_style); + FPDF_ANNOT_LINE_END start_style, + FPDF_ANNOT_LINE_END end_style); // Experimental EmbedPDF Extension API. // Get the line endings of a Line, Polyline, or FreeText annotation. @@ -1474,8 +1564,8 @@ EPDFAnnot_SetLineEndings(FPDF_ANNOTATION annot, // FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetLineEndings(FPDF_ANNOTATION annot, - FPDF_ANNOT_LINE_END* start_style, - FPDF_ANNOT_LINE_END* end_style); + FPDF_ANNOT_LINE_END* start_style, + FPDF_ANNOT_LINE_END* end_style); // Experimental EmbedPDF Extension API. // Replace every vertex in the /Vertices array with the |points| supplied. @@ -1486,10 +1576,10 @@ EPDFAnnot_GetLineEndings(FPDF_ANNOTATION annot, // count - the number of vertices to be set. // // Returns true on success. - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV - EPDFAnnot_SetVertices(FPDF_ANNOTATION annot, - const FS_POINTF* points, - unsigned long count); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetVertices(FPDF_ANNOTATION annot, + const FS_POINTF* points, + unsigned long count); // Experimental EmbedPDF Extension API. // Set (or create) the two end‑points of a **Line** annotation @@ -1500,12 +1590,11 @@ EPDFAnnot_GetLineEndings(FPDF_ANNOTATION annot, // end - pointer to an `FS_POINTF` holding the new end‑point. // // Returns true on success. - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV - EPDFAnnot_SetLine(FPDF_ANNOTATION annot, - const FS_POINTF* start, - const FS_POINTF* end); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetLine(FPDF_ANNOTATION annot, + const FS_POINTF* start, + const FS_POINTF* end); -// Experimental EmbedPDF Extension API. +// Experimental EmbedPDF Extension API. // Set the default appearance of a FreeText annotation. // // annot - handle to an annotation. @@ -1546,8 +1635,8 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, // alignment - the text alignment to be set. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, FPDF_TEXT_ALIGNMENT alignment); // Experimental EmbedPDF Extension API. @@ -1556,37 +1645,16 @@ EPDFAnnot_SetTextAlignment(FPDF_ANNOTATION annot, // annot - handle to an annotation. // // Returns the text alignment. -FPDF_EXPORT FPDF_TEXT_ALIGNMENT FPDF_CALLCONV +FPDF_EXPORT FPDF_TEXT_ALIGNMENT FPDF_CALLCONV EPDFAnnot_GetTextAlignment(FPDF_ANNOTATION annot); -// Experimental EmbedPDF Extension API. -// Set the vertical alignment of a FreeText annotation. -// -// annot - handle to an annotation. -// alignment - the vertical alignment to be set. -// -// Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetVerticalAlignment(FPDF_ANNOTATION annot, - FPDF_VERTICAL_ALIGNMENT alignment); - -// Experimental EmbedPDF Extension API. -// Get the vertical alignment of a FreeText annotation. -// -// annot - handle to an annotation. -// -// Returns the vertical alignment. -FPDF_EXPORT FPDF_VERTICAL_ALIGNMENT FPDF_CALLCONV -EPDFAnnot_GetVerticalAlignment(FPDF_ANNOTATION annot); - - // Get the annotation by name. // // page - handle to a page. // nm - the name of the annotation. // // Returns the annotation. -FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV +FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm); // Remove the annotation by name. @@ -1595,7 +1663,7 @@ EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm); // nm - the name of the annotation. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm); // Set the linked annotation. @@ -1605,14 +1673,17 @@ EPDFPage_RemoveAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm); // linked_annot - the linked annotation. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetLinkedAnnot(FPDF_ANNOTATION annot, FPDF_BYTESTRING key, FPDF_ANNOTATION linked_annot); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetLinkedAnnot(FPDF_ANNOTATION annot, + FPDF_BYTESTRING key, + FPDF_ANNOTATION linked_annot); // Experimental EmbedPDF Extension API. // Set the action of a Link annotation. // // annot - handle to a link annotation. -// action - handle to an action dictionary (e.g. from EPDFAction_CreateGoTo()). +// action - handle to an action dictionary (e.g. from +// EPDFAction_CreateGoTo()). // // Returns true on success. // @@ -1620,8 +1691,8 @@ EPDFAnnot_SetLinkedAnnot(FPDF_ANNOTATION annot, FPDF_BYTESTRING key, FPDF_ANNOTA // * Only valid for FPDF_ANNOT_LINK annotations. // * The action must be an indirect object. // * Any existing /A entry will be replaced. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetAction(FPDF_ANNOTATION annot, FPDF_ACTION action); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAction(FPDF_ANNOTATION annot, + FPDF_ACTION action); // Experimental EmbedPDF Extension API. // Get the annotation count. @@ -1630,8 +1701,8 @@ EPDFAnnot_SetAction(FPDF_ANNOTATION annot, FPDF_ACTION action); // page_index - the index of the page. // // Returns the annotation count. -FPDF_EXPORT int FPDF_CALLCONV -EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, int page_index); +FPDF_EXPORT int FPDF_CALLCONV EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, + int page_index); // Experimental EmbedPDF Extension API. // Get the annotation by index. @@ -1641,7 +1712,7 @@ EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, int page_index); // index - the index of the annotation. // // Returns the annotation. -FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV +FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index); // Experimental EmbedPDF Extension API. @@ -1652,8 +1723,9 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index); // index - the index of the annotation. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, + int page_index, + int index); // Experimental EmbedPDF Extension API. // Set the /Name entry of an annotation (icon name for text/file/sound, @@ -1663,8 +1735,8 @@ EPDFPage_RemoveAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index); // name - the name to be set. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetName(FPDF_ANNOTATION annot, FPDF_ANNOT_NAME name); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetName(FPDF_ANNOTATION annot, + FPDF_ANNOT_NAME name); // Experimental EmbedPDF Extension API. // Get the /Name entry of an annotation. @@ -1676,8 +1748,9 @@ FPDF_EXPORT FPDF_ANNOT_NAME FPDF_CALLCONV EPDFAnnot_GetName(FPDF_ANNOTATION annot); // Experimental EmbedPDF Extension API. -// Resize the normal appearance (/AP/N) of a Stamp to match the annotation's /Rect -// using the specified fit policy. Updates the AP /BBox and the image's CTM. +// Resize the normal appearance (/AP/N) of a Stamp to match the annotation's +// /Rect using the specified fit policy. Updates the AP /BBox and the image's +// CTM. // // annot - handle to a Stamp annotation. // fit - one of EPDF_STAMP_FIT_*. @@ -1687,24 +1760,26 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_UpdateAppearanceToRect(FPDF_ANNOTATION annot, EPDF_STAMP_FIT fit); // Experimental EmbedPDF Extension API. -// Create an annotation. (the difference from FPDFPage_CreateAnnot is that it creates an indirect object) +// Create an annotation. (the difference from FPDFPage_CreateAnnot is that it +// creates an indirect object) // // page - handle to a page. // subtype - the subtype of the annotation. // // Returns the annotation. -FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV +FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV EPDFPage_CreateAnnot(FPDF_PAGE page, FPDF_ANNOTATION_SUBTYPE subtype); // Experimental EmbedPDF Extension API. // Set the rotation of an annotation in degrees. // // annot - handle to an annotation. -// rotation - the rotation in degrees (any value, e.g. 0, 45.5, 90, 180, etc.). +// rotation - the rotation in degrees (any value, e.g. 0, 45.5, 90, 180, +// etc.). // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, float rotation); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, + float rotation); // Experimental EmbedPDF Extension API. // Get the rotation of an annotation in degrees. @@ -1713,8 +1788,8 @@ EPDFAnnot_SetRotate(FPDF_ANNOTATION annot, float rotation); // rotation - receives the rotation value in degrees. // // Returns true on success, false if annot is invalid or rotation is NULL. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetRotate(FPDF_ANNOTATION annot, float* rotation); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetRotate(FPDF_ANNOTATION annot, + float* rotation); // Experimental EmbedPDF Extension API. // Get the reply type (RT) of an annotation. This specifies how an annotation @@ -1798,8 +1873,8 @@ EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot); // annot - handle to an annotation with an appearance stream // // Returns TRUE on success, FALSE if no appearance stream or error. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_Flatten(FPDF_PAGE page, FPDF_ANNOTATION annot); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, + FPDF_ANNOTATION annot); // Experimental EmbedPDF Extension API. // Set an annotation's normal appearance (AP/N) from a page of another document. @@ -1845,53 +1920,6 @@ FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, int annot_count); -// Experimental EmbedPDF Extension API. -// Set the EmbedPDF extended rotation on an annotation. This stores a custom -// /EPDFRotate entry (not the standard /Rotate) for non-widget annotations. -// A value of 0 removes the key to keep the PDF clean. -// -// annot - handle to an annotation. -// rotation - the rotation in degrees. -// -// Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetExtendedRotation(FPDF_ANNOTATION annot, float rotation); - -// Experimental EmbedPDF Extension API. -// Get the EmbedPDF extended rotation from an annotation. -// Reads the custom /EPDFRotate entry. -// -// annot - handle to an annotation. -// rotation - receives the rotation value in degrees. 0 if not set. -// -// Returns true on success, false if annot is invalid or rotation is NULL. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetExtendedRotation(FPDF_ANNOTATION annot, float* rotation); - -// Experimental EmbedPDF Extension API. -// Set the EmbedPDF unrotated rect on an annotation. This stores a custom -// /EPDFUnrotatedRect array representing the annotation's rect before rotation -// was applied. Follows the same FS_RECTF convention as FPDFAnnot_SetRect. -// -// annot - handle to an annotation. -// rect - pointer to the unrotated rect. Pass NULL to remove. -// -// Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetUnrotatedRect(FPDF_ANNOTATION annot, const FS_RECTF* rect); - -// Experimental EmbedPDF Extension API. -// Get the EmbedPDF unrotated rect from an annotation. -// Reads the custom /EPDFUnrotatedRect array. -// Follows the same FS_RECTF convention as FPDFAnnot_GetRect. -// -// annot - handle to an annotation. -// rect - receives the unrotated rect. All zeros if not set. -// -// Returns true on success, false if annot is invalid or rect is NULL. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetUnrotatedRect(FPDF_ANNOTATION annot, FS_RECTF* rect); - // Experimental EmbedPDF Extension API. // Get the annotation rectangle with normalization applied. // Wraps FPDFAnnot_GetRect and ensures the returned rect is normalized @@ -1901,8 +1929,8 @@ EPDFAnnot_GetUnrotatedRect(FPDF_ANNOTATION annot, FS_RECTF* rect); // rect - receives the normalized rectangle; must not be NULL. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetRect(FPDF_ANNOTATION annot, FS_RECTF* rect); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetRect(FPDF_ANNOTATION annot, + FS_RECTF* rect); // Experimental EmbedPDF Extension API. // Set the Matrix on an annotation's appearance stream for the given mode. @@ -1985,12 +2013,11 @@ typedef enum { // R,G,B - color components in 0..255. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, - EPDF_MK_COLORTYPE type, - unsigned int R, - unsigned int G, - unsigned int B); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, + EPDF_MK_COLORTYPE type, + unsigned int R, + unsigned int G, + unsigned int B); // Experimental EmbedPDF Extension API. // Get a color from the widget annotation's /MK dictionary. @@ -2000,12 +2027,11 @@ EPDFAnnot_SetMKColor(FPDF_ANNOTATION annot, // R,G,B - pointers to receive color components in 0..255. // // Returns true on success, false if no MK color is set or annot is invalid. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_GetMKColor(FPDF_ANNOTATION annot, - EPDF_MK_COLORTYPE type, - unsigned int* R, - unsigned int* G, - unsigned int* B); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetMKColor(FPDF_ANNOTATION annot, + EPDF_MK_COLORTYPE type, + unsigned int* R, + unsigned int* G, + unsigned int* B); // Experimental EmbedPDF Extension API. // Remove a color from the widget annotation's /MK dictionary. @@ -2025,8 +2051,9 @@ EPDFAnnot_ClearMKColor(FPDF_ANNOTATION annot, EPDF_MK_COLORTYPE type); // model so that subsequent FPDFAnnot_SetFormFieldFlags etc. calls work. // // page - handle to the page. -// handle - handle to the form fill module (FPDFDOC_InitFormFillEnvironment). -// field_type - one of FPDF_FORMFIELD_TEXTFIELD, FPDF_FORMFIELD_CHECKBOX, +// handle - handle to the form fill module +// (FPDFDOC_InitFormFillEnvironment). field_type - one of +// FPDF_FORMFIELD_TEXTFIELD, FPDF_FORMFIELD_CHECKBOX, // FPDF_FORMFIELD_RADIOBUTTON, FPDF_FORMFIELD_COMBOBOX, // FPDF_FORMFIELD_LISTBOX, FPDF_FORMFIELD_PUSHBUTTON. // field_name - the partial field name (/T). May be NULL for unnamed fields. @@ -2084,9 +2111,10 @@ EPDFAnnot_GetFormFieldObjectNumber(FPDF_FORMHANDLE handle, // Re-parent the source widget field into the target widget field so both // widgets share the same logical AcroForm field. // -// handle - handle to the form fill module (FPDFDOC_InitFormFillEnvironment). -// source_annot - handle to the widget annotation whose field should be merged. -// target_annot - handle to the widget annotation whose field should be reused. +// handle - handle to the form fill module +// (FPDFDOC_InitFormFillEnvironment). source_annot - handle to the widget +// annotation whose field should be merged. target_annot - handle to the +// widget annotation whose field should be reused. // // Returns true on success, false if the annotations are not compatible form // fields or the share operation could not be completed. @@ -2233,8 +2261,8 @@ EPDFPage_GetAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num); // index - the index of the annotation in the /Annots array. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_RemoveAnnot(FPDF_PAGE page, int index); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_RemoveAnnot(FPDF_PAGE page, + int index); // Experimental EmbedPDF Extension API. // Remove an annotation on a page by its PDF indirect object number. @@ -2269,11 +2297,10 @@ EPDFPage_RemoveAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num); // (objectNumber, /NM) is preserved across the move. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_MoveAnnots(FPDF_PAGE page, - const int* from_indices, - int from_indices_len, - int to_index); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_MoveAnnots(FPDF_PAGE page, + const int* from_indices, + int from_indices_len, + int to_index); #ifdef __cplusplus } // extern "C" diff --git a/public/fpdfview.h b/public/fpdfview.h index 4b79a39617..7accf476c1 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -1750,9 +1750,9 @@ EPDF_RenderAnnotBitmap(FPDF_BITMAP bitmap, // Experimental EmbedPDF Extension API. // Renders the annotation's AP form content WITHOUT the AP stream's rotation -// Matrix applied, using /EPDFUnrotatedRect (falling back to /Rect) for the -// MatchRect mapping. This produces an unrotated bitmap suitable for UI layers -// that apply CSS rotation separately. +// Matrix applied, using /EMBD_Metadata /UnrotatedRect (falling back to /Rect) +// for the MatchRect mapping. This produces an unrotated bitmap suitable for UI +// layers that apply CSS rotation separately. // // Same parameters as EPDF_RenderAnnotBitmap. // From ee61c10b1a6b8659e4a17c050012412dff0ee430 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sat, 30 May 2026 23:43:03 +0300 Subject: [PATCH 29/56] Add APIs to query page boxes and UserUnit Add EPDF_GetPageBoxByIndex and EPDF_GetPageUserUnitByIndex to query page box rectangles and /UserUnit without loading or parsing a page. Implement helper functions (GetPageDictionaryByIndex, GetInheritedPageRotation, GetPageBoxKey, GetEffectiveMediaBox) and reuse inherited-attribute walking for MediaBox/CropBox and rotation resolution. MediaBox falls back to PDFium default (612x792) when absent; CropBox falls back to MediaBox; Bleed/Trim/Art boxes are optional and return false if absent. /UserUnit returns the page value when present and positive, otherwise defaults to 1.0. Update EPDF_GetPageRotationByIndex to use the inherited-rotation helper. Add API enum and declarations to public/fpdfview.h, register new APIs in the C API test, and include unit tests in fpdf_view_embeddertest.cpp to validate behavior. --- fpdfsdk/fpdf_view.cpp | 172 ++++++++++++++++++++++++----- fpdfsdk/fpdf_view_c_api_test.c | 2 + fpdfsdk/fpdf_view_embeddertest.cpp | 87 +++++++++++++++ public/fpdfview.h | 48 +++++++- 4 files changed, 280 insertions(+), 29 deletions(-) diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 536e415a4a..c5cc0300a4 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -1640,6 +1640,12 @@ FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, return true; } +static RetainPtr GetPageDictionaryByIndex( + FPDF_DOCUMENT document, + CPDF_Document* doc, + int page_index); +static int GetInheritedPageRotation(const CPDF_Dictionary* page_dict); + FPDF_EXPORT int FPDF_CALLCONV EPDF_GetPageRotationByIndex(FPDF_DOCUMENT document, int page_index) { auto* pDoc = CPDFDocumentFromFPDFDocument(document); @@ -1647,42 +1653,87 @@ EPDF_GetPageRotationByIndex(FPDF_DOCUMENT document, int page_index) { return -1; } - if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { + RetainPtr dict = + GetPageDictionaryByIndex(document, pDoc, page_index); + if (!dict) { return -1; } + return GetInheritedPageRotation(dict.Get()); +} - // Cheap: no ParseContent(). - RetainPtr dict = pDoc->GetMutablePageDictionary(page_index); - if (!dict) { - return -1; +static RetainPtr GetPageDictionaryByIndex( + FPDF_DOCUMENT document, + CPDF_Document* doc, + int page_index) { + if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { + return nullptr; } - auto page = pdfium::MakeRetain(pDoc, std::move(dict)); - return page->GetPageRotation(); + return doc->GetPageDictionary(page_index); +} + +static ByteStringView GetPageBoxKey(EPDF_PAGE_BOX_TYPE box_type) { + switch (box_type) { + case EPDF_PAGE_BOX_MEDIA: + return pdfium::page_object::kMediaBox; + case EPDF_PAGE_BOX_CROP: + return pdfium::page_object::kCropBox; + case EPDF_PAGE_BOX_BLEED: + return pdfium::page_object::kBleedBox; + case EPDF_PAGE_BOX_TRIM: + return pdfium::page_object::kTrimBox; + case EPDF_PAGE_BOX_ART: + return pdfium::page_object::kArtBox; + } + return ByteStringView(); } // Walk the page tree (/Parent chain) to resolve an inherited rectangle // attribute. Mirrors the logic of CPDF_Page::GetPageAttr + GetBox but works // directly on a dictionary pointer so we can avoid constructing a CPDF_Page. -static CFX_FloatRect GetInheritedRect(const CPDF_Dictionary* pPageDict, +static CFX_FloatRect GetInheritedRect(const CPDF_Dictionary* page_dict, ByteStringView name) { std::set visited; - const CPDF_Dictionary* pDict = pPageDict; - while (pDict && !visited.contains(pDict)) { - RetainPtr pObj = pDict->GetDirectObjectFor(name); - if (pObj) { - RetainPtr pArray = ToArray(std::move(pObj)); - if (pArray) { - CFX_FloatRect rect = pArray->GetRect(); + const CPDF_Dictionary* dict = page_dict; + while (dict && !visited.contains(dict)) { + RetainPtr object = dict->GetDirectObjectFor(name); + if (object) { + RetainPtr array = ToArray(std::move(object)); + if (array) { + CFX_FloatRect rect = array->GetRect(); rect.Normalize(); return rect; } } - visited.insert(pDict); - pDict = pDict->GetDictFor(pdfium::page_object::kParent).Get(); + visited.insert(dict); + dict = dict->GetDictFor(pdfium::page_object::kParent).Get(); } return CFX_FloatRect(); } +static int GetInheritedPageRotation(const CPDF_Dictionary* page_dict) { + std::set visited; + const CPDF_Dictionary* dict = page_dict; + while (dict && !visited.contains(dict)) { + if (dict->KeyExist(pdfium::page_object::kRotate)) { + int rotation = + (dict->GetIntegerFor(pdfium::page_object::kRotate) / 90) % 4; + return rotation < 0 ? rotation + 4 : rotation; + } + visited.insert(dict); + dict = dict->GetDictFor(pdfium::page_object::kParent).Get(); + } + return 0; +} + +static CFX_FloatRect GetEffectiveMediaBox(const CPDF_Dictionary* page_dict) { + CFX_FloatRect media_box = + GetInheritedRect(page_dict, pdfium::page_object::kMediaBox); + if (media_box.IsEmpty()) { + media_box = CFX_FloatRect(0, 0, 612, 792); + } + return media_box; +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, int page_index, @@ -1696,22 +1747,14 @@ EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, return false; } - if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { - return false; - } - - RetainPtr dict = pDoc->GetMutablePageDictionary(page_index); + RetainPtr dict = + GetPageDictionaryByIndex(document, pDoc, page_index); if (!dict) { return false; } // Resolve MediaBox/CropBox via page tree inheritance (not just the page dict) - CFX_FloatRect mediabox = - GetInheritedRect(dict.Get(), pdfium::page_object::kMediaBox); - if (mediabox.IsEmpty()) { - mediabox = CFX_FloatRect(0, 0, 612, 792); - } - + CFX_FloatRect mediabox = GetEffectiveMediaBox(dict.Get()); CFX_FloatRect cropbox = GetInheritedRect(dict.Get(), pdfium::page_object::kCropBox); CFX_FloatRect bbox = cropbox.IsEmpty() ? mediabox : cropbox; @@ -1723,6 +1766,79 @@ EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, return true; } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_GetPageBoxByIndex(FPDF_DOCUMENT document, + int page_index, + EPDF_PAGE_BOX_TYPE box_type, + FS_RECTF* box) { + if (!box) { + return false; + } + + auto* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) { + return false; + } + + RetainPtr dict = + GetPageDictionaryByIndex(document, pDoc, page_index); + if (!dict) { + return false; + } + + CFX_FloatRect rect; + switch (box_type) { + case EPDF_PAGE_BOX_MEDIA: + rect = GetEffectiveMediaBox(dict.Get()); + break; + case EPDF_PAGE_BOX_CROP: + rect = GetInheritedRect(dict.Get(), pdfium::page_object::kCropBox); + if (rect.IsEmpty()) { + rect = GetEffectiveMediaBox(dict.Get()); + } + break; + case EPDF_PAGE_BOX_BLEED: + case EPDF_PAGE_BOX_TRIM: + case EPDF_PAGE_BOX_ART: + rect = GetInheritedRect(dict.Get(), GetPageBoxKey(box_type)); + if (rect.IsEmpty()) { + return false; + } + break; + } + + if (rect.IsEmpty()) { + return false; + } + + *box = FSRectFFromCFXFloatRect(rect); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_GetPageUserUnitByIndex(FPDF_DOCUMENT document, + int page_index, + float* user_unit) { + if (!user_unit) { + return false; + } + + auto* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) { + return false; + } + + RetainPtr dict = + GetPageDictionaryByIndex(document, pDoc, page_index); + if (!dict) { + return false; + } + + float value = dict->GetFloatFor("UserUnit"); + *user_unit = value > 0 ? value : 1.0f; + return true; +} + FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV EPDF_LoadPageNormalized(FPDF_DOCUMENT document, int page_index, diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 558f340f0b..9ccefbba11 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -536,6 +536,8 @@ int CheckPDFiumCApi() { CHK(FPDF_GetXFAPacketName); CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); + CHK(EPDF_GetPageBoxByIndex); + CHK(EPDF_GetPageUserUnitByIndex); CHK(EPDF_LoadBaseDocument); CHK(EPDF_LoadMemBaseDocument); CHK(EPDF_LoadMemBaseDocument64); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 6968fc4841..1a09fb074f 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -14,7 +14,10 @@ #include #include "build/build_config.h" +#include "constants/page_object.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fxge/cfx_defaultrenderdevice.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/fpdf_view_c_api_test.h" @@ -2580,6 +2583,90 @@ TEST_F(FPDFViewEmbedderTest, EPDFDocGetPageObjectNumberByIndex) { EXPECT_EQ(1u, doc->GetParsedPageCountForTesting()); } +TEST_F(FPDFViewEmbedderTest, EPDFGetPageBoxByIndex) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + + auto expect_rect = [](const FS_RECTF& rect, float left, float top, + float right, float bottom) { + EXPECT_FLOAT_EQ(left, rect.left); + EXPECT_FLOAT_EQ(top, rect.top); + EXPECT_FLOAT_EQ(right, rect.right); + EXPECT_FLOAT_EQ(bottom, rect.bottom); + }; + + FS_RECTF box = {-1.0f, -1.0f, -1.0f, -1.0f}; + EXPECT_FALSE(EPDF_GetPageBoxByIndex(nullptr, 0, EPDF_PAGE_BOX_MEDIA, &box)); + EXPECT_FALSE( + EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_MEDIA, nullptr)); + EXPECT_FALSE( + EPDF_GetPageBoxByIndex(document(), -1, EPDF_PAGE_BOX_MEDIA, &box)); + EXPECT_FALSE( + EPDF_GetPageBoxByIndex(document(), 1, EPDF_PAGE_BOX_MEDIA, &box)); + EXPECT_FALSE(EPDF_GetPageBoxByIndex( + document(), 0, static_cast(999), &box)); + + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_MEDIA, &box)); + expect_rect(box, 0.0f, 300.0f, 200.0f, 0.0f); + + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_CROP, &box)); + expect_rect(box, 0.0f, 300.0f, 200.0f, 0.0f); + + box = {-1.0f, -1.0f, -1.0f, -1.0f}; + EXPECT_FALSE( + EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_BLEED, &box)); + expect_rect(box, -1.0f, -1.0f, -1.0f, -1.0f); + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + RetainPtr page_dict = doc->GetMutablePageDictionary(0); + ASSERT_TRUE(page_dict); + page_dict->SetRectFor(pdfium::page_object::kCropBox, + CFX_FloatRect(10.0f, 20.0f, 110.0f, 120.0f)); + page_dict->SetRectFor(pdfium::page_object::kBleedBox, + CFX_FloatRect(20.0f, 30.0f, 100.0f, 110.0f)); + page_dict->SetRectFor(pdfium::page_object::kTrimBox, + CFX_FloatRect(30.0f, 40.0f, 90.0f, 100.0f)); + page_dict->SetRectFor(pdfium::page_object::kArtBox, + CFX_FloatRect(40.0f, 50.0f, 80.0f, 90.0f)); + + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_CROP, &box)); + expect_rect(box, 10.0f, 120.0f, 110.0f, 20.0f); + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_BLEED, &box)); + expect_rect(box, 20.0f, 110.0f, 100.0f, 30.0f); + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_TRIM, &box)); + expect_rect(box, 30.0f, 100.0f, 90.0f, 40.0f); + ASSERT_TRUE(EPDF_GetPageBoxByIndex(document(), 0, EPDF_PAGE_BOX_ART, &box)); + expect_rect(box, 40.0f, 90.0f, 80.0f, 50.0f); + + EXPECT_EQ(0u, doc->GetParsedPageCountForTesting()); +} + +TEST_F(FPDFViewEmbedderTest, EPDFGetPageUserUnitByIndex) { + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + + float user_unit = 0.0f; + EXPECT_FALSE(EPDF_GetPageUserUnitByIndex(nullptr, 0, &user_unit)); + EXPECT_FALSE(EPDF_GetPageUserUnitByIndex(document(), 0, nullptr)); + EXPECT_FALSE(EPDF_GetPageUserUnitByIndex(document(), -1, &user_unit)); + EXPECT_FALSE(EPDF_GetPageUserUnitByIndex(document(), 1, &user_unit)); + + ASSERT_TRUE(EPDF_GetPageUserUnitByIndex(document(), 0, &user_unit)); + EXPECT_FLOAT_EQ(1.0f, user_unit); + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + RetainPtr page_dict = doc->GetMutablePageDictionary(0); + ASSERT_TRUE(page_dict); + page_dict->SetNewFor("UserUnit", 2.5f); + + ASSERT_TRUE(EPDF_GetPageUserUnitByIndex(document(), 0, &user_unit)); + EXPECT_FLOAT_EQ(2.5f, user_unit); + + page_dict->SetNewFor("UserUnit", -10.0f); + ASSERT_TRUE(EPDF_GetPageUserUnitByIndex(document(), 0, &user_unit)); + EXPECT_FLOAT_EQ(1.0f, user_unit); + + EXPECT_EQ(0u, doc->GetParsedPageCountForTesting()); +} + TEST_F(FPDFViewEmbedderTest, FPDFGetPageSizeByIndex) { ASSERT_TRUE(OpenDocument("rectangles.pdf")); diff --git a/public/fpdfview.h b/public/fpdfview.h index 7accf476c1..8a2ddd2671 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -1024,6 +1024,15 @@ FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, int page_index, FS_SIZEF* size); +// Page box type used by EPDF_GetPageBoxByIndex(). +typedef enum EPDF_PAGE_BOX_TYPE { + EPDF_PAGE_BOX_MEDIA = 0, + EPDF_PAGE_BOX_CROP = 1, + EPDF_PAGE_BOX_BLEED = 2, + EPDF_PAGE_BOX_TRIM = 3, + EPDF_PAGE_BOX_ART = 4, +} EPDF_PAGE_BOX_TYPE; + // Experimental EmbedPDF API. // Function: EPDF_GetPageRotationByIndex // Get the rotation of the page at the given index without parsing @@ -1032,7 +1041,7 @@ FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, // document - Handle to document. Returned by FPDF_LoadDocument(). // page_index - Page index, zero for the first page. // Return value: -// The rotation in degrees (must be one of 0, 90, 180, 270). +// The rotation as quarter-turns (must be one of 0, 1, 2, 3). // Returns -1 on error (document or page not found). FPDF_EXPORT int FPDF_CALLCONV EPDF_GetPageRotationByIndex(FPDF_DOCUMENT document, int page_index); @@ -1053,6 +1062,43 @@ EPDF_GetPageSizeByIndexNormalized(FPDF_DOCUMENT document, int page_index, FS_SIZEF* size); +// Experimental EmbedPDF API. +// Function: EPDF_GetPageBoxByIndex +// Get a page box at the given index without loading or parsing the page. +// Parameters: +// document - Handle to document. Returned by FPDF_LoadDocument(). +// page_index - Page index, zero for the first page. +// box_type - The page box to query. +// box - Pointer to a FS_RECTF to receive the box (in points). +// Return value: +// Non-zero for success. 0 for error or absent optional box. +// Comments: +// MediaBox is resolved through page-tree inheritance and falls back to +// PDFium's default page size when absent. CropBox falls back to +// MediaBox. BleedBox, TrimBox, and ArtBox return false when absent. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_GetPageBoxByIndex(FPDF_DOCUMENT document, + int page_index, + EPDF_PAGE_BOX_TYPE box_type, + FS_RECTF* box); + +// Experimental EmbedPDF API. +// Function: EPDF_GetPageUserUnitByIndex +// Get /UserUnit at the given page index without loading or parsing the +// page. +// Parameters: +// document - Handle to document. Returned by FPDF_LoadDocument(). +// page_index - Page index, zero for the first page. +// user_unit - Pointer to a float to receive the user unit. +// Return value: +// Non-zero for success. 0 for error. +// Comments: +// Missing or invalid /UserUnit values return the PDF default 1.0. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDF_GetPageUserUnitByIndex(FPDF_DOCUMENT document, + int page_index, + float* user_unit); + // Experimental EmbedPDF API. // Function: EPDF_LoadPageNormalized // Load a page with rotation normalized to 0 degrees. From ef3f53bc9328c47096f986bb864f986698aadab2 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 31 May 2026 13:36:21 +0300 Subject: [PATCH 30/56] Promote and save /Info for layer documents Ensure document /Info dictionaries are correctly promoted into layer overlays and serialized in deltas. CPDF_Creator now uses the current_info when writing the trailer and skips copying parser /Info entries; it only writes /Info if the current_info has a valid objnum. CPDF_Document::GetOrCreateInfo delegates to GetMutableInfo so layer behavior is honored. CPDF_LayerDocument::GetMutableInfo now returns/promotes the base /Info into the layer and IngestCurrentDelta imports a delta /Info (with validation) into the cached info. Added unit and embedder tests to cover promotion, creating layer-local Info when base has none, metadata updates, and saving/replaying deltas; also added a missing include for cpdf_string. --- core/fpdfapi/edit/cpdf_creator.cpp | 15 +-- core/fpdfapi/parser/cpdf_document.cpp | 10 +- core/fpdfapi/parser/cpdf_layer_document.cpp | 22 ++++- .../parser/cpdf_layer_document_unittest.cpp | 83 ++++++++++++++++ fpdfsdk/fpdf_view_embeddertest.cpp | 97 +++++++++++++++++++ 5 files changed, 211 insertions(+), 16 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 025c9b1ff2..2dee5f5aa8 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -544,6 +544,7 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { } } + RetainPtr current_info = document_->GetInfo(); if (parser_) { CPDF_DictionaryLocker locker(parser_->GetCombinedTrailer()); for (const auto& it : locker) { @@ -552,7 +553,7 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { if (key == "Encrypt" || key == "Size" || key == "Filter" || key == "Index" || key == "Length" || key == "Prev" || key == "W" || key == "XRefStm" || key == "ID" || key == "DecodeParms" || - key == "Type") { + key == "Type" || (key == "Info" && current_info)) { continue; } if (!archive_->WriteString(("/")) || @@ -569,12 +570,12 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { !archive_->WriteString(" 0 R\r\n")) { return Stage::kInvalid; } - if (document_->GetInfo()) { - if (!archive_->WriteString("/Info ") || - !archive_->WriteDWord(document_->GetInfo()->GetObjNum()) || - !archive_->WriteString(" 0 R\r\n")) { - return Stage::kInvalid; - } + } + if (current_info && current_info->GetObjNum() != 0) { + if (!archive_->WriteString("/Info ") || + !archive_->WriteDWord(current_info->GetObjNum()) || + !archive_->WriteString(" 0 R\r\n")) { + return Stage::kInvalid; } } if (encrypt_dict_) { diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index e51bf4f8e0..2a1e5dca34 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -724,12 +724,10 @@ RetainPtr CPDF_Document::GetMutableInfo() { } RetainPtr CPDF_Document::GetOrCreateInfo() { - if (info_dict_) { - return info_dict_; - } - - // If parser already has an Info object, reuse it (this populates info_dict_). - if (RetainPtr existing = GetInfo()) { + // If the document already has an Info object, return the mutable view of it. + // Layer documents override GetMutableInfo() to promote the base /Info into + // the layer overlay before returning it. + if (RetainPtr existing = GetMutableInfo()) { return existing; } diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index 11b232118c..aa2f3f0fa2 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -119,11 +119,13 @@ RetainPtr CPDF_LayerDocument::GetMutableRoot() { } RetainPtr CPDF_LayerDocument::GetMutableInfo() { - CPDF_Parser* parser = base_->GetParser(); - const uint32_t info_objnum = parser ? parser->GetInfoObjNum() : 0; - if (!info_objnum || info_objnum == CPDF_Object::kInvalidObjNum) { + RetainPtr current_info = GetInfo(); + if (!current_info) { return nullptr; } + const uint32_t info_objnum = current_info->GetObjNum(); + DCHECK_NE(CPDF_Object::kInvalidObjNum, info_objnum); + DCHECK_NE(0u, info_objnum); RetainPtr live = GetMutableIndirectObject(info_objnum); RetainPtr info = live ? pdfium::WrapRetain(live->AsMutableDictionary()) : nullptr; @@ -328,6 +330,20 @@ void CPDF_LayerDocument::IngestCurrentDelta() { if (FindLocalIndirectObject(base_parser->GetInfoObjNum())) { InvalidateCachedInfoDict(); } + const uint32_t delta_info_objnum = parser.GetInfoObjNum(); + if (delta_info_objnum && delta_info_objnum != CPDF_Object::kInvalidObjNum && + delta_info_objnum != base_parser->GetInfoObjNum()) { + RetainPtr local_info = + FindLocalIndirectObject(delta_info_objnum); + RetainPtr info = + local_info ? pdfium::WrapRetain(local_info->AsMutableDictionary()) + : nullptr; + if (!info) { + FailDeltaIngest(OpenStatus::kMalformedDelta); + return; + } + SetCachedInfoDict(info); + } if (selected_delta_object_count > 0 && !RebuildPageListFromCurrentPageTree()) { FailDeltaIngest(OpenStatus::kMalformedDelta); diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp index 614bd8b069..0b1880226c 100644 --- a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -22,6 +22,7 @@ #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" #include "core/fxcrt/cfx_read_only_span_stream.h" #include "core/fxcrt/fx_stream.h" #include "core/fxcrt/retain_ptr.h" @@ -98,6 +99,35 @@ std::string BuildSimplePdf() { return pdf.str(); } +std::string BuildSimplePdfWithInfo() { + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100] >>\n" + "endobj\n", + "4 0 obj\n<< /Title (Base Title) >>\nendobj\n", + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R /Info 4 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + std::string BuildPdfWithDirectResources() { const std::vector objects = { "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", @@ -392,6 +422,59 @@ TEST_F(CPDFLayerDocumentTest, CrossHandleReadRefreshesAfterPagePromotion) { base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Bar")); } +TEST_F(CPDFLayerDocumentTest, GetOrCreateInfoPromotesBaseInfo) { + const std::string pdf = BuildSimplePdfWithInfo(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + ASSERT_TRUE(base->GetInfo()); + EXPECT_EQ("Base Title", base->GetInfo()->GetUnicodeTextFor("Title").ToUTF8()); + + auto layer_a = std::make_unique(base, nullptr); + auto layer_b = std::make_unique(base, nullptr); + EXPECT_EQ(0u, layer_a->GetPromotedObjectCount()); + EXPECT_EQ(0u, layer_b->GetPromotedObjectCount()); + + RetainPtr info = layer_a->GetOrCreateInfo(); + ASSERT_TRUE(info); + EXPECT_EQ(4u, info->GetObjNum()); + EXPECT_EQ(1u, layer_a->GetPromotedObjectCount()); + EXPECT_TRUE(layer_a->FindPromotedObject(4)); + EXPECT_NE(base->GetFrozenObjectForLayer(4).Get(), info.Get()); + + info->SetNewFor("Title", "Layer A Title"); + + EXPECT_EQ("Layer A Title", + layer_a->GetInfo()->GetUnicodeTextFor("Title").ToUTF8()); + EXPECT_EQ("Base Title", + layer_b->GetInfo()->GetUnicodeTextFor("Title").ToUTF8()); + EXPECT_EQ("Base Title", base->GetInfo()->GetUnicodeTextFor("Title").ToUTF8()); + EXPECT_EQ(0u, layer_b->GetPromotedObjectCount()); +} + +TEST_F(CPDFLayerDocumentTest, + GetOrCreateInfoCreatesLayerLocalInfoWhenBaseHasNone) { + const std::string pdf = BuildSimplePdf(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + EXPECT_FALSE(base->GetInfo()); + + auto layer = std::make_unique(base, nullptr); + EXPECT_FALSE(layer->GetInfo()); + EXPECT_EQ(0u, layer->GetPromotedObjectCount()); + + RetainPtr info = layer->GetOrCreateInfo(); + ASSERT_TRUE(info); + EXPECT_NE(0u, info->GetObjNum()); + EXPECT_EQ(info.Get(), layer->FindPromotedObject(info->GetObjNum()).Get()); + EXPECT_EQ(1u, layer->GetPromotedObjectCount()); + + info->SetNewFor("Title", "Layer Title"); + + EXPECT_EQ("Layer Title", + layer->GetInfo()->GetUnicodeTextFor("Title").ToUTF8()); + EXPECT_FALSE(base->GetInfo()); +} + TEST_F(CPDFLayerDocumentTest, DirectResourcesPromoteOwningPage) { const std::string pdf = BuildPdfWithDirectResources(); RetainPtr base = LoadBaseDocumentFromString(pdf); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 1a09fb074f..a995d382d0 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -1426,6 +1426,103 @@ TEST_F(FPDFViewEmbedderTest, ReadOnlySiblingLayersStayEmptyAfterPeerMutates) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerMetadataUpdatePromotesInfoAndSavesDelta) { + FileAccessForTesting base_access("bug_601362.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status_a = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_a( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_a)); + ASSERT_TRUE(layer_a); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_a); + + EPDFLayerOpenStatus status_b = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_b( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_b)); + ASSERT_TRUE(layer_b); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_b); + + unsigned short buf[128]; + ASSERT_EQ(30u, FPDF_GetMetaText(layer_a.get(), "Creator", buf, sizeof(buf))); + EXPECT_EQ(L"Microsoft Word", GetPlatformWString(buf)); + ASSERT_EQ(30u, FPDF_GetMetaText(layer_b.get(), "Creator", buf, sizeof(buf))); + EXPECT_EQ(L"Microsoft Word", GetPlatformWString(buf)); + + ScopedFPDFWideString layer_creator = GetFPDFWideString(L"Layer A Creator"); + ASSERT_TRUE(EPDF_SetMetaText(layer_a.get(), "Creator", layer_creator.get())); + EXPECT_EQ(1u, EPDFLayer_GetPromotedObjectCount(layer_a.get())); + + ASSERT_EQ(32u, FPDF_GetMetaText(layer_a.get(), "Creator", buf, sizeof(buf))); + EXPECT_EQ(L"Layer A Creator", GetPlatformWString(buf)); + ASSERT_EQ(30u, FPDF_GetMetaText(layer_b.get(), "Creator", buf, sizeof(buf))); + EXPECT_EQ(L"Microsoft Word", GetPlatformWString(buf)); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer_b.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_a.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta = GetString(); + EXPECT_FALSE(delta.empty()); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ASSERT_EQ(32u, FPDF_GetMetaText(replayed.get(), "Creator", buf, sizeof(buf))); + EXPECT_EQ(L"Layer A Creator", GetPlatformWString(buf)); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LayerMetadataUpdateCreatesInfoWhenBaseHasNone) { + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + unsigned short buf[128]; + EXPECT_EQ(0u, FPDF_GetMetaText(layer.get(), "Title", buf, sizeof(buf))); + + ScopedFPDFWideString title = GetFPDFWideString(L"Layer Title"); + ASSERT_TRUE(EPDF_SetMetaText(layer.get(), "Title", title.get())); + EXPECT_EQ(1u, EPDFLayer_GetPromotedObjectCount(layer.get())); + ASSERT_EQ(24u, FPDF_GetMetaText(layer.get(), "Title", buf, sizeof(buf))); + EXPECT_EQ(L"Layer Title", GetPlatformWString(buf)); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta = GetString(); + EXPECT_FALSE(delta.empty()); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ASSERT_EQ(24u, FPDF_GetMetaText(replayed.get(), "Title", buf, sizeof(buf))); + EXPECT_EQ(L"Layer Title", GetPlatformWString(buf)); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From 06594e0ef50a7f7a6d251aa0497bc171f8c37b02 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 2 Jun 2026 21:49:30 +0300 Subject: [PATCH 31/56] Move pending security into CPDF_Document Embed pending security state inside CPDF_Document instead of using a global map and mutex. Add PendingSecurity struct, enum, and Set/Get/Clear methods to CPDF_Document; store an optional pending_security_ member. Update EPDF_SetEncryption/EPDF_RemoveEncryption and DoDocSave to use the document-owned pending state and remove the fpdfsdk_pending_security global storage and headers. Add a test to validate removal-of-encryption round-trip using the document-owned pending state. Cleanup includes and references to the deleted pending security header. --- core/fpdfapi/parser/cpdf_document.cpp | 13 +++++++ core/fpdfapi/parser/cpdf_document.h | 15 ++++++++ fpdfsdk/fpdf_save.cpp | 32 +++++++--------- fpdfsdk/fpdf_save_embeddertest.cpp | 21 ++++++++++ fpdfsdk/fpdf_view.cpp | 55 +++++++-------------------- fpdfsdk/fpdfsdk_pending_security.h | 37 ------------------ 6 files changed, 75 insertions(+), 98 deletions(-) delete mode 100644 fpdfsdk/fpdfsdk_pending_security.h diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 2a1e5dca34..9924a925ba 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -496,6 +496,19 @@ bool CPDF_Document::IsModifiedAPStream(const CPDF_Stream* stream) const { pdfium::Contains(modified_apstream_ids_, stream->GetObjNum()); } +void CPDF_Document::SetPendingSecurity(PendingSecurity pending) { + pending_security_ = std::move(pending); +} + +const CPDF_Document::PendingSecurity* CPDF_Document::GetPendingSecurity() + const { + return pending_security_ ? &pending_security_.value() : nullptr; +} + +void CPDF_Document::ClearPendingSecurity() { + pending_security_.reset(); +} + RetainPtr CPDF_Document::FindPromotedObject( uint32_t objnum) const { return nullptr; diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 0a02dfcea0..c47e7f8c6d 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -8,12 +8,14 @@ #define CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ #include +#include #include #include #include #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_security_handler.h" #include "core/fxcrt/fx_memory.h" #include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/retain_ptr.h" @@ -81,6 +83,14 @@ class CPDF_Document : public Observable, UnownedPtr doc_; }; + enum class PendingSecurityMode { kNone, kEncrypt, kRemove }; + + struct PendingSecurity { + PendingSecurityMode mode = PendingSecurityMode::kNone; + RetainPtr encrypt_dict; + RetainPtr security_handler; + }; + static constexpr int kPageMaxNum = 0xFFFFF; static bool IsValidPageObject(const CPDF_Object* obj); @@ -145,6 +155,10 @@ class CPDF_Document : public Observable, // Returns whether CreateModifiedAPStream() created `stream`. bool IsModifiedAPStream(const CPDF_Stream* stream) const; + void SetPendingSecurity(PendingSecurity pending); + const PendingSecurity* GetPendingSecurity() const; + void ClearPendingSecurity(); + // Returns whether `objnum` has been promoted from its base storage into a // document overlay. Always false for ordinary documents. virtual RetainPtr FindPromotedObject(uint32_t objnum) const; @@ -249,6 +263,7 @@ class CPDF_Document : public Observable, std::unique_ptr codec_context_; std::unique_ptr links_context_; std::set modified_apstream_ids_; + std::optional pending_security_; std::vector page_list_; // Page number to page's dict objnum. // Must be second to last. diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp index d82567c8e2..3ed555cdd2 100644 --- a/fpdfsdk/fpdf_save.cpp +++ b/fpdfsdk/fpdf_save.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include @@ -31,7 +30,6 @@ #include "core/fxcrt/stl_util.h" #include "fpdfsdk/cpdfsdk_filewriteadapter.h" #include "fpdfsdk/cpdfsdk_helpers.h" -#include "fpdfsdk/fpdfsdk_pending_security.h" #include "public/fpdf_edit.h" #ifdef PDF_ENABLE_XFA @@ -199,23 +197,19 @@ bool DoDocSave(FPDF_DOCUMENT document, CPDF_Creator file_maker( doc, pdfium::MakeRetain(file_write)); - // Apply pending security state - { - std::lock_guard lock(GetPendingSecurityMutex()); - auto& pending_security = GetPendingSecurityMap(); - auto it = pending_security.find(document); - if (it != pending_security.end()) { - if (it->second.mode == PendingSecurityMode::kRemove) { - flags |= FPDF_REMOVE_SECURITY; - } else if (it->second.mode == PendingSecurityMode::kEncrypt) { - // SetEncryption sets both: - // 1. encrypt_dict_ - so /Encrypt reference is written to trailer - // 2. security_handler_ - so GetCryptoHandler() encrypts streams/strings - file_maker.SetEncryption(it->second.encrypt_dict, - it->second.security_handler); - } - // Don't erase from map here - leave for cleanup on doc close - // This allows multiple saves of the same encrypted doc + // Apply document-owned pending security state. It stays on the document so + // repeated saves use the same requested encryption/removal policy until the + // caller changes it or closes the document. + if (const CPDF_Document::PendingSecurity* pending = + doc->GetPendingSecurity()) { + if (pending->mode == CPDF_Document::PendingSecurityMode::kRemove) { + flags |= FPDF_REMOVE_SECURITY; + } else if (pending->mode == CPDF_Document::PendingSecurityMode::kEncrypt) { + // SetEncryption sets both: + // 1. encrypt_dict_ - so /Encrypt reference is written to trailer + // 2. security_handler_ - so GetCryptoHandler() encrypts streams/strings + file_maker.SetEncryption(pending->encrypt_dict, + pending->security_handler); } } diff --git a/fpdfsdk/fpdf_save_embeddertest.cpp b/fpdfsdk/fpdf_save_embeddertest.cpp index 30583b56ee..f880ab3477 100644 --- a/fpdfsdk/fpdf_save_embeddertest.cpp +++ b/fpdfsdk/fpdf_save_embeddertest.cpp @@ -199,6 +199,27 @@ TEST_F(FPDFSaveEmbedderTest, SetEncryptionRoundTripsWithInlineEncryptDict) { ASSERT_TRUE(bitmap); } +TEST_F(FPDFSaveEmbedderTest, RemoveEncryptionUsesDocumentOwnedPendingState) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + ASSERT_TRUE(EPDF_SetEncryption(document(), "user", "owner", + EPDF_PERM_PRINT | EPDF_PERM_COPY)); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + + { + ScopedSavedDoc encrypted_doc = OpenScopedSavedDocumentWithPassword("user"); + ASSERT_TRUE(encrypted_doc); + ASSERT_TRUE(EPDF_IsEncrypted(encrypted_doc.get())); + + ClearString(); + ASSERT_TRUE(EPDF_RemoveEncryption(encrypted_doc.get())); + ASSERT_TRUE(FPDF_SaveAsCopy(encrypted_doc.get(), this, 0)); + } + + ScopedSavedDoc decrypted_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(decrypted_doc); + EXPECT_FALSE(EPDF_IsEncrypted(decrypted_doc.get())); +} + TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocNoIncremental) { ASSERT_TRUE(OpenDocument("hello_world.pdf")); EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, FPDF_NO_INCREMENTAL, 14)); diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index c5cc0300a4..04686a6b7c 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -8,9 +8,7 @@ #include #include -#include #include -#include #include #include @@ -66,7 +64,6 @@ #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_pageview.h" #include "fpdfsdk/cpdfsdk_renderpage.h" -#include "fpdfsdk/fpdfsdk_pending_security.h" #include "fxjs/ijs_runtime.h" #include "public/fpdf_formfill.h" @@ -117,26 +114,6 @@ static_assert(static_cast(CFX_DefaultRenderDevice::RendererType::kSkia) == FPDF_RENDERERTYPE_SKIA); #endif // defined(PDF_USE_SKIA) -// Storage for pending security state (declared in fpdfsdk_pending_security.h). -// Both the mutex and the map are intentionally leaked behind function-local -// statics to avoid the static destruction order fiasco. -std::mutex& GetPendingSecurityMutex() { - static std::mutex* mutex = new std::mutex; - return *mutex; -} - -std::unordered_map& GetPendingSecurityMap() { - static auto* pending_security = - new std::unordered_map; - return *pending_security; -} - -// Helper to cleanup pending security on document close -void EPDF_CleanupPendingSecurity(FPDF_DOCUMENT doc) { - std::lock_guard lock(GetPendingSecurityMutex()); - GetPendingSecurityMap().erase(doc); -} - namespace { bool g_bLibraryInitialized = false; @@ -557,15 +534,11 @@ EPDF_SetEncryption(FPDF_DOCUMENT document, return false; } - // Store (OVERWRITE if exists - allows changing password multiple times) - { - std::lock_guard lock(GetPendingSecurityMutex()); - PendingSecurity pending; - pending.mode = PendingSecurityMode::kEncrypt; - pending.encrypt_dict = std::move(pEncryptDict); - pending.security_handler = std::move(pSecurityHandler); - GetPendingSecurityMap()[document] = std::move(pending); - } + CPDF_Document::PendingSecurity pending; + pending.mode = CPDF_Document::PendingSecurityMode::kEncrypt; + pending.encrypt_dict = std::move(pEncryptDict); + pending.security_handler = std::move(pSecurityHandler); + pDoc->SetPendingSecurity(std::move(pending)); return true; } @@ -576,13 +549,14 @@ EPDF_RemoveEncryption(FPDF_DOCUMENT document) { return false; } - // Set pending security to removal mode - // This will cause RemoveSecurity() to be called during save - std::lock_guard lock(GetPendingSecurityMutex()); - PendingSecurity pending; - pending.mode = PendingSecurityMode::kRemove; - // encrypt_dict and security_handler remain null for removal - GetPendingSecurityMap()[document] = std::move(pending); + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) { + return false; + } + + CPDF_Document::PendingSecurity pending; + pending.mode = CPDF_Document::PendingSecurityMode::kRemove; + pDoc->SetPendingSecurity(std::move(pending)); return true; } @@ -1370,9 +1344,6 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_ClosePage(FPDF_PAGE page) { } FPDF_EXPORT void FPDF_CALLCONV FPDF_CloseDocument(FPDF_DOCUMENT document) { - // Cleanup pending security BEFORE deletion - EPDF_CleanupPendingSecurity(document); - // Take it back across the API and throw it away, std::unique_ptr(CPDFDocumentFromFPDFDocument(document)); } diff --git a/fpdfsdk/fpdfsdk_pending_security.h b/fpdfsdk/fpdfsdk_pending_security.h deleted file mode 100644 index b8e85d1a98..0000000000 --- a/fpdfsdk/fpdfsdk_pending_security.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The PDFium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FPDFSDK_FPDFSDK_PENDING_SECURITY_H_ -#define FPDFSDK_FPDFSDK_PENDING_SECURITY_H_ - -#include -#include - -#include "core/fpdfapi/parser/cpdf_dictionary.h" -#include "core/fpdfapi/parser/cpdf_security_handler.h" -#include "core/fxcrt/retain_ptr.h" -#include "public/fpdfview.h" - -// Experimental EmbedPDF Extension: pending security state shared between -// fpdf_view.cpp (writers: EPDF_SetEncryption / EPDF_RemoveEncryption / -// EPDF_CleanupPendingSecurity) and fpdf_save.cpp (reader: DoDocSave). -// -// The storage is keyed by FPDF_DOCUMENT handle and protected by a mutex. -// Both the mutex and the map are intentionally leaked (heap-allocated behind -// function-local statics) to avoid the static destruction order fiasco -- the -// map holds RetainPtr<> handles to PDFium objects whose destructors must not -// race with process shutdown of other globals. - -enum class PendingSecurityMode { kNone, kEncrypt, kRemove }; - -struct PendingSecurity { - PendingSecurityMode mode = PendingSecurityMode::kNone; - RetainPtr encrypt_dict; // Only for kEncrypt - RetainPtr security_handler; // Only for kEncrypt -}; - -std::mutex& GetPendingSecurityMutex(); -std::unordered_map& GetPendingSecurityMap(); - -#endif // FPDFSDK_FPDFSDK_PENDING_SECURITY_H_ From f87f6b65fa92aec2354be1bed3d52f9efe9f0d47 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 2 Jun 2026 23:24:34 +0300 Subject: [PATCH 32/56] Add optional thread-local globals and thread-soak test Introduce optional per-thread PDFium globals to support a thread-confined runtime for server worker pools. Adds core/fxcrt/epdf_tls.h (EPDF_TLS) and converts numerous process-global singletons to be thread-local when embedpdf_thread_local_globals is enabled. Exposes EPDF_InitThread/EPDF_ShutdownThread as lifecycle entry points, makes localtime usage thread-safe, and adjusts RNG/errno/timer/render/color/font/module globals accordingly. Adds a thread-soak test harness (testing/tools:epdf_thread_soak), build/test scripts (scripts/embedpdf-runtime/*), GN flag (embedpdf_thread_local_globals) and a GitHub Actions workflow (pdfium-tsan-thread-soak.yml) to run the TSAN-backed soak. Default behavior remains unchanged (flag off) so builds are byte-for-byte compatible unless explicitly enabled. --- .github/workflows/pdfium-tsan-thread-soak.yml | 79 ++++++++ BUILD.gn | 11 ++ core/fpdfapi/edit/cpdf_creator.cpp | 11 +- core/fpdfapi/font/cpdf_fontglobals.cpp | 5 +- core/fpdfapi/page/cpdf_colorspace.cpp | 5 +- .../fpdfapi/page/cpdf_streamcontentparser.cpp | 5 +- core/fpdfapi/render/cpdf_renderstatus.cpp | 5 +- core/fxcodec/icc/icc_transform.cpp | 16 ++ core/fxcrt/cfx_timer.cpp | 7 +- core/fxcrt/epdf_tls.h | 30 +++ core/fxcrt/fx_extension.cpp | 16 +- core/fxcrt/fx_random.cpp | 7 +- core/fxcrt/fx_system.cpp | 5 +- core/fxge/cfx_gemodule.cpp | 6 +- fpdfsdk/BUILD.gn | 1 + fpdfsdk/cpdfsdk_helpers.cpp | 12 ++ fpdfsdk/epdf_threading.cpp | 30 +++ fpdfsdk/fpdf_view.cpp | 5 +- fpdfsdk/fpdf_view_c_api_test.c | 2 + pdfium.gni | 8 + public/fpdf_ext.h | 5 +- public/fpdfview.h | 18 ++ scripts/embedpdf-runtime/build-target.sh | 12 ++ scripts/embedpdf-runtime/test-target.sh | 6 + .../embedpdf-runtime/thread-soak-target.sh | 101 ++++++++++ testing/tools/BUILD.gn | 14 ++ testing/tools/epdf_thread_soak.cpp | 187 ++++++++++++++++++ 27 files changed, 594 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/pdfium-tsan-thread-soak.yml create mode 100644 core/fxcrt/epdf_tls.h create mode 100644 fpdfsdk/epdf_threading.cpp create mode 100755 scripts/embedpdf-runtime/thread-soak-target.sh create mode 100644 testing/tools/epdf_thread_soak.cpp diff --git a/.github/workflows/pdfium-tsan-thread-soak.yml b/.github/workflows/pdfium-tsan-thread-soak.yml new file mode 100644 index 0000000000..e4347fc457 --- /dev/null +++ b/.github/workflows/pdfium-tsan-thread-soak.yml @@ -0,0 +1,79 @@ +name: PDFium TSAN Thread Soak + +on: + workflow_dispatch: + inputs: + ref: + description: Git ref to test + required: false + default: embedpdf/main + pdf_path: + description: PDF fixture to render during the soak + required: false + default: testing/resources/hello_world.pdf + threads: + description: Number of worker threads + required: false + default: '2' + iterations: + description: Iterations per worker thread + required: false + default: '2' + +permissions: + contents: read + +jobs: + tsan-thread-soak: + name: Linux x64 TSAN thread soak + runs-on: ubuntu-24.04 + timeout-minutes: 90 + env: + PDF_RUNTIME_SYNC: auto + PDF_RUNTIME_TARGET_OS_LIST: linux + EMBEDPDF_TLS_GLOBALS: true + EMBEDPDF_TSAN: 1 + PDF_PATH: ${{ inputs.pdf_path }} + SOAK_THREADS: ${{ inputs.threads }} + SOAK_ITERATIONS: ${{ inputs.iterations }} + SOAK_OUT: out/embedpdf-runtime-thread-soak-linux-x64 + + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ inputs.ref || github.ref_name }} + + - name: Install depot_tools + shell: bash + run: | + git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git "$RUNNER_TEMP/depot_tools" + echo "$RUNNER_TEMP/depot_tools" >> "$GITHUB_PATH" + + - name: Install Linux base deps + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends cmake clang lld curl g++ ninja-build pkg-config tar + + - name: Run TSAN thread soak + shell: bash + run: | + set -euo pipefail + mkdir -p "$SOAK_OUT" + scripts/embedpdf-runtime/thread-soak-target.sh \ + linux-x64 \ + "$PDF_PATH" \ + -- \ + --threads="$SOAK_THREADS" \ + --iterations="$SOAK_ITERATIONS" \ + 2>&1 | tee "$SOAK_OUT/thread-soak.log" + + - name: Upload TSAN logs + if: always() + uses: actions/upload-artifact@v6 + with: + name: pdfium-tsan-thread-soak-logs + path: | + out/embedpdf-runtime-thread-soak-linux-x64/thread-soak.log + out/embedpdf-runtime-thread-soak-linux-x64/args.gn + if-no-files-found: ignore diff --git a/BUILD.gn b/BUILD.gn index fbdb13a4e3..3ba3799196 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -51,6 +51,13 @@ config("pdfium_common_config") { defines += [ "PDF_USE_PARTITION_ALLOC" ] } + # EmbedPDF: thread-confined runtime. Translates the embedpdf_thread_local_globals + # GN arg into the EPDF_THREAD_LOCAL_GLOBALS define consumed by EPDF_TLS + # (core/fxcrt/epdf_tls.h). Default off; see pdfium.gni. + if (embedpdf_thread_local_globals) { + defines += [ "EPDF_THREAD_LOCAL_GLOBALS" ] + } + if (is_win) { # Assume UTF-8 by default to avoid code page dependencies. cflags += [ "/utf-8" ] @@ -191,6 +198,7 @@ source_set("pdfium_public_headers_impl") { sources = [ "public/cpp/fpdf_deleters.h", "public/cpp/fpdf_scopers.h", + "public/epdf_redact.h", "public/fpdf_annot.h", "public/fpdf_attachment.h", "public/fpdf_catalog.h", @@ -431,6 +439,9 @@ group("pdfium_all") { ":pdfium_unittests", "testing:pdfium_test", "testing/fuzzers", + "testing/tools:epdf_layer_memory_benchmark", + "testing/tools:epdf_layer_replay_soak", + "testing/tools:epdf_thread_soak", ] if (pdf_is_standalone) { diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 2dee5f5aa8..8346b2a278 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -545,6 +545,11 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { } RetainPtr current_info = document_->GetInfo(); + const uint32_t current_info_objnum = + current_info ? current_info->GetObjNum() : 0; + const uint32_t parser_info_objnum = parser_ ? parser_->GetInfoObjNum() : 0; + const bool should_write_current_info = + current_info_objnum != 0 && current_info_objnum != parser_info_objnum; if (parser_) { CPDF_DictionaryLocker locker(parser_->GetCombinedTrailer()); for (const auto& it : locker) { @@ -553,7 +558,7 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { if (key == "Encrypt" || key == "Size" || key == "Filter" || key == "Index" || key == "Length" || key == "Prev" || key == "W" || key == "XRefStm" || key == "ID" || key == "DecodeParms" || - key == "Type" || (key == "Info" && current_info)) { + key == "Type" || (key == "Info" && should_write_current_info)) { continue; } if (!archive_->WriteString(("/")) || @@ -571,9 +576,9 @@ CPDF_Creator::Stage CPDF_Creator::WriteDoc_Stage4() { return Stage::kInvalid; } } - if (current_info && current_info->GetObjNum() != 0) { + if (should_write_current_info) { if (!archive_->WriteString("/Info ") || - !archive_->WriteDWord(current_info->GetObjNum()) || + !archive_->WriteDWord(current_info_objnum) || !archive_->WriteString(" 0 R\r\n")) { return Stage::kInvalid; } diff --git a/core/fpdfapi/font/cpdf_fontglobals.cpp b/core/fpdfapi/font/cpdf_fontglobals.cpp index bd57de4cfd..17f3b48c02 100644 --- a/core/fpdfapi/font/cpdf_fontglobals.cpp +++ b/core/fpdfapi/font/cpdf_fontglobals.cpp @@ -18,10 +18,13 @@ #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/check.h" #include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/epdf_tls.h" namespace { -CPDF_FontGlobals* g_FontGlobals = nullptr; +// EmbedPDF: thread-confined runtime - each worker thread owns its own font +// globals (stock fonts + predefined CMaps), created/destroyed on that thread. +EPDF_TLS CPDF_FontGlobals* g_FontGlobals = nullptr; RetainPtr LoadPredefinedCMap(ByteStringView name) { if (!name.IsEmpty() && name[0] == '/') { diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp index e49d7af436..186fe40b55 100644 --- a/core/fpdfapi/page/cpdf_colorspace.cpp +++ b/core/fpdfapi/page/cpdf_colorspace.cpp @@ -38,6 +38,7 @@ #include "core/fxcrt/check_op.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fx_2d_size.h" #include "core/fxcrt/fx_safe_types.h" @@ -450,7 +451,9 @@ class StockColorSpaces { RetainPtr pattern_; }; -StockColorSpaces* g_stock_colorspaces = nullptr; +// EmbedPDF: thread-confined runtime - per-thread stock device colorspaces +// (gray/rgb/cmyk/pattern), created/destroyed on the owning thread. +EPDF_TLS StockColorSpaces* g_stock_colorspaces = nullptr; } // namespace diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 64f366c2fc..b22e4c8d7c 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -42,6 +42,7 @@ #include "core/fxcrt/check.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/scoped_set_insertion.h" #include "core/fxcrt/span.h" @@ -68,7 +69,9 @@ const char kPathOperatorClosePath = 'h'; const char kPathOperatorRectangle[] = "re"; using OpCodes = std::map; -OpCodes* g_opcodes = nullptr; +// EmbedPDF: thread-confined runtime - per-thread content-operator dispatch +// table, lazily built and torn down on the owning thread. +EPDF_TLS OpCodes* g_opcodes = nullptr; CFX_FloatRect GetShadingBBox(CPDF_ShadingPattern* pShading, const CFX_Matrix& matrix) { diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index 8494f1c615..8485bc5db4 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -55,6 +55,7 @@ #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/data_vector.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_2d_size.h" #include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/fx_system.h" @@ -80,7 +81,9 @@ namespace { constexpr int kRenderMaxRecursionDepth = 64; -int g_CurrentRecursionDepth = 0; +// EmbedPDF: thread-confined runtime - per-thread render recursion counter so +// concurrent renders on different workers don't corrupt each other's depth. +EPDF_TLS int g_CurrentRecursionDepth = 0; CFX_FillRenderOptions GetFillOptionsForDrawPathWithBlend( const CPDF_RenderOptions::Options& options, diff --git a/core/fxcodec/icc/icc_transform.cpp b/core/fxcodec/icc/icc_transform.cpp index 0cd02e7b2f..fad316a265 100644 --- a/core/fxcodec/icc/icc_transform.cpp +++ b/core/fxcodec/icc/icc_transform.cpp @@ -20,6 +20,22 @@ namespace fxcodec { namespace { +// EmbedPDF: thread-confined runtime - LCMS verification gate. +// +// The cms* calls below (cmsOpenProfileFromMem, cmsCreate_sRGBProfile, +// cmsCreateTransform, cmsDoTransform, ...) use the default/null cmsContext, +// which is a process-global in lcms2. We intentionally do NOT rewrite this for +// the first thread_local slice: per-profile/per-transform work on the default +// context is independent across threads in practice, and our workers create +// and use their own profiles/transforms. +// +// Gate (not a code change): run the threaded soak (testing/tools:epdf_thread_ +// soak) under ThreadSanitizer with ICC-heavy PDFs before lifting the server +// pool cap. If TSAN flags contention/races in the default context, move to a +// per-thread cmsContext via cmsCreateContext + the cms*THR APIs (or guard +// transform creation with a mutex). Do not enable ICC-heavy concurrency in +// production until this gate is green. + // For use with std::unique_ptr. struct CmsProfileDeleter { inline void operator()(cmsHPROFILE p) { cmsCloseProfile(p); } diff --git a/core/fxcrt/cfx_timer.cpp b/core/fxcrt/cfx_timer.cpp index 658f39a373..48fa5a07da 100644 --- a/core/fxcrt/cfx_timer.cpp +++ b/core/fxcrt/cfx_timer.cpp @@ -9,11 +9,16 @@ #include #include "core/fxcrt/check.h" +#include "core/fxcrt/epdf_tls.h" namespace { using TimerMap = std::map; -TimerMap* g_pwl_timer_map = nullptr; +// EmbedPDF: thread-confined runtime - per-thread timer map. The PWL timer +// subsystem is inactive in headless server rendering, but the global is still +// made per-thread so per-thread InitializeGlobals()/DestroyGlobals() (and the +// CHECK(!g_pwl_timer_map) inside Init) hold independently on each worker. +EPDF_TLS TimerMap* g_pwl_timer_map = nullptr; } // namespace diff --git a/core/fxcrt/epdf_tls.h b/core/fxcrt/epdf_tls.h new file mode 100644 index 0000000000..bca3c6eba3 --- /dev/null +++ b/core/fxcrt/epdf_tls.h @@ -0,0 +1,30 @@ +// Copyright 2025 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// EmbedPDF: thread-confined runtime support. +// +// EPDF_TLS expands to `thread_local` when the build is configured with the +// `embedpdf_thread_local_globals` GN arg (which defines +// EPDF_THREAD_LOCAL_GLOBALS), and to nothing otherwise. It is used to give +// each worker thread its own copy of PDFium's process-global singletons so +// that N threads can run shared-nothing in a single process. +// +// Contract: a thread that touches any EPDF_TLS-backed global must initialize +// PDFium on that thread (EPDF_InitThread), use only handles created on that +// thread, and tear down on the same thread (EPDF_ShutdownThread). PDFium +// handles must never cross threads. +// +// Default (flag off) keeps every global as an ordinary process-global, so +// targets that do not opt in and upstream rebases are byte-for-byte unchanged. + +#ifndef CORE_FXCRT_EPDF_TLS_H_ +#define CORE_FXCRT_EPDF_TLS_H_ + +#if defined(EPDF_THREAD_LOCAL_GLOBALS) +#define EPDF_TLS thread_local +#else +#define EPDF_TLS +#endif + +#endif // CORE_FXCRT_EPDF_TLS_H_ diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp index 28b4825b40..91c2151a94 100644 --- a/core/fxcrt/fx_extension.cpp +++ b/core/fxcrt/fx_extension.cpp @@ -6,6 +6,7 @@ #include "core/fxcrt/fx_extension.h" +#include #include #include @@ -24,7 +25,20 @@ time_t DefaultTimeFunction() { } struct tm* DefaultLocaltimeFunction(const time_t* tp) { - return localtime(tp); + // EmbedPDF: thread-confined runtime. Plain localtime() returns a pointer to + // shared static storage, which is a data race across worker threads. Fill a + // thread_local tm via the reentrant localtime_r/localtime_s instead so each + // thread gets its own result. struct tm is trivially destructible, so the + // thread_local adds no per-thread teardown cost. + thread_local struct tm result; +#if defined(_WIN32) + if (localtime_s(&result, tp) != 0) { + return nullptr; + } + return &result; +#else + return localtime_r(tp, &result); +#endif } time_t (*g_time_func)() = DefaultTimeFunction; diff --git a/core/fxcrt/fx_random.cpp b/core/fxcrt/fx_random.cpp index c0733698c9..ea0b63e447 100644 --- a/core/fxcrt/fx_random.cpp +++ b/core/fxcrt/fx_random.cpp @@ -9,6 +9,7 @@ #include #include "build/build_config.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_memory.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" @@ -33,8 +34,10 @@ struct MTContext { std::array mt; }; -bool g_bHaveGlobalSeed = false; -uint32_t g_nGlobalSeed = 0; +// EmbedPDF: thread-confined runtime - per-thread RNG seed state so concurrent +// workers don't race on the lazy global-seed initialization. +EPDF_TLS bool g_bHaveGlobalSeed = false; +EPDF_TLS uint32_t g_nGlobalSeed = 0; #if BUILDFLAG(IS_WIN) bool GenerateSeedFromCryptoRandom(uint32_t* pSeed) { diff --git a/core/fxcrt/fx_system.cpp b/core/fxcrt/fx_system.cpp index d5c00af4df..ff3a72d38f 100644 --- a/core/fxcrt/fx_system.cpp +++ b/core/fxcrt/fx_system.cpp @@ -12,12 +12,15 @@ #include "build/build_config.h" #include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_extension.h" namespace { #if !BUILDFLAG(IS_WIN) -uint32_t g_last_error = 0; +// EmbedPDF: thread-confined runtime - per-thread last-error, written during +// parse/render and read back by FPDF_GetLastError on the same thread. +EPDF_TLS uint32_t g_last_error = 0; #endif template diff --git a/core/fxge/cfx_gemodule.cpp b/core/fxge/cfx_gemodule.cpp index e67b86ceca..b4294e8085 100644 --- a/core/fxge/cfx_gemodule.cpp +++ b/core/fxge/cfx_gemodule.cpp @@ -7,12 +7,16 @@ #include "core/fxge/cfx_gemodule.h" #include "core/fxcrt/check.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxge/cfx_folderfontinfo.h" #include "core/fxge/cfx_fontmgr.h" namespace { -CFX_GEModule* g_pGEModule = nullptr; +// EmbedPDF: thread-confined runtime - each worker thread owns its own +// CFX_GEModule (FreeType FT_Library + font/glyph caches), created and destroyed +// on that thread. +EPDF_TLS CFX_GEModule* g_pGEModule = nullptr; } // namespace diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 6132162e33..6c8aa9f80a 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -15,6 +15,7 @@ source_set("fpdfsdk") { "epdf_png_shim.cpp", "epdf_jpeg_shim.cpp", "epdf_redact.cpp", + "epdf_threading.cpp", "cpdfsdk_annot.cpp", "cpdfsdk_annot.h", "cpdfsdk_annotiteration.cpp", diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 766f6033a5..9bab8ec218 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp @@ -38,6 +38,18 @@ namespace { constexpr char kQuadPoints[] = "QuadPoints"; +// EmbedPDF: thread-confined runtime - config callbacks, NOT runtime knobs. +// These two process-globals are intentionally left process-wide (not EPDF_TLS): +// they are immutable configuration that MUST be set once during process +// bootstrap, before any worker thread starts, and MUST NOT be mutated while +// workers are live. Setting them per-request/per-thread is unsupported. The +// server sets neither after startup, so there is no cross-thread write race. +// +// (Other inactive process-globals in our build config - the Skia font manager +// and the Windows print-mode globals - are compiled out of the headless server +// runtime. They would be unsafe under multi-threading if those subsystems were +// ever re-enabled, and would need the same treatment then.) + // 0 bit: FPDF_POLICY_MACHINETIME_ACCESS uint32_t g_sandbox_policy = 0xFFFFFFFF; diff --git a/fpdfsdk/epdf_threading.cpp b/fpdfsdk/epdf_threading.cpp new file mode 100644 index 0000000000..91fff70f02 --- /dev/null +++ b/fpdfsdk/epdf_threading.cpp @@ -0,0 +1,30 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// EmbedPDF: thread-confined runtime lifecycle. +// +// EPDF_InitThread / EPDF_ShutdownThread make the per-thread PDFium lifecycle +// explicit for callers that run PDFium on worker threads. With +// embedpdf_thread_local_globals enabled (see core/fxcrt/epdf_tls.h) each worker +// thread owns its own PDFium globals, so every such thread must initialize and +// tear down PDFium itself. With the flag disabled these are exact aliases of +// FPDF_InitLibrary / FPDF_DestroyLibrary. +// +// These are intentionally exported for ALL targets (including wasm, where they +// simply wrap the normal init/destroy) so shared runtime code can call a single +// lifecycle entry point regardless of platform. + +#include "public/fpdfview.h" + +FPDF_EXPORT void FPDF_CALLCONV EPDF_InitThread() { + // Routes through FPDF_InitLibrary so the standard config/init path runs for + // the calling thread. + FPDF_InitLibrary(); +} + +FPDF_EXPORT void FPDF_CALLCONV EPDF_ShutdownThread() { + // Lifecycle-strict: callers must have already closed every PDFium handle + // created on this thread before invoking this. + FPDF_DestroyLibrary(); +} diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 04686a6b7c..c39d414e04 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -44,6 +44,7 @@ #include "core/fxcrt/cfx_timer.h" #include "core/fxcrt/check_op.h" #include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_memcpy_wrappers.h" #include "core/fxcrt/fx_safe_types.h" @@ -116,7 +117,9 @@ static_assert(static_cast(CFX_DefaultRenderDevice::RendererType::kSkia) == namespace { -bool g_bLibraryInitialized = false; +// EmbedPDF: thread-confined runtime - each worker thread tracks its own +// library-initialized state so per-thread Init/Destroy don't race. +EPDF_TLS bool g_bLibraryInitialized = false; void SetRendererType(FPDF_RENDERER_TYPE public_type) { // Internal definition of renderer types must stay updated with respect to diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 9ccefbba11..fc3678e32e 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -536,6 +536,8 @@ int CheckPDFiumCApi() { CHK(FPDF_GetXFAPacketName); CHK(FPDF_InitLibrary); CHK(FPDF_InitLibraryWithConfig); + CHK(EPDF_InitThread); + CHK(EPDF_ShutdownThread); CHK(EPDF_GetPageBoxByIndex); CHK(EPDF_GetPageUserUnitByIndex); CHK(EPDF_LoadBaseDocument); diff --git a/pdfium.gni b/pdfium.gni index 73ea9f46bd..6c681945de 100644 --- a/pdfium.gni +++ b/pdfium.gni @@ -91,6 +91,14 @@ declare_args() { # Don't build against bundled zlib. use_system_zlib = false + + # EmbedPDF: thread-confined runtime. When true, PDFium's process-global + # singletons become per-thread (thread_local via EPDF_TLS), so each worker + # thread owns its own PDFium state and N threads can render shared-nothing in + # one process. Default off keeps globals process-wide; enable only for native + # server targets that follow the per-thread init/shutdown contract. Never + # makes arbitrary PDFium usage thread-safe; handles must not cross threads. + embedpdf_thread_local_globals = false } assert(!pdf_is_complete_lib || !is_component_build, diff --git a/public/fpdf_ext.h b/public/fpdf_ext.h index 068a977c12..877788bfbe 100644 --- a/public/fpdf_ext.h +++ b/public/fpdf_ext.h @@ -84,7 +84,10 @@ FPDF_EXPORT void FPDF_CALLCONV FSDK_SetTimeFunction(time_t (*func)()); // behave poorly in production environments. // // func - Function pointer to alternate implementation of localtime(), or -// NULL to restore to actual localtime() call itself. +// NULL to restore the thread-safe default localtime wrapper (which +// fills a thread-local tm via localtime_r/localtime_s). EmbedPDF: the +// default is no longer plain localtime(), which returned shared static +// storage and raced across threads. FPDF_EXPORT void FPDF_CALLCONV FSDK_SetLocaltimeFunction(struct tm* (*func)(const time_t*)); diff --git a/public/fpdfview.h b/public/fpdfview.h index 8a2ddd2671..66f8ebe992 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -320,6 +320,24 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_InitLibrary(); // closing the library with this function. FPDF_EXPORT void FPDF_CALLCONV FPDF_DestroyLibrary(); +// Experimental EmbedPDF Extension API. +// Function: EPDF_InitThread / EPDF_ShutdownThread +// Thread-confined runtime lifecycle. Initialize / tear down PDFium for +// the CALLING thread. +// Comments: +// When the runtime is built with per-thread globals +// (embedpdf_thread_local_globals), each worker thread owns its own +// PDFium state, so every thread that uses PDFium MUST call +// EPDF_InitThread before creating any handle and EPDF_ShutdownThread +// after closing every handle it created. Handles must never cross +// threads. When per-thread globals are disabled, these are exact +// aliases of FPDF_InitLibrary / FPDF_DestroyLibrary and are safe to +// call once on a single thread. EPDF_ShutdownThread is lifecycle- +// strict: only legal after all handles on the calling thread are +// closed. +FPDF_EXPORT void FPDF_CALLCONV EPDF_InitThread(); +FPDF_EXPORT void FPDF_CALLCONV EPDF_ShutdownThread(); + // Policy for accessing the local machine time. #define FPDF_POLICY_MACHINETIME_ACCESS 0 diff --git a/scripts/embedpdf-runtime/build-target.sh b/scripts/embedpdf-runtime/build-target.sh index 0326635369..84b4662113 100755 --- a/scripts/embedpdf-runtime/build-target.sh +++ b/scripts/embedpdf-runtime/build-target.sh @@ -4,6 +4,10 @@ set -euo pipefail SOURCE_DIR="${PDF_RUNTIME_SOURCE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" TARGET="${1:-}" PDF_IS_COMPLETE_LIB=true +# EmbedPDF: thread-confined runtime. Off by default; enabled per-target below +# for the native server builds. wasm isolates globals per-instance, so it stays +# off there. +EMBEDPDF_TLS_GLOBALS=false if [[ -z "$TARGET" ]]; then echo "usage: $0 " >&2 @@ -63,6 +67,13 @@ case "$TARGET" in ;; esac +# EmbedPDF: enable per-thread PDFium globals for the native server targets so +# the server worker pool can render in parallel in-process. wasm stays off +# (each instance already isolates globals via its own linear memory). +if [[ "$TARGET" != "wasm32" ]]; then + EMBEDPDF_TLS_GLOBALS=true +fi + PDF_RUNTIME_TARGET_OS_LIST="${PDF_RUNTIME_TARGET_OS_LIST:-$GN_TARGET_OS}" \ "$SOURCE_DIR/scripts/embedpdf-runtime/ensure-deps.sh" @@ -91,6 +102,7 @@ pdf_is_standalone=true use_debug_fission=false pdf_is_complete_lib=$PDF_IS_COMPLETE_LIB pdf_use_partition_alloc=false +embedpdf_thread_local_globals=$EMBEDPDF_TLS_GLOBALS symbol_level=0 target_os="$GN_TARGET_OS" target_cpu="$GN_TARGET_CPU"${EXTRA_ARGS:-} diff --git a/scripts/embedpdf-runtime/test-target.sh b/scripts/embedpdf-runtime/test-target.sh index 07c25687b0..0c1321cbbc 100755 --- a/scripts/embedpdf-runtime/test-target.sh +++ b/scripts/embedpdf-runtime/test-target.sh @@ -4,6 +4,11 @@ set -euo pipefail SOURCE_DIR="${PDF_RUNTIME_SOURCE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" TARGET="${1:-}" TEST_SUITE="${PDFIUM_TEST_SUITE:-all}" +# EmbedPDF: thread-confined runtime. test-target.sh only builds native host +# targets, which is exactly where we ship the flag on, so default it on here to +# exercise the same variant we ship. Override with EMBEDPDF_TLS_GLOBALS=false to +# build the baseline (process-global) variant for comparison/regression. +EMBEDPDF_TLS_GLOBALS="${EMBEDPDF_TLS_GLOBALS:-true}" if [[ -z "$TARGET" ]]; then echo "usage: $0 " >&2 @@ -71,6 +76,7 @@ pdf_is_standalone=true use_debug_fission=false pdf_is_complete_lib=false pdf_use_partition_alloc=false +embedpdf_thread_local_globals=$EMBEDPDF_TLS_GLOBALS symbol_level=1 target_os="$GN_TARGET_OS" target_cpu="$GN_TARGET_CPU"${EXTRA_ARGS:-} diff --git a/scripts/embedpdf-runtime/thread-soak-target.sh b/scripts/embedpdf-runtime/thread-soak-target.sh new file mode 100755 index 0000000000..b2fe0b2b43 --- /dev/null +++ b/scripts/embedpdf-runtime/thread-soak-target.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +set -euo pipefail + +# EmbedPDF: build and run the thread-confined runtime soak harness +# (testing/tools:epdf_thread_soak). This is the gate for the thread_local +# globals work: run it (ideally under TSAN) before lifting the server pool cap. +# +# Usage: +# thread-soak-target.sh [-- ] +# +# Env: +# EMBEDPDF_TLS_GLOBALS default "true". Set "false" to build the baseline +# (process-global) variant for an A/B comparison. +# EMBEDPDF_TSAN default "0". Set "1" to build with is_tsan=true. + +SOURCE_DIR="${PDF_RUNTIME_SOURCE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" +TARGET="${1:-}" +PDF_PATH="${2:-}" +EMBEDPDF_TLS_GLOBALS="${EMBEDPDF_TLS_GLOBALS:-true}" +EMBEDPDF_TSAN="${EMBEDPDF_TSAN:-0}" + +if [[ -z "$TARGET" || -z "$PDF_PATH" ]]; then + echo "usage: $0 [-- ]" >&2 + exit 1 +fi +shift 2 || true +if [[ "${1:-}" == "--" ]]; then + shift +fi + +case "$TARGET" in + darwin-arm64) + GN_TARGET_OS="mac" + GN_TARGET_CPU="arm64" + ;; + darwin-x64) + GN_TARGET_OS="mac" + GN_TARGET_CPU="x64" + ;; + linux-x64) + GN_TARGET_OS="linux" + GN_TARGET_CPU="x64" + ;; + linux-arm64) + GN_TARGET_OS="linux" + GN_TARGET_CPU="arm64" + EXTRA_ARGS=$'\narm_control_flow_integrity="none"' + ;; + *) + echo "thread-soak-target.sh only supports host-native targets: darwin-arm64, darwin-x64, linux-x64, linux-arm64" >&2 + exit 1 + ;; +esac + +TSAN_ARG="" +if [[ "$EMBEDPDF_TSAN" == "1" ]]; then + TSAN_ARG=$'\nis_tsan=true' +fi + +PDF_RUNTIME_TARGET_OS_LIST="${PDF_RUNTIME_TARGET_OS_LIST:-$GN_TARGET_OS}" \ + "$SOURCE_DIR/scripts/embedpdf-runtime/ensure-deps.sh" + +"$SOURCE_DIR/scripts/embedpdf-runtime/apply-patches.sh" "$TARGET" + +if [[ "$TARGET" == linux-* ]]; then + ( + cd "$SOURCE_DIR" + build/install-build-deps.sh --no-prompt + build/linux/sysroot_scripts/install-sysroot.py "--arch=$GN_TARGET_CPU" + ) +fi + +OUT="$SOURCE_DIR/out/embedpdf-runtime-thread-soak-$TARGET" +mkdir -p "$OUT" + +cat > "$OUT/args.gn" < load -> render page 0 -> (optional) encrypted save +// -> close -> FPDF_DestroyLibrary. Each worker only ever touches handles it +// created, matching the thread-confined contract. +// +// With embedpdf_thread_local_globals OFF this exercises (and is expected to +// trip) the shared process-global init/render races. With the flag ON every +// thread owns its own PDFium state and the soak should pass cleanly. The +// encrypted-save path is included on purpose: pending security is now stored on +// CPDF_Document, so it must survive concurrent SetEncryption -> save across +// threads. Intended to be run under ThreadSanitizer as the gate before the +// server worker-pool cap is lifted. + +#include "testing/tools/epdf_layer_tool_common.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_save.h" +#include "public/fpdfview.h" + +namespace { + +// Fixed render surface keeps per-thread memory bounded while still exercising +// the rasterizer, font cache, and stock colorspaces. +constexpr int kRenderWidth = 300; +constexpr int kRenderHeight = 400; + +size_t ParseSizeArg(const std::string& arg, + const char* prefix, + size_t fallback) { + const std::string prefix_string(prefix); + if (arg.rfind(prefix_string, 0) != 0) { + return fallback; + } + return static_cast( + std::strtoull(arg.substr(prefix_string.size()).c_str(), nullptr, 10)); +} + +struct Options { + size_t threads = 4; + size_t iterations = 50; + bool render = true; + bool encrypt = true; +}; + +const char* kUsageExtra = + "[--threads=4] [--iterations=50] [--no-render] [--no-encrypt]"; + +bool RenderFirstPage(FPDF_DOCUMENT doc) { + ScopedFPDFPage page(FPDF_LoadPage(doc, 0)); + if (!page) { + return false; + } + ScopedFPDFBitmap bitmap(FPDFBitmap_Create(kRenderWidth, kRenderHeight, 0)); + if (!bitmap) { + return false; + } + FPDFBitmap_FillRect(bitmap.get(), 0, 0, kRenderWidth, kRenderHeight, + 0xFFFFFFFF); + FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, kRenderWidth, + kRenderHeight, 0, FPDF_ANNOT); + // Touch the buffer so the render isn't optimized away. + return FPDFBitmap_GetBuffer(bitmap.get()) != nullptr; +} + +bool EncryptAndSave(FPDF_DOCUMENT doc) { + if (!EPDF_SetEncryption(doc, "user", "owner", + EPDF_PERM_PRINT | EPDF_PERM_COPY)) { + return false; + } + unsigned long out_size = 0; + void* buffer = EPDF_SaveDocumentToOwnedBuffer(doc, 0, &out_size); + const bool ok = buffer != nullptr && out_size > 0; + EPDF_FreeBuffer(buffer); + return ok; +} + +bool RunWorker(const std::vector& bytes, + const Options& opts, + size_t worker_index) { + for (size_t i = 0; i < opts.iterations; ++i) { + FPDF_InitLibrary(); + { + ScopedFPDFDocument doc(FPDF_LoadMemDocument64( + bytes.data(), bytes.size(), nullptr)); + if (!doc) { + std::fprintf(stderr, "worker %zu iter %zu: load failed\n", worker_index, + i); + FPDF_DestroyLibrary(); + return false; + } + if (opts.render && !RenderFirstPage(doc.get())) { + std::fprintf(stderr, "worker %zu iter %zu: render failed\n", + worker_index, i); + FPDF_DestroyLibrary(); + return false; + } + if (opts.encrypt && !EncryptAndSave(doc.get())) { + std::fprintf(stderr, "worker %zu iter %zu: encrypt-save failed\n", + worker_index, i); + FPDF_DestroyLibrary(); + return false; + } + } // Document is closed here, before tearing down the library. + FPDF_DestroyLibrary(); + } + return true; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + epdf_layer_tool::PrintUsage(argv[0], kUsageExtra); + return 2; + } + + std::string path = argv[1]; + Options opts; + for (int i = 2; i < argc; ++i) { + const std::string arg = argv[i]; + if (arg.rfind("--threads=", 0) == 0) { + opts.threads = ParseSizeArg(arg, "--threads=", opts.threads); + } else if (arg.rfind("--iterations=", 0) == 0) { + opts.iterations = ParseSizeArg(arg, "--iterations=", opts.iterations); + } else if (arg == "--no-render") { + opts.render = false; + } else if (arg == "--no-encrypt") { + opts.encrypt = false; + } else { + epdf_layer_tool::PrintUsage(argv[0], kUsageExtra); + return 2; + } + } + + if (opts.threads == 0 || opts.iterations == 0) { + std::fprintf(stderr, "Thread count and iterations must be positive.\n"); + return 2; + } + + std::vector bytes; + if (!epdf_layer_tool::ReadFile(path, &bytes)) { + std::fprintf(stderr, "Failed to read %s\n", path.c_str()); + return 1; + } + + std::atomic failures{0}; + std::vector workers; + workers.reserve(opts.threads); + for (size_t t = 0; t < opts.threads; ++t) { + workers.emplace_back([&bytes, &opts, &failures, t]() { + if (!RunWorker(bytes, opts, t)) { + failures.fetch_add(1, std::memory_order_relaxed); + } + }); + } + for (auto& worker : workers) { + worker.join(); + } + + const size_t failed = failures.load(std::memory_order_relaxed); + if (failed != 0) { + std::fprintf(stderr, "thread soak FAILED: %zu/%zu workers errored\n", failed, + opts.threads); + return 1; + } + + std::printf( + "thread soak OK: threads=%zu iterations=%zu render=%d encrypt=%d\n", + opts.threads, opts.iterations, opts.render ? 1 : 0, + opts.encrypt ? 1 : 0); + return 0; +} From af64b09eb1b9ef30fbe227e5488eeb71f4988a5d Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 2 Jun 2026 23:39:06 +0300 Subject: [PATCH 33/56] Make s_CurrentRecursionDepth thread-local Mark the parser's static recursion depth variable as thread-local (EPDF_TLS) in both the header and source. Adds an #include for core/fxcrt/epdf_tls.h. This ensures each thread has its own s_CurrentRecursionDepth to avoid cross-thread interference when parsing concurrently; kParserMaxRecursionDepth is unchanged. --- core/fpdfapi/parser/cpdf_syntax_parser.cpp | 2 +- core/fpdfapi/parser/cpdf_syntax_parser.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index f765a10ead..3753019c64 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -76,7 +76,7 @@ class ReadableSubStream final : public IFX_SeekableReadStream { } // namespace // static -int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; +EPDF_TLS int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; // static std::unique_ptr CPDF_SyntaxParser::CreateForTesting( diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.h b/core/fpdfapi/parser/cpdf_syntax_parser.h index a3c27a9342..283dcbb20c 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.h +++ b/core/fpdfapi/parser/cpdf_syntax_parser.h @@ -15,6 +15,7 @@ #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/data_vector.h" +#include "core/fxcrt/epdf_tls.h" #include "core/fxcrt/fx_types.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/span.h" @@ -96,7 +97,7 @@ class CPDF_SyntaxParser { friend class cpdf_syntax_parser_ReadHexString_Test; static constexpr int kParserMaxRecursionDepth = 64; - static int s_CurrentRecursionDepth; + static EPDF_TLS int s_CurrentRecursionDepth; bool ReadBlockAt(FX_FILESIZE read_pos); bool GetCharAtBackward(FX_FILESIZE pos, uint8_t* ch); From 0267271acea5ab405de87b409e12a518cbd5d3d5 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 2 Jun 2026 23:53:18 +0300 Subject: [PATCH 34/56] Add test PDFs with bad ICC profiles Add two PDF fixtures under testing/resources/pixel to exercise ICC profile parsing: icc_profile_bad_component.pdf embeds an ICCBased color space with N=1 (one component instead of the expected 3) but still triggers DetectSRGB(); icc_profile_bad_value.pdf contains a profile/value (0x80000000) that overflows when multiplied by 255. These files are used by pixel tests to validate robustness and error handling of ICC profile processing. --- .../resources/pixel/icc_profile_bad_component.pdf | Bin 0 -> 875 bytes testing/resources/pixel/icc_profile_bad_value.pdf | Bin 0 -> 906 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 testing/resources/pixel/icc_profile_bad_component.pdf create mode 100644 testing/resources/pixel/icc_profile_bad_value.pdf diff --git a/testing/resources/pixel/icc_profile_bad_component.pdf b/testing/resources/pixel/icc_profile_bad_component.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03ead69421ad4e99471a68cb5d6bbde10f10ff1d GIT binary patch literal 875 zcmZuwU2obj6n*!vxGzzu#z#V$6lsWQgwnz~T9Q6&LS1K^3&|E@W;;^bhy9j4>=#b^ z0kaJh#%3u|e00zKIQPW49Sj>@^PD(8e*OGSJaB=}zd*N309toXYlK!r6)pJE0Jn6B z652W_CcPfPGS$Jv+>c2%(oiB^l?pub`7Tc-%zVSXKcE}nfAmd3fttRlXtR|{13Jyw zCXL44W17=Ge}tKp6vnE~{S z_O+kYl-)Objpb5h;Gdguq!LJ1{?P-5|&+1*(KQrEo#LfX~<~E;LJo9AN&>{{6fnQ zuqUvB=%jKxHK)7J>7L4Me^7TD=dAMm=Z{~^1qbB(19UnJpn11hBQyhUcqW$?xaCXK z(4tKt>vkFD32kQf|Cm(nw3I*=xdGRHz7&ausb|^u2XqVkkG@T)km%ctWwhK7Kw-|d zVF-JTiQql?08@uB*D3FN%MMY?Ld8^asi)*;QblVX<0E9j$bo5d7z918F#-QEG5~2T zAA7Af?Y`Jom@iEVuIpGm+9>2J_KB4dW6dgXmkJG^c~)QzzNDDLs>qC3XM*y~H_-C^ z8YGem%%y>aFd%Z^P>9@kt(j@C3un8)rAx=`Kp`lE1)JC=>=N(VvCEnitJMZb6|9w9 zhzud+8cd3y#4ZT({6T2O@7 zZ{I|x-jj7u&pNf)^N%>Wc~({3>)FY&F&fp2ZaN;t@4uA;__y{4g$pvN&33-g3);T# z`LKXLm`hUZf_#s)FaE(?k50qUKF^^6IKq7Y05gh{)oOQuLP>44XDYNNMB*z_Y2~DF QWy)I5-KVTlxx5*$-^CI1MF0Q* literal 0 HcmV?d00001 From ad5c71a624196b31ffeaeb44c56c0f78c4fefaa6 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 3 Jun 2026 00:16:06 +0300 Subject: [PATCH 35/56] Fix gmtime handling and add platform defines Add platform-specific defines for gmtime variants in BUILD.gn (HAVE_GMTIME_R on Linux/ChromeOS/Android/mac/iOS, HAVE_GMTIME_S on Windows). Update cmsplugin.c::_cmsGetTime to guard against gmtime returning NULL: copy the result into ptr_time only if non-NULL and return a boolean success value, avoiding a NULL dereference inside the critical section. --- third_party/BUILD.gn | 6 ++++++ third_party/lcms/src/cmsplugin.c | 3 +++ 2 files changed, 9 insertions(+) diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn index dfb74ec3ed..6384408d1e 100644 --- a/third_party/BUILD.gn +++ b/third_party/BUILD.gn @@ -306,6 +306,12 @@ source_set("fx_lcms2") { "lcms/src/cmswtpnt.c", "lcms/src/cmsxform.c", ] + if (is_linux || is_chromeos || is_android || is_mac || is_ios) { + defines = [ "HAVE_GMTIME_R" ] + } + if (is_win) { + defines = [ "HAVE_GMTIME_S" ] + } deps = [ "../core/fxcrt" ] } diff --git a/third_party/lcms/src/cmsplugin.c b/third_party/lcms/src/cmsplugin.c index 3876506dac..c5e33d937b 100644 --- a/third_party/lcms/src/cmsplugin.c +++ b/third_party/lcms/src/cmsplugin.c @@ -1057,7 +1057,10 @@ cmsBool _cmsGetTime(struct tm* ptr_time) _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); t = gmtime(&now); + if (t != NULL) + *ptr_time = *t; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + return t != NULL; #endif if (t == NULL) From 2520dc17b58f42f93c43f872cc382f2914886ab8 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 3 Jun 2026 00:38:30 +0300 Subject: [PATCH 36/56] Update cmswtpnt.c --- third_party/lcms/src/cmswtpnt.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/third_party/lcms/src/cmswtpnt.c b/third_party/lcms/src/cmswtpnt.c index a73eaa7e36..a8648a33ae 100644 --- a/third_party/lcms/src/cmswtpnt.c +++ b/third_party/lcms/src/cmswtpnt.c @@ -30,16 +30,18 @@ // D50 - Widely used const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) { - static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; + static const cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; return &D50XYZ; } const cmsCIExyY* CMSEXPORT cmsD50_xyY(void) { - static cmsCIExyY D50xyY; - - cmsXYZ2xyY(&D50xyY, cmsD50_XYZ()); + static const cmsCIExyY D50xyY = { + cmsD50X / (cmsD50X + cmsD50Y + cmsD50Z), + cmsD50Y / (cmsD50X + cmsD50Y + cmsD50Z), + cmsD50Y + }; return &D50xyY; } @@ -350,4 +352,3 @@ cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, return TRUE; } - From 74b6d9c2c5470891db37b384c48fd74ee8a70faf Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 3 Jun 2026 00:40:46 +0300 Subject: [PATCH 37/56] Address thread-safety in lcms helpers Add clarifying comments about concurrency and ThreadSanitizer findings in two lcms sources. In cmsplugin.c note that gmtime()'s shared static result is copied while holding the LCMS mutex to avoid TSan-reported races when creating ICC profiles concurrently. In cmswtpnt.c document that the D50 XYZ constant is safe for concurrent readers and that the xyY value is computed in a thread-confined way to avoid writing to a shared static on each call. --- third_party/lcms/src/cmsplugin.c | 3 +++ third_party/lcms/src/cmswtpnt.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/third_party/lcms/src/cmsplugin.c b/third_party/lcms/src/cmsplugin.c index c5e33d937b..ce7fb2eac7 100644 --- a/third_party/lcms/src/cmsplugin.c +++ b/third_party/lcms/src/cmsplugin.c @@ -1057,6 +1057,9 @@ cmsBool _cmsGetTime(struct tm* ptr_time) _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); t = gmtime(&now); + // EmbedPDF: copy gmtime()'s shared static result while still holding the + // LCMS mutex. ThreadSanitizer flags copying it after unlock when ICC + // profiles are created concurrently. if (t != NULL) *ptr_time = *t; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); diff --git a/third_party/lcms/src/cmswtpnt.c b/third_party/lcms/src/cmswtpnt.c index a8648a33ae..490035e9d5 100644 --- a/third_party/lcms/src/cmswtpnt.c +++ b/third_party/lcms/src/cmswtpnt.c @@ -30,6 +30,7 @@ // D50 - Widely used const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) { + // EmbedPDF: immutable shared D50 constant is safe for concurrent readers. static const cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; return &D50XYZ; @@ -37,6 +38,10 @@ const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) const cmsCIExyY* CMSEXPORT cmsD50_xyY(void) { + // EmbedPDF: thread-confined runtime. + // This is equivalent to cmsXYZ2xyY(cmsD50_XYZ()), but avoids writing to a + // shared static on every call. ThreadSanitizer flags the old lazy + // recomputation when multiple documents create ICC transforms in parallel. static const cmsCIExyY D50xyY = { cmsD50X / (cmsD50X + cmsD50Y + cmsD50Z), cmsD50Y / (cmsD50X + cmsD50Y + cmsD50Z), @@ -351,4 +356,3 @@ cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, return TRUE; } - From deb36570d078a0489b5ab97d22e6a7c96815a126 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 15 Jun 2026 11:44:17 +0300 Subject: [PATCH 38/56] Add EPDFDoc page APIs (delete/set/normalize) Introduce new EmbedPDF extension APIs to operate on pages by PDF object number. LoadPageByValidatedIndex gains a `normalize` flag to override page rotation to 0 for normalized coordinates, and EPDFDoc_LoadPageByObjectNumberNormalized is exported. Add EPDFDoc_DeletePageByObjectNumber to delete the first visible page matching an indirect object number (with XFA-backed documents rejected), and EPDFDoc_SetPageRotationByObjectNumber to update a page's /Rotate value (validates rotate in 0..3). Update public/fpdfview.h with API docs, add tests and test registrations in fpdf_view_embeddertest.cpp and fpdf_view_c_api_test.c, and include fpdf_edit.h where needed. --- fpdfsdk/fpdf_view.cpp | 93 ++++++++++++++++++++++++++++-- fpdfsdk/fpdf_view_c_api_test.c | 2 + fpdfsdk/fpdf_view_embeddertest.cpp | 91 +++++++++++++++++++++++++++++ public/fpdfview.h | 54 +++++++++++++++++ 4 files changed, 236 insertions(+), 4 deletions(-) diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index c39d414e04..cf7ade5998 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -723,10 +723,14 @@ namespace { // Shared body of FPDF_LoadPage and EPDFDoc_LoadPageByObjectNumber. Validates // `page_index` against the document's page count, then constructs and returns -// a leaked page handle. Returns nullptr on any failure. +// a leaked page handle. When `normalize` is true, the page's rotation is +// overridden to 0 so all subsequent operations use normalized 0-degree +// coordinates (the intrinsic rotation is surfaced separately via +// EPDF_GetPageRotationByIndex). Returns nullptr on any failure. FPDF_PAGE LoadPageByValidatedIndex(FPDF_DOCUMENT document, CPDF_Document* doc, - int page_index) { + int page_index, + bool normalize) { if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) { return nullptr; } @@ -750,6 +754,12 @@ FPDF_PAGE LoadPageByValidatedIndex(FPDF_DOCUMENT document, pPage->AddPageImageCache(); pPage->ParseContent(); + // Force rotation to 0 - this re-runs UpdateDimensions() so page_size_ and + // page_matrix_ are calculated as if rotation=0. + if (normalize) { + pPage->SetRotationOverride(0); + } + return FPDFPageFromIPDFPage(pPage.Leak()); } @@ -761,7 +771,8 @@ FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV FPDF_LoadPage(FPDF_DOCUMENT document, if (!doc) { return nullptr; } - return LoadPageByValidatedIndex(document, doc, page_index); + return LoadPageByValidatedIndex(document, doc, page_index, + /*normalize=*/false); } FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV @@ -770,7 +781,19 @@ EPDFDoc_LoadPageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num) { if (!doc || obj_num == 0) { return nullptr; } - return LoadPageByValidatedIndex(document, doc, doc->GetPageIndex(obj_num)); + return LoadPageByValidatedIndex(document, doc, doc->GetPageIndex(obj_num), + /*normalize=*/false); +} + +FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV +EPDFDoc_LoadPageByObjectNumberNormalized(FPDF_DOCUMENT document, + unsigned int obj_num) { + auto* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || obj_num == 0) { + return nullptr; + } + return LoadPageByValidatedIndex(document, doc, doc->GetPageIndex(obj_num), + /*normalize=*/true); } FPDF_EXPORT unsigned int FPDF_CALLCONV @@ -792,6 +815,68 @@ EPDFDoc_GetPageObjectNumberByIndex(FPDF_DOCUMENT document, int page_index) { return dict ? dict->GetObjNum() : 0; } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_DeletePageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num) { + auto* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || obj_num == 0) { + return false; + } + +#ifdef PDF_ENABLE_XFA + // XFA pages do not have CPDF_Page dictionaries. Match the other + // EPDFDoc_*ByObjectNumber APIs and reject object-number page mutations for + // XFA-backed documents. + if (doc->GetExtension()) { + return false; + } +#endif // PDF_ENABLE_XFA + + const int page_index = doc->GetPageIndex(obj_num); + if (page_index < 0) { + return false; + } + + const uint32_t deleted_obj_num = doc->DeletePage(page_index); + if (deleted_obj_num == 0) { + return false; + } + + doc->SetPageToNullObject(deleted_obj_num); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPageRotationByObjectNumber(FPDF_DOCUMENT document, + unsigned int obj_num, + int rotate) { + auto* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || obj_num == 0 || rotate < 0 || rotate > 3) { + return false; + } + +#ifdef PDF_ENABLE_XFA + // XFA pages do not have CPDF_Page dictionaries. Match the other + // EPDFDoc_*ByObjectNumber APIs and reject object-number page mutations for + // XFA-backed documents. + if (doc->GetExtension()) { + return false; + } +#endif // PDF_ENABLE_XFA + + if (doc->GetPageIndex(obj_num) < 0) { + return false; + } + + RetainPtr page_dict = + ToDictionary(doc->GetMutableIndirectObject(obj_num)); + if (!page_dict) { + return false; + } + + page_dict->SetNewFor(pdfium::page_object::kRotate, rotate * 90); + return true; +} + FPDF_EXPORT unsigned int FPDF_CALLCONV EPDFPage_GetObjectNumber(FPDF_PAGE page) { // Note: CPDFPageFromFPDFPage() returns null for XFA pages, so this function diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index fc3678e32e..cc3ae907c3 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -543,7 +543,9 @@ int CheckPDFiumCApi() { CHK(EPDF_LoadBaseDocument); CHK(EPDF_LoadMemBaseDocument); CHK(EPDF_LoadMemBaseDocument64); + CHK(EPDFDoc_DeletePageByObjectNumber); CHK(EPDFDoc_GetPageObjectNumberByIndex); + CHK(EPDFDoc_SetPageRotationByObjectNumber); CHK(EPDF_FreeBuffer); CHK(EPDF_SaveDocumentToOwnedBuffer); CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index a995d382d0..bdca4837cb 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -25,6 +25,7 @@ #include "public/fpdf_annot.h" #include "public/fpdf_attachment.h" #include "public/fpdf_doc.h" +#include "public/fpdf_edit.h" #include "public/fpdf_javascript.h" #include "public/fpdf_save.h" #include "public/fpdf_text.h" @@ -2680,6 +2681,96 @@ TEST_F(FPDFViewEmbedderTest, EPDFDocGetPageObjectNumberByIndex) { EXPECT_EQ(1u, doc->GetParsedPageCountForTesting()); } +TEST_F(FPDFViewEmbedderTest, EPDFDocSetPageRotationByObjectNumber) { + constexpr char kRotatedPng[] = "rectangles_rotated"; + + ASSERT_TRUE(OpenDocument("rectangles.pdf")); + + const unsigned int objnum = EPDFDoc_GetPageObjectNumberByIndex(document(), 0); + ASSERT_NE(0u, objnum); + + EXPECT_FALSE(EPDFDoc_SetPageRotationByObjectNumber(nullptr, objnum, 1)); + EXPECT_FALSE(EPDFDoc_SetPageRotationByObjectNumber(document(), 0, 1)); + EXPECT_FALSE(EPDFDoc_SetPageRotationByObjectNumber(document(), objnum, -1)); + EXPECT_FALSE(EPDFDoc_SetPageRotationByObjectNumber(document(), objnum, 4)); + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + EXPECT_EQ(0u, doc->GetParsedPageCountForTesting()); + + EXPECT_TRUE(EPDFDoc_SetPageRotationByObjectNumber(document(), objnum, 1)); + EXPECT_EQ(0u, doc->GetParsedPageCountForTesting()); + + { + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + EXPECT_EQ(1, FPDFPage_GetRotation(page.get())); + EXPECT_EQ(300, static_cast(FPDF_GetPageWidth(page.get()))); + EXPECT_EQ(200, static_cast(FPDF_GetPageHeight(page.get()))); + ScopedFPDFBitmap bitmap = RenderLoadedPage(page.get()); + CompareBitmapWithExpectationSuffix(bitmap.get(), kRotatedPng); + } + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ScopedSavedDoc saved_document = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_document); + ScopedSavedPage saved_page = LoadScopedSavedPage(0); + ASSERT_TRUE(saved_page); + EXPECT_EQ(1, FPDFPage_GetRotation(saved_page.get())); +} + +TEST_F(FPDFViewEmbedderTest, EPDFDocDeletePageByObjectNumber) { + ASSERT_TRUE(OpenDocument("rectangles_multi_pages.pdf")); + ASSERT_EQ(5, FPDF_GetPageCount(document())); + + const unsigned int original_page_1 = + EPDFDoc_GetPageObjectNumberByIndex(document(), 1); + ASSERT_NE(0u, original_page_1); + + int page_to_move = 1; + ASSERT_TRUE(FPDF_MovePages(document(), &page_to_move, 1, 4)); + ASSERT_EQ(5, FPDF_GetPageCount(document())); + EXPECT_EQ(original_page_1, EPDFDoc_GetPageObjectNumberByIndex(document(), 4)); + + EXPECT_FALSE(EPDFDoc_DeletePageByObjectNumber(nullptr, original_page_1)); + EXPECT_FALSE(EPDFDoc_DeletePageByObjectNumber(document(), 0)); + EXPECT_TRUE(EPDFDoc_DeletePageByObjectNumber(document(), original_page_1)); + EXPECT_EQ(4, FPDF_GetPageCount(document())); + + for (int i = 0; i < FPDF_GetPageCount(document()); ++i) { + EXPECT_NE(original_page_1, + EPDFDoc_GetPageObjectNumberByIndex(document(), i)); + } + + EXPECT_FALSE(EPDFDoc_DeletePageByObjectNumber(document(), original_page_1)); +} + +TEST_F(FPDFViewEmbedderTest, + EPDFDocDeletePageByObjectNumberDeletesDuplicatePageObjectOccurrence) { + // This malformed compatibility fixture references the same /Page object from + // multiple visible page positions. Delete-by-object-number removes the first + // visible occurrence resolved by PDFium. + ASSERT_TRUE(OpenDocument("bug_1229106.pdf")); + ASSERT_EQ(4, FPDF_GetPageCount(document())); + + const unsigned int duplicate_objnum = + EPDFDoc_GetPageObjectNumberByIndex(document(), 0); + ASSERT_NE(0u, duplicate_objnum); + ASSERT_EQ(duplicate_objnum, EPDFDoc_GetPageObjectNumberByIndex(document(), 1)); + + EXPECT_TRUE(EPDFDoc_DeletePageByObjectNumber(document(), duplicate_objnum)); + EXPECT_EQ(3, FPDF_GetPageCount(document())); + EXPECT_EQ(duplicate_objnum, EPDFDoc_GetPageObjectNumberByIndex(document(), 0)); + + EXPECT_TRUE(EPDFDoc_DeletePageByObjectNumber(document(), duplicate_objnum)); + EXPECT_EQ(2, FPDF_GetPageCount(document())); + + for (int i = 0; i < FPDF_GetPageCount(document()); ++i) { + EXPECT_NE(duplicate_objnum, + EPDFDoc_GetPageObjectNumberByIndex(document(), i)); + } +} + TEST_F(FPDFViewEmbedderTest, EPDFGetPageBoxByIndex) { ASSERT_TRUE(OpenDocument("rectangles.pdf")); diff --git a/public/fpdfview.h b/public/fpdfview.h index 66f8ebe992..fb1816dff3 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -1890,6 +1890,24 @@ FPDF_EXPORT FPDF_RESULT FPDF_CALLCONV FPDF_BStr_Clear(FPDF_BSTR* bstr); FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV EPDFDoc_LoadPageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num); +// Experimental EmbedPDF Extension API. +// Load a page by its PDF indirect object number with rotation normalized to +// 0 degrees. Like EPDFDoc_LoadPageByObjectNumber(), but forces the page's +// rotation override to 0 so all subsequent operations (GetPageWidth, +// annotations, text, rendering) use normalized coordinates as if the page had +// no rotation. The intrinsic rotation is surfaced separately via +// EPDF_GetPageRotationByIndex(). +// +// document - handle to the document. +// obj_num - the indirect object number of the page dictionary. +// +// Returns a handle to the loaded page, or NULL if the object number +// does not correspond to a page. The caller must close the returned +// handle with FPDF_ClosePage(). +FPDF_EXPORT FPDF_PAGE FPDF_CALLCONV +EPDFDoc_LoadPageByObjectNumberNormalized(FPDF_DOCUMENT document, + unsigned int obj_num); + // Experimental EmbedPDF Extension API. // Get the PDF indirect object number of a page's dictionary by page index. // Unlike FPDF_LoadPage(), this does not construct a page object or parse page @@ -1904,6 +1922,42 @@ EPDFDoc_LoadPageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num); FPDF_EXPORT unsigned int FPDF_CALLCONV EPDFDoc_GetPageObjectNumberByIndex(FPDF_DOCUMENT document, int page_index); +// Experimental EmbedPDF Extension API. +// Delete the first visible page whose page dictionary has |obj_num| as its PDF +// indirect object number. Unlike FPDFPage_Delete(), this remains stable across +// page moves because it is keyed by page identity rather than page position. +// +// document - handle to the document. +// obj_num - the indirect object number of the page dictionary. +// +// Returns TRUE if a matching page was found and deleted, or FALSE if |document| +// is invalid, |obj_num| is 0, or |obj_num| does not correspond to a visible +// page. If a malformed PDF references the same /Page object more than once, +// the first visible occurrence resolved by PDFium is deleted. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_DeletePageByObjectNumber(FPDF_DOCUMENT document, unsigned int obj_num); + +// Experimental EmbedPDF Extension API. +// Set the rotation of the page whose page dictionary has |obj_num| as its PDF +// indirect object number. Unlike FPDFPage_SetRotation(), this does not require +// loading or parsing the page. +// +// document - handle to the document. +// obj_num - the indirect object number of the page dictionary. +// rotate - the rotation value, one of: +// 0 - No rotation. +// 1 - Rotated 90 degrees clockwise. +// 2 - Rotated 180 degrees clockwise. +// 3 - Rotated 270 degrees clockwise. +// +// Returns TRUE if a matching page was found and updated, or FALSE if |document| +// is invalid, |obj_num| is 0, |rotate| is outside 0..3, or |obj_num| does not +// correspond to a visible page. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPageRotationByObjectNumber(FPDF_DOCUMENT document, + unsigned int obj_num, + int rotate); + // Experimental EmbedPDF Extension API. // Get the PDF indirect object number of a page's dictionary. // From d17968e5c0d0f4b9f4752e40a71d6f5b567a03db Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 15 Jun 2026 14:17:18 +0300 Subject: [PATCH 39/56] Avoid null-replacing base pages in layer deltas Prevent layer documents from promoting or null-replacing base /Page objects when deleting pages. Introduces GetNodeTypeForTraversal and uses const access during page-tree traversal to avoid unnecessary promotion; only request mutable dicts for branch /Pages nodes that will be edited. Adds virtual CPDF_Document::ShouldReplaceDeletedPageWithNull (default true) and overrides it in CPDF_LayerDocument to skip null-replacement for objects that exist in the base parser (deletion is represented by removing references from the promoted page tree). DeletePage now uses the mutable catalog path for proper layer edits, and SetPageToNullObject consults ShouldReplaceDeletedPageWithNull. Adds a unit test that verifies layer deletion saves a promoted page tree without null replacement. --- core/fpdfapi/parser/cpdf_document.cpp | 50 ++++++++++++++++-- core/fpdfapi/parser/cpdf_document.h | 6 +++ core/fpdfapi/parser/cpdf_layer_document.cpp | 14 +++++ core/fpdfapi/parser/cpdf_layer_document.h | 1 + fpdfsdk/fpdf_view_embeddertest.cpp | 58 +++++++++++++++++++++ 5 files changed, 125 insertions(+), 4 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 9924a925ba..be03ea2e66 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -61,6 +61,18 @@ NodeType GetNodeType(RetainPtr kid_dict) { return has_kids ? NodeType::kBranch : NodeType::kLeaf; } +NodeType GetNodeTypeForTraversal(const CPDF_Dictionary* kid_dict) { + const ByteString kid_type_value = kid_dict->GetNameFor("Type"); + if (kid_type_value == "Pages") { + return NodeType::kBranch; + } + if (kid_type_value == "Page") { + return NodeType::kLeaf; + } + + return kid_dict->KeyExist("Kids") ? NodeType::kBranch : NodeType::kLeaf; +} + // Returns a value in the range [0, `CPDF_Document::kPageMaxNum`), or nullopt on // error. Note that this function may modify `pages_dict` to correct PDF spec // violations. By normalizing the in-memory representation, other code that @@ -636,8 +648,16 @@ bool CPDF_Document::InsertDeletePDFPage( } for (size_t i = 0; i < kids_list->size(); i++) { - RetainPtr kid_dict = kids_list->GetMutableDictAt(i); - NodeType kid_type = GetNodeType(kid_dict); + // EmbedPDF layer documents must not promote a base /Page object merely to + // decide whether traversal should skip it or remove its reference from + // /Kids. Use const access first, and only request a mutable object for the + // branch /Pages node that will be structurally edited. + RetainPtr const_kid_dict = kids_list->GetDictAt(i); + if (!const_kid_dict) { + return false; + } + + NodeType kid_type = GetNodeTypeForTraversal(const_kid_dict.Get()); if (kid_type == NodeType::kLeaf) { if (pages_to_go != 0) { pages_to_go--; @@ -657,11 +677,16 @@ bool CPDF_Document::InsertDeletePDFPage( } CHECK_EQ(kid_type, NodeType::kBranch); - int page_count = kid_dict->GetIntegerFor("Count"); + int page_count = const_kid_dict->GetIntegerFor("Count"); if (pages_to_go >= page_count) { pages_to_go -= page_count; continue; } + + RetainPtr kid_dict = kids_list->GetMutableDictAt(i); + if (!kid_dict) { + return false; + } if (pdfium::Contains(*visited, kid_dict)) { return false; } @@ -755,7 +780,15 @@ RetainPtr CPDF_Document::GetFileIdentifier() const { } uint32_t CPDF_Document::DeletePage(int iPage) { - RetainPtr pPages = GetMutablePagesDict(); + RetainPtr pRoot = GetMutableRoot(); + if (!pRoot) { + return 0; + } + + // Use the mutable catalog path so layer documents promote the page tree + // before editing /Kids and /Count. A const-cast mutable page tree would leave + // no layer overlay object to save. + RetainPtr pPages = pRoot->GetMutableDictFor("Pages"); if (!pPages) { return 0; } @@ -795,6 +828,10 @@ void CPDF_Document::SetPageToNullObject(uint32_t page_obj_num) { } } + if (!ShouldReplaceDeletedPageWithNull(page_obj_num)) { + return; + } + // If `page_dict` is no longer in the page tree, replace it with an object of // type null. // @@ -806,6 +843,11 @@ void CPDF_Document::SetPageToNullObject(uint32_t page_obj_num) { CHECK(replaced); } +bool CPDF_Document::ShouldReplaceDeletedPageWithNull( + uint32_t page_obj_num) const { + return true; +} + void CPDF_Document::SetRootForTesting(RetainPtr root) { SetCachedRootDict(std::move(root)); } diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index c47e7f8c6d..2216cb37c0 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -205,6 +205,12 @@ class CPDF_Document : public Observable, void SetCachedInfoDict(RetainPtr info); void InvalidateCachedInfoDict(); + // EmbedPDF layer documents represent deletion by removing references from the + // promoted owning container, e.g. /Pages /Kids or /Annots. Base objects + // remain resolvable through the base xref and are not null-replaced in + // append-only layer deltas. + virtual bool ShouldReplaceDeletedPageWithNull(uint32_t page_obj_num) const; + private: class StockFontClearer { public: diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index aa2f3f0fa2..f6ef785ef2 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -164,6 +164,20 @@ FX_FILESIZE CPDF_LayerDocument::GetLayerAppendBaseOffset() const { return base_->GetLayerAppendBaseOffset(); } +bool CPDF_LayerDocument::ShouldReplaceDeletedPageWithNull( + uint32_t page_obj_num) const { + CPDF_Parser* parser = base_->GetParser(); + if (parser && parser->IsValidObjectNumber(page_obj_num) && + !parser->IsObjectFree(page_obj_num)) { + return false; + } + + // If the page object was created in this layer, nulling it is a local overlay + // change. If it exists in the base document, deletion is represented solely + // by the promoted page tree no longer referencing it. + return FindPromotedObject(page_obj_num) != nullptr; +} + RetainPtr CPDF_LayerDocument::ParseIndirectObject( uint32_t objnum) { NOTREACHED(); diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index 6d22237dcd..dc3a521008 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -45,6 +45,7 @@ class CPDF_LayerDocument final : public CPDF_Document { RetainPtr FindPromotedObject(uint32_t objnum) const override; bool IsLayerDocument() const override; FX_FILESIZE GetLayerAppendBaseOffset() const override; + bool ShouldReplaceDeletedPageWithNull(uint32_t page_obj_num) const override; // CPDF_Parser::ParsedObjectsHolder: RetainPtr ParseIndirectObject(uint32_t objnum) override; diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index bdca4837cb..4ade9985c7 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -1524,6 +1524,64 @@ TEST_F(FPDFViewEmbedderTest, LayerMetadataUpdateCreatesInfoWhenBaseHasNone) { EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, + LayerDeleteBasePageSavesPromotedPageTreeWithoutNullReplacement) { + FileAccessForTesting base_access("rectangles_multi_pages.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status_a = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_a( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_a)); + ASSERT_TRUE(layer_a); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_a); + ASSERT_EQ(5, FPDF_GetPageCount(layer_a.get())); + + EPDFLayerOpenStatus status_b = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_b( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_b)); + ASSERT_TRUE(layer_b); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_b); + ASSERT_EQ(5, FPDF_GetPageCount(layer_b.get())); + + const unsigned int deleted_page_objnum = + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 1); + ASSERT_NE(0u, deleted_page_objnum); + + FPDFPage_Delete(layer_a.get(), 1); + EXPECT_EQ(4, FPDF_GetPageCount(layer_a.get())); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(layer_a.get(), deleted_page_objnum)); + + EXPECT_EQ(5, FPDF_GetPageCount(layer_b.get())); + EXPECT_EQ(deleted_page_objnum, + EPDFDoc_GetPageObjectNumberByIndex(layer_b.get(), 1)); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer_b.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_a.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta = GetString(); + EXPECT_FALSE(delta.empty()); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ASSERT_EQ(4, FPDF_GetPageCount(replayed.get())); + for (int i = 0; i < FPDF_GetPageCount(replayed.get()); ++i) { + EXPECT_NE(deleted_page_objnum, + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), i)); + } + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From 2df8155a4753cabb007178b2e711356c6ce97dde Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 15 Jun 2026 17:04:41 +0300 Subject: [PATCH 40/56] LayerDocument: const Root & mutable PageDict Add overrides to CPDF_LayerDocument to ensure correct behavior for roots and page dictionaries in layer documents. Implement GetRoot() to return a local indirect root (so const reads observe overlays after delta ingest) and add GetMutablePageDictionary() that promotes a moved page object before returning a mutable dictionary. Update the header to declare the new methods. Add a unit test (LayerMovePagesPromotesMovedPageAndReplays) that verifies moving pages promotes the page object and that saved deltas replay correctly. Also adjust some test line breaks for readability. --- core/fpdfapi/parser/cpdf_layer_document.cpp | 29 +++++++ core/fpdfapi/parser/cpdf_layer_document.h | 2 + fpdfsdk/fpdf_view_embeddertest.cpp | 96 ++++++++++++++++++++- 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index f6ef785ef2..9637e0a7c4 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -109,6 +109,17 @@ CPDF_Parser* CPDF_LayerDocument::GetParser() const { return base_->GetParser(); } +const CPDF_Dictionary* CPDF_LayerDocument::GetRoot() const { + const uint32_t root_objnum = base_->GetParser()->GetRootObjNum(); + if (RetainPtr local = FindLocalIndirectObject(root_objnum)) { + // The returned pointer is owned by this layer's indirect object holder. + // Const root reads must see the effective overlay after delta ingest even + // when the mutable root cache has been invalidated. + return local->AsDictionary(); + } + return base_->GetRoot(); +} + RetainPtr CPDF_LayerDocument::GetMutableRoot() { const uint32_t root_objnum = base_->GetParser()->GetRootObjNum(); RetainPtr live = GetMutableIndirectObject(root_objnum); @@ -147,6 +158,24 @@ RetainPtr CPDF_LayerDocument::GetPageDictionary( return ToDictionary(GetOrParseIndirectObject(objnum)); } +RetainPtr CPDF_LayerDocument::GetMutablePageDictionary( + int iPage) { + if (iPage < 0 || static_cast(iPage) >= GetPageListSize()) { + return nullptr; + } + + const uint32_t objnum = GetPageObjNumAt(iPage); + if (!objnum) { + return nullptr; + } + + // EmbedPDF layer documents must never return a const-cast frozen base page + // for mutation. Page moves reparent the moved page dictionary, so promote the + // page object before returning a mutable handle. + RetainPtr live = GetMutableIndirectObject(objnum); + return live ? pdfium::WrapRetain(live->AsMutableDictionary()) : nullptr; +} + uint32_t CPDF_LayerDocument::GetUserPermissions(bool get_owner_perms) const { return base_->GetUserPermissions(get_owner_perms); } diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index dc3a521008..deff9b76e8 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -38,9 +38,11 @@ class CPDF_LayerDocument final : public CPDF_Document { // CPDF_Document: CPDF_Parser* GetParser() const override; + const CPDF_Dictionary* GetRoot() const override; RetainPtr GetMutableRoot() override; RetainPtr GetMutableInfo() override; RetainPtr GetPageDictionary(int iPage) override; + RetainPtr GetMutablePageDictionary(int iPage) override; uint32_t GetUserPermissions(bool get_owner_perms) const override; RetainPtr FindPromotedObject(uint32_t objnum) const override; bool IsLayerDocument() const override; diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 4ade9985c7..5f1d766024 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -1582,6 +1582,96 @@ TEST_F(FPDFViewEmbedderTest, EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, LayerMovePagesPromotesMovedPageAndReplays) { + FileAccessForTesting base_access("rectangles_multi_pages.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status_a = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_a( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_a)); + ASSERT_TRUE(layer_a); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_a); + ASSERT_EQ(5, FPDF_GetPageCount(layer_a.get())); + + std::vector original_order; + for (int i = 0; i < FPDF_GetPageCount(layer_a.get()); ++i) { + original_order.push_back( + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), i)); + } + ASSERT_EQ(5u, original_order.size()); + + EPDFLayerOpenStatus status_b = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_b( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_b)); + ASSERT_TRUE(layer_b); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status_b); + + int page_to_move = 2; + ASSERT_TRUE(FPDF_MovePages(layer_a.get(), &page_to_move, 1, 1)); + EXPECT_EQ(5, FPDF_GetPageCount(layer_a.get())); + EXPECT_EQ(original_order[0], + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 0)); + EXPECT_EQ(original_order[2], + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 1)); + EXPECT_EQ(original_order[1], + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 2)); + EXPECT_EQ(original_order[3], + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 3)); + EXPECT_EQ(original_order[4], + EPDFDoc_GetPageObjectNumberByIndex(layer_a.get(), 4)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(layer_a.get(), original_order[2])); + + for (int i = 0; i < FPDF_GetPageCount(layer_b.get()); ++i) { + EXPECT_EQ(original_order[i], + EPDFDoc_GetPageObjectNumberByIndex(layer_b.get(), i)); + } + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer_b.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_a.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta = GetString(); + EXPECT_FALSE(delta.empty()); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + ASSERT_EQ(5, FPDF_GetPageCount(replayed.get())); + EXPECT_EQ(original_order[0], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 0)); + EXPECT_EQ(original_order[2], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 1)); + EXPECT_EQ(original_order[1], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 2)); + EXPECT_EQ(original_order[3], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 3)); + EXPECT_EQ(original_order[4], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 4)); + + page_to_move = 2; + ASSERT_TRUE(FPDF_MovePages(replayed.get(), &page_to_move, 1, 1)); + EXPECT_EQ(original_order[0], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 0)); + EXPECT_EQ(original_order[1], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 1)); + EXPECT_EQ(original_order[2], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 2)); + EXPECT_EQ(original_order[3], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 3)); + EXPECT_EQ(original_order[4], + EPDFDoc_GetPageObjectNumberByIndex(replayed.get(), 4)); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, CreateAnnotOnFreshLayerPromotesOverlayOnly) { FileAccessForTesting base_access("rectangles.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); @@ -2814,11 +2904,13 @@ TEST_F(FPDFViewEmbedderTest, const unsigned int duplicate_objnum = EPDFDoc_GetPageObjectNumberByIndex(document(), 0); ASSERT_NE(0u, duplicate_objnum); - ASSERT_EQ(duplicate_objnum, EPDFDoc_GetPageObjectNumberByIndex(document(), 1)); + ASSERT_EQ(duplicate_objnum, + EPDFDoc_GetPageObjectNumberByIndex(document(), 1)); EXPECT_TRUE(EPDFDoc_DeletePageByObjectNumber(document(), duplicate_objnum)); EXPECT_EQ(3, FPDF_GetPageCount(document())); - EXPECT_EQ(duplicate_objnum, EPDFDoc_GetPageObjectNumberByIndex(document(), 0)); + EXPECT_EQ(duplicate_objnum, + EPDFDoc_GetPageObjectNumberByIndex(document(), 0)); EXPECT_TRUE(EPDFDoc_DeletePageByObjectNumber(document(), duplicate_objnum)); EXPECT_EQ(2, FPDF_GetPageCount(document())); From f098ad870915d955f11bc8b6f2ea32245d070513 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 15 Jun 2026 21:55:59 +0300 Subject: [PATCH 41/56] Use cached reachable-objects set and add test Store the set of reachable objects in CPDF_Creator as objects_with_refs_ and use it when writing old/new objects instead of recomputing locally. Initialize and clear the cache in Create() via CollectSaveReachableObjects(document_, ...). Add the corresponding std::set include and member, plus minor header reorder and comment wrap. Add unit test LayerFullSavePrunesDeletedBasePageButKeepsSharedObjects (with helpers and CPDF_Reference include) to verify layer full-save prunes a deleted base page while preserving shared resource/content objects. --- core/fpdfapi/edit/cpdf_creator.cpp | 13 ++--- core/fpdfapi/edit/cpdf_creator.h | 7 ++- fpdfsdk/fpdf_view_embeddertest.cpp | 78 ++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 10 deletions(-) diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 8346b2a278..b03d76115d 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -233,13 +233,9 @@ bool CPDF_Creator::WriteOldObjs() { return true; } - // WriteOldObjs() only runs for full saves. Layer saves are incremental and - // use CollectSaveReachableObjects() when writing their overlay objects. - const std::set objects_with_refs = - GetObjectsWithReferences(document_); uint32_t last_object_number_written = 0; for (uint32_t objnum = cur_obj_num_; objnum <= nLastObjNum; ++objnum) { - if (!pdfium::Contains(objects_with_refs, objnum)) { + if (!pdfium::Contains(objects_with_refs_, objnum)) { continue; } if (!WriteOldIndirectObject(objnum)) { @@ -256,12 +252,10 @@ bool CPDF_Creator::WriteOldObjs() { } bool CPDF_Creator::WriteNewObjs() { - const std::set objects_with_refs = - CollectSaveReachableObjects(document_, encrypt_dict_.Get()); std::vector written_new_obj_nums; for (size_t i = cur_obj_num_; i < new_obj_num_array_.size(); ++i) { uint32_t objnum = new_obj_num_array_[i]; - if (!pdfium::Contains(objects_with_refs, objnum)) { + if (!pdfium::Contains(objects_with_refs_, objnum)) { continue; } @@ -725,8 +719,11 @@ bool CPDF_Creator::Create(Mask flags, int32_t file_version) { last_obj_num_ = document_->GetLastObjNum(); object_offsets_.clear(); new_obj_num_array_.clear(); + objects_with_refs_.clear(); InitID(); + objects_with_refs_ = + CollectSaveReachableObjects(document_, encrypt_dict_.Get()); const bool result = Continue(); if (!result && failure_reason_ == FailureReason::kNone) { failure_reason_ = FailureReason::kOther; diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h index 06d2fe1205..94ccd6343b 100644 --- a/core/fpdfapi/edit/cpdf_creator.h +++ b/core/fpdfapi/edit/cpdf_creator.h @@ -11,10 +11,11 @@ #include #include +#include #include -#include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/fx_string.h" #include "core/fxcrt/mask.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/unowned_ptr.h" @@ -58,7 +59,8 @@ class CPDF_Creator { // Experimental EmbedPDF Extension: Set encryption for documents that weren't // originally encrypted. This sets both encrypt_dict_ (for trailer writing) - // and security_handler_ (for GetCryptoHandler() used in stream/string encryption). + // and security_handler_ (for GetCryptoHandler() used in stream/string + // encryption). void SetEncryption(RetainPtr encrypt_dict, RetainPtr security_handler); @@ -114,6 +116,7 @@ class CPDF_Creator { FX_FILESIZE xref_start_ = 0; std::map object_offsets_; std::vector new_obj_num_array_; // Sorted, ascending. + std::set objects_with_refs_; RetainPtr id_array_; int32_t file_version_ = 0; bool security_changed_ = false; diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 5f1d766024..968f59579a 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -18,6 +18,7 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fxge/cfx_defaultrenderdevice.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/fpdf_view_c_api_test.h" @@ -57,6 +58,20 @@ namespace { constexpr char kFirstAlternate[] = "FirstAlternate"; constexpr char kLastAlternate[] = "LastAlternate"; +uint32_t GetReferencedObjectNumber(const CPDF_Dictionary* dict, + ByteStringView key) { + if (!dict) { + return 0; + } + + RetainPtr ref = ToReference(dict->GetObjectFor(key)); + return ref ? ref->GetRefObjNum() : 0; +} + +bool PdfBytesContainObject(const std::string& pdf, uint32_t objnum) { + return pdf.find(std::to_string(objnum) + " 0 obj") != std::string::npos; +} + #if BUILDFLAG(IS_WIN) const char kExpectedRectanglePostScript[] = R"( save @@ -1582,6 +1597,69 @@ TEST_F(FPDFViewEmbedderTest, EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, + LayerFullSavePrunesDeletedBasePageButKeepsSharedObjects) { + FileAccessForTesting base_access( + "hello_world_2_pages_shared_resources_dict.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + ASSERT_EQ(2, FPDF_GetPageCount(layer.get())); + + CPDF_Document* cpdf_layer = CPDFDocumentFromFPDFDocument(layer.get()); + RetainPtr surviving_page = + cpdf_layer->GetPageDictionary(0); + RetainPtr deleted_page = + cpdf_layer->GetPageDictionary(1); + ASSERT_TRUE(surviving_page); + ASSERT_TRUE(deleted_page); + + const uint32_t surviving_page_objnum = surviving_page->GetObjNum(); + const uint32_t deleted_page_objnum = deleted_page->GetObjNum(); + const uint32_t shared_resources_objnum = + GetReferencedObjectNumber(surviving_page.Get(), "Resources"); + const uint32_t deleted_page_resources_objnum = + GetReferencedObjectNumber(deleted_page.Get(), "Resources"); + const uint32_t shared_contents_objnum = + GetReferencedObjectNumber(surviving_page.Get(), "Contents"); + const uint32_t deleted_page_contents_objnum = + GetReferencedObjectNumber(deleted_page.Get(), "Contents"); + + ASSERT_NE(0u, surviving_page_objnum); + ASSERT_NE(0u, deleted_page_objnum); + ASSERT_NE(surviving_page_objnum, deleted_page_objnum); + ASSERT_NE(0u, shared_resources_objnum); + ASSERT_EQ(shared_resources_objnum, deleted_page_resources_objnum); + ASSERT_NE(0u, shared_contents_objnum); + ASSERT_EQ(shared_contents_objnum, deleted_page_contents_objnum); + + FPDFPage_Delete(layer.get(), 1); + ASSERT_EQ(1, FPDF_GetPageCount(layer.get())); + + ClearString(); + ASSERT_TRUE(FPDF_SaveAsCopy(layer.get(), this, 0)); + std::string saved_pdf = GetString(); + EXPECT_FALSE(saved_pdf.empty()); + + EXPECT_TRUE(PdfBytesContainObject(saved_pdf, surviving_page_objnum)); + EXPECT_FALSE(PdfBytesContainObject(saved_pdf, deleted_page_objnum)); + EXPECT_TRUE(PdfBytesContainObject(saved_pdf, shared_resources_objnum)); + EXPECT_TRUE(PdfBytesContainObject(saved_pdf, shared_contents_objnum)); + + ScopedSavedDoc saved_doc = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_doc); + EXPECT_EQ(1, FPDF_GetPageCount(saved_doc.get())); + EXPECT_EQ(surviving_page_objnum, + EPDFDoc_GetPageObjectNumberByIndex(saved_doc.get(), 0)); + + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, LayerMovePagesPromotesMovedPageAndReplays) { FileAccessForTesting base_access("rectangles_multi_pages.pdf"); EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); From 18d23c9599a84630fc35f612b38c9e103dce3bf1 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 24 Jun 2026 13:51:13 +0300 Subject: [PATCH 42/56] Add registered font fallbacks and subsetting Introduce runtime-registered font support and per-annotation font subsetting for FreeText appearance generation. Adds CPDF_AnnotFontMap and CPDF_AnnotFontSubset to route fallback lookups to CFX_FontRegistry, create marker font entries in the AcroForm DR, and produce subsetted Type0/CIDFont dictionaries (using HarfBuzz) that embed only glyphs used by an annotation/layer. Update CPDF_Font::FallbackFontFromCharcode to prefer registered fonts and create runtime fallbacks, and switch FreeText AP generation to use CPDF_AnnotFontMap so resources include any registered fallback/subset fonts actually used. Expose UpdateDefaultAppearanceRegisteredFont to set a DA referencing a registered runtime font. Update BUILD.gn to include the new files and third_party/harfbuzz-ng, and add supporting CFX_FontRegistry and public/epdf_font glue. --- core/fpdfapi/font/cpdf_font.cpp | 40 +- core/fpdfdoc/BUILD.gn | 9 + core/fpdfdoc/cpdf_annotfontmap.cpp | 353 ++++++++++++++ core/fpdfdoc/cpdf_annotfontmap.h | 72 +++ core/fpdfdoc/cpdf_annotfontsubset.cpp | 668 ++++++++++++++++++++++++++ core/fpdfdoc/cpdf_annotfontsubset.h | 53 ++ core/fpdfdoc/cpdf_generateap.cpp | 59 ++- core/fpdfdoc/cpdf_generateap.h | 10 + core/fpdfdoc/cpvt_fontmap.cpp | 58 ++- core/fpdfdoc/cpvt_variabletext.cpp | 14 +- core/fxge/BUILD.gn | 4 + core/fxge/cfx_fontregistry.cpp | 318 ++++++++++++ core/fxge/cfx_fontregistry.h | 55 +++ fpdfsdk/BUILD.gn | 2 + fpdfsdk/epdf_font.cpp | 73 +++ fpdfsdk/fpdf_annot.cpp | 41 ++ fpdfsdk/fpdf_annot_embeddertest.cpp | 396 +++++++++++++++ fpdfsdk/fpdf_view.cpp | 4 + fpdfsdk/fpdf_view_c_api_test.c | 10 + public/epdf_font.h | 87 ++++ public/fpdf_annot.h | 22 +- 21 files changed, 2316 insertions(+), 32 deletions(-) create mode 100644 core/fpdfdoc/cpdf_annotfontmap.cpp create mode 100644 core/fpdfdoc/cpdf_annotfontmap.h create mode 100644 core/fpdfdoc/cpdf_annotfontsubset.cpp create mode 100644 core/fpdfdoc/cpdf_annotfontsubset.h create mode 100644 core/fxge/cfx_fontregistry.cpp create mode 100644 core/fxge/cfx_fontregistry.h create mode 100644 fpdfsdk/epdf_font.cpp create mode 100644 public/epdf_font.h diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp index c0de42a8de..16923148ea 100644 --- a/core/fpdfapi/font/cpdf_font.cpp +++ b/core/fpdfapi/font/cpdf_font.cpp @@ -30,8 +30,10 @@ #include "core/fxcrt/check.h" #include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_safe_types.h" +#include "core/fxcrt/numerics/safe_conversions.h" #include "core/fxcrt/stl_util.h" #include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/cfx_fontregistry.h" #include "core/fxge/cfx_substfont.h" #include "core/fxge/fx_font.h" #include "core/fxge/fx_fontencoding.h" @@ -395,14 +397,38 @@ const char* CPDF_Font::GetAdobeCharName( } uint32_t CPDF_Font::FallbackFontFromCharcode(uint32_t charcode) { + // EmbedPDF: prefer fonts registered through EPDFFont_* before falling back to + // PDFium's hard-coded Arial substitute. This lets broken PDFs with missing + // glyph coverage render through the same runtime fallback registry used by + // annotation authoring, without repairing or mutating the source PDF. + WideString str = UnicodeFromCharCode(charcode); + uint32_t unicode = !str.IsEmpty() ? str[0] : charcode; + for (size_t i = 0; i < font_fallbacks_.size(); ++i) { + if (font_fallbacks_[i]->GetFace() && + font_fallbacks_[i]->GetFace()->GetCharIndex(unicode) != 0) { + return pdfium::checked_cast(i); + } + } + + FX_SAFE_INT32 safe_weight = stem_v_; + safe_weight *= 5; + const int weight = safe_weight.ValueOrDefault(pdfium::kFontWeightNormal); + if (auto font_id = CFX_FontRegistry::FindFallbackFont(unicode, weight, + italic_angle_ != 0)) { + std::unique_ptr fallback_font = + CFX_FontRegistry::CreateFont(*font_id); + if (fallback_font) { + font_fallbacks_.push_back(std::move(fallback_font)); + return pdfium::checked_cast(font_fallbacks_.size() - 1); + } + } + if (font_fallbacks_.empty()) { - font_fallbacks_.push_back(std::make_unique()); - FX_SAFE_INT32 safe_weight = stem_v_; - safe_weight *= 5; - font_fallbacks_[0]->LoadSubst( - "Arial", IsTrueTypeFont(), flags_, - safe_weight.ValueOrDefault(pdfium::kFontWeightNormal), italic_angle_, - FX_CodePage::kDefANSI, IsVertWriting()); + auto fallback_font = std::make_unique(); + fallback_font->LoadSubst("Arial", IsTrueTypeFont(), flags_, weight, + italic_angle_, FX_CodePage::kDefANSI, + IsVertWriting()); + font_fallbacks_.push_back(std::move(fallback_font)); } return 0; } diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn index f258efae31..912e46daba 100644 --- a/core/fpdfdoc/BUILD.gn +++ b/core/fpdfdoc/BUILD.gn @@ -13,6 +13,12 @@ source_set("fpdfdoc") { "cpdf_action.h", "cpdf_annot.cpp", "cpdf_annot.h", + # EmbedPDF: registered FreeText annotation fonts and per-layer subset + # embedding. Keep these fork-owned files when rebasing from upstream PDFium. + "cpdf_annotfontmap.cpp", + "cpdf_annotfontmap.h", + "cpdf_annotfontsubset.cpp", + "cpdf_annotfontsubset.h", "cpdf_annotlist.cpp", "cpdf_annotlist.h", "cpdf_apsettings.cpp", @@ -92,6 +98,9 @@ source_set("fpdfdoc") { "../fpdfapi/render", "../fxcrt", "../fxge", + # EmbedPDF: CPDF_AnnotFontSubset uses HarfBuzz subsetting to embed only the + # glyphs used by each saved annotation/layer. + "../../third_party/harfbuzz-ng", ] visibility = [ "../../*" ] } diff --git a/core/fpdfdoc/cpdf_annotfontmap.cpp b/core/fpdfdoc/cpdf_annotfontmap.cpp new file mode 100644 index 0000000000..c06215e465 --- /dev/null +++ b/core/fpdfdoc/cpdf_annotfontmap.cpp @@ -0,0 +1,353 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: annotation font map for registered runtime fonts. This lets +// FreeText appearance generation pick per-glyph fallback fonts and later embed +// only the glyph subset used by the annotation/layer. + +#include "core/fpdfdoc/cpdf_annotfontmap.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfdoc/cpdf_annotfontsubset.h" +#include "core/fpdfdoc/cpdf_interactiveform.h" +#include "core/fxcrt/check.h" +#include "core/fxcrt/fx_codepage.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "core/fxcrt/stl_util.h" +#include "core/fxge/cfx_font.h" + +namespace { + +constexpr char kRegisteredFontResourcePrefix[] = "ERegF"; + +ByteString NormalizeBaseFontName(ByteString name) { + name.Remove(' '); + return name.IsEmpty() ? ByteString(CFX_Font::kUntitledFontName) : name; +} + +ByteString BaseFontNameForRegisteredFont(CFX_FontRegistry::FontId font_id, + const CFX_Font* font) { + ByteString name = CFX_FontRegistry::GetBaseFontName(font_id); + if (name.IsEmpty() && font) { + name = font->GetBaseFontName(); + } + return NormalizeBaseFontName(std::move(name)); +} + +std::optional FontIdFromResourceKey( + const ByteString& resource_key) { + constexpr size_t kPrefixLength = sizeof(kRegisteredFontResourcePrefix) - 1; + if (resource_key.First(kPrefixLength) != kRegisteredFontResourcePrefix) { + return std::nullopt; + } + + ByteString id_string = resource_key.Substr(kPrefixLength); + if (id_string.IsEmpty()) { + return std::nullopt; + } + + uint32_t font_id = 0; + for (char ch : id_string.AsStringView()) { + if (ch < '0' || ch > '9') { + return std::nullopt; + } + FX_SAFE_UINT32 safe_font_id = font_id; + safe_font_id *= 10; + safe_font_id += ch - '0'; + if (!safe_font_id.IsValid()) { + return std::nullopt; + } + font_id = safe_font_id.ValueOrDie(); + } + + if (!CFX_FontRegistry::IsValidFont(font_id)) { + return std::nullopt; + } + return font_id; +} + +ByteString ResourceKeyForRegisteredFont(CFX_FontRegistry::FontId font_id) { + return ByteString::Format("%s%u", kRegisteredFontResourcePrefix, font_id); +} + +bool FontDictMatchesBaseFontName(const CPDF_Dictionary* font_dict, + const ByteString& base_font_name) { + return font_dict && font_dict->GetNameFor("BaseFont") == base_font_name; +} + +bool PDFontSupportsUnicode(const RetainPtr& font, uint16_t word) { + if (!font) { + return false; + } + + uint32_t charcode = font->CharCodeFromUnicode(word); + if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { + return false; + } + + bool vert_glyph = false; + return font->GlyphFromCharCode(charcode, &vert_glyph) > 0; +} + +} // namespace + +CPDF_AnnotFontMap::CPDF_AnnotFontMap(CPDF_Document* doc, + RetainPtr default_font, + const ByteString& default_font_alias, + bool allow_registered_fallbacks) + : doc_(doc), allow_registered_fallbacks_(allow_registered_fallbacks) { + FontEntry entry; + entry.font = std::move(default_font); + entry.alias = default_font_alias; + if (auto font_id = FontIdFromResourceKey(default_font_alias)) { + RetainPtr registered_font = CreateRegisteredLayoutFont(*font_id); + if (registered_font) { + entry.font = std::move(registered_font); + entry.registered_font_id = *font_id; + } + } + fonts_.push_back(std::move(entry)); +} + +CPDF_AnnotFontMap::~CPDF_AnnotFontMap() { + DeleteTemporaryLayoutObjects(); +} + +// static +bool CPDF_AnnotFontMap::EnsureRegisteredFontMarkerInDocument( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id, + ByteString* resource_key) { + if (!doc || !resource_key || !CFX_FontRegistry::IsValidFont(font_id)) { + return false; + } + + RetainPtr root_dict = doc->GetMutableRoot(); + if (!root_dict) { + return false; + } + + RetainPtr acroform_dict = + root_dict->GetMutableDictFor("AcroForm"); + if (!acroform_dict) { + acroform_dict = CPDF_InteractiveForm::InitAcroFormDict(doc); + CHECK(acroform_dict); + } + + RetainPtr font_res = + acroform_dict->GetOrCreateDictFor("DR")->GetOrCreateDictFor("Font"); + + const ByteString base_font_name = + BaseFontNameForRegisteredFont(font_id, nullptr); + ByteString key = ResourceKeyForRegisteredFont(font_id); + if (RetainPtr existing_font_dict = + font_res->GetMutableDictFor(key.AsStringView())) { + if (FontDictMatchesBaseFontName(existing_font_dict.Get(), base_font_name)) { + *resource_key = key; + return true; + } + } + + const ByteString base_key = key; + for (int suffix = 1; font_res->KeyExist(key.AsStringView()); ++suffix) { + key = ByteString::Format("%s_%d", base_key.c_str(), suffix); + } + + RetainPtr marker_font_dict = + CPDF_AnnotFontSubset::CreateMarkerFontDict(doc, font_id); + if (!marker_font_dict) { + return false; + } + + font_res->SetNewFor(key, doc, marker_font_dict->GetObjNum()); + *resource_key = key; + return true; +} + +RetainPtr CPDF_AnnotFontMap::CreateFontResourceDict() { + if (!doc_) { + return nullptr; + } + + auto resource_font_dict = doc_->New(); + for (FontEntry& entry : fonts_) { + if (!entry.font || entry.alias.IsEmpty()) { + continue; + } + + if (entry.registered_font_id != CFX_FontRegistry::kInvalidFontId) { + RetainPtr subset_font_dict = + CPDF_AnnotFontSubset::CreateSubsetFontDict( + doc_, entry.registered_font_id, entry.glyph_to_unicode); + if (subset_font_dict) { + resource_font_dict->SetNewFor( + entry.alias, doc_, subset_font_dict->GetObjNum()); + } + continue; + } + + RetainPtr font_dict = entry.font->GetFontDict(); + if (!font_dict) { + continue; + } + + const uint32_t font_obj_num = font_dict->GetObjNum(); + if (font_obj_num != 0) { + resource_font_dict->SetNewFor(entry.alias, doc_, + font_obj_num); + } else { + resource_font_dict->SetFor(entry.alias, font_dict->Clone()); + } + } + return resource_font_dict; +} + +RetainPtr CPDF_AnnotFontMap::GetPDFFont(int32_t font_index) { + return fxcrt::IndexInBounds(fonts_, font_index) ? fonts_[font_index].font + : nullptr; +} + +ByteString CPDF_AnnotFontMap::GetPDFFontAlias(int32_t font_index) { + return fxcrt::IndexInBounds(fonts_, font_index) ? fonts_[font_index].alias + : ByteString(); +} + +int32_t CPDF_AnnotFontMap::GetWordFontIndex(uint16_t word, + FX_Charset charset, + int32_t font_index) { + if (SupportsWord(font_index, word)) { + return font_index; + } + if (SupportsWord(0, word)) { + return 0; + } + + for (size_t i = 1; i < fonts_.size(); ++i) { + if (SupportsWord(pdfium::checked_cast(i), word)) { + return pdfium::checked_cast(i); + } + } + + if (!allow_registered_fallbacks_ || !fonts_.front().font) { + return -1; + } + + const int weight = + fonts_.front().font->GetFontWeight().value_or(pdfium::kFontWeightNormal); + const bool italic = fonts_.front().font->GetItalicAngle() != 0; + std::optional font_id = + CFX_FontRegistry::FindFallbackFont(word, weight, italic); + if (!font_id.has_value()) { + return -1; + } + + int32_t existing_font_index = FindExistingRegisteredFont(*font_id); + if (existing_font_index >= 0) { + return existing_font_index; + } + + return AddRegisteredFallbackFont(*font_id); +} + +int32_t CPDF_AnnotFontMap::CharCodeFromUnicode(int32_t font_index, + uint16_t word) { + RetainPtr font = GetPDFFont(font_index); + if (!font) { + return -1; + } + + uint32_t charcode = font->CharCodeFromUnicode(word); + if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { + return -1; + } + if (fxcrt::IndexInBounds(fonts_, font_index)) { + FontEntry& entry = fonts_[font_index]; + if (entry.registered_font_id != CFX_FontRegistry::kInvalidFontId) { + entry.glyph_to_unicode.emplace(charcode, word); + } + } + return pdfium::checked_cast(charcode); +} + +FX_Charset CPDF_AnnotFontMap::CharSetFromUnicode(uint16_t word, + FX_Charset old_charset) { + if (word < 0x7F) { + return FX_Charset::kANSI; + } + if (old_charset != FX_Charset::kDefault) { + return old_charset; + } + return CFX_Font::GetCharSetFromUnicode(word); +} + +bool CPDF_AnnotFontMap::SupportsWord(int32_t font_index, uint16_t word) const { + if (!fxcrt::IndexInBounds(fonts_, font_index)) { + return false; + } + const FontEntry& entry = fonts_[font_index]; + if (!entry.font) { + return false; + } + if (entry.registered_font_id != CFX_FontRegistry::kInvalidFontId) { + return CFX_FontRegistry::SupportsUnicode(entry.registered_font_id, word); + } + return PDFontSupportsUnicode(entry.font, word); +} + +void CPDF_AnnotFontMap::DeleteTemporaryLayoutObjects() { + fonts_.clear(); + if (!doc_) { + temporary_layout_object_numbers_.clear(); + return; + } + + for (uint32_t obj_num : temporary_layout_object_numbers_) { + doc_->DeleteIndirectObject(obj_num); + } + temporary_layout_object_numbers_.clear(); +} + +RetainPtr CPDF_AnnotFontMap::CreateRegisteredLayoutFont( + CFX_FontRegistry::FontId font_id) { + CPDF_AnnotFontSubset::LayoutFont layout_font = + CPDF_AnnotFontSubset::CreateLayoutFont(doc_, font_id); + temporary_layout_object_numbers_.insert( + temporary_layout_object_numbers_.end(), + layout_font.temporary_object_numbers.begin(), + layout_font.temporary_object_numbers.end()); + return std::move(layout_font.font); +} + +int32_t CPDF_AnnotFontMap::FindExistingRegisteredFont( + CFX_FontRegistry::FontId font_id) const { + for (size_t i = 0; i < fonts_.size(); ++i) { + if (fonts_[i].registered_font_id == font_id) { + return pdfium::checked_cast(i); + } + } + return -1; +} + +int32_t CPDF_AnnotFontMap::AddRegisteredFallbackFont( + CFX_FontRegistry::FontId font_id) { + RetainPtr font = CreateRegisteredLayoutFont(font_id); + if (!font) { + return -1; + } + + FontEntry entry; + entry.font = std::move(font); + entry.alias = ResourceKeyForRegisteredFont(font_id); + entry.registered_font_id = font_id; + fonts_.push_back(std::move(entry)); + return pdfium::checked_cast(fonts_.size() - 1); +} diff --git a/core/fpdfdoc/cpdf_annotfontmap.h b/core/fpdfdoc/cpdf_annotfontmap.h new file mode 100644 index 0000000000..19193dea09 --- /dev/null +++ b/core/fpdfdoc/cpdf_annotfontmap.h @@ -0,0 +1,72 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: annotation font map for registered runtime fonts. This file is +// fork-owned and supports FreeText fallback font routing/subsetting. + +#ifndef CORE_FPDFDOC_CPDF_ANNOTFONTMAP_H_ +#define CORE_FPDFDOC_CPDF_ANNOTFONTMAP_H_ + +#include + +#include +#include + +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/unowned_ptr.h" +#include "core/fxge/cfx_fontregistry.h" + +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Font; + +class CPDF_AnnotFontMap final : public IPVT_FontMap { + public: + CPDF_AnnotFontMap(CPDF_Document* doc, + RetainPtr default_font, + const ByteString& default_font_alias, + bool allow_registered_fallbacks); + ~CPDF_AnnotFontMap() override; + + static bool EnsureRegisteredFontMarkerInDocument( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id, + ByteString* resource_key); + + RetainPtr CreateFontResourceDict(); + + // IPVT_FontMap: + RetainPtr GetPDFFont(int32_t font_index) override; + ByteString GetPDFFontAlias(int32_t font_index) override; + int32_t GetWordFontIndex(uint16_t word, + FX_Charset charset, + int32_t font_index) override; + int32_t CharCodeFromUnicode(int32_t font_index, uint16_t word) override; + FX_Charset CharSetFromUnicode(uint16_t word, FX_Charset old_charset) override; + + private: + struct FontEntry { + RetainPtr font; + ByteString alias; + CFX_FontRegistry::FontId registered_font_id = + CFX_FontRegistry::kInvalidFontId; + std::map glyph_to_unicode; + }; + + bool SupportsWord(int32_t font_index, uint16_t word) const; + void DeleteTemporaryLayoutObjects(); + RetainPtr CreateRegisteredLayoutFont( + CFX_FontRegistry::FontId font_id); + int32_t FindExistingRegisteredFont(CFX_FontRegistry::FontId font_id) const; + int32_t AddRegisteredFallbackFont(CFX_FontRegistry::FontId font_id); + + UnownedPtr const doc_; + const bool allow_registered_fallbacks_; + std::vector fonts_; + std::vector temporary_layout_object_numbers_; +}; + +#endif // CORE_FPDFDOC_CPDF_ANNOTFONTMAP_H_ diff --git a/core/fpdfdoc/cpdf_annotfontsubset.cpp b/core/fpdfdoc/cpdf_annotfontsubset.cpp new file mode 100644 index 0000000000..ac1766fd48 --- /dev/null +++ b/core/fpdfdoc/cpdf_annotfontsubset.cpp @@ -0,0 +1,668 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: builds PDF font dictionaries for registered annotation fonts, +// including per-annotation/layer subsets so large fallback fonts are not fully +// embedded into saved PDFs. + +#include "core/fpdfdoc/cpdf_annotfontsubset.h" + +#include +#include +#include +#include +#include + +#include "constants/font_encodings.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/check.h" +#include "core/fxcrt/check_op.h" +#include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/data_vector.h" +#include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "core/fxcrt/span.h" +#include "core/fxcrt/utf16.h" +#include "core/fxge/cfx_font.h" +#include "hb-subset.h" // nogncheck + +namespace { + +constexpr uint32_t kMaxBfCharBfRangeEntries = 100; +constexpr uint32_t kMaxPdfCid = 0xffff; + +enum class ObjectStorage { + kDirect, + kIndirect, +}; + +ByteString NormalizeBaseFontName(ByteString name) { + name.Remove(' '); + return name.IsEmpty() ? ByteString(CFX_Font::kUntitledFontName) : name; +} + +ByteString BaseFontNameForRegisteredFont(CFX_FontRegistry::FontId font_id, + const CFX_Font* font) { + ByteString name = CFX_FontRegistry::GetBaseFontName(font_id); + if (name.IsEmpty() && font) { + name = font->GetBaseFontName(); + } + return NormalizeBaseFontName(std::move(name)); +} + +RetainPtr NewDictionary(CPDF_Document* doc, + ObjectStorage storage) { + return storage == ObjectStorage::kIndirect + ? doc->NewIndirect() + : pdfium::MakeRetain(); +} + +RetainPtr NewArray(CPDF_Document* doc, ObjectStorage storage) { + return storage == ObjectStorage::kIndirect ? doc->NewIndirect() + : pdfium::MakeRetain(); +} + +RetainPtr NewStream(CPDF_Document* doc, + pdfium::span data, + ObjectStorage storage) { + return storage == ObjectStorage::kIndirect + ? doc->NewIndirect(data) + : pdfium::MakeRetain(data); +} + +template +void SetReferenceOrDirect(CPDF_Dictionary* dict, + const ByteString& key, + CPDF_Document* doc, + RetainPtr object) { + if (!object) { + return; + } + + const uint32_t obj_num = object->GetObjNum(); + if (obj_num != 0) { + dict->SetNewFor(key, doc, obj_num); + return; + } + + dict->SetFor(key, RetainPtr(std::move(object))); +} + +template +void AppendReferenceOrDirect(CPDF_Array* array, + CPDF_Document* doc, + RetainPtr object) { + if (!object) { + return; + } + + const uint32_t obj_num = object->GetObjNum(); + if (obj_num != 0) { + array->AppendNew(doc, obj_num); + return; + } + + array->Append(RetainPtr(std::move(object))); +} + +ByteString MakeSubsetBaseFontName( + const ByteString& base_font_name, + const CPDF_AnnotFontSubset::GlyphUnicodeMap& glyph_to_unicode) { + uint32_t hash = 2166136261u; + auto mix = [&hash](uint32_t value) { + for (int i = 0; i < 4; ++i) { + hash ^= (value >> (i * 8)) & 0xff; + hash *= 16777619u; + } + }; + + for (const auto& [glyph_id, unicode] : glyph_to_unicode) { + mix(glyph_id); + mix(unicode); + } + + char prefix[7] = {}; + for (int i = 0; i < 6; ++i) { + prefix[i] = static_cast('A' + (hash % 26)); + hash = hash / 26 + 1; + } + return ByteString(prefix) + "+" + base_font_name; +} + +RetainPtr CreateCompositeFontDict(CPDF_Document* doc, + const ByteString& name, + ObjectStorage storage) { + auto font_dict = NewDictionary(doc, storage); + font_dict->SetNewFor("Type", "Font"); + font_dict->SetNewFor("Subtype", "Type0"); + font_dict->SetNewFor("Encoding", "Identity-H"); + font_dict->SetNewFor("BaseFont", name); + return font_dict; +} + +RetainPtr CreateCidFontDict(CPDF_Document* doc, + const ByteString& name, + ObjectStorage storage) { + auto cid_font_dict = NewDictionary(doc, storage); + cid_font_dict->SetNewFor("Type", "Font"); + cid_font_dict->SetNewFor("Subtype", "CIDFontType2"); + cid_font_dict->SetNewFor("BaseFont", name); + cid_font_dict->SetNewFor("CIDToGIDMap", "Identity"); + + auto cid_system_info_dict = pdfium::MakeRetain(); + cid_system_info_dict->SetNewFor("Registry", "Adobe"); + cid_system_info_dict->SetNewFor("Ordering", "Identity"); + cid_system_info_dict->SetNewFor("Supplement", 0); + cid_font_dict->SetFor("CIDSystemInfo", std::move(cid_system_info_dict)); + return cid_font_dict; +} + +RetainPtr LoadFontDesc( + CPDF_Document* doc, + const ByteString& font_name, + CFX_Font* font, + pdfium::span font_data, + ObjectStorage storage, + std::vector* temporary_object_numbers) { + auto font_descriptor_dict = NewDictionary(doc, storage); + font_descriptor_dict->SetNewFor("Type", "FontDescriptor"); + font_descriptor_dict->SetNewFor("FontName", font_name); + + int flags = pdfium::kFontStyleNonSymbolic; + if (font->IsFixedWidth()) { + flags |= pdfium::kFontStyleFixedPitch; + } + if (font_name.Contains("Serif")) { + flags |= pdfium::kFontStyleSerif; + } + if (font->IsItalic()) { + flags |= pdfium::kFontStyleItalic; + } + if (font->IsBold()) { + flags |= pdfium::kFontStyleForceBold; + } + font_descriptor_dict->SetNewFor("Flags", flags); + + FX_RECT bbox = font->GetBBox().value_or(FX_RECT()); + font_descriptor_dict->SetRectFor("FontBBox", CFX_FloatRect(bbox)); + font_descriptor_dict->SetNewFor("ItalicAngle", + font->IsItalic() ? -12 : 0); + font_descriptor_dict->SetNewFor("Ascent", font->GetAscent()); + font_descriptor_dict->SetNewFor("Descent", font->GetDescent()); + font_descriptor_dict->SetNewFor("CapHeight", font->GetAscent()); + font_descriptor_dict->SetNewFor("StemV", + font->IsBold() ? 120 : 70); + + RetainPtr stream = + storage == ObjectStorage::kDirect + ? doc->NewIndirect(font_data) + : NewStream(doc, font_data, ObjectStorage::kIndirect); + stream->GetMutableDict()->SetNewFor( + "Length1", pdfium::checked_cast(font_data.size())); + if (temporary_object_numbers && storage == ObjectStorage::kDirect) { + temporary_object_numbers->push_back(stream->GetObjNum()); + } + font_descriptor_dict->SetNewFor("FontFile2", doc, + stream->GetObjNum()); + return font_descriptor_dict; +} + +RetainPtr CreateWidthsArray( + CPDF_Document* doc, + const std::map& widths, + ObjectStorage storage) { + auto widths_array = NewArray(doc, storage); + for (auto it = widths.begin(); it != widths.end(); ++it) { + auto next_it = std::next(it); + + if (next_it != widths.end() && next_it->first == it->first + 1 && + next_it->second == it->second) { + widths_array->AppendNew(static_cast(it->first)); + + while (next_it != widths.end() && next_it->first == it->first + 1 && + next_it->second == it->second) { + it = next_it; + next_it = std::next(it); + } + widths_array->AppendNew(static_cast(it->first)); + widths_array->AppendNew(static_cast(it->second)); + continue; + } + + widths_array->AppendNew(static_cast(it->first)); + auto current_width_array = pdfium::MakeRetain(); + current_width_array->AppendNew(static_cast(it->second)); + + while (next_it != widths.end() && next_it->first == it->first + 1) { + it = next_it; + next_it = std::next(it); + current_width_array->AppendNew(static_cast(it->second)); + } + widths_array->Append(std::move(current_width_array)); + } + return widths_array; +} + +const char kToUnicodeStart[] = + "/CIDInit /ProcSet findresource begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "<> def\n" + "/CMapName /Adobe-Identity-H def\n" + "/CMapType 2 def\n" + "1 begincodespacerange\n" + "<0000> \n" + "endcodespacerange\n"; + +const char kToUnicodeEnd[] = + "endcmap\n" + "CMapName currentdict /CMap defineresource pop\n" + "end\n" + "end\n"; + +void AddCharcode(fxcrt::ostringstream& buffer, uint32_t number) { + CHECK_LE(number, kMaxPdfCid); + buffer << "<"; + char ans[4]; + FXSYS_IntToFourHexChars(number, ans); + for (char c : ans) { + buffer << c; + } + buffer << ">"; +} + +void AddUnicode(fxcrt::ostringstream& buffer, uint32_t unicode) { + if (pdfium::IsHighSurrogate(unicode) || pdfium::IsLowSurrogate(unicode)) { + unicode = 0; + } + + char unicode_buf[8]; + pdfium::span unicode_span = FXSYS_ToUTF16BE(unicode, unicode_buf); + CHECK(!unicode_span.empty()); + buffer << "<"; + for (char c : unicode_span) { + buffer << c; + } + buffer << ">"; +} + +RetainPtr LoadUnicode( + CPDF_Document* doc, + const std::multimap& to_unicode, + ObjectStorage storage, + std::vector* temporary_object_numbers) { + std::map char_to_unicode_map; + std::map, std::vector> + char_range_to_unicodes_map; + std::map, uint32_t> + char_range_to_consecutive_unicodes_map; + + for (auto it = to_unicode.begin(); it != to_unicode.end(); ++it) { + uint32_t first_charcode = it->first; + uint32_t first_unicode = it->second; + { + auto next_it = std::next(it); + if (next_it == to_unicode.end() || first_charcode + 1 != next_it->first) { + char_to_unicode_map[first_charcode] = first_unicode; + continue; + } + } + + ++it; + uint32_t current_charcode = it->first; + uint32_t current_unicode = it->second; + if (current_charcode % 256 == 0) { + char_to_unicode_map[first_charcode] = first_unicode; + char_to_unicode_map[current_charcode] = current_unicode; + continue; + } + + const size_t max_extra = 255 - (current_charcode % 256); + auto next_it = std::next(it); + if (first_unicode + 1 != current_unicode) { + std::vector unicodes = {first_unicode, current_unicode}; + for (size_t i = 0; i < max_extra; ++i) { + if (next_it == to_unicode.end() || + current_charcode + 1 != next_it->first) { + break; + } + ++it; + ++current_charcode; + unicodes.push_back(it->second); + next_it = std::next(it); + } + CHECK_EQ(it->first - first_charcode + 1, unicodes.size()); + char_range_to_unicodes_map[std::make_pair(first_charcode, it->first)] = + std::move(unicodes); + continue; + } + + for (size_t i = 0; i < max_extra; ++i) { + if (next_it == to_unicode.end() || + current_charcode + 1 != next_it->first || + current_unicode + 1 != next_it->second) { + break; + } + ++it; + ++current_charcode; + ++current_unicode; + next_it = std::next(it); + } + char_range_to_consecutive_unicodes_map[std::make_pair( + first_charcode, current_charcode)] = first_unicode; + } + + fxcrt::ostringstream buffer; + buffer << kToUnicodeStart; + + uint32_t to_process = + pdfium::checked_cast(char_to_unicode_map.size()); + auto char_it = char_to_unicode_map.begin(); + while (to_process) { + const uint32_t count = std::min(to_process, kMaxBfCharBfRangeEntries); + buffer << count << " beginbfchar\n"; + for (uint32_t i = 0; i < count; ++i) { + CHECK(char_it != char_to_unicode_map.end()); + AddCharcode(buffer, char_it->first); + buffer << " "; + AddUnicode(buffer, char_it->second); + buffer << "\n"; + ++char_it; + } + buffer << "endbfchar\n"; + to_process -= count; + } + + to_process = + pdfium::checked_cast(char_range_to_unicodes_map.size()); + auto range_it = char_range_to_unicodes_map.begin(); + while (to_process) { + const uint32_t count = std::min(to_process, kMaxBfCharBfRangeEntries); + buffer << count << " beginbfrange\n"; + for (uint32_t i = 0; i < count; ++i) { + CHECK(range_it != char_range_to_unicodes_map.end()); + AddCharcode(buffer, range_it->first.first); + buffer << " "; + AddCharcode(buffer, range_it->first.second); + buffer << " ["; + auto unicodes = pdfium::span(range_it->second); + AddUnicode(buffer, unicodes[0]); + for (uint32_t code : unicodes.subspan(1u)) { + buffer << " "; + AddUnicode(buffer, code); + } + buffer << "]\n"; + ++range_it; + } + buffer << "endbfrange\n"; + to_process -= count; + } + + to_process = pdfium::checked_cast( + char_range_to_consecutive_unicodes_map.size()); + auto consecutive_it = char_range_to_consecutive_unicodes_map.begin(); + while (to_process) { + const uint32_t count = std::min(to_process, kMaxBfCharBfRangeEntries); + buffer << count << " beginbfrange\n"; + for (uint32_t i = 0; i < count; ++i) { + CHECK(consecutive_it != char_range_to_consecutive_unicodes_map.end()); + AddCharcode(buffer, consecutive_it->first.first); + buffer << " "; + AddCharcode(buffer, consecutive_it->first.second); + buffer << " "; + AddUnicode(buffer, consecutive_it->second); + buffer << "\n"; + ++consecutive_it; + } + buffer << "endbfrange\n"; + to_process -= count; + } + + buffer << kToUnicodeEnd; + RetainPtr stream = doc->NewIndirect(&buffer); + if (temporary_object_numbers && storage == ObjectStorage::kDirect) { + temporary_object_numbers->push_back(stream->GetObjNum()); + } + return stream; +} + +void CreateDescendantFontsArray(CPDF_Document* doc, + CPDF_Dictionary* font_dict, + RetainPtr cid_font_dict) { + auto descendant_fonts_array = + font_dict->SetNewFor("DescendantFonts"); + AppendReferenceOrDirect(descendant_fonts_array.Get(), doc, + std::move(cid_font_dict)); +} + +DataVector SubsetFontDataRetainGids( + pdfium::span font_data, + const CPDF_AnnotFontSubset::GlyphUnicodeMap& glyph_to_unicode) { + if (font_data.empty() || glyph_to_unicode.empty()) { + return DataVector(); + } + + hb_blob_t* source_blob = + hb_blob_create(reinterpret_cast(font_data.data()), + pdfium::checked_cast(font_data.size()), + HB_MEMORY_MODE_READONLY, nullptr, nullptr); + if (!source_blob) { + return DataVector(); + } + + hb_face_t* source_face = hb_face_create(source_blob, 0); + hb_blob_destroy(source_blob); + if (!source_face) { + return DataVector(); + } + + hb_subset_input_t* input = hb_subset_input_create_or_fail(); + if (!input) { + hb_face_destroy(source_face); + return DataVector(); + } + + hb_set_t* glyph_set = hb_subset_input_glyph_set(input); + hb_set_add(glyph_set, 0); + for (const auto& [glyph_id, unicode] : glyph_to_unicode) { + if (glyph_id <= kMaxPdfCid) { + hb_set_add(glyph_set, glyph_id); + } + } + + hb_subset_input_set_flags( + input, HB_SUBSET_FLAGS_RETAIN_GIDS | HB_SUBSET_FLAGS_NO_HINTING); + + hb_face_t* subset_face = hb_subset_or_fail(source_face, input); + hb_subset_input_destroy(input); + hb_face_destroy(source_face); + if (!subset_face) { + return DataVector(); + } + + hb_blob_t* subset_blob = hb_face_reference_blob(subset_face); + hb_face_destroy(subset_face); + if (!subset_blob) { + return DataVector(); + } + + unsigned int subset_length = 0; + const char* subset_data = hb_blob_get_data(subset_blob, &subset_length); + DataVector result; + if (subset_data && subset_length > 0) { + result = DataVector( + reinterpret_cast(subset_data), + reinterpret_cast(subset_data) + subset_length); + } + hb_blob_destroy(subset_blob); + return result; +} + +RetainPtr BuildCompositeFont( + CPDF_Document* doc, + CFX_Font* font, + const ByteString& base_font_name, + pdfium::span font_data, + const std::map& widths, + const std::multimap& to_unicode, + ObjectStorage storage, + std::vector* temporary_object_numbers) { + if (!doc || !font || widths.empty() || to_unicode.empty()) { + return nullptr; + } + + RetainPtr font_dict = + CreateCompositeFontDict(doc, base_font_name, storage); + RetainPtr cid_font_dict = + CreateCidFontDict(doc, base_font_name, storage); + + RetainPtr font_descriptor_dict = LoadFontDesc( + doc, base_font_name, font, font_data, storage, temporary_object_numbers); + SetReferenceOrDirect(cid_font_dict.Get(), "FontDescriptor", doc, + std::move(font_descriptor_dict)); + + RetainPtr widths_array = CreateWidthsArray(doc, widths, storage); + SetReferenceOrDirect(cid_font_dict.Get(), "W", doc, std::move(widths_array)); + + CreateDescendantFontsArray(doc, font_dict.Get(), std::move(cid_font_dict)); + + RetainPtr to_unicode_stream = + LoadUnicode(doc, to_unicode, storage, temporary_object_numbers); + SetReferenceOrDirect(font_dict.Get(), "ToUnicode", doc, + std::move(to_unicode_stream)); + return font_dict; +} + +} // namespace + +CPDF_AnnotFontSubset::LayoutFont::LayoutFont() = default; + +CPDF_AnnotFontSubset::LayoutFont::LayoutFont(LayoutFont&& that) noexcept = + default; + +CPDF_AnnotFontSubset::LayoutFont& CPDF_AnnotFontSubset::LayoutFont::operator=( + LayoutFont&& that) noexcept = default; + +CPDF_AnnotFontSubset::LayoutFont::~LayoutFont() = default; + +// static +CPDF_AnnotFontSubset::LayoutFont CPDF_AnnotFontSubset::CreateLayoutFont( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id) { + LayoutFont result; + if (!doc || !CFX_FontRegistry::IsValidFont(font_id)) { + return result; + } + + std::unique_ptr font = CFX_FontRegistry::CreateFont(font_id); + if (!font || !font->HasAnyGlyphs()) { + return result; + } + + auto char_codes_and_indices = + font->GetCharCodesAndIndices(pdfium::kMaximumSupplementaryCodePoint); + if (char_codes_and_indices.empty()) { + return result; + } + + std::multimap to_unicode; + std::map widths; + for (const auto& item : char_codes_and_indices) { + if (item.glyph_index > kMaxPdfCid) { + continue; + } + if (!pdfium::Contains(widths, item.glyph_index)) { + widths[item.glyph_index] = font->GetGlyphWidth(item.glyph_index); + } + to_unicode.emplace(item.glyph_index, item.char_code); + } + if (widths.empty() || to_unicode.empty()) { + return result; + } + + const ByteString base_font_name = + BaseFontNameForRegisteredFont(font_id, font.get()); + RetainPtr font_dict = BuildCompositeFont( + doc, font.get(), base_font_name, font->GetFontSpan(), widths, to_unicode, + ObjectStorage::kDirect, &result.temporary_object_numbers); + result.font = CPDF_Font::Create(doc, std::move(font_dict), nullptr); + return result; +} + +// static +RetainPtr CPDF_AnnotFontSubset::CreateSubsetFontDict( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id, + const GlyphUnicodeMap& glyph_to_unicode) { + if (!doc || glyph_to_unicode.empty() || + !CFX_FontRegistry::IsValidFont(font_id)) { + return nullptr; + } + + std::unique_ptr font = CFX_FontRegistry::CreateFont(font_id); + if (!font || !font->HasAnyGlyphs()) { + return nullptr; + } + + GlyphUnicodeMap filtered_glyph_to_unicode; + std::map widths; + std::multimap to_unicode; + for (const auto& [glyph_id, unicode] : glyph_to_unicode) { + if (glyph_id == 0 || glyph_id > kMaxPdfCid) { + continue; + } + filtered_glyph_to_unicode.emplace(glyph_id, unicode); + widths[glyph_id] = font->GetGlyphWidth(glyph_id); + to_unicode.emplace(glyph_id, unicode); + } + if (filtered_glyph_to_unicode.empty()) { + return nullptr; + } + + DataVector subset_font_data = + SubsetFontDataRetainGids(font->GetFontSpan(), filtered_glyph_to_unicode); + pdfium::span font_data = subset_font_data.empty() + ? font->GetFontSpan() + : pdfium::span(subset_font_data); + + const ByteString base_font_name = + BaseFontNameForRegisteredFont(font_id, font.get()); + const ByteString subset_font_name = + MakeSubsetBaseFontName(base_font_name, filtered_glyph_to_unicode); + return BuildCompositeFont(doc, font.get(), subset_font_name, font_data, + widths, to_unicode, ObjectStorage::kIndirect, + /*temporary_object_numbers=*/nullptr); +} + +// static +RetainPtr CPDF_AnnotFontSubset::CreateMarkerFontDict( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id) { + if (!doc || !CFX_FontRegistry::IsValidFont(font_id)) { + return nullptr; + } + + auto font_dict = doc->NewIndirect(); + font_dict->SetNewFor("Type", "Font"); + font_dict->SetNewFor("Subtype", "Type1"); + font_dict->SetNewFor( + "BaseFont", BaseFontNameForRegisteredFont(font_id, nullptr)); + font_dict->SetNewFor("Encoding", + pdfium::font_encodings::kWinAnsiEncoding); + return font_dict; +} diff --git a/core/fpdfdoc/cpdf_annotfontsubset.h b/core/fpdfdoc/cpdf_annotfontsubset.h new file mode 100644 index 0000000000..f34e4cf301 --- /dev/null +++ b/core/fpdfdoc/cpdf_annotfontsubset.h @@ -0,0 +1,53 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: fork-owned helper for registered annotation font layout and +// per-annotation/layer subset embedding. + +#ifndef CORE_FPDFDOC_CPDF_ANNOTFONTSUBSET_H_ +#define CORE_FPDFDOC_CPDF_ANNOTFONTSUBSET_H_ + +#include + +#include +#include + +#include "core/fxcrt/retain_ptr.h" +#include "core/fxge/cfx_fontregistry.h" + +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Font; + +class CPDF_AnnotFontSubset final { + public: + using GlyphUnicodeMap = std::map; + + struct LayoutFont { + LayoutFont(); + LayoutFont(LayoutFont&& that) noexcept; + LayoutFont& operator=(LayoutFont&& that) noexcept; + ~LayoutFont(); + + LayoutFont(const LayoutFont&) = delete; + LayoutFont& operator=(const LayoutFont&) = delete; + + RetainPtr font; + std::vector temporary_object_numbers; + }; + + static LayoutFont CreateLayoutFont(CPDF_Document* doc, + CFX_FontRegistry::FontId font_id); + + static RetainPtr CreateSubsetFontDict( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id, + const GlyphUnicodeMap& glyph_to_unicode); + + static RetainPtr CreateMarkerFontDict( + CPDF_Document* doc, + CFX_FontRegistry::FontId font_id); +}; + +#endif // CORE_FPDFDOC_CPDF_ANNOTFONTSUBSET_H_ diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index e399eb0635..b05ee652c1 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -34,6 +34,7 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfapi/parser/fpdf_parser_utility.h" #include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_annotfontmap.h" #include "core/fpdfdoc/cpdf_cloudy_border.h" #include "core/fpdfdoc/cpdf_color_utils.h" #include "core/fpdfdoc/cpdf_defaultappearance.h" @@ -262,9 +263,12 @@ ByteString GetPDFWordString(IPVT_FontMap* font_map, } ByteString word_string; - uint32_t char_code = pdf_font->CharCodeFromUnicode(word); - if (char_code != CPDF_Font::kInvalidCharCode) { - pdf_font->AppendChar(&word_string, char_code); + // EmbedPDF: route unicode-to-charcode mapping through IPVT_FontMap so + // CPDF_AnnotFontMap can use registered fallback fonts and subset-local glyph + // ids when generating FreeText appearance streams. + int32_t char_code = font_map->CharCodeFromUnicode(font_index, word); + if (char_code >= 0) { + pdf_font->AppendChar(&word_string, static_cast(char_code)); } return word_string; } @@ -1839,7 +1843,11 @@ bool GenerateFreeTextAP(APGenerationTarget* target, actual_text_color = fpdfdoc::CFXColorFromArray(*tc); } - CPVT_FontMap map(doc, nullptr, std::move(default_font), font_name); + // EmbedPDF: use the annotation font map instead of CPVT_FontMap so + // FreeText AP generation can fall back to registered fonts and produce + // persistent, per-annotation subsets when saving. + CPDF_AnnotFontMap map(doc, std::move(default_font), font_name, + target->IsPersistent()); CPVT_VariableText::Provider provider(&map); CPVT_VariableText vt(&provider); @@ -1882,8 +1890,9 @@ bool GenerateFreeTextAP(APGenerationTarget* target, // Finalize AP dict. auto graphics_state_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resource_font_dict = - GenerateResourceFontDict(doc, font_name, font_dict.Get()); + // EmbedPDF: collect both the original DA font and any registered fallback + // fonts actually used by this annotation into the AP resource dictionary. + auto resource_font_dict = map.CreateFontResourceDict(); auto resource_dict = GenerateResourcesDict( doc, std::move(graphics_state_dict), std::move(resource_font_dict)); GenerateAndSetAPDict(target, annot_dict, &appearance_stream, @@ -1916,7 +1925,9 @@ bool GenerateFreeTextAP(APGenerationTarget* target, appearance_stream << "q\n" << border_stream << "Q\n"; } - CPVT_FontMap map(doc, nullptr, std::move(default_font), font_name); + // EmbedPDF: same registered-font/subset path as the callout branch above. + CPDF_AnnotFontMap map(doc, std::move(default_font), font_name, + target->IsPersistent()); CPVT_VariableText::Provider provider(&map); CPVT_VariableText vt(&provider); @@ -1961,8 +1972,9 @@ bool GenerateFreeTextAP(APGenerationTarget* target, } auto graphics_state_dict = GenerateExtGStateDict(*annot_dict, blend_name); - auto resource_font_dict = - GenerateResourceFontDict(doc, font_name, font_dict.Get()); + // EmbedPDF: include registered fallback subset fonts used by this FreeText + // appearance, scoped to this annotation/layer. + auto resource_font_dict = map.CreateFontResourceDict(); auto resource_dict = GenerateResourcesDict( doc, std::move(graphics_state_dict), std::move(resource_font_dict)); if (rot_info.is_rotated) { @@ -3597,3 +3609,32 @@ bool CPDF_GenerateAP::UpdateDefaultAppearance(CPDF_Document* doc, annot_dict->SetNewFor("DA", da_color_part + " " + da_font_part); return true; } + +bool CPDF_GenerateAP::UpdateDefaultAppearanceRegisteredFont( + CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + CFX_FontRegistry::FontId font_id, + float font_size, + const CFX_Color& color) { + // EmbedPDF: allow FreeText DA to reference a registered runtime font. The DA + // stores a lightweight marker resource; actual subset embedding happens when + // AP generation knows the characters used by this annotation/layer. + if (!doc || !annot_dict || !CFX_FontRegistry::IsValidFont(font_id)) { + return false; + } + + ByteString resource_key; + if (!CPDF_AnnotFontMap::EnsureRegisteredFontMarkerInDocument(doc, font_id, + &resource_key) || + resource_key.IsEmpty()) { + return false; + } + + ByteString da_font_part = StringFromFontNameAndSize(resource_key, font_size); + ByteString da_color_part = GenerateColorAP(color, PaintOperation::kFill); + da_color_part.TrimBack('\n'); + da_font_part.TrimBack('\n'); + + annot_dict->SetNewFor("DA", da_color_part + " " + da_font_part); + return true; +} diff --git a/core/fpdfdoc/cpdf_generateap.h b/core/fpdfdoc/cpdf_generateap.h index c0b4cc1f4c..0b31f2d25f 100644 --- a/core/fpdfdoc/cpdf_generateap.h +++ b/core/fpdfdoc/cpdf_generateap.h @@ -10,6 +10,7 @@ #include #include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxge/cfx_fontregistry.h" class CPDF_Dictionary; class CPDF_Document; @@ -73,6 +74,15 @@ class CPDF_GenerateAP { float font_size, const CFX_Color& color); + // EmbedPDF: Set FreeText DA to a registered runtime font. The actual AP path + // later embeds a subset for only the characters used by the annotation/layer. + static bool UpdateDefaultAppearanceRegisteredFont( + CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + CFX_FontRegistry::FontId font_id, + float font_size, + const CFX_Color& color); + CPDF_GenerateAP() = delete; CPDF_GenerateAP(const CPDF_GenerateAP&) = delete; CPDF_GenerateAP& operator=(const CPDF_GenerateAP&) = delete; diff --git a/core/fpdfdoc/cpvt_fontmap.cpp b/core/fpdfdoc/cpvt_fontmap.cpp index 7f3ef705cc..3e4a835644 100644 --- a/core/fpdfdoc/cpvt_fontmap.cpp +++ b/core/fpdfdoc/cpvt_fontmap.cpp @@ -16,7 +16,28 @@ #include "core/fpdfdoc/cpdf_interactiveform.h" #include "core/fxcrt/check.h" #include "core/fxcrt/fx_codepage.h" -#include "core/fxcrt/notreached.h" + +namespace { + +// EmbedPDF: CPVT_FontMap is used by upstream FreeText appearance generation, +// but upstream left these font-selection hooks as NOTREACHED(). Registered +// annotation fonts need real default behavior so CPVT_VariableText can ask the +// active font map whether a specific glyph is supported. +bool FontSupportsUnicode(const RetainPtr& font, uint16_t word) { + if (!font) { + return false; + } + + uint32_t charcode = font->CharCodeFromUnicode(word); + if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { + return false; + } + + bool vert_glyph = false; + return font->GlyphFromCharCode(charcode, &vert_glyph) > 0; +} + +} // namespace CPVT_FontMap::CPVT_FontMap(CPDF_Document* doc, RetainPtr pResDict, @@ -81,14 +102,43 @@ ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) { int32_t CPVT_FontMap::GetWordFontIndex(uint16_t word, FX_Charset charset, int32_t nFontIndex) { - NOTREACHED(); + // EmbedPDF: keep the current font when it can draw the word, otherwise fall + // back to the default DA font and then PDFium's native annotation font. + if (nFontIndex >= 0 && FontSupportsUnicode(GetPDFFont(nFontIndex), word)) { + return nFontIndex; + } + if (FontSupportsUnicode(GetPDFFont(0), word)) { + return 0; + } + if (FontSupportsUnicode(GetPDFFont(1), word)) { + return 1; + } + return -1; } int32_t CPVT_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) { - NOTREACHED(); + // EmbedPDF: expose a common unicode-to-charcode hook so specialized font maps + // can return registered-font subset glyph ids without changing PVT layout. + RetainPtr font = GetPDFFont(nFontIndex); + if (!font) { + return -1; + } + uint32_t charcode = font->CharCodeFromUnicode(word); + if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { + return -1; + } + return charcode; } FX_Charset CPVT_FontMap::CharSetFromUnicode(uint16_t word, FX_Charset nOldCharset) { - NOTREACHED(); + // EmbedPDF: provide a conservative default implementation for the PVT + // provider hook; registered annotation maps may override as needed. + if (word < 0x7F) { + return FX_Charset::kANSI; + } + if (nOldCharset != FX_Charset::kDefault) { + return nOldCharset; + } + return CFX_Font::GetCharSetFromUnicode(word); } diff --git a/core/fpdfdoc/cpvt_variabletext.cpp b/core/fpdfdoc/cpvt_variabletext.cpp index 60cb93a41d..63b0be70f3 100644 --- a/core/fpdfdoc/cpvt_variabletext.cpp +++ b/core/fpdfdoc/cpvt_variabletext.cpp @@ -68,17 +68,9 @@ int32_t CPVT_VariableText::Provider::GetTypeDescent(int32_t nFontIndex) { int32_t CPVT_VariableText::Provider::GetWordFontIndex(uint16_t word, FX_Charset charset, int32_t nFontIndex) { - if (RetainPtr pDefFont = font_map_->GetPDFFont(0)) { - if (pDefFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) { - return 0; - } - } - if (RetainPtr pSysFont = font_map_->GetPDFFont(1)) { - if (pSysFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) { - return 1; - } - } - return -1; + // EmbedPDF: delegate font choice to IPVT_FontMap so CPDF_AnnotFontMap can + // route individual FreeText glyphs to registered fallback fonts. + return font_map_->GetWordFontIndex(word, charset, nFontIndex); } int32_t CPVT_VariableText::Provider::GetDefaultFontIndex() { diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn index 9604143bd5..4763ea406f 100644 --- a/core/fxge/BUILD.gn +++ b/core/fxge/BUILD.gn @@ -33,6 +33,10 @@ source_set("fxge") { "cfx_font.h", "cfx_fontmapper.cpp", "cfx_fontmapper.h", + # EmbedPDF: runtime font registry shared by page fallback rendering and + # annotation authoring/subset embedding. + "cfx_fontregistry.cpp", + "cfx_fontregistry.h", "cfx_fontmgr.cpp", "cfx_fontmgr.h", "cfx_gemodule.cpp", diff --git a/core/fxge/cfx_fontregistry.cpp b/core/fxge/cfx_fontregistry.cpp new file mode 100644 index 0000000000..572b5161ed --- /dev/null +++ b/core/fxge/cfx_fontregistry.cpp @@ -0,0 +1,318 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: process/thread-local registry for runtime fonts. Registered fonts +// are used both for page-rendering fallback and for annotation authoring. + +#include "core/fxge/cfx_fontregistry.h" + +#include +#include +#include +#include +#include + +#include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/data_vector.h" +#include "core/fxcrt/epdf_tls.h" +#include "core/fxcrt/fx_codepage.h" +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "core/fxcrt/stl_util.h" +#include "core/fxcrt/utf16.h" +#include "core/fxge/cfx_face.h" +#include "core/fxge/cfx_font.h" + +namespace { + +struct RegisteredFont { + CFX_FontRegistry::FontId id = CFX_FontRegistry::kInvalidFontId; + ByteString base_font_name; + int weight = pdfium::kFontWeightNormal; + bool italic = false; + std::vector supported_unicodes; + DataVector memory_data; + RetainPtr stream; +}; + +struct RegistryState { + CFX_FontRegistry::FontId next_font_id = 1; + std::vector> fonts; + std::vector fallback_order; +}; + +EPDF_TLS RegistryState* g_registry = nullptr; + +RegistryState* GetRegistry() { + if (!g_registry) { + g_registry = new RegistryState(); + } + return g_registry; +} + +RegisteredFont* GetRegisteredFont(CFX_FontRegistry::FontId font_id) { + if (font_id == CFX_FontRegistry::kInvalidFontId || !g_registry) { + return nullptr; + } + + for (const auto& font : g_registry->fonts) { + if (font && font->id == font_id) { + return font.get(); + } + } + return nullptr; +} + +ByteString NormalizeBaseFontName(ByteString name) { + name.Remove(' '); + return name.IsEmpty() ? ByteString(CFX_Font::kUntitledFontName) : name; +} + +int NormalizeWeight(int weight, const CFX_Font& font) { + if (weight >= 100 && weight <= 900) { + return weight; + } + return font.IsBold() ? pdfium::kFontWeightBold : pdfium::kFontWeightNormal; +} + +bool NormalizeItalic(int italic, const CFX_Font& font) { + if (italic == 0 || italic == 1) { + return italic == 1; + } + return font.IsItalic(); +} + +DataVector ReadStreamToData(IFX_SeekableReadStream* stream) { + if (!stream || stream->GetSize() <= 0 || + !pdfium::IsValueInRangeForNumericType(stream->GetSize())) { + return {}; + } + + DataVector data(pdfium::checked_cast(stream->GetSize())); + if (!stream->ReadBlockAtOffset(pdfium::span(data), /*offset=*/0)) { + return {}; + } + return data; +} + +std::unique_ptr LoadFont(pdfium::span data) { + if (data.empty()) { + return nullptr; + } + + auto font = std::make_unique(); + if (!font->LoadEmbedded(data, /*force_vertical=*/false, /*object_tag=*/0)) { + return nullptr; + } + return font; +} + +std::vector CollectSupportedUnicodes(CFX_Font* font) { + if (!font) { + return {}; + } + + auto char_codes_and_indices = + font->GetCharCodesAndIndices(pdfium::kMaximumSupplementaryCodePoint); + std::vector supported_unicodes; + supported_unicodes.reserve(char_codes_and_indices.size()); + for (const auto& item : char_codes_and_indices) { + if (item.glyph_index != 0) { + supported_unicodes.push_back(item.char_code); + } + } + + std::ranges::sort(supported_unicodes); + supported_unicodes.erase( + std::unique(supported_unicodes.begin(), supported_unicodes.end()), + supported_unicodes.end()); + return supported_unicodes; +} + +CFX_FontRegistry::FontId RegisterLoadedFontSource( + const ByteString& family_name, + int weight, + int italic, + pdfium::span data, + DataVector memory_data, + RetainPtr stream) { + if (data.empty()) { + return CFX_FontRegistry::kInvalidFontId; + } + + RegistryState* registry = GetRegistry(); + if (registry->next_font_id == + std::numeric_limits::max()) { + return CFX_FontRegistry::kInvalidFontId; + } + + std::unique_ptr font = LoadFont(data); + if (!font || !font->HasAnyGlyphs()) { + return CFX_FontRegistry::kInvalidFontId; + } + + std::vector supported_unicodes = + CollectSupportedUnicodes(font.get()); + if (supported_unicodes.empty()) { + return CFX_FontRegistry::kInvalidFontId; + } + + auto registered_font = std::make_unique(); + registered_font->id = registry->next_font_id++; + registered_font->base_font_name = NormalizeBaseFontName( + family_name.IsEmpty() ? font->GetBaseFontName() : family_name); + registered_font->weight = NormalizeWeight(weight, *font); + registered_font->italic = NormalizeItalic(italic, *font); + registered_font->supported_unicodes = std::move(supported_unicodes); + registered_font->memory_data = std::move(memory_data); + registered_font->stream = std::move(stream); + + const CFX_FontRegistry::FontId id = registered_font->id; + registry->fonts.push_back(std::move(registered_font)); + return id; +} + +int StyleScore(const RegisteredFont& font, int weight, bool italic) { + const int weight_score = std::abs(font.weight - weight); + const int italic_score = font.italic == italic ? 0 : 1000; + return weight_score + italic_score; +} + +} // namespace + +// static +CFX_FontRegistry::FontId CFX_FontRegistry::RegisterMemoryFont( + const ByteString& family_name, + int weight, + int italic, + pdfium::span data) { + if (data.empty()) { + return kInvalidFontId; + } + + DataVector memory_data(data.begin(), data.end()); + pdfium::span font_data(memory_data); + return RegisterLoadedFontSource(family_name, weight, italic, font_data, + std::move(memory_data), nullptr); +} + +// static +CFX_FontRegistry::FontId CFX_FontRegistry::RegisterFont( + const ByteString& family_name, + int weight, + int italic, + RetainPtr stream) { + DataVector data = ReadStreamToData(stream.Get()); + return RegisterLoadedFontSource(family_name, weight, italic, + pdfium::span(data), {}, std::move(stream)); +} + +// static +void CFX_FontRegistry::ClearRegisteredFonts() { + if (!g_registry) { + return; + } + g_registry->fallback_order.clear(); + g_registry->fonts.clear(); + g_registry->next_font_id = 1; +} + +// static +bool CFX_FontRegistry::AddFallbackFont(FontId font_id) { + if (!IsValidFont(font_id)) { + return false; + } + + RegistryState* registry = GetRegistry(); + if (pdfium::Contains(registry->fallback_order, font_id)) { + return true; + } + registry->fallback_order.push_back(font_id); + return true; +} + +// static +void CFX_FontRegistry::ClearFallbackFonts() { + if (!g_registry) { + return; + } + g_registry->fallback_order.clear(); +} + +// static +bool CFX_FontRegistry::IsValidFont(FontId font_id) { + return GetRegisteredFont(font_id) != nullptr; +} + +// static +ByteString CFX_FontRegistry::GetBaseFontName(FontId font_id) { + RegisteredFont* font = GetRegisteredFont(font_id); + return font ? font->base_font_name : ByteString(); +} + +// static +int CFX_FontRegistry::GetStyleWeight(FontId font_id) { + RegisteredFont* font = GetRegisteredFont(font_id); + return font ? font->weight : pdfium::kFontWeightNormal; +} + +// static +bool CFX_FontRegistry::IsStyleItalic(FontId font_id) { + RegisteredFont* font = GetRegisteredFont(font_id); + return font && font->italic; +} + +// static +bool CFX_FontRegistry::SupportsUnicode(FontId font_id, uint32_t unicode) { + RegisteredFont* font = GetRegisteredFont(font_id); + if (!font) { + return false; + } + return std::ranges::binary_search(font->supported_unicodes, unicode); +} + +// static +std::optional +CFX_FontRegistry::FindFallbackFont(uint32_t unicode, int weight, bool italic) { + if (!g_registry) { + return std::nullopt; + } + + std::optional best_font_id; + int best_score = std::numeric_limits::max(); + for (FontId font_id : g_registry->fallback_order) { + RegisteredFont* font = GetRegisteredFont(font_id); + if (!font || !SupportsUnicode(font_id, unicode)) { + continue; + } + + const int score = StyleScore(*font, weight, italic); + if (!best_font_id.has_value() || score < best_score) { + best_font_id = font_id; + best_score = score; + } + } + return best_font_id; +} + +// static +std::unique_ptr CFX_FontRegistry::CreateFont(FontId font_id) { + RegisteredFont* registered_font = GetRegisteredFont(font_id); + if (!registered_font) { + return nullptr; + } + + if (!registered_font->memory_data.empty()) { + return LoadFont(pdfium::span(registered_font->memory_data)); + } + + DataVector data = ReadStreamToData(registered_font->stream.Get()); + return LoadFont(pdfium::span(data)); +} + +// static +void CFX_FontRegistry::DestroyGlobals() { + delete g_registry; + g_registry = nullptr; +} diff --git a/core/fxge/cfx_fontregistry.h b/core/fxge/cfx_fontregistry.h new file mode 100644 index 0000000000..4c35a502cf --- /dev/null +++ b/core/fxge/cfx_fontregistry.h @@ -0,0 +1,55 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmbedPDF: fork-owned runtime font registry shared by page fallback rendering +// and annotation appearance/subset embedding. + +#ifndef CORE_FXGE_CFX_FONTREGISTRY_H_ +#define CORE_FXGE_CFX_FONTREGISTRY_H_ + +#include + +#include +#include + +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" + +class CFX_Font; +class IFX_SeekableReadStream; + +class CFX_FontRegistry { + public: + using FontId = uint32_t; + + static constexpr FontId kInvalidFontId = 0; + + static FontId RegisterMemoryFont(const ByteString& family_name, + int weight, + int italic, + pdfium::span data); + static FontId RegisterFont(const ByteString& family_name, + int weight, + int italic, + RetainPtr stream); + static void ClearRegisteredFonts(); + + static bool AddFallbackFont(FontId font_id); + static void ClearFallbackFonts(); + + static bool IsValidFont(FontId font_id); + static ByteString GetBaseFontName(FontId font_id); + static int GetStyleWeight(FontId font_id); + static bool IsStyleItalic(FontId font_id); + static bool SupportsUnicode(FontId font_id, uint32_t unicode); + static std::optional FindFallbackFont(uint32_t unicode, + int weight, + bool italic); + static std::unique_ptr CreateFont(FontId font_id); + + static void DestroyGlobals(); +}; + +#endif // CORE_FXGE_CFX_FONTREGISTRY_H_ diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 6c8aa9f80a..b9be6f88d4 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -8,6 +8,8 @@ import("../testing/test.gni") source_set("fpdfsdk") { sources = [ "epdf_base_document.cpp", + # EmbedPDF: implements EPDFFont_* runtime font registration APIs. + "epdf_font.cpp", "epdf_layer.cpp", "epdf_outline.cpp", "epdf_page_content_helpers.cpp", diff --git a/fpdfsdk/epdf_font.cpp b/fpdfsdk/epdf_font.cpp new file mode 100644 index 0000000000..efe9c04db5 --- /dev/null +++ b/fpdfsdk/epdf_font.cpp @@ -0,0 +1,73 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_font.h" + +#include +#include + +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" +#include "core/fxge/cfx_fontregistry.h" +#include "fpdfsdk/cpdfsdk_customaccess.h" + +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterFont(FPDF_BYTESTRING family_name, + int weight, + int italic, + FPDF_FILEACCESS* file_access) { + if (!file_access) { + return CFX_FontRegistry::kInvalidFontId; + } + + ByteString font_family_name(family_name ? family_name : ""); + return CFX_FontRegistry::RegisterFont( + font_family_name, weight, italic, + pdfium::MakeRetain(file_access)); +} + +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterMemFont(FPDF_BYTESTRING family_name, + int weight, + int italic, + const void* data_buf, + int size) { + if (size < 0) { + return CFX_FontRegistry::kInvalidFontId; + } + return EPDFFont_RegisterMemFont64(family_name, weight, italic, data_buf, + static_cast(size)); +} + +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterMemFont64(FPDF_BYTESTRING family_name, + int weight, + int italic, + const void* data_buf, + size_t size) { + if (!data_buf || size == 0) { + return CFX_FontRegistry::kInvalidFontId; + } + + ByteString font_family_name(family_name ? family_name : ""); + // SAFETY: required from caller. + auto font_data = + UNSAFE_BUFFERS(pdfium::span(static_cast(data_buf), size)); + return CFX_FontRegistry::RegisterMemoryFont(font_family_name, weight, italic, + font_data); +} + +FPDF_EXPORT void FPDF_CALLCONV EPDFFont_ClearRegisteredFonts(void) { + CFX_FontRegistry::ClearRegisteredFonts(); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFFont_AddFallbackFont(EPDF_FONT_ID font_id) { + return CFX_FontRegistry::AddFallbackFont(font_id); +} + +FPDF_EXPORT void FPDF_CALLCONV EPDFFont_ClearFallbackFonts(void) { + CFX_FontRegistry::ClearFallbackFonts(); +} diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 8659c21a9e..10ee70472b 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -50,6 +50,7 @@ #include "core/fxcrt/ptr_util.h" #include "core/fxcrt/stl_util.h" #include "core/fxge/cfx_color.h" +#include "core/fxge/cfx_fontregistry.h" #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_interactiveform.h" @@ -3644,6 +3645,46 @@ EPDFAnnot_SetDefaultAppearance(FPDF_ANNOTATION annot, doc, annot_dict.Get(), internal_font, font_size, CFX_Color(R, G, B)); } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetDefaultAppearanceRegisteredFont(FPDF_ANNOTATION annot, + EPDF_FONT_ID font_id, + float font_size, + unsigned int R, + unsigned int G, + unsigned int B) { + // EmbedPDF: annotation-specific bridge from public API to the registered font + // AP pipeline. Generic EPDFFont_* registration lives in epdf_font.cpp because + // the same registry is also used for page-rendering fallback. + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return false; + } + + RetainPtr annot_dict = context->GetMutableAnnotDict(); + if (!annot_dict) { + return false; + } + + FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot); + if (subtype != FPDF_ANNOT_FREETEXT && subtype != FPDF_ANNOT_WIDGET && + subtype != FPDF_ANNOT_REDACT) { + return false; + } + + CPDF_Document* doc = context->GetPage()->GetDocument(); + if (!doc) { + return false; + } + + if (!CFX_FontRegistry::IsValidFont(font_id) || font_size < 0 || R > 255 || + G > 255 || B > 255) { + return false; + } + + return CPDF_GenerateAP::UpdateDefaultAppearanceRegisteredFont( + doc, annot_dict.Get(), font_id, font_size, CFX_Color(R, G, B)); +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, FPDF_STANDARD_FONT* font, diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 47449aed4e..5e335681ac 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -15,11 +15,13 @@ #include "build/build_config.h" #include "constants/annotation_common.h" +#include "core/fpdfapi/font/cpdf_tounicodemap.h" #include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" +#include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/fx_memcpy_wrappers.h" @@ -31,6 +33,7 @@ #include "public/fpdf_attachment.h" #include "public/fpdf_edit.h" #include "public/fpdf_formfill.h" +#include "public/fpdf_save.h" #include "public/fpdf_text.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" @@ -38,9 +41,12 @@ #include "testing/fx_string_testhelpers.h" #include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/utils/file_util.h" #include "testing/utils/hash.h" +#include "testing/utils/path_service.h" using pdfium::kAnnotationStampWithApPng; +using testing::HasSubstr; namespace { @@ -64,6 +70,41 @@ std::wstring ExtractPageText(FPDF_PAGE page) { return GetPlatformWString(buffer.data()); } +std::vector LoadNotoSansSCFontData() { + std::string font_path = PathService::GetThirdPartyFilePath( + "NotoSansCJK/NotoSansSC-Regular.subset.otf"); + if (font_path.empty()) { + ADD_FAILURE() << "Failed to find NotoSansSC subset font"; + return {}; + } + return GetFileContents(font_path.c_str()); +} + +std::vector LoadRobotoFontData() { + std::string font_path = PathService::GetThirdPartyFilePath( + "harfbuzz-ng/src/perf/fonts/Roboto-Regular.ttf"); + if (font_path.empty()) { + ADD_FAILURE() << "Failed to find Roboto test font"; + return {}; + } + return GetFileContents(font_path.c_str()); +} + +std::wstring GetNormalAppearance(FPDF_ANNOTATION annot) { + unsigned long length_bytes = + FPDFAnnot_GetAP(annot, FPDF_ANNOT_APPEARANCEMODE_NORMAL, nullptr, 0); + if (length_bytes == 0) { + ADD_FAILURE() << "Missing normal appearance stream"; + return L""; + } + + std::vector buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, + FPDFAnnot_GetAP(annot, FPDF_ANNOT_APPEARANCEMODE_NORMAL, + buffer.data(), length_bytes)); + return GetPlatformWString(buffer.data()); +} + struct RedactionReport { std::vector object_numbers; uint32_t written_count = 0; @@ -71,6 +112,103 @@ struct RedactionReport { uint32_t nm_utf8_bytes_used = 0; }; +class ScopedRegisteredFonts { + public: + ScopedRegisteredFonts() { EPDFFont_ClearRegisteredFonts(); } + ~ScopedRegisteredFonts() { EPDFFont_ClearRegisteredFonts(); } +}; + +class MemoryFontFileAccess final : public FPDF_FILEACCESS { + public: + explicit MemoryFontFileAccess(std::vector data) + : data_(std::move(data)) { + m_FileLen = static_cast(data_.size()); + m_GetBlock = &MemoryFontFileAccess::GetBlock; + m_Param = this; + } + + private: + static int GetBlock(void* param, + unsigned long pos, + unsigned char* buf, + unsigned long size) { + auto* file_access = static_cast(param); + if (!file_access || !buf || pos > file_access->data_.size() || + size > file_access->data_.size() - pos) { + return 0; + } + + std::copy_n(file_access->data_.data() + pos, size, buf); + return 1; + } + + std::vector data_; +}; + +ByteString RegisteredFontAlias(EPDF_FONT_ID font_id) { + return ByteString::Format("ERegF%u", font_id); +} + +RetainPtr GetAppearanceFontDict( + FPDF_ANNOTATION annot, + const ByteString& font_alias) { + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return nullptr; + } + + const CPDF_Dictionary* annot_dict = context->GetAnnotDict(); + if (!annot_dict) { + return nullptr; + } + + RetainPtr ap_dict = + annot_dict->GetDictFor(pdfium::annotation::kAP); + RetainPtr stream_dict = + ap_dict ? ap_dict->GetDictFor("N") : nullptr; + RetainPtr resources_dict = + stream_dict ? stream_dict->GetDictFor("Resources") : nullptr; + RetainPtr font_dict = + resources_dict ? resources_dict->GetDictFor("Font") : nullptr; + return font_dict ? font_dict->GetDictFor(font_alias.AsStringView()) : nullptr; +} + +bool AppearanceFontHasEmbeddedSubset(const CPDF_Dictionary* font_dict) { + if (!font_dict || font_dict->GetNameFor("Subtype") != "Type0" || + !font_dict->GetStreamFor("ToUnicode")) { + return false; + } + + RetainPtr descendant_fonts = + font_dict->GetArrayFor("DescendantFonts"); + if (!descendant_fonts || descendant_fonts->size() == 0) { + return false; + } + + RetainPtr cid_font_dict = + descendant_fonts->GetDictAt(0); + RetainPtr font_descriptor = + cid_font_dict ? cid_font_dict->GetDictFor("FontDescriptor") : nullptr; + if (!font_descriptor || !font_descriptor->GetStreamFor("FontFile2")) { + return false; + } + + ByteString base_font = font_dict->GetNameFor("BaseFont"); + return base_font.GetLength() > 7 && base_font[6] == '+' && + base_font.Last(6) == "Roboto"; +} + +bool AppearanceFontMapsUnicode(const CPDF_Dictionary* font_dict, char value) { + RetainPtr to_unicode = + font_dict ? font_dict->GetStreamFor("ToUnicode") : nullptr; + if (!to_unicode) { + return false; + } + + CPDF_ToUnicodeMap to_unicode_map(std::move(to_unicode)); + return to_unicode_map.ReverseLookup(value) != 0; +} + RedactionReport ApplyRedactionWithReport(FPDF_PAGE page, FPDF_ANNOTATION annot) { std::array removed = {}; @@ -506,6 +644,264 @@ TEST_F(FPDFAnnotEmbedderTest, ExplicitGenerateAppearanceAllowed) { EXPECT_GT(doc->GetLastObjNum(), before); } +TEST_F(FPDFAnnotEmbedderTest, FreeTextAppearanceUsesRegisteredMemoryFont) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadNotoSansSCFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("NotoSansSC", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"这是第一句。"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearanceRegisteredFont(annot.get(), font_id, + 18.0f, 0, 0, 0)); + + FPDF_STANDARD_FONT font = FPDF_FONT_COURIER; + float font_size = 0.0f; + unsigned int r = 0; + unsigned int g = 0; + unsigned int b = 0; + ASSERT_TRUE(EPDFAnnot_GetDefaultAppearance(annot.get(), &font, &font_size, &r, + &g, &b)); + EXPECT_EQ(FPDF_FONT_UNKNOWN, font); + EXPECT_FLOAT_EQ(18.0f, font_size); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + EXPECT_THAT(GetNormalAppearance(annot.get()), HasSubstr(L"/ERegF")); +} + +TEST_F(FPDFAnnotEmbedderTest, FreeTextAppearanceFallsBackToRegisteredFont) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadNotoSansSCFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("NotoSansSC", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + ASSERT_TRUE(EPDFFont_AddFallbackFont(font_id)); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"Hello 这是"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 18.0f, 0, 0, 0)); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + std::wstring appearance = GetNormalAppearance(annot.get()); + EXPECT_THAT(appearance, HasSubstr(L"/Helv")); + EXPECT_THAT(appearance, HasSubstr(L"/ERegF")); +} + +TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontEmbedsSubsetInSavedPdf) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadRobotoFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("Roboto", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"ABC"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearanceRegisteredFont(annot.get(), font_id, + 18.0f, 0, 0, 0)); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + RetainPtr font_dict = + GetAppearanceFontDict(annot.get(), RegisteredFontAlias(font_id)); + ASSERT_TRUE(font_dict); + EXPECT_TRUE(AppearanceFontHasEmbeddedSubset(font_dict.Get())); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'A')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'B')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'C')); + + unsigned long saved_size = 0; + void* saved_buffer = + EPDF_SaveDocumentToOwnedBuffer(doc.get(), /*flags=*/0, &saved_size); + ASSERT_TRUE(saved_buffer); + std::string saved_pdf(static_cast(saved_buffer), saved_size); + EPDF_FreeBuffer(saved_buffer); + + EXPECT_LT(saved_pdf.size(), font_data.size() / 2); +} + +TEST_F(FPDFAnnotEmbedderTest, FreeTextRegistersFontFromFileAccess) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadRobotoFontData(); + ASSERT_FALSE(font_data.empty()); + const size_t original_font_size = font_data.size(); + MemoryFontFileAccess font_access(std::move(font_data)); + + EPDF_FONT_ID font_id = EPDFFont_RegisterFont("Roboto", /*weight=*/400, + /*italic=*/0, &font_access); + ASSERT_NE(0u, font_id); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"ABC"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearanceRegisteredFont(annot.get(), font_id, + 18.0f, 0, 0, 0)); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + RetainPtr font_dict = + GetAppearanceFontDict(annot.get(), RegisteredFontAlias(font_id)); + ASSERT_TRUE(font_dict); + EXPECT_TRUE(AppearanceFontHasEmbeddedSubset(font_dict.Get())); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'A')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'B')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'C')); + + unsigned long saved_size = 0; + void* saved_buffer = + EPDF_SaveDocumentToOwnedBuffer(doc.get(), /*flags=*/0, &saved_size); + ASSERT_TRUE(saved_buffer); + std::string saved_pdf(static_cast(saved_buffer), saved_size); + EPDF_FreeBuffer(saved_buffer); + + EXPECT_LT(saved_pdf.size(), original_font_size / 2); +} + +TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontSubsetsAreLayerLocal) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadRobotoFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("Roboto", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + + FileAccessForTesting base_access("rectangles.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + struct LayerSubsetResult { + std::string delta; + ByteString subset_base_font; + }; + + auto save_layer_with_text = [&](const wchar_t* text, + const std::vector& expected_chars, + const std::vector& unexpected_chars) { + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &open_status)); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + EXPECT_TRUE(layer); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + EXPECT_TRUE(page); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + EXPECT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + EXPECT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(text); + EXPECT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + EXPECT_TRUE(EPDFAnnot_SetDefaultAppearanceRegisteredFont( + annot.get(), font_id, 18.0f, 0, 0, 0)); + EXPECT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + + RetainPtr font_dict = + GetAppearanceFontDict(annot.get(), RegisteredFontAlias(font_id)); + EXPECT_TRUE(font_dict); + EXPECT_TRUE(AppearanceFontHasEmbeddedSubset(font_dict.Get())); + for (char value : expected_chars) { + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), value)); + } + for (char value : unexpected_chars) { + EXPECT_FALSE(AppearanceFontMapsUnicode(font_dict.Get(), value)); + } + + ByteString subset_base_font = + font_dict ? font_dict->GetNameFor("BaseFont") : ByteString(); + + unsigned long delta_size = 0; + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + void* delta_buffer = EPDFLayer_SaveDeltaToOwnedBuffer( + layer.get(), &delta_size, &save_status); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + EXPECT_TRUE(delta_buffer); + std::string delta(static_cast(delta_buffer), delta_size); + EPDF_FreeBuffer(delta_buffer); + return LayerSubsetResult{std::move(delta), std::move(subset_base_font)}; + }; + + LayerSubsetResult layer_a = + save_layer_with_text(L"ABC", {'A', 'B', 'C'}, {'D', 'E', 'F'}); + LayerSubsetResult layer_b = + save_layer_with_text(L"DEF", {'D', 'E', 'F'}, {'A', 'B', 'C'}); + EPDF_ReleaseBaseDocument(base); + + EXPECT_FALSE(layer_a.delta.empty()); + EXPECT_FALSE(layer_b.delta.empty()); + EXPECT_LT(layer_a.delta.size(), font_data.size() / 2); + EXPECT_LT(layer_b.delta.size(), font_data.size() / 2); + EXPECT_NE(layer_a.subset_base_font, layer_b.subset_base_font); + EXPECT_NE(std::string::npos, + layer_a.delta.find(layer_a.subset_base_font.c_str())); + EXPECT_NE(std::string::npos, + layer_b.delta.find(layer_b.subset_base_font.c_str())); + EXPECT_EQ(std::string::npos, + layer_a.delta.find(layer_b.subset_base_font.c_str())); + EXPECT_EQ(std::string::npos, + layer_b.delta.find(layer_a.subset_base_font.c_str())); +} + TEST_F(FPDFAnnotEmbedderTest, ExtractHighlightLongContent) { // Open a file with one annotation and load its first page. ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf")); diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index cf7ade5998..1fbdf16242 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -56,6 +56,7 @@ #include "core/fxcrt/stl_util.h" #include "core/fxcrt/unowned_ptr.h" #include "core/fxge/cfx_defaultrenderdevice.h" +#include "core/fxge/cfx_fontregistry.h" #include "core/fxge/cfx_gemodule.h" #include "core/fxge/cfx_glyphcache.h" #include "core/fxge/cfx_renderdevice.h" @@ -280,6 +281,9 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_DestroyLibrary() { CFX_GlyphCache::DestroyGlobals(); #endif + // EmbedPDF: registered runtime fonts are global/TLS-backed PDFium state, so + // tear them down with the rest of the library singletons. + CFX_FontRegistry::DestroyGlobals(); pdfium::DestroyPageModule(); CFX_GEModule::Destroy(); CFX_Timer::DestroyGlobals(); diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index cc3ae907c3..2b37d4e687 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -9,6 +9,7 @@ #include "fpdfsdk/fpdf_view_c_api_test.h" +#include "public/epdf_font.h" #include "public/fpdf_annot.h" #include "public/fpdf_attachment.h" #include "public/fpdf_catalog.h" @@ -106,6 +107,15 @@ int CheckPDFiumCApi() { CHK(FPDFPage_GetAnnotCount); CHK(FPDFPage_GetAnnotIndex); CHK(FPDFPage_RemoveAnnot); + CHK(EPDFAnnot_SetDefaultAppearanceRegisteredFont); + + // epdf_font.h + CHK(EPDFFont_AddFallbackFont); + CHK(EPDFFont_ClearFallbackFonts); + CHK(EPDFFont_ClearRegisteredFonts); + CHK(EPDFFont_RegisterFont); + CHK(EPDFFont_RegisterMemFont); + CHK(EPDFFont_RegisterMemFont64); // fpdf_attachment.h CHK(FPDFAttachment_GetFile); diff --git a/public/epdf_font.h b/public/epdf_font.h new file mode 100644 index 0000000000..2a0ce489a6 --- /dev/null +++ b/public/epdf_font.h @@ -0,0 +1,87 @@ +// Copyright 2026 The EmbedPDF Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PUBLIC_EPDF_FONT_H_ +#define PUBLIC_EPDF_FONT_H_ + +#include +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Experimental EmbedPDF Extension API. +typedef uint32_t EPDF_FONT_ID; + +// Experimental EmbedPDF Extension API. +// Register a font for runtime fallback use and PDF authoring from file access. +// +// family_name - optional family/resource base name. Pass NULL or "" to +// infer from the font. +// weight - style weight for matching. Pass 0 to infer from the font. +// italic - style italic flag for matching. Pass -1 to infer from the +// font, 0 for non-italic, or 1 for italic. +// file_access - font bytes as FPDF_FILEACCESS. The underlying file resources +// must remain valid until EPDFFont_ClearRegisteredFonts() or +// PDFium shutdown. The FPDF_FILEACCESS struct itself may be +// stack-owned. +// +// Returns a non-zero font id on success, or 0 on failure. +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterFont(FPDF_BYTESTRING family_name, + int weight, + int italic, + FPDF_FILEACCESS* file_access); + +// Experimental EmbedPDF Extension API. +// Register an in-memory font for runtime fallback use and PDF authoring. +// +// family_name - optional family/resource base name. Pass NULL or "" to infer +// from the font. +// weight - style weight for matching. Pass 0 to infer from the font. +// italic - style italic flag for matching. Pass -1 to infer from the +// font, 0 for non-italic, or 1 for italic. +// data_buf - pointer to font bytes. +// size - size of |data_buf| in bytes. +// +// Returns a non-zero font id on success, or 0 on failure. +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterMemFont(FPDF_BYTESTRING family_name, + int weight, + int italic, + const void* data_buf, + int size); + +// Experimental EmbedPDF Extension API. +// Same as EPDFFont_RegisterMemFont(), but supports size_t byte counts. +FPDF_EXPORT EPDF_FONT_ID FPDF_CALLCONV +EPDFFont_RegisterMemFont64(FPDF_BYTESTRING family_name, + int weight, + int italic, + const void* data_buf, + size_t size); + +// Experimental EmbedPDF Extension API. +// Clear all registered fonts and the fallback font order. +FPDF_EXPORT void FPDF_CALLCONV EPDFFont_ClearRegisteredFonts(void); + +// Experimental EmbedPDF Extension API. +// Add a registered font to the ordered fallback list used when the selected +// font does not contain a glyph or a PDF page needs a substitute font. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFFont_AddFallbackFont(EPDF_FONT_ID font_id); + +// Experimental EmbedPDF Extension API. +// Clear the ordered fallback font list without unregistering fonts. +FPDF_EXPORT void FPDF_CALLCONV EPDFFont_ClearFallbackFonts(void); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_EPDF_FONT_H_ diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index a9d7c84db4..43ab5fa281 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -6,13 +6,15 @@ #define PUBLIC_FPDF_ANNOT_H_ #include - // NOLINTNEXTLINE(build/include) #include "fpdfview.h" // NOLINTNEXTLINE(build/include) #include "fpdf_formfill.h" +// NOLINTNEXTLINE(build/include) +#include "epdf_font.h" + // NOLINTNEXTLINE(build/include) #include "epdf_redact.h" @@ -1611,6 +1613,24 @@ EPDFAnnot_SetDefaultAppearance(FPDF_ANNOTATION annot, unsigned int G, unsigned int B); +// Experimental EmbedPDF Extension API. +// Set the default appearance of a FreeText annotation using a registered font. +// +// annot - handle to an annotation. +// font_id - font id returned by EPDFFont_RegisterFont() or +// EPDFFont_RegisterMemFont64(). +// font_size - the font size to be set. +// R, G, B - the color to be set. +// +// Returns true on success. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_SetDefaultAppearanceRegisteredFont(FPDF_ANNOTATION annot, + EPDF_FONT_ID font_id, + float font_size, + unsigned int R, + unsigned int G, + unsigned int B); + // Experimental EmbedPDF Extension API. // Get the default appearance of a FreeText annotation. // From 7a9888b7796979e083a7b0190034a7bea457ae90 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 24 Jun 2026 14:34:55 +0300 Subject: [PATCH 43/56] EmbedPDF: register font markers & registry fixes Persist registered-font identity in marker font dictionaries and make font registry behavior robust. - Store registered font id in marker font dict (key "EmbedPDFRegisteredFontId") and add CPDF_AnnotFontSubset::GetRegisteredFontIdFromMarkerFontDict to read it. CPDF_AnnotFontMap now checks the marker dict for identity instead of inferring from BaseFont/resource alias. - Create marker font dicts with the new id field; make subset base-name comment deterministic. - Prevent CFX_FontRegistry::ClearRegisteredFonts from resetting next_font_id to avoid reusing ids that may still be referenced by existing document markers. - Update CPVT_FontMap unicode/charcode logic to use CharCodeFromUnicode checks and safe numeric conversions; preserve upstream appearance font selection behavior. - Add/adjust tests and helpers in fpdfsdk to validate stable appearance streams, alias-suffix survival, fallback rendering, checksums, and related utilities. - Update public API docs for font registration to clarify thread/ownership rules and ClearRegisteredFonts semantics. Also includes small cleanup/refactors and added includes needed by new code and tests. --- core/fpdfdoc/cpdf_annotfontmap.cpp | 65 +----- core/fpdfdoc/cpdf_annotfontsubset.cpp | 40 ++++ core/fpdfdoc/cpdf_annotfontsubset.h | 4 + core/fpdfdoc/cpvt_fontmap.cpp | 54 ++--- core/fxge/cfx_fontregistry.cpp | 5 +- fpdfsdk/fpdf_annot_embeddertest.cpp | 271 ++++++++++++++++++++++++++ public/epdf_font.h | 9 + 7 files changed, 357 insertions(+), 91 deletions(-) diff --git a/core/fpdfdoc/cpdf_annotfontmap.cpp b/core/fpdfdoc/cpdf_annotfontmap.cpp index c06215e465..4a9c88b270 100644 --- a/core/fpdfdoc/cpdf_annotfontmap.cpp +++ b/core/fpdfdoc/cpdf_annotfontmap.cpp @@ -29,61 +29,10 @@ namespace { constexpr char kRegisteredFontResourcePrefix[] = "ERegF"; -ByteString NormalizeBaseFontName(ByteString name) { - name.Remove(' '); - return name.IsEmpty() ? ByteString(CFX_Font::kUntitledFontName) : name; -} - -ByteString BaseFontNameForRegisteredFont(CFX_FontRegistry::FontId font_id, - const CFX_Font* font) { - ByteString name = CFX_FontRegistry::GetBaseFontName(font_id); - if (name.IsEmpty() && font) { - name = font->GetBaseFontName(); - } - return NormalizeBaseFontName(std::move(name)); -} - -std::optional FontIdFromResourceKey( - const ByteString& resource_key) { - constexpr size_t kPrefixLength = sizeof(kRegisteredFontResourcePrefix) - 1; - if (resource_key.First(kPrefixLength) != kRegisteredFontResourcePrefix) { - return std::nullopt; - } - - ByteString id_string = resource_key.Substr(kPrefixLength); - if (id_string.IsEmpty()) { - return std::nullopt; - } - - uint32_t font_id = 0; - for (char ch : id_string.AsStringView()) { - if (ch < '0' || ch > '9') { - return std::nullopt; - } - FX_SAFE_UINT32 safe_font_id = font_id; - safe_font_id *= 10; - safe_font_id += ch - '0'; - if (!safe_font_id.IsValid()) { - return std::nullopt; - } - font_id = safe_font_id.ValueOrDie(); - } - - if (!CFX_FontRegistry::IsValidFont(font_id)) { - return std::nullopt; - } - return font_id; -} - ByteString ResourceKeyForRegisteredFont(CFX_FontRegistry::FontId font_id) { return ByteString::Format("%s%u", kRegisteredFontResourcePrefix, font_id); } -bool FontDictMatchesBaseFontName(const CPDF_Dictionary* font_dict, - const ByteString& base_font_name) { - return font_dict && font_dict->GetNameFor("BaseFont") == base_font_name; -} - bool PDFontSupportsUnicode(const RetainPtr& font, uint16_t word) { if (!font) { return false; @@ -108,7 +57,11 @@ CPDF_AnnotFontMap::CPDF_AnnotFontMap(CPDF_Document* doc, FontEntry entry; entry.font = std::move(default_font); entry.alias = default_font_alias; - if (auto font_id = FontIdFromResourceKey(default_font_alias)) { + RetainPtr default_font_dict = + entry.font ? entry.font->GetFontDict() : nullptr; + if (auto font_id = + CPDF_AnnotFontSubset::GetRegisteredFontIdFromMarkerFontDict( + default_font_dict.Get())) { RetainPtr registered_font = CreateRegisteredLayoutFont(*font_id); if (registered_font) { entry.font = std::move(registered_font); @@ -146,12 +99,14 @@ bool CPDF_AnnotFontMap::EnsureRegisteredFontMarkerInDocument( RetainPtr font_res = acroform_dict->GetOrCreateDictFor("DR")->GetOrCreateDictFor("Font"); - const ByteString base_font_name = - BaseFontNameForRegisteredFont(font_id, nullptr); ByteString key = ResourceKeyForRegisteredFont(font_id); if (RetainPtr existing_font_dict = font_res->GetMutableDictFor(key.AsStringView())) { - if (FontDictMatchesBaseFontName(existing_font_dict.Get(), base_font_name)) { + // EmbedPDF: registered-font identity is stored in the marker dictionary, + // not inferred from the resource alias. This survives alias collisions, + // suffixes, and resource renaming during save/merge. + if (CPDF_AnnotFontSubset::GetRegisteredFontIdFromMarkerFontDict( + existing_font_dict.Get()) == font_id) { *resource_key = key; return true; } diff --git a/core/fpdfdoc/cpdf_annotfontsubset.cpp b/core/fpdfdoc/cpdf_annotfontsubset.cpp index ac1766fd48..bec45b0be7 100644 --- a/core/fpdfdoc/cpdf_annotfontsubset.cpp +++ b/core/fpdfdoc/cpdf_annotfontsubset.cpp @@ -39,6 +39,7 @@ namespace { +constexpr char kRegisteredFontIdKey[] = "EmbedPDFRegisteredFontId"; constexpr uint32_t kMaxBfCharBfRangeEntries = 100; constexpr uint32_t kMaxPdfCid = 0xffff; @@ -119,6 +120,10 @@ void AppendReferenceOrDirect(CPDF_Array* array, ByteString MakeSubsetBaseFontName( const ByteString& base_font_name, const CPDF_AnnotFontSubset::GlyphUnicodeMap& glyph_to_unicode) { + // EmbedPDF: a deterministic six-letter PDF subset tag is enough to keep + // subsets distinguishable for readers/debugging. A theoretical hash collision + // is harmless because each AP resource dictionary still points at its own + // embedded subset font object. uint32_t hash = 2166136261u; auto mix = [&hash](uint32_t value) { for (int i = 0; i < 4; ++i) { @@ -664,5 +669,40 @@ RetainPtr CPDF_AnnotFontSubset::CreateMarkerFontDict( "BaseFont", BaseFontNameForRegisteredFont(font_id, nullptr)); font_dict->SetNewFor("Encoding", pdfium::font_encodings::kWinAnsiEncoding); + font_dict->SetNewFor(kRegisteredFontIdKey, + ByteString::Format("%u", font_id)); return font_dict; } + +// static +std::optional +CPDF_AnnotFontSubset::GetRegisteredFontIdFromMarkerFontDict( + const CPDF_Dictionary* font_dict) { + if (!font_dict) { + return std::nullopt; + } + + ByteString id_string = font_dict->GetByteStringFor(kRegisteredFontIdKey); + if (id_string.IsEmpty()) { + return std::nullopt; + } + + uint32_t font_id = 0; + for (char ch : id_string.AsStringView()) { + if (ch < '0' || ch > '9') { + return std::nullopt; + } + FX_SAFE_UINT32 safe_font_id = font_id; + safe_font_id *= 10; + safe_font_id += ch - '0'; + if (!safe_font_id.IsValid()) { + return std::nullopt; + } + font_id = safe_font_id.ValueOrDie(); + } + + if (!CFX_FontRegistry::IsValidFont(font_id)) { + return std::nullopt; + } + return font_id; +} diff --git a/core/fpdfdoc/cpdf_annotfontsubset.h b/core/fpdfdoc/cpdf_annotfontsubset.h index f34e4cf301..a1118be63d 100644 --- a/core/fpdfdoc/cpdf_annotfontsubset.h +++ b/core/fpdfdoc/cpdf_annotfontsubset.h @@ -11,6 +11,7 @@ #include #include +#include #include #include "core/fxcrt/retain_ptr.h" @@ -48,6 +49,9 @@ class CPDF_AnnotFontSubset final { static RetainPtr CreateMarkerFontDict( CPDF_Document* doc, CFX_FontRegistry::FontId font_id); + + static std::optional + GetRegisteredFontIdFromMarkerFontDict(const CPDF_Dictionary* font_dict); }; #endif // CORE_FPDFDOC_CPDF_ANNOTFONTSUBSET_H_ diff --git a/core/fpdfdoc/cpvt_fontmap.cpp b/core/fpdfdoc/cpvt_fontmap.cpp index 3e4a835644..cb44b89b34 100644 --- a/core/fpdfdoc/cpvt_fontmap.cpp +++ b/core/fpdfdoc/cpvt_fontmap.cpp @@ -16,28 +16,7 @@ #include "core/fpdfdoc/cpdf_interactiveform.h" #include "core/fxcrt/check.h" #include "core/fxcrt/fx_codepage.h" - -namespace { - -// EmbedPDF: CPVT_FontMap is used by upstream FreeText appearance generation, -// but upstream left these font-selection hooks as NOTREACHED(). Registered -// annotation fonts need real default behavior so CPVT_VariableText can ask the -// active font map whether a specific glyph is supported. -bool FontSupportsUnicode(const RetainPtr& font, uint16_t word) { - if (!font) { - return false; - } - - uint32_t charcode = font->CharCodeFromUnicode(word); - if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { - return false; - } - - bool vert_glyph = false; - return font->GlyphFromCharCode(charcode, &vert_glyph) > 0; -} - -} // namespace +#include "core/fxcrt/numerics/safe_conversions.h" CPVT_FontMap::CPVT_FontMap(CPDF_Document* doc, RetainPtr pResDict, @@ -102,32 +81,37 @@ ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) { int32_t CPVT_FontMap::GetWordFontIndex(uint16_t word, FX_Charset charset, int32_t nFontIndex) { - // EmbedPDF: keep the current font when it can draw the word, otherwise fall - // back to the default DA font and then PDFium's native annotation font. - if (nFontIndex >= 0 && FontSupportsUnicode(GetPDFFont(nFontIndex), word)) { - return nFontIndex; - } - if (FontSupportsUnicode(GetPDFFont(0), word)) { - return 0; + // EmbedPDF: preserve upstream shared AP behavior for the default form/popup + // font map: choose the DA font first, then PDFium's native annotation font, + // based only on CharCodeFromUnicode(). Stricter glyph checks live in + // CPDF_AnnotFontMap, which is used only by registered FreeText fonts. + if (RetainPtr pDefFont = GetPDFFont(0)) { + if (pDefFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) { + return 0; + } } - if (FontSupportsUnicode(GetPDFFont(1), word)) { - return 1; + if (RetainPtr pSysFont = GetPDFFont(1)) { + if (pSysFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) { + return 1; + } } return -1; } int32_t CPVT_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) { - // EmbedPDF: expose a common unicode-to-charcode hook so specialized font maps - // can return registered-font subset glyph ids without changing PVT layout. + // EmbedPDF: default implementation is equivalent to the old shared AP path's + // direct pdf_font->CharCodeFromUnicode() call. The hook exists so specialized + // font maps can return registered-font subset glyph ids. RetainPtr font = GetPDFFont(nFontIndex); if (!font) { return -1; } uint32_t charcode = font->CharCodeFromUnicode(word); - if (charcode == CPDF_Font::kInvalidCharCode || (charcode == 0 && word != 0)) { + if (charcode == CPDF_Font::kInvalidCharCode || + !pdfium::IsValueInRangeForNumericType(charcode)) { return -1; } - return charcode; + return static_cast(charcode); } FX_Charset CPVT_FontMap::CharSetFromUnicode(uint16_t word, diff --git a/core/fxge/cfx_fontregistry.cpp b/core/fxge/cfx_fontregistry.cpp index 572b5161ed..a5009c3c1e 100644 --- a/core/fxge/cfx_fontregistry.cpp +++ b/core/fxge/cfx_fontregistry.cpp @@ -215,7 +215,10 @@ void CFX_FontRegistry::ClearRegisteredFonts() { } g_registry->fallback_order.clear(); g_registry->fonts.clear(); - g_registry->next_font_id = 1; + // EmbedPDF: do not reset next_font_id. Documents can keep registered-font + // marker resources after ClearRegisteredFonts(); reusing ids could make an + // old marker resolve to a different font registered later in the same + // runtime/thread. } // static diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 5e335681ac..c634f724be 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -17,14 +18,20 @@ #include "constants/annotation_common.h" #include "core/fpdfapi/font/cpdf_tounicodemap.h" #include "core/fpdfapi/page/cpdf_annotcontext.h" +#include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_read_only_graph_guard.h" +#include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/containers/contains.h" #include "core/fxcrt/fx_memcpy_wrappers.h" +#include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/span.h" #include "core/fxge/cfx_defaultrenderdevice.h" @@ -149,6 +156,56 @@ ByteString RegisteredFontAlias(EPDF_FONT_ID font_id) { return ByteString::Format("ERegF%u", font_id); } +ByteString GetDefaultAppearanceFontAlias(FPDF_ANNOTATION annot) { + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return ByteString(); + } + + const CPDF_Dictionary* annot_dict = context->GetAnnotDict(); + if (!annot_dict) { + return ByteString(); + } + + ByteString da = annot_dict->GetByteStringFor("DA"); + std::optional slash_pos = da.Find('/'); + if (!slash_pos.has_value()) { + return ByteString(); + } + + ByteStringView remainder = da.AsStringView().Substr(slash_pos.value() + 1); + std::optional end_pos = remainder.Find(' '); + if (!end_pos.has_value()) { + return ByteString(remainder); + } + return ByteString(remainder.First(end_pos.value())); +} + +ByteString GetNormalAppearanceStreamBytes(FPDF_ANNOTATION annot) { + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return ByteString(); + } + + const CPDF_Dictionary* annot_dict = context->GetAnnotDict(); + if (!annot_dict) { + return ByteString(); + } + + RetainPtr ap_dict = + annot_dict->GetDictFor(pdfium::annotation::kAP); + RetainPtr normal_stream = + ap_dict ? ap_dict->GetStreamFor("N") : nullptr; + if (!normal_stream) { + return ByteString(); + } + + RetainPtr stream_acc = + pdfium::MakeRetain(std::move(normal_stream)); + stream_acc->LoadAllDataFiltered(); + return ByteString(ByteStringView(stream_acc->GetSpan())); +} + RetainPtr GetAppearanceFontDict( FPDF_ANNOTATION annot, const ByteString& font_alias) { @@ -209,6 +266,83 @@ bool AppearanceFontMapsUnicode(const CPDF_Dictionary* font_dict, char value) { return to_unicode_map.ReverseLookup(value) != 0; } +std::string BitmapChecksum(FPDF_BITMAP bitmap) { + if (!bitmap) { + return std::string(); + } + + const int stride = FPDFBitmap_GetStride(bitmap); + const int height = FPDFBitmap_GetHeight(bitmap); + FX_SAFE_SIZE_T size = stride; + size *= height; + if (!size.IsValid()) { + return std::string(); + } + + return GenerateMD5Base16( + pdfium::span(static_cast(FPDFBitmap_GetBuffer(bitmap)), + size.ValueOrDie())); +} + +bool BitmapHasNonWhitePixels(FPDF_BITMAP bitmap) { + if (!bitmap) { + return false; + } + + const int stride = FPDFBitmap_GetStride(bitmap); + const int height = FPDFBitmap_GetHeight(bitmap); + FX_SAFE_SIZE_T size = stride; + size *= height; + if (!size.IsValid()) { + return false; + } + + pdfium::span bytes( + static_cast(FPDFBitmap_GetBuffer(bitmap)), + size.ValueOrDie()); + return std::ranges::any_of(bytes, + [](uint8_t value) { return value != 0xff; }); +} + +void AddBrokenTrueTypeCjkTextPageContent(FPDF_DOCUMENT doc, FPDF_PAGE page) { + CPDF_Document* cpdf_doc = CPDFDocumentFromFPDFDocument(doc); + CPDF_Page* cpdf_page = CPDFPageFromFPDFPage(page); + ASSERT_TRUE(cpdf_doc); + ASSERT_TRUE(cpdf_page); + + auto font_dict = cpdf_doc->NewIndirect(); + font_dict->SetNewFor("Type", "Font"); + font_dict->SetNewFor("Subtype", "TrueType"); + font_dict->SetNewFor("BaseFont", "Helvetica"); + + auto encoding_dict = pdfium::MakeRetain(); + encoding_dict->SetNewFor("Type", "Encoding"); + auto differences = pdfium::MakeRetain(); + differences->AppendNew(65); + differences->AppendNew("uni8FD9"); + encoding_dict->SetFor("Differences", std::move(differences)); + font_dict->SetFor("Encoding", std::move(encoding_dict)); + + RetainPtr page_dict = cpdf_page->GetMutableDict(); + RetainPtr resources = + page_dict->GetOrCreateDictFor("Resources"); + RetainPtr font_resources = + resources->GetOrCreateDictFor("Font"); + font_resources->SetNewFor("F1", cpdf_doc, + font_dict->GetObjNum()); + + const ByteString kContent = + "BT\n" + "/F1 72 Tf\n" + "40 100 Td\n" + "<41> Tj\n" + "ET\n"; + RetainPtr contents = + cpdf_doc->NewIndirect(kContent.unsigned_span()); + page_dict->SetNewFor("Contents", cpdf_doc, + contents->GetObjNum()); +} + RedactionReport ApplyRedactionWithReport(FPDF_PAGE page, FPDF_ANNOTATION annot) { std::array removed = {}; @@ -644,6 +778,23 @@ TEST_F(FPDFAnnotEmbedderTest, ExplicitGenerateAppearanceAllowed) { EXPECT_GT(doc->GetLastObjNum(), before); } +TEST_F(FPDFAnnotEmbedderTest, TextFieldGenerateAppearanceStreamIsStable) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + static const FS_POINTF kTextFieldPoint = {120.0f, 120.0f}; + ScopedFPDFAnnotation annot(FPDFAnnot_GetFormFieldAtPoint( + form_handle(), page.get(), &kTextFieldPoint)); + ASSERT_TRUE(annot); + + ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); + ByteString appearance = GetNormalAppearanceStreamBytes(annot.get()); + ASSERT_FALSE(appearance.IsEmpty()); + EXPECT_EQ("68a94799890022965d780f65db1e7430", + GenerateMD5Base16(appearance.unsigned_span())); +} + TEST_F(FPDFAnnotEmbedderTest, FreeTextAppearanceUsesRegisteredMemoryFont) { ScopedRegisteredFonts scoped_fonts; @@ -812,6 +963,66 @@ TEST_F(FPDFAnnotEmbedderTest, FreeTextRegistersFontFromFileAccess) { EXPECT_LT(saved_pdf.size(), original_font_size / 2); } +TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontMarkerSurvivesAliasSuffix) { + ScopedRegisteredFonts scoped_fonts; + + std::vector font_data = LoadRobotoFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("Roboto", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + + CPDF_Document* cpdf_doc = CPDFDocumentFromFPDFDocument(doc.get()); + ASSERT_TRUE(cpdf_doc); + RetainPtr root_dict = cpdf_doc->GetMutableRoot(); + ASSERT_TRUE(root_dict); + RetainPtr font_resources = + root_dict->GetOrCreateDictFor("AcroForm") + ->GetOrCreateDictFor("DR") + ->GetOrCreateDictFor("Font"); + + auto colliding_font_dict = cpdf_doc->NewIndirect(); + colliding_font_dict->SetNewFor("Type", "Font"); + colliding_font_dict->SetNewFor("Subtype", "Type1"); + colliding_font_dict->SetNewFor("BaseFont", "Helvetica"); + const ByteString base_alias = RegisteredFontAlias(font_id); + font_resources->SetNewFor(base_alias, cpdf_doc, + colliding_font_dict->GetObjNum()); + + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"ABC"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearanceRegisteredFont(annot.get(), font_id, + 18.0f, 0, 0, 0)); + + ByteString actual_alias = GetDefaultAppearanceFontAlias(annot.get()); + ASSERT_FALSE(actual_alias.IsEmpty()); + EXPECT_NE(base_alias, actual_alias); + EXPECT_EQ(base_alias, actual_alias.First(base_alias.GetLength())); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + RetainPtr font_dict = + GetAppearanceFontDict(annot.get(), actual_alias); + ASSERT_TRUE(font_dict); + EXPECT_TRUE(AppearanceFontHasEmbeddedSubset(font_dict.Get())); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'A')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'B')); + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'C')); +} + TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontSubsetsAreLayerLocal) { ScopedRegisteredFonts scoped_fonts; @@ -902,6 +1113,66 @@ TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontSubsetsAreLayerLocal) { layer_b.delta.find(layer_a.subset_base_font.c_str())); } +TEST_F(FPDFAnnotEmbedderTest, RegisteredFallbackFontRendersPageMissingGlyph) { + auto create_broken_pdf = []() { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + EXPECT_TRUE(doc); + { + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + EXPECT_TRUE(page); + AddBrokenTrueTypeCjkTextPageContent(doc.get(), page.get()); + } + + unsigned long saved_size = 0; + void* saved_buffer = + EPDF_SaveDocumentToOwnedBuffer(doc.get(), /*flags=*/0, &saved_size); + EXPECT_TRUE(saved_buffer); + if (!saved_buffer) { + return std::vector(); + } + std::vector pdf_bytes( + static_cast(saved_buffer), + static_cast(saved_buffer) + saved_size); + EPDF_FreeBuffer(saved_buffer); + return pdf_bytes; + }; + + auto render_broken_pdf = [](const std::vector& pdf_bytes) { + MemoryFontFileAccess file_access(pdf_bytes); + ScopedFPDFDocument doc(FPDF_LoadCustomDocument(&file_access, nullptr)); + EXPECT_TRUE(doc); + ScopedFPDFPage page(FPDF_LoadPage(doc.get(), 0)); + EXPECT_TRUE(page); + ScopedFPDFBitmap bitmap = EmbedderTest::RenderPage(page.get()); + EXPECT_TRUE(bitmap); + return bitmap; + }; + + ScopedRegisteredFonts scoped_fonts; + std::vector broken_pdf = create_broken_pdf(); + ASSERT_FALSE(broken_pdf.empty()); + ScopedFPDFBitmap bitmap_without_fallback = render_broken_pdf(broken_pdf); + ASSERT_TRUE(bitmap_without_fallback); + std::string without_registered_fallback = + BitmapChecksum(bitmap_without_fallback.get()); + ASSERT_FALSE(without_registered_fallback.empty()); + + std::vector font_data = LoadNotoSansSCFontData(); + ASSERT_FALSE(font_data.empty()); + + EPDF_FONT_ID font_id = + EPDFFont_RegisterMemFont64("NotoSansSC", /*weight=*/400, /*italic=*/0, + font_data.data(), font_data.size()); + ASSERT_NE(0u, font_id); + ASSERT_TRUE(EPDFFont_AddFallbackFont(font_id)); + + ScopedFPDFBitmap bitmap = render_broken_pdf(broken_pdf); + ASSERT_TRUE(bitmap); + + EXPECT_TRUE(BitmapHasNonWhitePixels(bitmap.get())); + EXPECT_NE(without_registered_fallback, BitmapChecksum(bitmap.get())); +} + TEST_F(FPDFAnnotEmbedderTest, ExtractHighlightLongContent) { // Open a file with one annotation and load its first page. ASSERT_TRUE(OpenDocument("annotation_highlight_long_content.pdf")); diff --git a/public/epdf_font.h b/public/epdf_font.h index 2a0ce489a6..9f2a5f4e70 100644 --- a/public/epdf_font.h +++ b/public/epdf_font.h @@ -20,6 +20,11 @@ typedef uint32_t EPDF_FONT_ID; // Experimental EmbedPDF Extension API. // Register a font for runtime fallback use and PDF authoring from file access. +// Font registration follows PDFium's normal handle/thread ownership model. In +// TLS builds, register and use fonts on the initialized worker thread that owns +// the document/page handles, and call EPDF_ShutdownThread() on that worker to +// release registered font state. In non-TLS builds, do not mutate the registry +// concurrently with rendering, saving, or editing. // // family_name - optional family/resource base name. Pass NULL or "" to // infer from the font. @@ -68,6 +73,10 @@ EPDFFont_RegisterMemFont64(FPDF_BYTESTRING family_name, // Experimental EmbedPDF Extension API. // Clear all registered fonts and the fallback font order. +// +// Existing documents may still contain registered-font DA marker resources +// after this call; those markers are invalid until their fonts are registered +// again. FPDF_EXPORT void FPDF_CALLCONV EPDFFont_ClearRegisteredFonts(void); // Experimental EmbedPDF Extension API. From 1c23b1d241bd5402cb5ce7deab14a5d6ec5247a1 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 24 Jun 2026 15:31:49 +0300 Subject: [PATCH 44/56] Use registered fallback fonts for form AP generation Prefer registered-font mapping when generating appearance streams for persistent form widgets: if the target is persistent and there are registered fallback fonts or the font dict indicates a registered subset, create a CPDF_AnnotFontMap with registered fallbacks and embed the corresponding Font resources. Refactor duplicated AP generation into a lambda to reduce code duplication and preserve the previous CPVT_FontMap path for non-registered cases. Add CFX_FontRegistry::HasFallbackFonts() and its declaration. Add tests and a DroidSansFallbackFull.ttf test font, plus helpers to register and assert registered fallback behaviour for FreeText, TextField, ComboBox, and ListBox Korean glyphs. Also include small test fixes (initializer_list include, wchar_t usage). --- core/fpdfdoc/cpdf_generateap.cpp | 63 +++++-- core/fxge/cfx_fontregistry.cpp | 5 + core/fxge/cfx_fontregistry.h | 1 + fpdfsdk/fpdf_annot_embeddertest.cpp | 173 +++++++++++++++++- .../resources/fonts/DroidSansFallbackFull.ttf | Bin 0 -> 5155540 bytes 5 files changed, 225 insertions(+), 17 deletions(-) create mode 100644 testing/resources/fonts/DroidSansFallbackFull.ttf diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index b05ee652c1..b60948a594 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -35,6 +35,7 @@ #include "core/fpdfapi/parser/fpdf_parser_utility.h" #include "core/fpdfdoc/cpdf_annot.h" #include "core/fpdfdoc/cpdf_annotfontmap.h" +#include "core/fpdfdoc/cpdf_annotfontsubset.h" #include "core/fpdfdoc/cpdf_cloudy_border.h" #include "core/fpdfdoc/cpdf_color_utils.h" #include "core/fpdfdoc/cpdf_defaultappearance.h" @@ -46,6 +47,7 @@ #include "core/fxcrt/fx_string_wrappers.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/notreached.h" +#include "core/fxge/cfx_fontregistry.h" #include "core/fxge/cfx_renderdevice.h" namespace { @@ -2996,6 +2998,12 @@ bool GenerateFormAPToTarget(APGenerationTarget* target, if (!default_font) { return false; } + const bool use_registered_font_map = + target->IsPersistent() && + (CFX_FontRegistry::HasFallbackFonts() || + CPDF_AnnotFontSubset::GetRegisteredFontIdFromMarkerFontDict( + font_dict.Get()) + .has_value()); const AnnotationDimensionsAndColor dims = GetAnnotationDimensionsAndColor(annot_dict); @@ -3030,26 +3038,53 @@ bool GenerateFormAPToTarget(APGenerationTarget* target, std::move(resource_font_dict)); } + auto generate_form_stream = [&](CPVT_VariableText::Provider& provider, + fxcrt::ostringstream& app_stream) { + switch (type) { + case CPDF_GenerateAP::kTextField: + GenerateTextFieldFormAP(app_stream, annot_dict, dims.bbox, + default_appearance_info.value(), provider); + break; + case CPDF_GenerateAP::kComboBox: + GenerateComboBoxFormAP(app_stream, annot_dict, dims.bbox, + default_appearance_info.value(), provider); + break; + case CPDF_GenerateAP::kListBox: + GenerateListBoxFormAP(app_stream, annot_dict, dims.bbox, + default_appearance_info.value(), provider); + break; + } + }; + + if (use_registered_font_map) { + // EmbedPDF: form widgets need the same registered fallback/subset path as + // FreeText when their value/options contain glyphs outside the DA font. + // Keep the old CPVT_FontMap path unless a registered font is actually + // involved so existing form AP output remains stable by default. + CPDF_AnnotFontMap map(doc, std::move(default_font), font_name, + /*allow_registered_fallbacks=*/true); + CPVT_VariableText::Provider provider(&map); + + fxcrt::ostringstream app_stream; + generate_form_stream(provider, app_stream); + + normal_stream->SetDataFromStringstreamAndRemoveFilter(&app_stream); + RetainPtr stream_dict = normal_stream->GetMutableDict(); + stream_dict->SetMatrixFor("Matrix", dims.matrix); + stream_dict->SetRectFor("BBox", dims.bbox); + RetainPtr stream_resources = + stream_dict->GetOrCreateDictFor("Resources"); + stream_resources->SetFor("Font", map.CreateFontResourceDict()); + return true; + } + RetainPtr ephemeral_resources_dict = resources_dict; CPVT_FontMap map(doc, std::move(resources_dict), std::move(default_font), font_name); CPVT_VariableText::Provider provider(&map); fxcrt::ostringstream app_stream; - switch (type) { - case CPDF_GenerateAP::kTextField: - GenerateTextFieldFormAP(app_stream, annot_dict, dims.bbox, - default_appearance_info.value(), provider); - break; - case CPDF_GenerateAP::kComboBox: - GenerateComboBoxFormAP(app_stream, annot_dict, dims.bbox, - default_appearance_info.value(), provider); - break; - case CPDF_GenerateAP::kListBox: - GenerateListBoxFormAP(app_stream, annot_dict, dims.bbox, - default_appearance_info.value(), provider); - break; - } + generate_form_stream(provider, app_stream); if (!target->IsPersistent()) { return GenerateAPDict( diff --git a/core/fxge/cfx_fontregistry.cpp b/core/fxge/cfx_fontregistry.cpp index a5009c3c1e..36185b0f7b 100644 --- a/core/fxge/cfx_fontregistry.cpp +++ b/core/fxge/cfx_fontregistry.cpp @@ -243,6 +243,11 @@ void CFX_FontRegistry::ClearFallbackFonts() { g_registry->fallback_order.clear(); } +// static +bool CFX_FontRegistry::HasFallbackFonts() { + return g_registry && !g_registry->fallback_order.empty(); +} + // static bool CFX_FontRegistry::IsValidFont(FontId font_id) { return GetRegisteredFont(font_id) != nullptr; diff --git a/core/fxge/cfx_fontregistry.h b/core/fxge/cfx_fontregistry.h index 4c35a502cf..736934d662 100644 --- a/core/fxge/cfx_fontregistry.h +++ b/core/fxge/cfx_fontregistry.h @@ -38,6 +38,7 @@ class CFX_FontRegistry { static bool AddFallbackFont(FontId font_id); static void ClearFallbackFonts(); + static bool HasFallbackFonts(); static bool IsValidFont(FontId font_id); static ByteString GetBaseFontName(FontId font_id); diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index c634f724be..4245f224e2 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -97,6 +98,32 @@ std::vector LoadRobotoFontData() { return GetFileContents(font_path.c_str()); } +std::vector LoadDroidSansFallbackFullFontData() { + std::string font_path = + PathService::GetTestFilePath("fonts/DroidSansFallbackFull.ttf"); + if (font_path.empty()) { + ADD_FAILURE() << "Failed to find DroidSansFallbackFull test font"; + return {}; + } + return GetFileContents(font_path.c_str()); +} + +EPDF_FONT_ID RegisterDroidSansFallbackFullFont() { + std::vector font_data = LoadDroidSansFallbackFullFontData(); + if (font_data.empty()) { + return 0; + } + + EPDF_FONT_ID font_id = EPDFFont_RegisterMemFont64( + "DroidSansFallbackFull", /*weight=*/400, /*italic=*/0, font_data.data(), + font_data.size()); + if (font_id == 0 || !EPDFFont_AddFallbackFont(font_id)) { + ADD_FAILURE() << "Failed to register DroidSansFallbackFull as fallback"; + return 0; + } + return font_id; +} + std::wstring GetNormalAppearance(FPDF_ANNOTATION annot) { unsigned long length_bytes = FPDFAnnot_GetAP(annot, FPDF_ANNOT_APPEARANCEMODE_NORMAL, nullptr, 0); @@ -251,11 +278,11 @@ bool AppearanceFontHasEmbeddedSubset(const CPDF_Dictionary* font_dict) { } ByteString base_font = font_dict->GetNameFor("BaseFont"); - return base_font.GetLength() > 7 && base_font[6] == '+' && - base_font.Last(6) == "Roboto"; + return base_font.GetLength() > 7 && base_font[6] == '+'; } -bool AppearanceFontMapsUnicode(const CPDF_Dictionary* font_dict, char value) { +bool AppearanceFontMapsUnicode(const CPDF_Dictionary* font_dict, + wchar_t value) { RetainPtr to_unicode = font_dict ? font_dict->GetStreamFor("ToUnicode") : nullptr; if (!to_unicode) { @@ -266,6 +293,19 @@ bool AppearanceFontMapsUnicode(const CPDF_Dictionary* font_dict, char value) { return to_unicode_map.ReverseLookup(value) != 0; } +void ExpectRegisteredAppearanceMapsUnicode( + FPDF_ANNOTATION annot, + EPDF_FONT_ID font_id, + std::initializer_list unicodes) { + RetainPtr font_dict = + GetAppearanceFontDict(annot, RegisteredFontAlias(font_id)); + ASSERT_TRUE(font_dict); + EXPECT_TRUE(AppearanceFontHasEmbeddedSubset(font_dict.Get())); + for (wchar_t unicode : unicodes) { + EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), unicode)); + } +} + std::string BitmapChecksum(FPDF_BITMAP bitmap) { if (!bitmap) { return std::string(); @@ -870,6 +910,33 @@ TEST_F(FPDFAnnotEmbedderTest, FreeTextAppearanceFallsBackToRegisteredFont) { EXPECT_THAT(appearance, HasSubstr(L"/ERegF")); } +TEST_F(FPDFAnnotEmbedderTest, FreeTextKoreanUsesRegisteredDroidFallbackFont) { + ScopedRegisteredFonts scoped_fonts; + + EPDF_FONT_ID font_id = RegisterDroidSansFallbackFullFont(); + ASSERT_NE(0u, font_id); + + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FREETEXT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ScopedFPDFWideString contents = GetFPDFWideString(L"Hello \xD55C\xAE00"); + ASSERT_TRUE( + FPDFAnnot_SetStringValue(annot.get(), "Contents", contents.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 18.0f, 0, 0, 0)); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, + {L'\xD55C', L'\xAE00'}); +} + TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontEmbedsSubsetInSavedPdf) { ScopedRegisteredFonts scoped_fonts; @@ -1023,6 +1090,106 @@ TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontMarkerSurvivesAliasSuffix) { EXPECT_TRUE(AppearanceFontMapsUnicode(font_dict.Get(), 'C')); } +TEST_F(FPDFAnnotEmbedderTest, TextFieldKoreanUsesRegisteredDroidFallbackFont) { + ScopedRegisteredFonts scoped_fonts; + EPDF_FONT_ID font_id = RegisterDroidSansFallbackFullFont(); + ASSERT_NE(0u, font_id); + + CreateEmptyDocument(); + { + ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); + ASSERT_TRUE(page); + + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_text"); + ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( + page.get(), form_handle(), FPDF_FORMFIELD_TEXTFIELD, field_name.get())); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 18.0f, 0, 0, 0)); + ScopedFPDFWideString value = GetFPDFWideString(L"\xD55C\xAE00"); + ASSERT_TRUE( + EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), value.get())); + + ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); + ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, + {L'\xD55C', L'\xAE00'}); + } + CloseDocument(); +} + +TEST_F(FPDFAnnotEmbedderTest, ComboBoxKoreanUsesRegisteredDroidFallbackFont) { + ScopedRegisteredFonts scoped_fonts; + EPDF_FONT_ID font_id = RegisterDroidSansFallbackFullFont(); + ASSERT_NE(0u, font_id); + + CreateEmptyDocument(); + { + ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); + ASSERT_TRUE(page); + + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_combo"); + ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( + page.get(), form_handle(), FPDF_FORMFIELD_COMBOBOX, field_name.get())); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 18.0f, 0, 0, 0)); + + ScopedFPDFWideString latin_option = GetFPDFWideString(L"Latin"); + ScopedFPDFWideString korean_option = GetFPDFWideString(L"\xD55C\xAE00"); + FPDF_WIDESTRING labels[] = {latin_option.get(), korean_option.get()}; + ASSERT_TRUE( + EPDFAnnot_SetFormFieldOptions(form_handle(), annot.get(), labels, 2)); + ASSERT_TRUE(EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), + korean_option.get())); + + ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); + ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, + {L'\xD55C', L'\xAE00'}); + } + CloseDocument(); +} + +TEST_F(FPDFAnnotEmbedderTest, ListBoxKoreanUsesRegisteredDroidFallbackFont) { + ScopedRegisteredFonts scoped_fonts; + EPDF_FONT_ID font_id = RegisterDroidSansFallbackFullFont(); + ASSERT_NE(0u, font_id); + + CreateEmptyDocument(); + { + ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); + ASSERT_TRUE(page); + + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_list"); + ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( + page.get(), form_handle(), FPDF_FORMFIELD_LISTBOX, field_name.get())); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 220.0f, 350.0f, 330.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 18.0f, 0, 0, 0)); + + ScopedFPDFWideString latin_option = GetFPDFWideString(L"Latin"); + ScopedFPDFWideString korean_option = GetFPDFWideString(L"\xD55C\xAE00"); + FPDF_WIDESTRING labels[] = {latin_option.get(), korean_option.get()}; + ASSERT_TRUE( + EPDFAnnot_SetFormFieldOptions(form_handle(), annot.get(), labels, 2)); + ASSERT_TRUE(EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), + korean_option.get())); + + ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); + ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, + {L'\xD55C', L'\xAE00'}); + } + CloseDocument(); +} + TEST_F(FPDFAnnotEmbedderTest, FreeTextRegisteredFontSubsetsAreLayerLocal) { ScopedRegisteredFonts scoped_fonts; diff --git a/testing/resources/fonts/DroidSansFallbackFull.ttf b/testing/resources/fonts/DroidSansFallbackFull.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c1f08d9dcdcf81db5302fcd453f58e8dfb26132b GIT binary patch literal 5155540 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
  • Kk>(KUzbnk=jZb?GXwVVONT1H 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�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 -U+b;CRgriL8RFW&~qyHdeJMD3+!+u#*I8jD; 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

    tSU1fjO4d!j&tifCe^B7=KUJJEkxtAQ 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 z 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�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 H!G8t1G5TX; zTgS#eJGFW9%nW;_X}*%Z{l%p8i4M z;QVEmJ?O6A0ov>{e1 zI;h~X#-(-s{^-f4PDI{(53n=^?Il63X3thLPGREDK2&6^h;^}l_kVEzN3p8Z^=KI- zak_I&AXJC!ZGO?;_SD0^on-MpML~$lw9n(gJ}6K2Yki}=*6U(lmT7%J^+Rl7jZ4s<}QEFo=74kq~%M*G@F{Y z0^^R?dWp4@#f+6HT<-eaX6Nhs*wz4AuD+I~s|>y{R!tX^CG=e|v`W^2$fCJ2(C!!9 z&r2w?e04*bjnm42dgFwacittM_BXs@b)DE86Vu5tp_1@ev3HMGtj&pCBe*myl;UVx z(cJj$Z{I6Vmr)2TJ4vK#md2#Pf>@AeD!8QJlIRylrGbKQBasB-(V++YjGuquctCFK zdJG}lUSJ=jOz`S%E^k8qq4D&d?z2*Xg@)HvYb-5h96N?aBI7Sl?nzGR<7{>0$tS-O z&z4bGnzSluuem*Tl@Enh8$8S%>CuZU-?FHKAT~aZz?aFO$B=kf4*XKo*l3MK4VD;fhVP!r~3-kO9 zdK~K56;;0Wq{KqQpcTgs^M?U6POhP_^c34HsO%1cX=VMob#F2AJ*hwnqE0^N23=qL z{`bH7;Q-kN6F!>W8`DZOT9j+1YQBBee7nDF|CPe;!CaOMI+8dvOOk&0Ia;xwy7F+k zh(2Rm3jWLd!WRGVl@GG~n^S0dqTRA{bknBMoo~M%yJC@6kMr@vztJMqGm!~52DtY> zYx{QWIB|O-v1&GP4ym^7lny@bsbyAy<1DI_mr<+2N--CF;o$8575t)M&mh_>E$N6+ zS8zViW(g-i;*uOl&c82g@<;q!Y=<_h^!n?zZ0Wyg_ zWpOB@s5bf>DV1mosl~Id^*uzmfT~BH$|S^$Qk5!ZTK26>tS;otKuK76q0^t)_S8nd zUcdY9Bz%n8jm^AQfP~1cDd1SjS~?NCk=D_InEb4tux_C7|ybtC_w52 z4qd(#_?9d`GQ0K@B{x5{W^b`LW-3fJ-^o;+JpvsrInYFEU2}eZ-f(=KxvG?~HLRQ1 z(v8pH8z}>vq))pRl(>x6kr*MY^Ii63V>^K$=H3`2r#5W=kInP1>IU$z4-mS;OwfGoIeJ5ghz ztB2WIlv^;xPiS%AaHfF;$9ec>=-YSW%xu{{H~ao$|3SRH4r}ol=p&#Q@fz3{>plJ< z-@jD#7tZ`}T|)c7Uj*PAs;?((8qz3Q7CxD%WR3=vI|H#YZ>+0zuC}%oeE*E7&L-oz z=~Y#y*MAGqB-)X~=YNQ^6%l^=Ja#@MZ1PEegZ1_Y<99Z)POkB|)t7n0pOt#@CAWsn z7ws6snR+keHq~u}BjkG^{N(F=zu3_F%aag@@#GUfJc0u+i0}0?Zr;aCv+zg%0D1?- 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
    D%@x2vk?q`NH7(&+`{ ze8SA47K=IctbMCx-FoYHo=zm5F2YL1R6IMN zLRXWyaPPhLg%@V*>H}5rR7*95GO5~Vu2C23E7$#KgVnjTI=P~qY`tXPGTSmniMgsN z&-}|3&&&F2O7$mc?47%xq8~%|+>4Nyd#=&c8yk4|N^A3__02|mLnP8&qZ4)L9XNA^n6jCfuTb3zpS(gpVT1mL z+T@JWtlp7<;TfmeA8JX8Agl(ewuCo_S4LNS-@e(lZ@&4_m34H&LhoN|+Oesb6(t&k&D_PIX3!Irm}_N#+eUX zv(~mJCLXrFn51=6xR~7$JG^WNFR5ml;+%kU7KcO^z6`>1wBMo+I z!_=zA5&I_FzUii~HnoMVSe4a08k`_Yr)k>}!#J{B^y?LBKkmyAZHbouh*#1(9X%j2 zCW9x5E6YVYi48K^#F;A0qRZl2w^f@18BVIPc`h! zCUKmiE9LWrrlAskn)ygp*zXqVf_?3^gD>6}ypv8hj{3#}fvUS>{U?@LjZ3Yj ziCUUL(Z*q_(^t_zATNtc@E_JWPA` z)v;oom0qXso=a;C=0o_>9;R`8i0YSff^f(d;j{k^eUt0?0pkx#9C2daBw3VUPE%$c zkvQJ_dIipKJ<8>o_Ee8^uO&0{L&ksP)`R>hIQw*hac4f3?*HG*I9dgITclsnFX#+0 zBR#TU-1GOtcDHSJcRyk;v*{-FqYuSvAO6Vo)-RJazqQ)^~=?AkMQ{ftHAq-;Bk0E!+UGy!GTOdg=r60|+fgZKF9~;z?<&|nhvMOj+P7X~ zUuk#5ZW}sFYmSkmGUo)Zyz(hJdo!ouEKS=TN?40xX-$t9vF4+gvtm7syWkGJN&G@8 zlG_Eb#^?@m$rAY|b=jT=AEY!{di0#t_8GQ)#u-1Qb$g?=c!E5`qwiJDeUD+Dw~E$1 zRBw#-Zr-4EdW&4Ad&Y5=#1#UUhL$=3mxXoEK6r4;Hh*kzt+H{vb|l!7q^#-9QQ!2I zgRPXvcHy_;l%s1+ospnZKDF^6#R#Ch$~CdXn#B6{cEk*_|Na)ORiI0sOaT4@Zm2%sx8@OLXYvg z{!DWpHtvs0?_wM>0W#+&vvByyao!WsMw$63ePS**k^lTR(w@<1HoF!Rjt)?(kUhNr z*fC;C&Hlc9&yO})Jr5+_b6%2e>d1EBE+6jn|BUN(WC!wWyvB3*DaO5XTj+(S%gVzh z;Jel{&&JEkOe2`yqr7I;2*IYGzyczHS(w*;uaG5j(EeW@oOzD zm*}_KSJ=88$t1f*)eT!HszUYZ4Z-af((LQ8dQ+!GDHj6eNolsy6fM7|C!M}FBj^q~ z!bbT8x5ts)XbIf`@oUDteHJ|XuVpyo(3`9e|Bdl~ zr_T~CFb2;t&a`l8g!+Fo3wPGx&(FfayD0x#!ZS0!bDmON(0yV&|AWyN=u?b8){5Zw z-!oq78|)qE&=<>a+=~!CfR`9|+6uq3xa;r-#$TpSQNL6EkBmDs!h90`**`H}noo%1 zkN5tW@XX9B?zfPK8gu7KwzZnb&*0AOEG$r(EhQHa&5_YDl7qBtU3J@S_Wu3z?Og4y z^wQwE#^}!IbZp12%8h4KE_!m6)mph?$ZA*P;mLuxZnRnc%9=(}6GDfg?N9Lg8cJ`& z+DOdHviJ3|fj7G0!41`iwx^c`*EZ_gV(azod!ATfww`X9b!G>>Wo}Q(v>VM?w0YI- zrQin{=WOOR#vK}C{Uqj+u(KRo*iEo6{=((opigIP-=_WN%*>mNJG4i6aaK^w$+u*A z%t_(PdYj8T^#d2{fWH!+nfV((eaC%=kaPdZsPhik*KaYe{}#dutRfi6Z-E`B} zt%hDYH6I9B4MPoj+Nw8`>mreLN%OP@mN}4vn3sR&b}>E3mWk4tFtpcehY7y-s0d+) z^%Pc~wXJnHGTCakOvXl=x1L3AjB8J9BKylu)D7=EeX!oF>9lIC9(o_-{X38yInY<( z(E*)JveiKctZ#UaOel8H8r|lu6P;mG_7scub=S2&xodj*%;yen+<5xqWPfd>`kO5J zpS}#AH+(K=Kk9>r*E6p$UNp0qq;kU^tJ!VWUvHmw+K&4_Vt=IN`Bi#TZ?yA*))sBW ziREU?RSoCu9JKtAS~~PVPHnB5-r?B3xYt`((L`fM79ZE^ww6|mUVX8^jttn_x1aUm z*>eq}CNHeup9ShD2X32XwWXpB`wnQ@frY(tTzC%VD(PKvO-wj!e<9Bx$&_3beG2}< z+6%Is=UT4X#o-4gJm*7se(KCw#1hEl{EV08fsDnNQ%dDQMSAall1yx1zbi?^v2ofn zqAs(E3;GdXzF#i_wq%D&pJjg8l=8ojCB%o=r9 zU;V+D=CkO425q!8nnq-IGBy&l@!NX)oaDLdHvS2m7-m6LRFsqx$g{Q9pd{WJBd5T%KhP@s>_=;}t2d zkq-^lKJh4IL20;gFp@2D7T&}6P{gA1KV;uV(HYK)O>|cFWixtn?-TQ_)YRU!>-IHf zCK6`2DOH)WDdR0n6{0!TLN7@k&UoKpqKH8wQM;F<<{8se|nk<|4)=)e|bw$)j7~~0T(wdqNU19r>M;Eq+SknqVilQk@ zyFUp#GZ!O3nIWmnc#78K9FsYxG49o`LVts^l$k#wi`IymUS_I57C zxHCUcKgZF_VURLR2jv+3ooEDGL-Zld-(gyi%?(@j1(IzB?SdjIR@pieTNmTljVXzE z@R8)F7m{uM_P{67R;n`7Zx0NNUpw5d?%!|Co%{HYYAA7Z^b4Dpjz&gC&KaPiVF~i_ zkIyq|1@AgO4l#}_7I}OzH)x%ctK&8@PjlOyIa6P1JC8f=3u6Balu>ddM@&)>GVZi9&M`3{x5zH@ z@FDn0ly7IeWSgMxtx4*{imAlo^PWv-WTXD)%~c+Hw43xUcrkCGe` z=j?=Er(SZ_NuC|=g4we+y^h>GW0A3uzPakg`WtS@)!F`3Xuv+rTyJ&$TnV(%*}INR z%4}{o6N}Rn#xLA?=!)(3Ir~*>h-EVREc8nMNqrD=V4$oIhzasG=KayXmf>O?Xw8$O zb+LyQaVpPu7IH(3bD!lHaJ*8P)(Xi@$0}hfdOVKl&wHxH(3Wh^BL=kE4qJDL*Ce<)wMM}m+;Tyb4Zt% zr_(-AG9Iuh518hdIZq+&OXCMQ#r}odG~O-uz7$%^;LfO6$6`;x;z*fNlV#)hOFjF#Rb{VKWB8FzRJ=ONxCJ0X+X2|TxpK1DsS zfoP4E+s);@^$4FJ5GA+AEiZLgZZDU2>PLIT9Nx!xsei~rOY8UCe#Ra8q5R8CzXOby z-YaEU?%=F?92s;*Sv{D)LKYk&@1v~QC86??G%V_$ewMFb!I!6HM&Tn=&Ntyr-dE!XN-ulbZYC3dlYjIumQ{2%w z-KVV&H<^a-0NsYIytFb=*%qK%xPj}oZuL{huC}%>S)(nr*}!N^XO}X!mojSA)Q!wt zIn@{L?LN@l+^k0FAn!6Ox!Q#J!93ykYsHuyAz0whk6448&3*IsS;(Jr7$>fyA3xn2 z!q_}UHf3qH(~{P!?VTGAScWyJG>E>`vsZYd&+Q(sTjNS2+!os$5Y5&cfE{Q zH8{IN(kaVtSozd~^!ouQ+mb9aGJl&+O zX)^6T-#oSYnrptL2a@LdO~Y(nvLvpBDc_)KhvRjN%}9@7CDe-=rHp);XbhhKq>~eo zYSzk)yc#4Zv7CaO?7shg`^Fo`EDC8gIr#%?!m=hNeze^h+;O3%UAS?+DgNLw6nqZ* z@Paa$0Dl$p`sjCO;qdiiUSBv17w1JXxr@qh$S2+}&0Wm6!y`7uFcLJsWEKuNgL!>v z38(c4d}b)$NwWnfsAwdd)dx)q%my)YW=$OUUgV7N&?nJPft421minTFVVzQ(*pXPZ z<)`zqHH~UpBI5txME}>Uh!M8t*d)5=%=t=vy;;9@tvNSd7s}Q&wE9Q0NxG+yZ0R!V z+i0W`)~+3D&6)FHEK3>6eUmccGJ*w;GXv14;4LM0xr@VAfIPke_)JOmfp(N@D0d~} zCE7`TmGxtliTYu4&tN1ggpMzW_uq!b=vwS-C@b(ZYV1cz7z8PM#fooaNp2p*iAPP zp2^+pJmqK38utC~QWtppmNHx=Upent z73*z`Te*z~IV0BFu%|P*yZBqw6Xp%rNSHq#EWLv){S>|9&t-NS!>0XEsV$7ZPW{4}2v9)DeV9HS`Uw8Lo69qwl8h2_^T#BiU_rUwwm8I*E5)I) zoRpe$ua=xnQdlK_QETVobdhY~!r>QN>3pWICh(;X?6j(0tqh&Z`yjW9wjPa5kf%6ua10SDN-tn*9LwF|l2|RV} zao8$Y7rxBjapr4j|A)q!zH={s=aWo3O~1;9JNJ$Nb{#V}YtlE+@YO*^k)SnOq(?w^;NUv;|&Z+!;H_3eIgO`&N|oKqeqw zN+$Q&vhu*+V!8IYGQ6bE?`OO;k6$EP4E+B2S><7?VlPP0`U~_F?L@3p&OMWR0OfOE zl(d}8M?NaZkFO9?F8BFNOpfSFxYK_0i*wt_ zdP+FtS*iVBm-XYEHLrO@Jd7OPF2)OM4A9{lW%UbsLe71Yac5j0|AfEsTeEOSR)3pu zaFQ5b;B+=F_fQ#bb3JIMpu=}Ohwd||`UEWy zyPo|wxt}urGl^py-eCPM#^EW6WBkRtiT3oCr}{NLSrZD`O415w zYfsY?d&k?U*-|#~9FybwbAkm9dlfoP(BKyy{B`EVUlLN1S+?wdCihQ-XL7%Co=P4S z^atIP+&|N&;6-OF1wF;nf056muPpa#DxAsvE57OBdC|6a7{$s|)CYNo^FEB{{>{am z@fUCScMtv!+f2_9qVTswJ+F)TEa%8?WO>MI;Rkx2%X{^j@B@nae=EzwC&sxsbH79R z+kk`tV0Cj~0vamc3=N=*v6oBVak_;X%hv`yaepw3lp2l&x18KnH`$P7 z&Vnpimm*#Wt;Suy2&`mlAKgdVPk}J%44)mk+a5Igwsx6ogPNX-B$p@6h?N+pAn|>D z-_`;NtLgomlKuQUK0~(=$JJykrcrE4x-rwRKyO4xe6-gOUjHSvs)Zu9jZvG}BaZ`< zWlf?R$n2)4cA)@_UiyVl6bHU<3i|fU)AfPcT3Il*Tsqza<*-Jd<)fhY?kB z|A#IxA7YGtK;^+{ncUy;6sDPc_7@&o=Fxm5!D7t+BKRj?h0-oxVO+6Ck;zw=;lfW& zZOZ$A=l%34>cO2#vI+7E;{gxOb08lC?$!@kB=opwPe_)>e0>%6y3lobRpQu_6Fzdb z6Y^o;#82YB)>C|5wx9C)%;URPJa#xVNYNV+0vLD0ldk6tno4N1EV-UtpId34e6)3? z8faNvtr=#Es*H~OW7TkgE^ljLC0uD#QHUeTW)p1JLrv996eh7I959ryWnD%8U-eX2 zTh`hXY3Ul!mbB7+`)Xdjk8E9zXM4MT*P4Hm|_|_IzrH}iM}J~A=jBgcjTM7 zt`_<1Pc)|-y_Lzg^0PMCX6c)fV?x}>IM)2ESMnJyO?)BC%R8U4%^m!-Q@*E6N94QY zcR=G;DoEeRzI1!)dKF_R-`(Tl&RI^;$6mJ{>35O(@h-xZe4l)`bMA(9YQEpC%dwqA zT>}yaZ;5#Y-JHn}p)T+l^A?^#_6-Adc>;43xeKKJ&yUEugiQkaig%An9I_1O$K*OP zKjz}FZQy?sZ5o$2bP(rA&rc9iZf~(2mY)Rf(Xmp7=I1buw+kMXc4>Yt0h#<1o?^VX zZ}1h;Jjl-j>gk)z&77Y<3kUB|Tk{KM;dnQ#G4l&&;SPTaS}dZcUO#&;$!O{YIoWB+ zz&;~a+K7M4dzV7w2)$Z%lWTKyBH)XM#_6Qpo;|g6>1pD{3A&Z-tJ}MGdV1Gj=;QV+ zwtdSjPh$~5xz|Vn)ut56xN0bBw3hy*8L>|;4TqO@kObiQ^eXXrX)G3VdmWz_Vrw;W z&IZJ>FIy3zX<64tEldEf2JtS0ZtS)D`@7ES>b=bQ%X9VwuC;ZEKak6%)uR99pBoMu z#=!+WmiU9)DeNZ5wI$R-x!>pESM~wrm(sJ+n1cVr`IGbUo%}L9b@>1`1Z356{?0q} zDfk293jTmhD)Ab8s+?yyzY=(Um0Mow<@{@zKHg&1J2Uj z;air`LbeE>TzKY z%Cm1x*1rSgU06Rp+&k)^^91=y>envUUqP zf?l9tM(W4Yge*CozXOU2T9(~s$?udn>f$w8epgv}L1Xaf?lK%cSW$it@cdp` zkInZjAh*R>?Q?PI*Uaxnd9fxXFE`$c^%3^u#F>F4?c=gtBy1o-UD!$Zcb1j`v{yyG zaQYk`{lq8Ci!UD9vW3#ITtGQfdV5E#rIz(YbJ=6_%$g}W3TM!7_?*nL=mbN~ zj^U0t9ZK%A_Ut))B&w%OGgg~w4Q_Agom<`56>2(jUuek^v$64<#f!~`hKFq1++xLJ zlqWJ8jZo6|RSV-*EF4;IZP7=y1O=`m8%*+w(6xt3{UBb3j}P)G%{PD0-U(<1%?%Pq zG<9$O(8=B;B{oZft;?2VPV1ji_XpoMoNNiFQQJ=>?uQym?;XOm*{Gz+w~MyI$UMWH;g8|b4`k_Ijf`72kQECnAX&O*Kd+P z%5X=k43JSpx&tZ{KbX4u-$6iLUb< zIWkQ*#x^ay8y`;$8>UXb1KV`7ql5lR3T=deeILTKz?p4w0-Dbb8#e%`sy=(0WbB?`!ck7%vYbS2P$9#+Zm5KH+@rK=>GAom2 zk7@Swki$|91%f^!yeny0$z9=&NF-{E>y)2)ymq+sjuSRlH1V_4rh0>hijG45DTp(RTGYKfzMA+xRl&Jx!dUm=^{%ec4w zVlNt8sN}De^^|1ab+gJl?YW+DF&F9V1icqF1_`q<5P8_MQE^!#lgIU_*pL=tt7m+QF7cOGJy*jGA{_*4=ko=bmeGjWKZ z+E20X;*nrfPdI%%HJ$;_$Ob%{#5?`gs=t3JcY61y9fDOfR~Mx7{gl`_m0);y#5iq zcAHy2?g&CQe1OY)Z7Sij5$(TSmKS4-_S{icKWsK31MV!t(N5kk%iqPgBd@@NVorSU zr1D~I@*&32TET;mleEt$>G@$7mwxX2-CVxZUlA`Ylm7_g-g?CR75)0CryfDKkCoMf z{=Uw8L8AP}WqIKPgB%d_yvN0Hjs&*(C%7J`zwo_@xyUwZ{*$si>KAl=2j%mha_f1W z=msCjKX5%x`*9EHHMYY(&E-EM%Y&ZWe#uuy-Fo1oM?29HC4WrfD9?7hq~~#o3%!W; z-$#g&pOHAmQM7-MkW4;@r>=g%9SQJI9w^u7jG34-qHhIR7y68Nx)# zBFUjs=+sbDX{@RYL>I1CwavpVpaJN{zAn&;==nKxiS-EXCSomfKX4Dtgpb{!&F9_n zh*eSI|1Y>W<`KqM(D(rtm$F>qUz9l7!|O`Pw_kE`=rywMxt*E(mkC$$54!pb_eq_( z_Z9a$Ql5+N91rk!zRKSLzws4aN3I|y6!Ux8d%o_zN7x;rFAmQOS%E%2%WwFG zd_Qnu*L)MWOGCk{#EX11XDo#; z=lhI1?ZcXw$0q*+t_P+a%44o_Zmj&n1Z47$;A#F*x3A*ff#}l@<##YQL<}>5|H#Fm zXRu~{hif_E!FgXR{}^z$t-_b=`n!((vs>QL@sF347x|Siho1nRf6^`Q$Q99^A4^>L zOC1_3`JcGuQ9ss+KSe!d?eWT|pSk5RhPd}5`t_8=A%}#1cpCNOpK;5Bf9ZTm{^!6w z^_REv7jF5o{kr@wB@R9i{*8Y^J?_}sbWenR1IK<_hR@amzjEt$Y#LCw)E-ekcnEaM z3Y6Dk0kZs?Z4% z|GmUP7nc1@aV7tvTVBo;+4q;+@-LFUBfgjA|KKSv^f>q?lYf~$mHZ#+GstIy{z5#6 z8_=a#a_fW_z;#^0f$4;uq%h5-I`BJ6zc@Y&=Rg24i(8Xg73mZTfh$&fyz-+0f%dNt zEeR@1C(jMuG7vTwMb~vK3vHf=k1Y+(omdnIWmEmu2R|74TyslkQA7y@=66nHG83I< zc4<;w6Mmx4ASX=^#UZAQsz$`Glb=RYdnlVjD6Hx8B1$A!U0vN7iPXpNvnmh?Q`cB; zK-RePI{znv1zyhoe|B+azQ009i9dzCR?@+*y5*%zmE-W5i{rhe@~=xA<07O-|!S~VLCyE;~gwlJafR=e?@zh{D0D?DDTXT{{mk2ZkE&B`pj|2IVJz!^8K*E zp_8ErlssmR(?8*#{a@g2ztKO@rvC%(wh4Mn*x-L>94!`Yl5}FjNtUNrmC&uYYwh)M z3A-rE_Z3`km*W%ytAnALcilhZe7l$)A+}6<*DiZx#R(yQ( z_rLG5AF@C4lRiz?=(lTS7cnH(${oi1z~m%F8r68L<-9IbavvOhFJv0&gF+SKkP;5P zd5^A8eG>i_);k3s<0V?au6AvZg5RwN{7qwUe0DwHB^rMre+uA0=e-`Av=ETEkV{m) z5F|wU6Pb^|7cSoyLMTuEBa`m@Kuz{%?3kUsO+pl2IQ?yCs z${@W{FbT*MU~?%2TlPhsNfq<55SQP!CJbB?xP7`?VO5*70WBuQVjeZyec98EQQ@5o#Diy6v=9_KL%eY{vbUh zJ`tmovx~wK-@Q4tKK?&A8Y8@y^*=SzgEx;@d(Umw(5_W=V^hf;bhW`@IbGi+}#tWh2g zGceHKNk9FE%wRY*(2Ae^)|HlZ<&{5681rizf;B7qV&T;T;lVjOv^IY@tQavhO8>=_ z!BDIws;Wt~SygLSsOpLy5RrLY&O6!nW>4SQwjBMK-WD=k-Wh9)Xv_9}Aq(7NyE^rtW~I=9dPv?P<^k5rj?NRBZf?Z_ zVbwu?W=W1ngKH@TTYTJ!}pqj_y= zDzKtHnp_*5TeI|ZyVJ5dJBxOYZTIv%KHp56^t;HSl;B~yqNJFC_7;k~ZuYJVh1Lx< znc@$$JIeXsf8_C9WTl6bWAn_`1Wq4jYi{S?mmU1|!L!dk{QTh~M>a2AYBn_;;?LXp z^KAb7s%fq_H<|SRB1(&F(C-HMC-?y4#JK?rouIF4=U~ks#=C14{+bvkImfy&9L!Je zvi2|Z@H4#QZPwwvWp%l0#zG%(=0s5!#+KxSc@IW z+>aI7V8|^meI$ipF7NQHI1h(=PFU9{g%P*BtVi~FRN~MR!ajvZAyXK`x6o#y2iE#* z^A*PV*#w>yCS7`PyN)yJ(p=EP>9@2k3v(oWUlZ>VG&zo*;yvgi&oiDeN?|T=TJwk; z7Vx1XZ|$HwO}7lQW0d`4j4Rn0-oSh6H-hT4{zOH6aglD+4ii%n=s@T}1h4sFov*|)#W z*1E>KDOQ$$B<9ZEemJiGLAxFQ5i1$Q6$fp&eHEySnPQRY?URmzJoEqJC*|HZwfw!-a&by zy9YN&*72P-$s5b@v>^CK*#5XnB>K0Ko{74oO(Mp>uu9^h-z9s9^pV?E;a_={0Hpw1 zOwj2iTAzVVYk|AG2YXAjmDa@`96ZkZ6O!-tyYcv zV?5D*(cftockFe6Z*prK6}=~RB`m3SNGNIr{e+}{&CCx z^rt>$UViyRADw(?-;?dTcz`yuJJ0AG(2Q}z7$5%u9egn6&3iOLduX~IX{S@6gOpG@ zs%i8g{>%>g{eum9O#C5uPud)k9=jzy&~I_qfaUHtm?V+ria!#GhdL1&9Oa0^LA z`dijLwIJ$qEVn;fUorQsUAud?y=Tw5b#vydpEGCkD*wvH$g)sm&>FEvM|*ph9H0zj zn%*1O&{!33_V zQ5NrzMp@TFl)x?66*DQr8pVY1Yhj(7L?QY~VDU*j2;Zn!Bkv<1Q@|Wm3I`+)f^SRn z;vhZ4cZ410=o+PPhQx8tfagWw5NdJlFw7VBEf$Ez4sUWjQqLVfi_2pKD=K2N9u_vY zk7L*2K7J2nzC+&E0~KdgoL6y4#g#NxWRA%}5QY!)c!-g;L zbReWqRDgsL*+sq)Yk#Ci*Y$q-)w}%Rs2*=rtok9Pr>?poFy5%>XMRmfefRF`u8BnS zcGGA2gAHUv`fR<*wtWe++E+)pUtlu*0@h%JinV@ToqB(i z?jXk!luL#39jn2F9$yw*V_FE|@&P+mM^OU8u}CZ)u|nFy>omjr2&|AE)7r9DB(!8$9hy2l7Aab(FWhi}t!c3&4SKRC+ZM5F7HRr|a3mYm%=jof z5L9V9KTWngvaDb|h#v2**iZZopBp+(zr@tCr#P{IGf@;XWRzoupfAq71zzvdH$+$n zDvJ2P@-kkwg}O~KMaY9dUOM_Ec~0l2FbM(>Qsdc+%}i#%SVYO1o3E>C^GCEqrC;%B zRfZlkqI8Z+t&Ucim8PNl)!SPP`nkHY!54^DSL#)Plo^Ut#q`?c%PW^IHCkG#DRyu~ z3u+Wt(GEWyj)fcaRa3p8zVS_I(>K}UUs~Oo^mR2fsPXjnO0#OoqB(6L%cwjS|N33m zG(>$Afw(%P#QYT1D_Ru|_iAc3qBX{SRVlw-9gFGJCi52L64sOFgLeuSfQ1MbcXxna z$oNGP7x9|0=D(QnOC%26A?mplc-cM6H=tvsy>yu@4||EveHSk0^59@GKcw$UmcK&c zu+`W;VOvcpkks;&$Gu!gJf(0IaFTl>mjC1KSwlxZA#My-r^`rhvp-f?*dpNr=^)~i z(u$RMM~pBtk6;K#uYvQChL<>p=g8JAO}^$eNndjf1v{so-E%0iQsTq>c?GRYDLvWG z%v#f|tv!u2i545?8!nGqiEFP-%&{iy3G01(=+F!O?mZke&R#KUo^9ZdtiOT6ZBPnd z)rL(D`H%SRPJgdPcNv#9uB5{?E-vlW!g~o(_$kT@*#Ub@$c}4ed90U&&rPhCuEVzq z*Soal_;iK$mDPoKP{NM7f$&V>M*hxC{GC#LH}kXi^E0a3ZF5QY-9pcRi#y=p*^8C4Q&GV^p5+3KZ@lBvbexeJX_y zaht@xZOK0Vu%|BXJMNaa*k^|<{|MLO$a3&8+wsiDnZif;>Bs0(rTv2!$>xQ9xtKj# z>nl!YYwBzv$E4VXBx4@Mza{4St>g5R*^wEO3Oajdqa^;k+ht(w|KH;Bx_+y_zvoC- z|3$XhN+%<0GntN#p5AmKYS%>T!u4urUu8Di-k!EswbDJUcDtRHoDG*ZgrcUA31wOYWWRjT;*oCXc zTA5BxyE27O)4P?zXV6@t-)#KoDez;bz>l8-zYjRw|E!}v{+{~iocMOv1dyGM_WZql z+_sM&Z{D-V9vgf3S<`&>tH&A-SW`qJ#J+l-=#2B?btJ8MiWf|1n#eQ>HiFx z{VsU!Bs@=u!qj}X@`aPi3%VC2j<|Y%AU??yKFjrd?iA(0DeqSQ=TCuu;S~4-z=@uX z^xogmS}j5uYI`aw;7f9D3}LI0>B%-dQI+L~{G^1L!*-AAOGK}?KedUB6kCf}QLA37 zt!WK4B`mu(n9^&t8nr6^xK5t($K%$WciyTbC}w7z(v+yz>QXfKDF89dkxa3(T0x`|W#$>d zsj5h{HkMAe2Abmav3e~?9^PnURq{!Y<;f(G<(5#)Q0k(ISQ05gHA-WtC2I6=qtsMjoZ1OsDBXqb8K~<#7TOmNwA`W(RO|Gz7~2!MfkF?!W&AD{P&&*%}(G z3WS3cZXoFQRp|;P`;M3@Wh$-Ssw`ei*^$R8SNR@$E*gFA`w#fSw3<()bV}J-8=yeP zroSl}4O6g!woYwCOZ4crIjiqKr9PaRRzE`*-$i~sC2^+6N ziEF$L#rhW|70$#c$|L3j#aJl3z~z6B@?;Z=cv4T%j$;}vic5b=)@d7G85ZVPG5O{YpdO7uMMe&SKn|4^XvE1(C z{=@$Wy1a<~%s8?<%J(hk{CnXg;DtY+o7B%B(FHMpEV?N|{S>yEB6i}*VZ!U{veD32 zL~Zqk+i90J8EcQ)^H)sS^XIRaSvmFPCSRSENnW-)sdpN!^9Bd4<(9Qv&=~uFpuK1l zNpc>mFzuP}8JWV%1Sp)PPn4HAz+`zxZoy~msi*Kq)I)tRXipgaZ`@BliF<^PnuN4m zf3;1=r>FP-YTtC#=J@8#hn_oQ^8+m{R*Pk|9H2ZOxOpu3=vAVl+vdWb@G7P+?$(#^ zKT8~a5&J*fm%=M41f6Faj_Fm4W=G4zIxy4u%-ge77{u>^@H;eYl97XayPJ6|<2J8(9o&pt}{&{$<@Q%b|9BbO8U*SL9^6<;J z^%VZg#X%49<48LFw~J#Ru2lYiTpaW+;s5L6&Up~gPDj4GcgzIu=bZ7x87Yn%C;L^Z z2kj}<|9@`%e-^%M+0MU99QE^lx2T_&HV%En*?{M%q{80<9%cHFJSkQJFILHVkmu`l zyti0gR$j!Wf&Wp=b#R|kzo(rutXGH|R6ZY$ytTNicGB!6c_bG#S@&;^+w2`XNFQvw z*ADdQ?XkF)xrYB1O=#^)?!1%Zr+wJpJfROaQ7WJb{#!#0B?Xf6i2Gmkq1{LO&^~HM zjOGjQctsQ6BBwQ~vzX^#Zdl8YWrZY!$9Oi&J{N884%Zt&y4@11>#*&%qt>!zbCoqA z#nE1mnn|s}=L;HvR4g1l+^;oe?LNbdM>6%KEi9{n>7*0A`5sZxkM_V?63*v> z#W>^uJLAJ=C}jD7#8D65`;vH2;+P-o_nLvkDUEZO&(*kmR1C@T7=MnRD92xwxI-_g zH;Z8xm;1kxf59Ds?%4Bi>*q{94$gce_>?pG02lj{t{&s;HKIKBwILsQ-V`IU{&GIe z6ftjZe5(9#Xlyu#T;uu>Xysm z2ko!g2RD+NOgFF7RWqblu8pr-ch>I?t$k|#;{N`{b3*l6%&^UPIBveLug~l>%}&`y zN4|@G>9UP6&dcG-C(h0x=z#nlC3^O|eJYbTMZ?7rR{-?n`g7}C9OYek##ufbI`e#$ z^JJf=yf|+v>Zx~e>@!17@VqLLbuRk_olWf&`F>ov0zTw3Dn*M5difCg%kt7EjT_4NBz{E+}KGt-|H^M3D4a3c|0v9=o4|baRwPSs7+QMc@t(^qBvA4 zPm|7`|Cwof+qN_Q_2BevjrH2p2ED0S%NiT(>FKjyI%G#zu}MaVY(WTy?KfpOGsXttY>mb6!^L0b=hD ztGKMgw~iHigB9E#tEW`w;c)fV*s>KNqt0k2x!`+cRoT?>vim8bB=Al~x+YAu_hL2D`q#vAVS<*xc|Nd%rzN zf$-EVw~trWQ)uSUf{#!irz4gbOQ<{g1{)d%~w1{%&GI8;e8@fA(%EBs2` zexSXpt99R=pPatCrK_uL?*?V(WVcO=ld0~Xm`c)Ywc2<;%Oq>pOjMaWaUOQOt&LVC zJXUW~yGg#vF}VcoBfKPEG2<212BN%-^Dg^CT1?g>?}TL@9_IYtbcBu z=pXg~u=hYqH7d<>O7gBp-{khuQ|H~RQ;Hp2-f5H2yVMVx2)l+n#Dt^gqMgWT?#lgQuZ!dS7V)PT z=iFHyocDtn&lF)FDMivQk`}zS%xwbd(oUs)MAiw#0WLl0sY{$&6}sXU7snc^!~;Vv zj`L060U-y6U0mjgk+j?F;?DWh(+DZG2ez_DH*$smv_C>L;{BiE2$gquj3_1h=CMzU zqwYJ9_oLKSXcJK$b-8$Mi;H88@Ae_*$TTs|;7Qg~p7D`+4`ko2^wjgZM@~#gT-aT- zZ(f`vMB&*Y+T*M<1?}d@@_4Tp8*qeDoGWqI@0{C0zPDr(Ax{F@3654cTY^I$?>so{ z)`R#dC3|ej#pQVbIhONW9CE>>PZ3g6)Q>st+9AaSE-vj8!H>C{2v>49d&aE9+Y8
    zjhn<&pCU4~1(TP@2Aoj_wLb;25a ztGHIyC1cY|p8tyc4#t^nPFa`NX689wTtDmG(moO8bKi2`Eqy~g#+l*7YD!7nSV(mn1W9IoX0@Y;*BAAwX&qeJ{OmFJ0z|5 zyLfpYU`aTA;5D}_f6#;T8c6o}3>QZ{SGPSJ)m793y@|2mu{;Joa%kDK>}Si{NkUR%M-b6z>idRCS{+pPz>r6ixuadE7D(Jzvr zG%L?_ap*KUdn@txxVWUV9QE^DT&^d?dpSz5po5GHUOb=c$6FlwaEwKc09{TWF(+Vp;ln>MXpPpY)DJf|57#bUNR*+>rDnpwf{ObE z9fG+a?1Zb)9M+r8S-C$DP@<2J+~L8XO(9Hdv#h0~p))nTxGMcx=_i({z5I?(%6G^(*MfgI+O^Y1uZ;VY=N%q9 z(b2sx*wuPr#>!@U&+E%v`TRPgo?@6*tAUPGq*GlQn^G6ic~1^cgE&!6&eLP#3IzIa7e%#(hD)13rn;TIB(^E_sJXjA`+UE{+)cv)lV6 zSr@(oc_Zf4m+3o7@j!|j&R;#<^?!9~4cI~dDm3CDv*|H>Cvg9WB z-cxMH-A;oLO6ZW}0SP5QXo2uTiXE?3qCFnrQ9_4=n$R8{LQ4WEq|xE!J7wPHl^I6#sUd#L(efD|!4ERZUCiczGd;w9VeL=6_VWXeI zzLWgQ{EpZUWxe#w7ooPgoS_q-UzT+7Jf7;h)$a?|#jzr{ff0y59;(m#ih`@U z^Hl{`%ip8moc9j>PTh`Lum{U;DxltIXYLi{S#Ge;pm*@|YxL>Y1x zsQdYEN?hde6nsUWSLai`jne>YXTBxcK%a~H@ohvK#z@(_J&k_t+`6w#a&Ltp@ted8m}~A~%s}7e|Zf5jmV0uWAza^@7@! zIpw(BI{nDQI*)+2)er!rU4-+UJ)ox=23+J#t473Ue!NS1QH_ea*gt|Su#DV>{I0hF zcvZ)`Xf*12jQ&f?PcYE@6-zFx9Cp>6Z&QRduL zv@kwS>yjilK$97{q57c1reN_LO@Nwr(zsAtdz!HXV=qYVLE$Y!s^8}bJ! z^rP&fA7y>*ljR%rxL@Mp{D~N|0fD1VQck=oYvX)b-j6kz{y_z&`@N#ShZLO8xsvQx z>wNR+p?dDzEXwm(qK#Srh(^6&ok0GB?cm%rN`D*jf+#rd&r3g2U5K?+ho$_|-o5Da zB1tRGdtoeZ{SzRWIu@KseDd9Atxakznq@gB|> zyE*f=~Ia;)9ypW76qhD)sddyrI)vbvA;x4zNqvx`ruKVCQ$_~dZ<&2ij zq-9u!?LjV*M6NCC!VPLO02v=s@$lYgba%7mz?rw!SlOr;FGv_hMAyx*5nfyLqOFhN>*L z3mo4HqP+Cg4TNtLxCL~xZDo8D;;@H=XPc3)ad>|L?9w?s68exz$owUEm%L=ceY&Zp z5%&P3OxkhRwgdNjr@gl|xv5yd3wT}G*kE&Ox7nTf47`Pezm_a&FOBvr3qdl|oD($$ zi$%zWoiD?>EZ=#+_VEP>u>0pw0J;eny_rU*LEzsbki6SD<^pd&z5AH^(T~EzXqFQj zi-)~%bn$YE*&pY!S_$~eq&B7S_`&#~( zk)4J+C=U2fzBAj2T zf9ftC8ruBxO$!#lsnM-)aMb^ePvpdbEvwpx7Zg(yaIrBxkxKQX@Yf0qeSl`4wsLg~ z0Ojgd_^DO5;ZGPlJj=tflOqfKT-@{}2fzh-pgNJUKH5?i{-Xq+eTl1YjH3iHx{@~o+!Tv(y_9foxfc(J2cnX-ubfn?`II1+Vl9!|pkozikfxCbIjvW`9@#vm)>n`nT zYily~kk%XyhgPrt(8&!OPMp}X<$}`K*oKjj9G&p*xlo6qZJHi;IGjh{6s(BFpTAs5o1L;9ny`6p)RmI6?VJlje#GYYQkI4p<&=2o}eCsy6I@Se@h21 z*pF@1`^;P>&~ukLzu9i9wDiYYLcw9{P;iS^G+T3}XerTQw3){@4p_wvo80wVrkfKj zad*S|33E~2ZY{xu>3r5mcKWswSz6;=9C+q z48*L&)I?-rDxK|&bf!!_V-{S<{uUZMg!VF-_wLs!o<5S#q#@T*Cf8+q@s3n?e|%W$ zZOzYLzRpfN32Ptlx*2>J%HDm%Yly;#4#8|72ijM-Ew{Bm?NEAvCukpzc;ScHYo>nF=!x65a-MOJ}+{a+qO3{In=kz zSXAzSn^Vz5Yr#9Pa7SXtj?J4797tfMz8&8Q!n^G7o?AE`*WIw5G)ymIMx*u?a5<)H zyKt|;c1^Mec-M?#>gol+L+$qWqS%7{z&$jcFJFjw6*L{9>87o~V zx0K!GrM#7JN^L1f=alKplwf4xoD9C7hU-}--2)k7o@yaz6r)v&Mp4T|WC}rSBN=r` zIO(L4C*Z_=I$>|z)zWuqA*jzck&}HL9)X?;nrC14{93YhlVx=e_T0 z1vBDCGR0^j60n>SJZ_SOa#Ya?c?q;?Gy&ce0oVHyKn*o}H_xC*^SvvS_LdHd%bsgDP79{K@SWAcGvIJ}Hu z8)V7BBL>5XW%#0M!|7(w5j7(msP$P2jhrEFl$@U*ZON@n1dqSE9e!PCd7c;8(5zdr zmn`j%+gg(yw7q1+%H>YPTPv}iO9u+kLhrZ*FJk5^i&|C;_KZaOJ6aR5z7{*t>g~MO ziR{@E>A?K*kZnG?JQdFe;Zg3u^2xxe;aI38){<%oMcWh8k(3!XV>+l-EC{w1?kF`u zGD1Uhf?+pmdT}EZrNzi7*Z^MhGr(H%JE038-|eJ`i71#Sb^sH6`4#*^UZI;p*mnwQ zqC66zvsqIfBcq##r2CdvEEX4x@91c5hj(KOlbCY9XZ6@vXQ|YAp_#83eJ6T5!^;QB@W@E$|BuYvo`|ftIFMUrHy@n{yT)(`*i<|ZGHlv`P0evT`hu}a+-rdh zsIhz^YNb+_#51K>*X2E}dbYB_j7{q{%&r zxhM(`R%1%rrxf z2u8prr=!tOSO>l}&C7u9{RrY5SS!XiHBj`~mXKAu*c-A2^HE5L5j_^@e?#=Tw)eL# zu!j?F+wu@3kGr;#>UcR+13n(}ZSb5JG!xFr;2ef=Tn~r6+bZGJqY}q+G7|p)dNlO? z=!^dX@uy2S8gWJpxB4Kr8jKYu1x>iQ&?e$W&R1mJ;M$9Pl5bn`D;7G54` z-4ouK7zyW%oUIp)@>fqD=xLc){>BZv`t8nLyZYQ#H@rFPdh3i-91@piAQ-^d(>iH3&2nh5`o_Eofgwdd@tyg7VzX}6g)b6I1)+tk$U7@PZV4&PYblFP*N zt+9#k1RZD6^NgXe4Yv#7X_=<2k*KpS<=Nww8&Ah<-~jLu&rm&q>!DR#w9u-@ku8La zeb-yQMfeGc<6SA_<4M9VMjT=Te0u};s~oxovV`t|pfbaZL7^OUpXLw5QZ^P!a*~E; z9#^@cu?0)Ro4xtrteJML^2KgB7t7|{tVa(7CrU=M8%*}6?X1(~I9*-$Yo-&Mwq0jw z)QfvgtgW*LG6$yY>85ra(%luen@a$7$Zoc@KPhP$CYfr(1>Dqd6a#LGT*jErv%h+Zqa3BcITf zn#*lZbY%yN<`Trm$rE)(9zw_v8hZ-JL#U1B+UH?&cS5=NjU95M(f zU``8^(Nc|1Zb&XzFwNxFi%n48KBl>mqx0M2@on1!DR1e*jos1khP9vhjN92c(qmUn zE_Z+79xyNLds%c96m{EqpQd|MQv4P-OXNTvn50|JPC2e?f$bacnq8^q}UDPldz z<#8`^v^+n27?X!>gjYC~h-)}jtkrZ~ZBe0HgH;+MmVcw=4!R&==kK{V=2@jd`UMZD#w=q9;;XQE zU(m98lEJ7GU7oQEBSsSP*qOj%54Z^@HvhEW6=4 zFrF#JC8pN8BrNz@WDU21*k;M+g5yXolR)-C4xoU=Q2Vfetork!7M$KAEX zL}_AK(Q8}l;*vbrdyGACAIpIi2bw*dMIFR}5HEX&6HSK>_b=0zcV~9!=f^KP>OuhI zzHfBYJyc2d?cF-;jPE!SvmjD~e&g93+?UC6jX3D|N9i+4K-*65f(wrAYnz51CwJ*P zt$hb~-q`~)R&Qm(OKco3J6(&s0i@Aii@*qvXoTAQ`sCe>u@Wv&c5d*tx9-cV)i>vx zlbiL`?yd_18x91PLB;FcF)x{2J5hE!`rXk{+7QAq!nyf3AbJFE2ao&u_3{`)-bt82 zEc|Y)GT3yLifRg!#E+y-!C4>tkE|V+`al1_h5d#w|-I6$oi)7>K1p@OQu&ZF4^t#ck+OUt%B607maYm`ZJ}-A8 zL*BM+frI;t>x?Z~knhdO^9}}M8|15J7(M6ecJK!bt7p!kvpfBmnc*R#=UHs}-x0w+y zHR$$)+ugxrB0t%kh8GjC0bJYX^J(ZmTIXR8VaSFxzT=SbM&GGBQ-yaNL71)c}K~ zt!#B%D}U5UrtQ{`6t#?7aTB>kV+A|gyWpe~4klWnn@in#r8A-rwZ=QJ{{fISv{By# z{p})JK%yEnO~i>LamZ)T=GXK?EWBX8(-AAW@zK~)t#?H4jQ0jB-CnsISYSGDS+>kO zzdc!+o-TRiJ%dy2@$&hQ^vp{y!K6L7pTp}e_&zGF3$R3?n5!8$6n#e@hdQ51fS&^= zZk>Qls~tN6hs=Z(w4++n+QfE!Yc{znyvy7c+O~J^iC0YR3QPs=CfDm#Y}oQ?i9wp7 zWZ$si#RkVc*Xi=S2@j+I*8}lB{{65Dls#uez~8VKz@vG-sENf~u*k4Pur=;QFI(0+ zsArQeOywi<^UKGN6uQjS_g<@A)#4?)f|Xdb`Q@>p|AD-fkV-b8g9nPoVBN2+%^h~U z;T$m2$ik))@`dwa7a-$ZFOCNDrEc(rc%W4ogUw(htip1$3)Y`PCwF@r;@c94OgO= zJcrGAp~TTv*KNj&B;IICUW_>O5%nD7%>=B!Km=Fsqa1D6UjQ}3uni+^nZ+t~k$3Q5 zbAF4tDbu=9zxbjqS1%aZm~G~7bfXosJ!+bnj}(jUd}B=^(K)`P%NyR*uD7%m?R?rb zy9QhGWvc{Urya{-FNg`H>=w z8TJP~H2iKkD=jZO<=V_jQ4rw-o(Pp-rRI-UBTI>@38l04td+Wv@sAIZE9M) zscG!~plh|Sa?3{2U9=NHN>l@K$arpf{1pc*X}ZgIfyVa$pe+j@SJ zcftO^qCT^KC_SaGH+IG!EJy8pust-_arCG=HT4PDX>Ng?GuKE&omgVAyVukMknnq# zy~Kg&1m99=^d-Stiy)2ZO6Qq+NPU{B+Lq&2mw(wHbo+|8!F@w&okj( z=GDM6jid|Z6Zc?v&+;0=uSJ#u9tYn*&27l`>V@RO>Dc7j(C)#@`U86|XkJt{ zd*&x6A}gHDI|BosvjVVEZo_Oe=GvWwqy@8e_~-d>S2F~=DR9UJ<{McU8()sU2RWB8 zS617+;kvEh`5lM_WK0fGyezyuM0j;U=U!}dwY}DacfDuEdw0awTl>A3t$SULnKqJZ z4+OoyvAvy3^r>EVr?D!t`+GrH7CC>-+O<(L7xTOvO--UL1sI+MsQ?H$>|poIH{B=% z0}W&Hdf;uj`Ud!^RbhO{o(Ov`?8bG-e!_+QuU=23(W;BLv z@(B!JO{xEzdz;z>&h_$%e4oCkque$g?JGg)@-}(H!`|lbkX{Kb{6r?? zxW%}a?C(w6Zegfcbc)5E)>hbDo1BDf$Zn>we{UpOQS!JC;*1+vd#(B=i8tEHH%r_v z{}w>B>J5m~zB-&<9a7}^ z;p7*nYvbhJ-4$EY($!{XvKLwL)|{DKZH1pdU7Q~&uI?()!Ir_YJLI)ShBIp>%aHTd zYO@MML(>ahj6dG!h2rs6Eg6GVVha{j;ME)}8*_{m;ZP)v+h`Fp47to=8Az{a*lr)p zk^9B{V%#^OdlA*QQlH<3U54@Jv&X2H>=)lIaMo|cZ=~{dUN`de9ilwGAF2AKcOp*f za6DJR(D+2Gd`sN|Gzuq6y3}~GTDN`h7Ft7 zu+6w?x8a5_Tag>kwWAv6$#%hqmR-@&e~i~8~B>&;{$er+b;1dMDk6Yc674q0~E zbwe>Xt$Qsm%D_&8k?Bb5U41Ki(&_XH_yhgGJz317ho@(jP){IM5K4iDx9&6=%@r)Q z!@dm6D@RHlAR+uAOb;fSXu;=#c)yV_mu(o|96Y(Jb#ZvQJ(%7Y9nbDQ+_G(=Y2(t^ z>U7hR>nm11RMb2DwT;7uod~&lXDQ}{6ZB7SpRV$_rUJgFGMc{sSa8qQ(DRoh zEBbJ2PjNIh;7;z0PA?Dc>3SXgI_|o=++eR>y4Q~Ei`r($HF7yHs*v|)U!*hI5$%X< z9$wfF3sXY=&fA!tihw6I-ezu(5Byp5)Jjc%R?eD!~{6XhHtE}tq z`#0rpmbh;l-VcaI-(njh;!R;c|5KFb+*?ThEmZyk5*PPP1b(Z)Iey0Sw^4bd3dhI- z{ls%l9HsHjri`v3R^wq&VE^GRX;9p|I9_XdKckpyUYh}_Y+Dzzo-3~|Dp1q zRB*~u!2Fc?#?c?~xPOYue_AQe{USc!@p*xB-g?xhX)6C2r9AJ)-A%a4XI|$fI`6no zDX;SRvkFf4&;|cLr{K&V?(gRnoa1F4uP-P#*UxhDMFr=2xL-d}aJ8N;JNX ztL49<;5;r|{;LYk<(d9_6kM%el@mVG$n|_pDbMwM9T1JA(U&*MCn5Ou4O!kl6Hfg- z)huyeo|zAiE4U)hoJU*uho|rica`Pjn@V|=58o0v$`$h;C046K93u5Xm8H(!~KLK_x%2HJq5nKHMAX@c*CGPi& z?a~hwoaO3AR32-q(~0`R=W(ZYPlXj+rC*g#)-R^>r%HKMetxFl++QyLa|Ku0 zt^Pv6xqjy7FBP2WVfr6XaJFMy{#OdF=vVdE3eMyB8$h(`Zxx)+>iv%J2OIFZ9e(H> zocZP`xH`TME4U)hrz#4r^5^#o&h-BQ5aAbKUB};J;2p|x{(U08r z<&g4HvmBlp5P04GKT73MyRkguD7U2Vx2X1<&s6icKPJkfU&ixxXnEj&oTr{;bqP`gJNz^{D)3xnlYMi&CEPzfyU%UyT2aaFtF)Ze_l9DPHy*E1y|_gFjK^JJfFq# z<(Ve@d)#ve=S!%Pd|ejkuW%u}vMQ|eJ^3Mn|#L}Ndr z+UUn-3{6G9FWK#n#Ul3Qly+n1E5e^nY)=&IAwHt9I_Qf%VyZ=ImuaV_N-V4e?tj(x4SMeD$t}O4%3iGY5!&ndK zrtZ9=rXfwkS_s5pUe9<{L*E6Evs;-PmT-cwPF+l3F zhW%B1|IA`p-p85#B?`{TT}6rA$#bKEquQo-4GvRyXzF3+hu&cf-83E6t?2ax?-13%_un2$@OedaFuTx zC5~|)jxl;KZDy0iMg9O`4>v0~wafXx8+@cHqg&1{FZjPz;t$b&xA3Vm+Z0@t#qARJ z*SDx&XHfH*4-avCed=xi${(o0PtpV-E0k-AJYIQb2Ym*fgFb8Q_b&JhabBZ_`SuLO z05f|8&i6e~CMgbX@NYbxtjl|q@*HcO2S|D5eE3?vEa0`FB|M8)Y1Inswz!0}f*?WcH|ntFgl|fiqvB{4E#@_>yy6>M8pk zYJ)Of`!p%~d*&M1h95ti0E9=umsiR!BJ}j6EZ^u$>M@*O59@V3c5EzvsZx*XBQH~M z)ka^g;HvCBPr-?&GtUR4F@{#^kvYP7eunnv3M!A*(&rD`RUVrcG~o3)z?BNF+SM1H zgR^~pk%B8R$LVu@Kg)_5uc~vNmniip<2ZAbf(p=V^=v)baJ#o2kF2 z{w2%%y3c%2=Tzh)g^a#jDX-f3SDb@$tn*3*XB)}_ zh;u!Vi$>IQy;5G4xi>1fDid!~@Fx^I_hyMB{isXSE@i}JdiXAzkNZAY#@$3u`OLea z9&P3=vJXo9a$1eQ*skyx+@Q2g^Q6EU(5P?^Eihe$CvB<;hz3bn<>TkIVa&@(Mj?ZaoKQ{`{xFSw>+`b>lD7dNzrxaWngBc2F1U-tL zoj$CTSADb^^Z%``A2WB#@(w_N#K$VHcxD;#i%M(9mK1${5?fQJ+7~{W` z^6Gr=V+yY9b;#WEC=aZwO#gq&@()42Bj69d8vxSsarjBxrm+-r>(eN?>KHWg?k-uE zuOF=UpHOhhLpt+6RL>_BT!|-SE_T*S95b#5N6zOF<<=DQrB5q3>l2OTY1Qwl_Tw|M zJdOdb1>OxvW4}}#_^c=&6?a_9w?9DTKPPau2X#6>ui&aZ`+~%Mo6j=$MTs}s-7iVp zpEG9UTFL||29dJ zU!L%p??MIT+o>1I8Y}bSd*`&R*um4+C~foFBJ<+=3eI!>A7DKV_E(k3|5eJXzUzky z&N&;n{vS!)myI6-;>*TQ;O}8Nr-E^@MYm-5)y)<2*3c>@qz<5@bi9O#2W)XdNqdBF zkjS4j@bnXazcg@77M_0bAbF@@~Yir$~->7?` zYlkD|DsxkLb7Z(Qo}AdJFLw2NZ7pZzGNqIiHCIHz)?gQM4!$!@wWi@(dX}^{&HUHKf-5fpK-p4cI&}& za6S*mGV&07+92n`jy^1Kv}erI-vd&f`2+maW*(8>VH-M1PbZE*dFDy{^wy2C zE{<8auBT*OzTYCdbp}U-+xF-8Ph&00dKBJcuG_h1WO-kfcpUyDa2#v)HxRQyJ%3ip zv(HCbwHfrlexFsH|Et9D9X#NL@C1JoIM%O@&EI8tq^GV6|B$%fuYUs4*e{adJLBiz zym$65z{@j-{7*%^$FlT)h$?#G`#R>uv+$|kH;!8nFH<NZj|CjGGNOjCJkovGe)B{jy|vA*-yoTT54Wqv6m0iM-)=*`X*Cyq;+t%I9(?D#z4P|XJ2>wscp$!W1;@YPFY*wJ^g-x{ zp5v^&*l)x0Escj_ z!0T;`2ckV@S0vXGY>p-^6Yd$hM&2+i*iI`tt#HI;X*?2$PsD;&d$V;P?6$QAy+SZq zD%lmQ*S34Dir2DsG89f~g;+GQYP7>F_N{6OE^N=moV;r}#rzt3DA*rKw6(TQ#&e67 zRw@-K$Euup3g7t*9rHJ#;L2RRmQ-+hSA}hREhTZ^wtpEAVJT{9**3*VwG4h%%fe5s zmXn{c9FlFUwTk+9{)9eqWyZ7tAfNEY*ei%aUnmoHb5Hf1lg8aJK_!c zOYZ`T{>zu)U$VM6IOY&(zNk)H)^Z&lgc*wOW_NQLm+Ktd$j<+O5HO0iD=8-)^aT z+O6QKp7tm>`Q$s70n*rC))%IyS1GT=$hAI+i}9@WV?7Fge7iSr4$l1H`sd4f8hlf2 zP~up>^kuaniTies<#B<6^E{YvnKK&WG~#D%A(X7s83FuBd>io{~7qdR?|q0{lKG^wgIB8+?U=(;QFez)A(D zIR{0Vp^6vYpd})7#*qe{2I&=l(9p85N`!P*2=o@ zJ|OJ7*4AP9+Iop&9D?Wjx$O-K&i!E90@0YHwZ3<#)ixaM7?w|8{dc4e*I(^IMR z_1U)#2K(0cBnmwj8k%dbfT!YOF|#RQ#0zjiIlOi_+7_`2a4)h@SiQ{3FO0yacHGPr zN{|6O?!7c_TJgx`nO%{%1zEP}Zl0Wz-T5ZqTV2=joGP8+qSIAcZ3nVd$QS8DZD&Jy z^dU4pJZ^WsN0x8Yw_S+C9bU|r^(5rW0&fOv(>U9<2RE5zrrWVn_s2T>j~{O>HJfhi z#EA_zeKlFg+U{O2=mvwk+#HxUz6<>gpo<^98s&3AsP8CcIVcS2CPBhggI!z-$L>T**x5;FY~21>RY+e(YA=lXkQ80DVeg#@@sR>AW_m6 ziFlemLG(>|_{JaRt{`2hk>9@ME^H3&)L_o9Cn4ung0m-}Z1Y`kOpqWK1?sG&OX47` zW2N#f#z-LC;#e(-NYj`Bd28Zh`ux6wokx$h<(f10#TOUXeywlZHk(p`p}v*fR_ExH z*V*FEci{eAbDtY;Wm!NS`zqLuJwT5p@21#57ws9`QANDA7s&;BIp;gxO$ATM+L!=3 zVabA09^wV4#B)(=uZ0Y*SHID=y_C@zb0;sjyu4yX)`5&v8#lJ?zALMFZYg>7#VMoL zYR@K1x;yGZvc2YEHvuC-{1bPcnaKb&sG_a`s%3aHsd*kDs#jMe_a6@6s@(V94 z6q;Mjefx$t>r54 z0IhZrl1Kf=_h1k|NcbVd!A9aZ;ajJ=$gmD^1n8nK_;f7|MubiyfT<%zsP}>OwCi)} zR7)yci@fJO_ElH8+qVy1QhD)BBm4Ik+nNnKe#tk^YlS=;=8BkQ4p|mlM(XcqULdCbm~B<_#R5h{-(#N}}x416M&Kh;f#L zc`^2iSAAH#@t)*kfa*op+clFC(xFEaY!uG+zEMy*y=&=Qn=Cb%}Ut|$}bh8Pm8%%iY zA>p(*EzQp1q-Voh4|X2%dIp=bc{|!hf6GLih>IV!2p+Ld6g*PSA^SXKc|R$6fw}l3 zPiq$o9CHOcJ@1Raqe}oO*Di&hTJ19U8G`!_IBs77j)h3BD)R* zs?)O#wwhAxrI%giP1CQJ?JKu6mvZUmXw2vc_jas)jpgNy%;p5-PR@Mg16SlX6*d>1 zmt2&LI>vTLrWg#ajU=Mw{toG)Pr6)y93eF znDFB;z#}lKL^s?CPLRK%{#m>K&cBACTC9c zT=o8rsq-^!0mF`+I6CI7I+X97pDZ>PB4b*hCj&VYV)L69WL8|%_FCt4j)NDNKhhL~ z^R#i@Y>o$;!;3> z_9E=AkQep?F9x7odkKAd6@3nrKgSJ8KHy_eoot6`L_)m|;W z!?^-bUYMrWAP)Y_n>Ph_V^6^=I;aC6@!--hr}(4ZN4$eZGSc#z74zq>D10Na0xcHL;7l|MHGR&Wmh+Uf_z(vYiOT z^x;nLyygqXL%Y9|9?0be>@hpu4F|gygrfzmD;$pKqfy9^1n-V8k8p1mcqHig4jaK+LHiG){_7D3>x}U?z7H9Lou!_J z(E-Z_Tw!$vUet$)Bg%&orxOQ4iBR+2x4*r3|H@=G(v%2Tm8@OX*F~nnlb;;OWCmPK zH{r~?yF47phT5!1Z0%NfvtW|?`v}K|qF-+mbRzvUuM~9RYy|m(^s{We832twW&BAl zFY0-VDDQ&I(VmB>=LUht;r%G8zxLLKdR&V6QFh;kIMv4EBIHWc^L9}W>Wo_djRJQm zMz4?WI|R-#Rvmw*EHC;c>VMb2!QYKI$t~K0@4$G$T2_Nr(nz6|O@%;YMfNUCOg~b3 zB=JEIS}zC(<>64+}RfBdc74Hps&0#OM?$iC*Odq`W5gT>}oFT|dlWk4K=TEex z67AY$zJ2=-> zW#ywv8>(#mmx8ObeoVG4;(o!4|5k9-PJUeAyzfyTgS!OI`*d~u6AG^AM(uxO{SP+C z+$RN&c~0tdmT&n!;9Bid()Ou+`?S)AIzFEfIOl||({#7Mas1W3eOBOSkK5-2j=7!d zG-?#wVzX6zYuj{d|H>0UyAQwjvf_%K;R~<`K$P^1dj5o;=h*Vah=Q`Q?2$J zS-#Q!{Z`;OZmRtMPT(<$`RnyOC~)b=1TP*^aH2=pnui6BHic}2DF1tjvyb;B^$!9! zpZ#qEJ&#EIkp}!xi8tD~#{_Oa`xx6}(eC2{N50Wm3OfI&)T8Ri6A~ACAnJKisYm7i zQv#2Jtf+eMw1Tq@cm@!y_9uZ$TO#WJv%o!&2bQ_NQ2D<~{6S$$82_8V9k3bXe?&ch zM;u})_LKL`vmv)7&R==?zn(^u=JwW&-r~hg=}NFWeB)TocCFm)0|V|`Q^7<~f4$q* zrFXWY4$8IJ+cDzP?f{Dfzi_<>bsyiqYp00KZv`hDu$CY<%+G2ye_rCe^Dchyx&52-iQP@lBNsn}hbrsk6{(*GV{)uD= z-~TwR{r!vZ|3e(+@*a%&W3cbj0<$yZL+`vH;04TkDht&Fx14QMQmf<|B_{n?-+E=} zz;;M!=ep}*<01;r8X~RkJCZ{~rqLPfZh6O00v--XeA_hxo)v0KMzfF{TTdqgUP@0U zhG9{6jT;F<()X3|Lw95L~B_rz@O2 z1D2M7=a@x0y))njPFx&3aw7ElfpS@Q^383L!^t+IoS)tlTDl^*?R}e~v8%!x>ciW$3gAtFZ-iA=lMiTq9av=WutY!k9q$OZLbHlXxDBb$x;B<+y*xd+z9 z@YS2T3}P6Mf235Ptl%G9f08%CU;&NC#X9C(eDSvY=x9?GSRH!Ld#>4jtTHvVZSpPn z<0`zA9RHjJN!<2Yb`Pu<2O}N$_hCpGHUfXv#ckb=Bf%k>FXR3ozR$$j=B8kcM^ILw z7afo?nk>_V`8jCvWgMyJZyCQ1e*}!ac5i4%cN4)( z^gZu6S~kjGib1Z?^~ItPb^?DDahU|g&7rS*69x%%qdcbK4r<}BHxj?$?E36&O zh5^uKBiJRtrJtIO60Rc-7Jy^xZ-OOA(XGYB*h{ukY^y*bLDjIMh?9g;m*id@?-77W zs8njTn{K@ECTD+VrTMVdSHAREp{GZ8I)bhnJ#}gkq$A&+aAK8jZm@MnUuDC4il!4x zS)-8i7Z$X=mPiKD?RuM|W;{nU^ST-K1$&{*#*k#_3-8_3aYNwJ*UXw!p2Qn$2iknp zN49p@Kfebfl@yr@GH5UJqIOR(l?;u$PODdZN8U?1t@nM4NqcW-{Qc>JZ}@^hPAU-dUnojeV@7V75dtp z-+u3Fi(QdQAru<#j`g%z+fuGQAbCN1ueYG*(`Fsn9{QU5p*7BN%O|sF2M`2M2wy`! z`z>DlraL^(9$4X-srF!pH(l@`E$zjLOq&M};Iz9%$LP;qW5&Q(>IZvKE231N@^-VHR6W}q)|BF4Z+i5FV-LGzMvs%kba;cVF@fu-zvKub+7>R{}$vEeKFf$Y*pEfLwyuED$s(+HZRQOTiV07 zczd_IjvM!0)#|jC4RV2IxXM& zOWE`;H=K7#Zi5}!=WovBbXd5JM7r}qB~8>x_h>(KoNykal~I zQ_eD!m3t^w#C-G|C*o7KaIgVij-dB;K~{&yVCkGz^+$HQ={~dPcw5=%EUom~hV}Wa zQ=U}}LsV5sn)g5|c&FG^NhFg4i>H@)uDy8Ts&F8X2<70}H;$hxV`}JL+-S0|3UNd;;yD6KC2E68IsL~dH=fs42$$Yna|3-Mo z$~ATz3&&ukJ{pdo^B~(I&RNVti@;m3Y=mR1L3_)DXtQ02!#o1*Kdwm?AhR&qT)a*J z3$NnoH(rVLUxD=pWK1lmS4PA;>0_lI1`en4$#^=KbRsQoD4Q=#bVbHWroO&;MZ_`A z|Jmk5wz&lc4HC#Sbp%@Ho87H})%UpZ0%SRN3@4+N^N!}gsUjC+Z#{d`9SH|pl3LMl zrb-=gcugJkH!x2F{l)Xr!|)!ZMFzTMUKn`(6zq%P{Gf3NK6DbrnTn3ff*4E6N%T|U33XTghixHcS~a{An{VWZj8y3Q+nJvao( z+dTn%Wj2e;&(sL&LbCT)PZA28AS3ttE>MTF*Mz0B}ZqK zYdzmP?>z5(v(G!?4GzMOzTi(*CDZskqt%(U2KChuc)`;pfDGdiWJ3+5F4AdtsK~iTS}aWcb(w=M49d9RMC; zDk)|BQC!j0z$`QY(*ihPh&iBv^@7dYh7>_z&7FC;^ao# zbxS4J9gC;q346P-V3XJUrubFy7PGm$c_2Aq+i+?Sey3w$I~2ROC1K^Fxx59Z-K|U8 ztbTLAwx>^ymtyThCtbH1YSHbXAv>6eL?dnVYeU=(I}p=~F`@IJf|m=42La&0!}A^h zS&zc&)APnk*du(k7DOm9{LLFWytbxKcsJZ|+18QR=*Y1XyWndagX4LF1ikqR8bbPu zOrTg5&kKN!ff_(EOV-}yA1o9OI!p9HXYo{E??+Y#)~ALG)Fb2+Xq*vP?hA!AN+3K}#T2k(}lWxlHhDWrE801UZ;NJM` zC;-|ltQtuC&-m`9z(L0){-}b3hm!bH3O+9J2VpK#uV(^rw7w9ZU=I4oJOjopPu^e1 z?=Xt;aQ*NGJl=(OLC{Bx!2-$`+?#KXx+mNvUem$Yp62$hPHW?vD$|Sfk*NcdeVMK! z+jk!8=p2I+vAr47v(Si&emfjAQQ z3u_Y8tFmR>J#`>ulQy8?a6la=ayr<5tpG+23aLk6perQY7)eidbYj~><){=0>OKuw+9eV7myj9*_Z;!X~o3GjT{GB^5hmJJCTGL}3 zmvDL10^u4xm>f{N&8Lf~3asb_-tps;t~(h^m*a4J(TomN?9J}@p+ol-+#M^Am_sc= zJqOb=IIA(bW7!T|`ha$D4vcHbxB>%K7pLO%&XnIAM{YMl@~8d zBvzPP^p)nO#Q4#*G50utHulE(NjU5^m7M&V zQ;K@V+E>Ic+xx0l;h15c=zQBOjQc$815Mafz;SQ%A&T{$kNE5rh(mjLF85Jb$I-z% zHBbkBN%*NQpmLS>#d|)Uv6FXK#>Oh+X?T&f+bC8rpo6;c?9T6~?iTINM5uAhc+ zFV9{{_zU4DmUo_g5^$807ZLtqiR1hVoDcAD{pdIVs@-LO; zF|I}YWmFG-%H?s53vp~wqn9WU$Gsf7hdcXnDv#9q<>^j_sQ(p+1JBx_zrTWh>GXOk zOEirrOj7axVsyK`aro~eA#Vk+&zt-B;;ma3Z_KUVyLZF!2-Tk_y}&s8l~AuX`zov+ z=*h$R9d4KLR|_2H%MTNuarCs=*9aWXi9B5I*X(O0F3#I?e`l|jxX&NrTlMP#&qF=G zq58SqYn1X&Dtx|H;y#_s|Njtp5$gFPo{OD*9U$85>t%VL|6KkJ0>}MIo`+mV<*!%D zKT~hF`o#uZ%1QOR3jSv-U;Po)Qy+J~e(vu*qCESxI{)7&>%lcV*r(=kuYN<~xUYuw zf2W~-UOUBlxW8|b^`p&2{LNGzxyo|&6yPX_OwUgQ-U@ufHO%rX^WiPBJl2EdZvdn& z|G3up4C&Wf34fa?UtbgBdftvW%pZzEPcf74AZR<7Jh9LW%UX%y`tzV8!x)9)+LSNL zDAgyE;q5WlS4o9hnl8HqUXY6iolr~QKl@D^7b9D|is!w^>$)!#pGw31kyzK}?L}BX zwU=C(rw812Ev!t(7FU22lJUpEmttRU1VAGVKpb_E_XOTSIQD>fhU*zP=A^r`@02+1 zX=6Ri%fCvzfycA&5_lTwe+cIyw;{K**>?-Pz8}IodylLKZ4AzBss7oUB#!j>czO1{ zRNMQARy?!FYY8_K`hM{p>)9uSUjHZIe&0}jeocM2r2)tDcWlR~ZJA>p&z(_jfY}dF zd0(!QfYTkq*;^4mvlV{&ykq;uJo=@?AD;JnlB?UWJaLxG^SNW6r%%iBKK;y#+a>-d z;Dwau**gS|K8ME=`B0uc1wXZ0|4B6QnQG+UY5eRqq)D5-Q_zd&IO_GCfzObx`WRKI zG-?~-9^Bhe{mhKO(Js9rjqNe_>%S3)`MNJ(ya(6?79@e|6%ZSNDdDXPFin*FTAg=~s;KPPb9$6}xHc|cSh z#@MK?6JJp3;dqbvcP?Bc6}RnFX7k=e|+hFh_Lrx6Sxlitm{^J7GoD} z7Cbb_gaPNgSk95A^6WS1vv1L7cxIV(2Blw{{Wko>?-XD>$>)l3zE9x(J2U?H-!Jjs zgFgU%)NTbt9UokKMLzL3V1$76+tL=WJo>Q;^5Y5e-Hd-vl*hA*s&0Q@)+6>6XZiur zNXqJblCjF{4@7x+MsoIlsl0D1QJ;7`S+{>E$|KHuG)zB6P*^{nc_euh{Q0rK*|uYB z&-DL9;CN1e=8UsH1*AOtGx({^{#@_^<0m*PBEItr@f~cN^5Qe^WL|uxwJ!6%--=3} zK0vkqN~wo+hx_nrfuk<-y7+IX{BH%0{zR1*kQAWxcSI|%W!ClQLGc}a2d+-jLjp&B zuswR1YC*1`&BR#v5$H4TN)K?<#p^na5f|JH9icxW=0dZY7``wOI`;05e)MB-88j2j zX)S?|4(6`8=9<0U0{1%48~Scbe5+v@D{{?Vv(fuT$R1X-tV6j>kG&)f&BOTNnPVDn zF@C>CvPdp5HwpHS$L|jU$MbkRMvnlZ%|0q{hj?D^_hSObv(BW~T+gYxea3q5d;rVY z;|=BO?fy~Vd^Q?zJ{3LtglxCLH=b@0INC|_QKDZ@3LMW3vJ9|YdP=E>a&im(tj9EX zb`$AgnR!N*e+u}9^3C|4B#!6)>gE3|ah%io@t`*Q7lET5lD!ag{#D@U+u431hqc+i z$$A>;!N>*23-yZWWWD+aee0j}nE`%Z)zN<`b*aAd{{)V*$~K0^e&!WQdETp_KF?gL z;Hq9dD{(wiUY7~9>_{uxR7K|I5N4SZHj;TU*CcS%b7dYs7ZA9=J|pHsbInS5rQNyU z+2uw3zO3XLZTy@j$|D~X9heI#^(g$D3(Ize4W5et(&!5xCq58A=c2Oy$Av61jv)>5 z0sE`i_?g$p@~AUt%ej0^;JWl(B-3+-Ebqq(T;3Eo-iJ}<>vM65V|nQ-<}887LARNn z2LRFLY*`-15$yGxgE(nIoqjq0oJ zJ&DUFl=AGmxc;OpFXqi++*1OV^Lv4#NklsFjGH>X8G+074^h4zpFatMPpv{$fH`gX`^k>AM zxpqMQ?R;U**HiRmYCR=cKk8{+PC5mSb2hSBf&xw0bbby_Rp zJB@y+Jl9R%=@H+-J+u0Edc}88u2p*b1YSSm$nw%J%VW$Z<#Z0bFV&BBMYT`!1&;G} zj)8a_24y|yQ|k2$$$A7o<`w`_j|I_(QhD}ea|=azzRv=Dni~eBJhuqHH8&#qjAJ4F z&D^N?4#tTbS1?Uu5`Pfd0RK9-7;7QUvu@&gF7R${3E?Pdh;!TEw`lCjbL05w+=So< z+8yYhpm(YG4xay4{Kwp+#6`bnAD~*M1deOTe@EXaDrxsDEx1mYg^hVOFa>Eu2t$$ z{Nmg?fy?#1x%GgQ=QhAk8f~BzZI!B{8^w3R%qOKiEUCNwrZl}OG4z7>SE`g)mQ~o@`zugM1 z%HAHt;p`xme;ni`4rgMz;H8#fIy(q^6|f2b8x~Vda7vr@Qq+Ho^Pf-(b~MDg0qksu zwQ`JgFE-2sTnmY%jg;pE%$FEesxQ`SWQ|P13E0(mb1WXa6fzOSjic@-U}JpDb#HPf zJ`cwrGgdaC+j?82Eo??zGjA0<`e(Zy4yL@YX9ZJk*j+V0Ul{CMxoC5EHE14;9mJ{dv!VwO8hZlOSoT$WIb5FYuSFevixYXkXBVooFbJx|KJ@mq73&=}*Im1^tNnD#F;KOtVsJSE!}xdcTUmkAuljPkk7U5>R&{bb(i8yGr0^twqeeRNywOOVgUx+{*x|%LU3i#RqdQ zN1R&0`ZGRGE12cESKy~}5H-SQe5V5YhPJ*u_bU1fO2B8xa~iw3S0k$MT#TvkKlS(- z&$ie3_geTC)`N3-RR*pWINC!MzeeB*z{wU1dAb&GZSFs)F6Oz^mATi6?_g{~cRh(p zZSM5~Xa5cTt9e)pjTF*^exvRme1H4~*#`Rp@_+I>$Pdy-(Z=<%4LnzZ@yX5D#@rhP z&Ubd8Z86?&lI2l8>gC@o@VXp40EjmCmWJ|m`MW{jICiAJb8iKtEJovPq7RP)4`D27 zVXRB`0nflcPHRAq;&-Y6{B-W^^c}W~xIV=8=|=brd3Cmqy+h!9&#~UWcM6=>XzKCW zy9AE9$McW}0MX{&EpTZ+L=WDBIPAcq-u(smlmQR7eBSgt@Vc<#jl1G-)Gky3pM^*E z@DH3ugsWPxPfuq;5>PGk-*EP?b zX@2#)O2Y@UEk$d(e-cjOTDi&oX{)m(tsBK~d#7IL%7$`_oBNv=d1kV`EzNiEn7?ve zZtf<*7q)q*Pc$Af4=&=o){WAy&AnHa7yCwY??arvh2!`C7<&`IxT|V^yvfXbXWzcx z?<`3sdooFyG-;A1X}a$l-6*sLTJ}{y*%hA;aNlr$Dk4Y=O_~;(nGwVVQ9%$9(SrLf z$`jlbT%XJHe?I5j@0~lLzTdx^w0!2yx#ym9?z!h~=T`gpGh7~4>giSdj@a$(8b`d1 zapxl_uWhG^>NWf89lCtYn*Xr_3Wr{0e*X;U96P9RSxZ45{yyV(Djah7z0oi3Qn=)K zfc-zihhMhWJE z5ns?wT28dNCE^59^YcAD`4N8C4)T$Cndoa;$wAJ$Rr}##g(IJq==T{ytYb3@hfg&1 zenjKmx`@y}s_@_(UwJoEyN7KEa}KkPV+O51L6^s7QCiy&%9}P+Qsr@mh4=iAm6>|Q zpd)K3!qZ0;uE%%fTkkc>^FH;l`S3qf=hB~6IOaj-{NX``BM#+z=rW!h z_TmTFwdkMea5gOTV~nG+Px%bf|BRvo8JX)WpH(>OHFfqmg-dJ%e)00*?&aDND#c@u@uy#`wK0~qSC4## zF~X45vBwoXocrZA9{UngdP3pwJ-mh?`CqxEkRfnhdpP!GD(Ok!Nv=Odv?QJvxqL;@ zLcgfiQ9MMWD7EOT^xHSDiRQk)r1RxrI!D$F4}^?HbfkmlWpn?v(Xn$)bTPZou*XSf z8q%3`W9~F3?KT3-KN_6q9U6@-9a%UY9Pb@m6kRehG(p(lXmrWKg>)WjlInV5-siZk z6V`MY-S=+JWHRk^J>Sk2oQ&Jr__^TH`STaV7A+tTI9BW%h>Z>m65m)C`Tg$eBt_2K1Fj@`Jm( z`@;*mENf9)ymS8c@IWVtm~@6*jV%8|urBM^ar%w8Ax`s0>cfs&mtY#)D6sdFk^nJN+>y z6wFd8%Vjw{*i+2w(_odyW|iCH*w+~UI&hLA#!k#FTIj@j zk+K^MQpSKKXa^aP$0|3*7|!Uf1u>5~JuV>NZ$1=2m)Rlf?i<~>)6lf@;#0fGgo4%t*|?IjQEsDLi+hQGx@88v%U_7b@Sili z66?6!*g2Y;7zH>wMgwtfR9{A;u#LVnL}#+;uO2c*{x51668i;vUTf!@oJ96qJJV=W zcFL=reBOz>b)Wf+?N|%?0@<#?u4u5OIgr~hvN!3}Cjxb8zti@r_Grf$^mDPjz_%o{ zoqzW`sc6?3`1N!!V@DFPmZ0lIlCgL)NLRp<@s^E=STq`r$HTEmtiL&tJt^<+JBO~Z z;eWBsbQ>(Rn}1IPqjY5qzi`$yNoOu!nD;RCDz-(>(i*;c)+Il^X#c~`-Ht=UD$c~d zz%g1=Y?UUGN0zujriI~yHmBPBu` zTMGMvzkOleLu7Z~AU#=kam-CVqnr78O!abaLzL>km7QPTcktjRpLE~xj>nt@rw%&b zeBB`1D#pG)QX7iLz6n~#z6I4&FT?!uIXYJlkC7q1=TJi%#yX!pcH3>`N8C5Rx#eMZ z_Hjz!;Mg~Aa!x;arO-(I>(AuJzd$sy%5&)6m{aZodRG6;1sk6}=i;ASbmpD0WU49d zM)SGUValJ0e-0+U;2d?Fqx-w^$%UH(BZaQy67|nj}( zU238lR@6;!7lU&^(tsdOBWRjI4Z#Q8otTr(uO=)?Y7mLHch_}M-F2_nSL_b-E(-N@ z_|LRX-Q(`w>%VkQ`_kyfp8U4RlExih-eTngxkPf+8Yda=nD4jeN0P~y6B>GRE}cxK zb9OG`rn@@mUE{3CMR+|c##T=X3Ku=Z6m^LIC%6C6O6LNX*M;*9zQ%}E zzaY3cI2dTYXn%Kipl>YH*X274Jnuc-cj;-JOQIW#`R$RVjVFI9n;mPXgvY7Q6`^!! zK{nkNqq~T9c<@FyO*gt+J0Ee2REmOvI*p zM)+^)W^C_ROU2yf+r*1?>^oqI#|jVsF5}+=PP}%|Sn+!rr@6nuPBV1Io$fdCI4!5# zsY7&p)P1wNyr<3Y_ql;caOdX2hd=V@6^YXmA8CTF zJbEK5>xdp-EXJ)8BAEZA`vzxZygox&WrBtC7UbPGOg(&cY6qR?tf!1UbpJYjbNe#t zr(Lwx1HS>E3QIK(;P=q=OR541NJkeZmTb1`T`Lvcxh@(nQ8znto8^l&1Uth)zm@#> zRq>NoP|VWk z&zgs?j&7rq5UJ+y{A4tCWcBLRH0O%aodMi$NUHIQ;}9rX9bzA+RLKVK%sQ@LLE_(! zopj;-_ctf=moAJAPLf0dvGCeu_6OYs3swz2VTbD+r*-XQVr+76-7W2u95+SdgB4C( zx?xdAM+c4f*k^o^?$0?i+V}Bo`l_U~&_zzTW6O#0Y5phXS6vGq>pU1v<>PgZKUr)^ zob60be(~}!rTfkY{dGN|jzmka^%7^9<1AZt-kDZiurt_`uu>1dBEDn!_O(SiXzL7* z^u#;+&bc_9zIfdT$s|VS$Ps@JQqJvh8NJ~|@I!K;A9yrKh%8PEA30ljaw<0{gQGp2 zIF`~l>Mo~@N^4d%b;r71nd+aPqHE!S%&uatJ>Ju>YW3*G<;&COWhS%deKJRXD0gXd zI@36q4+QE$PN*pwiEhr=b_?BVZQ9t--$>>jptD6dGa>g5+bEyx04$8ysb)=`7|T)J z=(of)v)n_*3j;=^@$-!h`AB`nm+o$&RM3mA>%I0BU4_Q}Tz5}Hy0i0<%eF+K9adjD zn0(M#zy2QkxIKT@uKD*2r5AEP{WaB1`)$W0rv3r<#~_W9zaspLlt&^%x3usIJ#r(Q zK%a7V&r&v(tV6b2xzPu9%{<%-txS$=$k&u@O`hQ_TC}(>;uNB!<`mtj-{*{teg4^J zcc$7F#QVy7pH-P{(ax3a;GfR#FX*+3!HYSrOCef3uAEc)*=oM^luZO3!b2B%Tw zU&ehI@;P_)Q7f!tKjgMpGza(%&F>!Pwlt6xhz)rCKwBoYWNAG{8Fh)>kpCE&2gzGT z<MV7{)=ev#?mK_kGI!}xzti24=uQ zJ3qSrEtfJ!yWa7R%WmxSy9qbk1wnc5fIQ9ZBmxwq{+qVG^5TnPnfOH)Z*R{A8WXsg zvi&xvCD7?~>}S&JZn)w6R|-wc=drIuRd_KVuWQmgOg-uWX7M8~EWJ79#%_E|<05xc zQ$wIRw8$NGQ*OMsd1a~7YIZ11*e=ebvgGQk&)n;#TR8@n0JF z^DLuZF^<&?p|93ll#G6(ah$QN%I>!s_tp@8M@W@V$W+!~nV-9+RC(A2=LA%I{$A5j zdnQuv5sy#V)1-Ru!Rl_6K6KA#K99Y?_%n(Qa9-bHYp{;JsBl?lL0l!e|AWGDCyMtI zj{T7k>)4-kd5?~i|1)rkXRtRQZ+4Kc@X)JYTUSSY-6@CL{*VaJE$!`W*z;70E;CiI#TD4q%Biz z^eOBZcVCb%5^;pYt`f6ySEF&5x_6G!8q{V_62CE;xiNBHkF$(2%rA9{`@?JY+KZMq zHu+nEi`@zLB=_mO-PxPX_IBDdGL9}|X1jLpUc0A(!aCtet+6Tj{uL}y8}u6CvHu~U z+6HMG>`CnPZ>l`(oA#?lzG=@y`>>af#bY7nyqbm)p~G zpL?JCSxUvy5*l;I+|BOsJT6Q-t*tFBt*y?I!9w%U$YK^}`>tIpPtNDLkN=GNtnO>G z^ej9H8EAaIKJAT!+YM|Q`>^Ol`> zgz=nqb=pHdlEi_iB||s9uM>KMR_*p9j%tcNa~%5L~A0k-G+|Dmpw(R zVsiJLD#Y>}#Z6dSfiwQUy*71#9C`HLJ&(5!knPGQ*Z%@z8 zWy?NoZ(BVQ8(wyLBACf%v)OdfS;Q)8-n41icBe==Gg%+9CXYP=wz1iek|TT&_Hxk= zn@nqhoW?M62%j`@^zt|SJHK(Az0mFKytS>3lD-VBS-5cA-MO*g1ai?acf?u0!+pAu zV&&dmhkg^I?F$;SBe**kY1+Jb$<}O>tb2eTUjLpA6NlDp1bm*ro@i}{ajc{Bda<&b zm@e=6dbYFKxWRK)^sK{>B4i7{QOyIw9kF z?3zUkSRK3I%Xq&-$%|rCMMs_WR&>e=ulhuhFE6dI96dc@;i7mHzRa40Jt++dhh+ zb^F+_N&AkiQaJjx_@fp=tl3tDgFcVtO5SY-F7_jOXg6@Pe22n?KJD2YeTf*gb%i6do@qIC!~0yNJHV+6QXv^&gar-J!n=&2BWd3(|$!u z*@3Eq=FXZH+vY6Onx!~`akN{;S+PO#EQ(I8{1CdxSc1GT$9eU9E$3xopNCOGeq?Q! z#*P!k*J=sDTUet}MJDZ;U{;kMTSSZP)ce=k!y|PAgT9I7?f|{^c-E$U%@kinHoEKG z)3-$8cC>SWzpuY;WHk6j`crOgY0K9)#=1I2?BnrdED=lQlK$ul+5o{AWcBv8E{IN8 zF-m`m&#sMjMBkFgr4ueaUKEO?8h4)M>6*_?iR_MDizX{uGHhmcp~9gbu}hZeVU9U; z`Kmt|Hp+`X;qv?{wx?%a8x-9f^~D({F6W=f9`Cxbh7R~)yA%1`4GZ`9=et3|zdk1dzbfsL{ye72gN}?_f{!a4 z{)NxY&rT3x%`R3rNWcx?}JObzvCjbJk&;lRG_M z;9UsvyqH~>-!b!o7ruDfg%`RPU%c;dCZ2Yko1AziW`DuCfL;J}E{FyDnxh@f&0XOx za=rEBA8=Rb>lBNSXVv}Aq)q(`Q*oq6Tjhjq-MVojC7ZjtdH0%>n{3;?`s;zL)8`D) zPMfo)uh~s?Ts|~J_KWjVf1ovu;!zpLmqSj}4!jS5y);^_rQJ)^DDj!DQKtPA2O%P( zI!|g!6|T+Zmkuvq?ym8zjE?(OtQfjJzUJxHcw5x!b0(eBPoM0vTNcp2woa1z&?e-g zI!+N5`7_>C)Z0u|>PA~7?xOlK^n{fYj&@U`wZOvkg22Ls0|%Yt$k51$+tt<8Hcc0a z=~cT4XK69sG2%=tvpVTN&OV!dQQMI3L~IN>n5bT&r?kZJFaE7-!h{Qppc9=PyWKr| zE*VbroO1ESq_k59GXt0IUb7^*{}Z&$mv>s7MrU}KeziLJEg1Yrw%9k}d&sjZ2(V^X z(r>KS^i%!M(z!UYSl&3~#=>3F?#W8*Oi%QDs*uP<*KD^2`nFmyFt zj_R~?MLLsj^ru4Pp|g$jW~ztZJM-wHGha#_w3ZelwtrE89;Ht=pA`SubtG z5;)qY+Nk&VYTN7#Qcyk^qhyV-UfP|unoo7zq;0#&NWe$u%hQc5z2UxwRCv6;Kaq42 z9r3=_A6PAeZg&=P8Ak-JGxsEq%dF$z<=j z=k?g3XfoXvONE_yJQt$lVBvH)=43;S$#|qInMy6VEReJM^TBw)ZLsWkDwPk>bH#y% zo(w&s8?{n)Q#kFk1qvz4wFVj@)m3|;j{O%ClO+CEwFFYE9JM&!Evqu{A>e0^*MtMWKm?qn%!>Tzvc46=MIgF?7VjE zG;p*0$r{JppehG1rUsv;98NLHGe1ghr)nH;a#ZQ;)_5(QJqFJ8s&?(2i!1u4DID^b zIil$Cbfdh;Q{-@lfwMdn{e2pjbr(-Q`!x=~QHSX^=?R{6P3m-p5fq~2E=xY@2(X}ng>*K1te zk^ET3GMP9|r zajHft3O_jLpx-B&NYN20HFv_`jJ*oXrE>J+{XNm>zZw&DA z(i-}+bLW~p!^6X`8X4IzHnxF(zxvG4*vRN5;b4%mV>cz6;=AYp%DPa9HnT6GIo14l zZ!8vTipAE`I~nuohy6a@+_bZIYFuI-&(7YZab?Gf{<}3^Yp?Iocx``vuf~;}6`l7PIIkNpUOe_i!mZi= zQo670>+jd!srA7hFmT?>Qhnuv8drC&RNc2|9JW&JTOTrT)8=l~xEd=IoeyhV%}*76 zo5pMTyxqWg3{>SmqH#6WDf|wN*V5q_Tg4`_4kW(epiy4hbtfUk*}Les1(~StROM~W z9@5{b)#sGPYwdd4z)d?ntZ{WNTD4(D7{&c^_e?IT; z2A?0-xVHu;qJvHT!8)OSsfadnUt0#vh!E&wd6te_Ex3HRjK9c~Gmxg}xV` zOT8#B_(L`2AJh25{|5hj4Nhwtiq0dzNp854@&cXv$za|nb6%PA^FeVE;bwP>J3j7i zSsWc&vgFBAPd(Ln&1-fH+I?#r`hIo&0DD7f{eZ--)(tRs#@HMmcK5r({A>OG{kM&3=J?L%z7@@&`I+Qk;E^aro^jPWn^$<2Cpr8vjxa z4t+d9h&59WoaW$IPsUzAeqI}$E2>#Z@snq^W(|+?_iw80}3Z zHl7^FreTZn@-PY=SEsfW zdwy1bNpuN4e_~sW4eR5({d@ebzpF7D&o%s)9hz9*A6T+=jpbPD)~uwooeqU`s8h~V zfR`r;ux7u4Do=oa6*$Qj>%7o8UdfVs0i^dHIwha!6t?(CSx@zO8R`r;3P*3AyoH{9 zT)isTOh*}=`fxN|jJ)l^SjY*+?z-|y>%t4KslUnpk&zK++p0FJ$z6BW`a~+4O6+x- zovh=!us82q2;@MXr?y_4lQpZ=XOZn2>a%qxZSl88NHn3m+iTtU(R7^NGP(WI1*5*P zHU8ngDSBOHa_>-Z)%ol3d`dEMhO>$mUqYGSTDi-CdlSc5{#XtDf7T7_LX*eiZ$jOh z>)XSYKNF&d!ToRfq!V|d?g!2~%Xi_0SNg8^Z@PKiI%mnU`Ju^;8+K*rRmY6a+2gdj zxh&te)Ay%lkCXhZ*{7fe(huHtkvXN{PXj04Rv`U6OJ~^0Q(^5{ozotnNEx{P!k4c;^>R>f6{sCleFHJG#}H;BV>slBdNuxUZUAbA8fFGo9`C-4eKmsv7f;MT7p?`1=kdfB3`4 zRyQwdq+@!~!rG=|)MVV(m3Yy68FI|?OUmucX^FTX)S(6fx`@;nq;&hi#^r7wy#ThU zK9S7R@!LTCs5=l@8<~tu2FI44+~*dT^pQj8uD`!Pf7W*_YV^_R!{%MP)+OE8=%!Zu zIhAHp9n|g&@g#c`-{5wC6YVBk?kHnC`xfKh22N)pDuC)cnDHaM_@rDz(5pgc%&6!2(tl95_ zHP!Y%pp6H3zQ>)5rR} zlovX-QJ(JuPIcClhadbU_&o9x#yy$KUJl}bA2R+UMMrd0wX+{99J>B3>r~|MjDe#+ zdh$Uno=$NtTIqD^WQEK9kZQd@RXD~9S#Num5Nj5#_UQ0gCz0pW2Y{2^Bkubxo!`&% z`T5Ct^H$ce(}D}q7fvQ%8Wc{T&%X2n>L=uy1z(hu1Rbbxc! zUf=y0nm{=A>0V^nJx73bbeX~-Yndyttfze%hb_{byxHeb-mnSP55=~QzDk!z&L{LM z(b>-x4%zX08?(P)I;b7|z_vKggQ9~-L~z(B_!m0AR5*0@BJ229gcN6gO~0*K@&!bz z`WevTEJ|3jzt!~kuC=1~JNnG4-)Q&j?-dT4Vf^ktGL;t$T-x^{)-wCi0ZHwWnOUY^ag#kPGoLGt^w1!tpm4lV@HXYKUXgYKi2W7Kg4v#gcJ* z5d8iGQUkbj=rvN(6=l$zWlMq$O8Hk zNv7%h>2$+jAf0ZryX{PNerF+>>$ckpv3z!MW~3?L2I5TJIm7T*#{Wm*s2A@ODf;?s1NLX7 zyx8);RC)N5KN`0GH-%%*o$oatUcmHWA7VGS*9;r~dkrqRJLt^WEc0{cX{tQdeP6&? zw7YNO^8Zjc=yPrcWqJPuPBBjh-B0@dya&|V8hY<`th0E(J3W2NEq6Zfc+y$pkbA~^ zgD+A)`7)JFi?z^n85Tm5XYw||Go0A9ZHvG6j^uxY-kiE5_ho;Z^KQCrldfO2imD>n z;#|6%p@x^UX8)Id!w!+-73X~M_9%@qm{$^6BJBO}HCWnDh5LG?yURU#^v*kHcCVxR zurc>;J^=94t`8*eBA2r%PbnSpkzji^+UUto;s~(TC)& z2ToO@jWhw09Z}2`f;m}f9+M>k^LJGkI~@NNxh1clOB`(t2|9b%pB%8Gb?uozW4vzR zipVB9m9sc9-XAH9gvJ_ozbEtx>p#O6hM)F_?P1%W&Zim^cA}pSS`Jysae9%ZHPV)H z?6!DgDxGMI*mzjmP9^J8Daa4DjB_GQv{t?z@SMFBl}Fu=(eeH?{h`Oa)!)W{%{cT-+=U?$ zFX9xiX_ZjYEAxBw6;-!cCa%gzz6*N8$EeFH(FBnA!1*#hS5rz-X{$uapg%Fr z=YZHlUWT0{oouH2)2GjS`MewEy?)+XJq;->k*qO9lX;suqkm(%JweAqa6-iUfxq?o z1gD`x$3H@(v;471fBX5Qp*)#s1r2LqkaDI2~6pWJvX%44R)bmH>CZAKr%dk zemDK;e|aF54#!(3IS_x-*=KLtv}xO-;o(#|y=kHC)Q|eoiTcg9_4Fj|fh1z#U@8$$#OP;<70VR-(Xn{Ek@iXA z@z-ulB$A1>6N#o+!ln1PQ~vx!G@9(88{UCXOFZhtB55lc3#6j4R4f#VS#e7ElOVe< z(EYb(Xe|nFbh1Z+e~?o`@_RNuxI20}g%Jgc{0@-vy&akh4FMclblSZ zUD6}YadAvrA}XXujv@JtU*vE6D%BLG`Fbbaj~QaWr#ulH!`#(E7A~Jd@i%+0`Oxn)Iidi~*3SgB? z1SUZ2^94nk8(?9Hj7-inOpKYbdu#aY{$RR4w6uL`Xys5~yB&V-KI_Jj(C~)Hx}F;v z>}=gV@kP5Ld)CAzE{R$zVJk*_#eG#L}_!NN;f;5J43hUxo@>=c8r*H|O@(Bw{3q`g{;RkMSXHCxJ-*1eZ)tMT;KksDg#)8q} zX+hsaa!=%}_{i4S&dJ2$-Ld_v6U(lOUiWm??zATdyQ9U9lbn>DTHl!(N~Xei*|{O% zkZ_Apo4T{CRmi%)u-bEEUn=V};{MIwwTEMRAXoeti#O<-!fX5{n(l7f>dPfkc}gx7 zN#zP5TFS6cfLJAO&K4z~ z&;IcqcxBbEl-=_BOR0(RLJb|z7djLRFrRW3jOIwC7B27Ai?KucEqbg~YE|X2xAIrq zO)a$n=T;+r872H)vbg}CNMzH8e#Fzh%V}GYSh~{x_5B;`Ez04DID6(htz*Pni)WPHVf!7jXmHG@^ z+5p5l@JfZtz6Y&esW!aKz$Gq_Hk@VP20x|w25z)@_QwX!`{hce{WZ9*cj`)oN60og z2b)M|>Rh8dpM6z)e#F2{oq0Nd9C$u1bPl{*mB*MOXL?1>59oT;UaHaxqJ7U+_^hwu zf6%}U`OH+~e6??;=+MZd^}_m6?W)$R@*pcdF`Mw}HEeF`iv})q77}7HS6+ET{-t4~ zydk%PJcg=1!)sZpT_Z+$quvsYQks9!Bim1Dkx|~PckIOY%zF)-?PmrSSj#`(6P>yI zCAcBygBK|})&3&`gn=9FI_Sv@qn(HbXqDh|80sOYc4|?k!b7iqomzQ;f zB6|U=v`XQqm)EckUQ39@wR^sUbA3v^)9=%CYHa%8;|3kprO58!NuX9*t$0=b?BM4Z zg_b-!n~}{!`Q>+OY2m5eSd{-t|-ZtC}JR+ zN4sCj?*{%%)^6aBHgY|ibp6VomNql)wF7>N?^>w(x6G|yWWronC6WyLX0I*G^Yq`0 zI{w7-9k%5=J$pJazgtyXu*Qb4ec<>^LZZC{++=2t|s0wLhO%RWi)ok8a{=OD*Zw|Cqlt2hgPN#YcqScWNhhwi_FdkVv5D2avjB@9$ zpSOne`YD>%QFbrP;W89YQ+72bex188+3q$w0h$LNA6}5@yZsY^`K=MeD}I{eVh;?w zdXX+qzKB;|RL}_}m}L&gRkCj`_VUJ*lWd5%qrDC-9OOIW#C^mqwo^*DaA#q_rIXR_ zy_DcA?mXGp8f|GBID6pi@XLpj0m_dN?9PS58JiNIWiJg(E{qQM4~&M#=Bx2r{M571|V=si)vITM&iN8%OoQ^d~&C{GrP82-<+ zUYS$#UmADG@@c(7tp@YG8M&uMlT25wI*f5|l*Dza`*nR{clfG}`H9p-OG{x@Y)N*@ zp2)V1Zaz(~VA}rE@^mRBmq}0#!T6T6n@u%5ZWo-^MyF%`P$5-lbqYJqZwzFt$cCOC ztG}zhy(iq)W<};VBr!=~yZxQSTVkJwz5(`?Jxkocaz6Agg^N7l*DoZ*DpkjOm1ndh zdbwDY*LHXa-n43;7!$?bBu?_|7V;PU!UC;BPboUMV=g}U65yqmDI9hs@h_M_=Ma)L1ONf~j4hc@`GTET4;mR!8Sb= z(RHZ%cA~Sxo{nMboRjv@x0t%uW|0xbpsRpuUxP77Vg}K{)keMi236^r8ai`)!J)4k z2;b{*1-XI8jEZ4WXEr~iY)HAn?CjGHriZzy~3-u{syK4O$Z%jTO}Fy zu;L(eJllN}0o8iv*vbLV=75WgL>AtBR_6gOv2J)30`x@|bUv~4X3*Dt7<6P_CbD~r z!H>}=OK(+pgyRnA>}|}a*EfVu$eQWQIGT=UyTWI`!sqsxx7XlAhdC_HP^3!Ipnk}9 zgm*wt$2%DH>=bp2U2`1=&QY|0OMenOov(1I8~*HFpi?6YS+fvcGpamvDKW{rQC|BY zX)|OY{m+~00vDMwe&7s62e{B-`la_6xcE_&FWz+zYME-7V;9mk&$n0Yi~I5cFYc+@ z{Chz~w+-b*7ViVD#})7-dX_d9=u?rkTE{B=7njGUz(GgKORssq!so zw^e&){tq0hp-+1@N}h)d9C5aXPbnPqWi5u=H8ZMkZMQS%rPcWc${W7JSnpJ80!O1< zzE;20v3^?9haFb!{IJ4h-2*;CVvHG$*ZP7Z3fJ~iI!Z{j|3+y}EcS_!$6^oY^+z6~ zc_r22-XXY(BUM}upCY(9{uE1)vsIc^ecs!bfVQlu-TFINmqHu3?@gI;p4eQ8shB$c z1LY6!Yzw0->X!IY`^!>A;nHTpr}h$3EPa%IbIbWVp5KywbFcai^oeuI#nOE!UHX{9 zQO9q1%|_brYK2Q3H2x_&x?h)9_}uJ z{q-|7<+bb%aR27~@i1CYur)Y&ty=r5vx}m4yykHStBdGKq$!hL&(^12s(Ph35*TPY_`72w1f* zoDujWGokP}0vEbkq3XL^m&7pwC@ov4J#9QcyXin{YMop?_H9AJl4nMzo2mG zAK;1YbY`2v(VvW1f5!96RsSgZc}&x(vG>v!4V?FP_@t%TpP+xpmHSQUaa|sM4fY~2 z-Iol0xSvglJ|QWw7tbF&K|s~+pwB$1I1^R}>C8RP}5f zg!lL4EIMZXr{JAEepoM45*tEmQXcUWHBATl!k)9}>+2fFoE&--e!gMw z^FJ&H(fc=z^5PG~4!0XP+duEz)!L8PzsSLh7pvo|)cY-ij+B@7di|n0j((d;7E9lu z-#nUfY-^55|4K96>aMdS&py^L6zCTo-fmg^|{MwI<@5ngxV?tD%KQBV-p?Hh&alZE;XZ>;3W%<0dbk>Sj zC^I-nLO=Sn6rG~N2{$z$jp5%p*&g6Mg9%!TryByuo^EU!G#pkIk=*aP&zOVGt8XUe% z`XtM_^sFjh^>J*A2O|c~=K@OqO^EWC2U1GMUYt3?b>N$x&Sbxg`;*>}ozw4+yib)E zn}8mF20CmRRXXq=rvjf2sq%VURP%-B6ps8lzec~DwotzGyu$T*z|=1o_xP;#o1fR< znjdAO_?Ga4{aDzv^y6PD9I}(~ie)$T&lBUNUm3XQfXkPDt#I@)k(3YaDcNCPwJIpmA@$!1W$9$4P^J zX~L+N&rM6;)@SjxEzU^0V38tc)Jt-n!8q^L{-U-yGtT&fQ3v03F8z@Zi)R{DTHc(b zcsG2YRr-^*Q`Wr5>`c-9IwYUG# zxVK)xLbJ|{lh3PV}|sXYQMw$N5^-i|5fF6 ze?NK#(}C4VyTB*rYCwty(O<06zw~Fu7+S_xyzdzJl-Gx0)3VnAS{9!e@yfGI%XNeo z4`R*5D%WdT5@+ytrr>Gu9ceeUL)u;TDO}=t>~C_vEc-PsZ%-7<0Ya=YyddaEd99yv zP~+aZB-=n4{?#gnjqgB)QinMnh!5oPqwK|o@UapzGJY^`)bZEqnpHWba2X4zUrG#E z_H01E6{p(l`6zi;13JP8S1c!)*XlS_T|2bOX`}9HTvxpFNqlFTY=~{y^Lfng(YLGb zpdH25t|Ia%ebri1okjOFs>oW@oBHuEJyR76`Q?I{@?(!U^c=_{=Y$5~UJZ%pqe#45Kb z9Bm-~(KhQBQjC>;Kl<1giV78p3+ z(JK#vj@B2>NOPQ09wNM0UWiYRoU7WVWK3eV|5=9b^>_yIRiQewlINFAOBW+u(aj$K{&7{V0Ppw+-5{0A9;!~yHkT>9Z^%yhr z83NQuGxJ&g4Bug!nf?HMW|fzz?*NxrUToE~CE$OB|17US`I@~WW38&Z5_ISc407M$ z3}BjaC$v(w&owl|q+FTaMFl$cKQ@Y&4f#BnEL{HEJCiuxC8xVS9`ub|(~{2nTS7g{ zLf6|3vADgMl6?9?J8f%Kcm3e}WLvyBnOG1Ri1ZEAr$e!1_6?MzITd;;8c%OqH5}5+v(zRq&e{ptQ(x}m2xo6gWb-Bhfl!(VI*k$+O-fH}UdLK6uW z`BGe_#_-h&$NY?Q+p94EQM_m4?8n4wmq{jC7jmYQ^*8-SUEb4$*v+Rk?yWh9-K^C( zY#;U{cDc^LMMr|K*LW?R4H}1SX#X?wq=8G{Vt&dPkW_!hhk>j1oBE+%c>u4#F;&$On^@za=N&OBz6m%b}~ zYlp(2Gx4Ep_cLEtIN~w(#mXn{)a5bOLPj#?A;K3vJ^v#Uj9p@ntX`7mN$s9!D;qn1x`kZNpzcF3Bh z_+nU-Cs+0%YX0*Ne5-sme^y=3k?)+Nz5`swX~t)sQ#j%PLl+1CqH%9t$?_=ENUZ8s z{k+WmpL>wU6Wio;g$jCO-}#CsQ|?yz0!6F3-u4qhtn!5lN4wcB%NGIH<2`tlH5%dR zVpYBx%doxbJLb@x*p2k_ON{b{UC#VT*IQfuWx71h<5PbtUrLBozD$?*e4C7Kmn$6o zoc)684=>krJXs5$KQnNHpRyOnXgP@QFJEDlH|FGJL=?~gbo>I(y+!v|0jIl}=>IR$ zcq@5vWF2N9y$d)=cVhR`SSky(v{*|cX{XMv+=>@0>2ho{y{A)Mwbd&wwDy8AS3kB# zCsM1oT|Wc=2kX-H$>HFIiTtL}WM|K!*tS->jhFI|bZvjcj?zo7lpA{8qUfUKXNIk0bCmv2 zmQVUKo{U8-D{Rw$H$)nP=|CV7NYjI&iCDz3VlgWnO{eJEp3j=3*(}Qm@5P`Wikz;7 zmU&fRp*D-Y8-t>(n8A?@$@UkwbaYEn$kkQavrftJ5tVivsHhddH$$Tj}wpbp3F% zz26y3L{qWUm(!88-PvsS+DLo2mHyWlk0paCJDjGcGK0YwC0wryQzBTrEF6yp=t=HG zJl)_M4@RTwBlP%WOk{|4N!Wn+o>wbb$vg-61B6&*NX)Yho_{KtzeeG6{AU@GM|l}H z$d<}C5a2}`H>%G(KL87`roXSg13QqlX;3MaZ^EbL*YbBn=VWU$@8i#2htI%^t_yZ3 ze(v@3*-P+a+af;p5z@Qx$w8Js+zo4oV}uiVrn zIz4@MEZ7jY{oUO|lmb3qAF?8GdJ-jWg{h0%@9~XfX)$*!(Hn1`wdLMXgmWsdQ_s`Qolr*YO4ZRKDFGNo}`N*(Lr!C>9GQW640c&FZ`7xkNnPlZ@J( zr!4KV{k_eRLM)w4ucTLK{o#p7xZoshw>M6+WtNpUhhmwO-=t(EIzf#2WesMgjGq~Lk#?9~z*)yD?)&G_h%F~VNbszhG1eH~OMo)0q&#%bAo^}Ay}C^IYt+4U z=$O96xY_yf@-BUqHtwX8XGZM7!2!BLpJ|A-HIBR^?O&G;r0X)Y%SI0kL>tmME0GK5 z;(_ApQvO6V5{x9W+mn7LN^dr&kUg6^3 zz44}4Mm%km-^H{f2Ev#ie#l$fl=XG59~R5+!FO=WjQFa?;q2${Eb96(zF?nH{J?vS z`pq~J9>k*~^A{N}{-$wn9>j6YVN2tfM}Su@f7n|Ok@%l*By{!i06 zQpIcICU0INz7(=RyTqefYO{RO6ZxY~cQPDOIKGmCGj zXykV0Pp=m$yZDHvrN)l(9jHUkQ))P2b^X@dKW7neyJat1A_gX6fv3p6cn&4guC_U5m;&z6r+Nw4P~)$)_QQ;hA! z^4;{?D&M0%tC>?BUa0DU%^7>rhiOz-<*`SIwy@nFDKM>Lx*i!XW*PN-5bQwmY6;IJ zO$&Y3^C#BfPK9ILNyZi#L&^#V9a$e_I(K@pE#xaa34P4=q#xA8H06)J1ZUeX-)rD9 zr@D`js(nabN1OwV7Rw*wPpSQ^KeaAVzMnt)I6fs^a@=1_oD`Gtot8ct?+7`%KB5ad_n1`rav7SQs05Ci4BVGwi~#Nv(mQ5YU-}? zx>DnwFa9DS7O#$YHo&od87ob-v6#{C?ySaQYA>k#B`yyM&Z9fW5k3?8HTsvl)QuT5 zPCRX#w{_mWdFRf%NaoUd22D{F&femOA};kqb16O(g^W_(c_{ri2gitk5ii$FuWQdm zz3{oLojK3%gw80^!(hF=L#M94eci4F#VaRT7A{;nd@X+Mk7fo!U3=Dq)-Ga5?!=xUoeae>qY0p!}w?T@WXo`PAV_^ zt0?~y0<7{A3I`oyeQWAx{OOlY^`APMi$egvFuV`AHZAqW4`Y~^f={Qq=$|%pV zN%?8u+F$5AEM?59E%rd-le}|GVxwPIbYzUc`B7=xHw^m5{*AtWuj3B3TC4m`UEZ_l zIOXhCComh4|x8W{lVeaDI9m>xqSIMgcQr)rQcThd+Iyzh0qWA zUqZcks`eq}9{}e*?$u%Vgz^vRQ^B8;F-h8Xr?(!0Ht>Gg>_0(A$5eA;pC2hYc%Sfh z;77&dKUTQ5qw+IM2NFlVA)H}@t+Y|bUS!u)Nd#N!Mrg)@l-oSh(TT{Z+dW%>&{o{Y84x6POJ^>oBLKjOyPTN>IUy-jYeFR-*Z-$=RG@;zN) zH@s@avc_Z+>TV&M$6CLi-v>mlH_G;<8BjUUJqD0Ij(DMDTcf#hYcif(yEl+LAa?izMt}0J)KP@Xr4OSS?CH6wmO-%!0=$RV`mEk%Wh~% zXPv|yJv|}^jM<23aY7TTeJ^1ns02}cTg}VM{+m;+n4NH(Y&hc&5+iOyQ(gN&c%&&A zI;k~XIMe6)nzNMOAajRXY|9qH-3?B@IXE;{SD@pUO`W6bh8M)U2Tr3Gd?+_oIx75N z-3e<90h*sm-UxDaIZQ7-B?W7D(ZKv zLR0&KrQsz5@zCl1(}JsgYo1Qf!e5eR^G>9la>i#;lsdk%r8Tf{e%5wUl#@o|1*`0%YVl`*bIwOuLqtZ2F=~a%BR^NP+QxKVG8qk6;GNE^=;grQ#5>MR@Lc9D%*d?re>3m(yvK$W)Vfp@tTFaj|)RXsoNfIW)g37pM96;KunIyO9Qc+1drs1@re6i^Qe8 zQ-Sz!avqKDWEL4EU@{R}VLU6FtiNnba~ezQFO)#AwLXXf++S*BAs^@7-4X3LyZ*dz+_htE z**Lk7Kx3|baAkCLF@K70OCp_aY>u{ER)1->H`bny(>oMaL#}gVWn^<}ZlCYuMB08T z7LUiANHiRbCDVyQpf8`cXbZd{>;#(vEnAZG(tsVwIP~I5!RpPW=(A`;$PUqG)Ff&v z#&8)|enEhBWFwkNJs#&gAcHn)DWa%R^c{MIm7*incRb}9T?abE3Kf-9>x9YIBB7r@ znvB^gI<0BdJArJdDVl4Jw7GWRbq_hN6}e;29(QnXn{Q;fe=XAYjdnJ5goj%Cih+rI zrpb0PO@qrPo5HEs#*>`x%}y$ki4cp#yNs>S(=Q3I%D)2ZgzLAr%fDtEEd%cIID_)P zVf?oW$C%Es%2C*~RsJ1tk^%B*|Cw^%M%5c1laPTdh|XPSr@W*jn;uRe`BHO0HqrDC zFY}*%?>hgPz3<>Zy=(n$U_;1`^j{yN1Rk;Z*<_T|UufwbSsp&uj&A!>I(FfO^h#P^ zyeBpoi_um}Ivxqd;%QnJ>#(DNR6LdL*gst;I~HxHZ}x?x6n-(7=^VII+A{%q1<#kQqq^>_9d{ zi-0z@N1rWI`hF4Zq&s!UFN+wfm&U1)c}wQ4;FBk8tKxABwX2`WO1+UVcE=-Th20IjY@(UCq}?b}$*uaT{?ng20x zp)bDRZwi5gQ zd+kLoQRb&o&$!oKecrC(tHHH=D*hV0N+(c*SIb*9IP$DY`t9*)$fptp zPUAhsi=WXwi^M#eyavLf<+S@irbzSV9>rnf;XdYmz(=dsHOdr5FHxG7F3S;MN0m^gKda{mF4Rvi;_pXLkEn7Ly(0 zdnpXui`57py-o8xy+i#d{VO()+#vjNPK7<09y0mnC!T2QaN6qbci;KWN1gLl%#ZdD z?Akh6^lXCH{wfioWmP!bHTz*D#&{g;D%>oe08a6MyaV$%c5?WoBE3T|E`<6Ub0o_M z#MAG$ZQktCQ&aETzal*xTDyMJrs3hoodqXv|M89eyKY+A9WV6m7+Be-`UU1CWIx9+ zs#%pJsw7_Iy{#&aAwcw{e0?QNfK?&wsPgD9bcU*epvS7X3Wpw_Cmj@3`HX@8!oaf{ ze@@OntMWOG*V4&r9B&wcegh#^rBUN*%|_9oNtouJ^P?%epm5#4D$Rsg6@)EbdwK0a zm2Wk0j-@MYgjoD3^7ngwhQ7~HYKHVdKXRj*wl&pqPq1g?JCWVHcVBc-T~nLCJ$m`& z`}Um?Jm)Dp+2?k-lR00;A04KD6)hH6-Mo`Xjt@|OpjIM2Vxp+PBg`@G&VIMQzv%0$ zqxZ_2tiIsF{yP>fbQZ-a%W{U6dSYYr?#B`|ppIh{$c^N#>3OtdGUC3^9UZMJbosku zOE$*0FMHQr3l=!<&JmsH%hz_NdQVdFQFHc6JIkR1vZT=d0!-hoj7g*{LcLwLSM(x$&Ns>n|6KmCH!eu*OZ-b7y&68H zUyI)RHGLK13O^N^(Q7&I`jo;K7`U{H`8n*xlrsK8Zel-!syuK*zm=gHI^?eo^Ehts zsqQNs-9;rWrsnB|&(rg(7ghN~Zfu7Ykpo75lm{;M_I0MiLyW==xgB~&m7k-R!(Kcf z<1*T{km-2()#Xd*DOG;pKY5=}Hop}94WuQDFQGGP;QXGbqO(Zh5)YtVV}w{oASLjFct+&IIA@&`K5O`qH?^od+H2H%$cumG z+QYb_54kaYUd>Q)qtROOB+@-Diqx0$xQ)m`oH72^k5hZ=@AUTsPbPVVfR3>A(DQ1D z7U;}FUuk<&Q%A?ZK&HpnZT0lDwKX-ZdDnx9OfKD$9Ev%9=aH3lh30rZnyBypqSF;g z=jeaEba=$)>*jyEg^pA%v7$LWbXlN15nr(;N6#%5VAQJ3hOgAQ`XCDfuS}>mLlz=a z(amCoLzjF%PHdMm0($g~@`t?nC}hXJM)k=_L#ABskw*xr+9Jx!Sc^fVih~~+%a<|^ zt~?#H50YGlm1PPCpVBVwV~2jE@HsYg=(`3TgMXcW5OjD?QrbHe(B;+sg4pPkPvgob zN{&X|mr$>?i*2+*_QL#Q4N&9*K8q#D$EvJQpVic@^D#meyoaRv2d!3VSs1$H41b<( zOuxQLm4~dQJp08dMC&LIUO8Tqes;)POG0^(1((-33sGKVCv97;=sG>&Zt}W@ydEd3vCwpLBm#MgTm*G-4$N*VSD#@f~8oMO$Hr9&pJQh zTzlWF%7a&towR}DWkp~50nLH67*aIIEwf`v>~HQLoN*204iCxm`1krc*0VL{Oe>@p?^V zCjr&5uc~|IN9X*5tw_uuwsNwfgYvwO!3s=lH)PKR4)@@;^n>@#G--J=MUCzEs(*aI{PMs@M;{<+aNgNp2CRl(Kqm!YHaMuf$3ECsPgbb(!cf+Qe^pCmD8Bk99>R% z<05#H`M>DE^zBkN%jn4Sst)uG(Y@e5)wnv-EPZ3fn_uboBb4vWs`65=j@wFasKMb^ zq;01gIO~#MoUH8wV!LNh$s#-uSupt*?#G^-gjX+SL>qW+A-w7wnlW#`S$NesE3sC@ zGMdE*WL5SVJc+!8*Zm5ItVMR*Z>G%H%Ft&`K2)(&;qwQYzM69@S)BP2`eKh>Ka+YP zJFd5KmQh~plzsJG_YiJX&enFpxlH9dMlMrttQNcQ;y2VGw9a8FUfs|q$H~I$k)No# zvF`K-S!8#4NJ}=P{IRU8TN*H9pZ9zGGFqHfVhIr;OuM&kxEOv`;V&4m@1O zKTxjv1hh@sAZ@$aC~x$?$~79V$)U*>?9mrpURy&SvJhEc$GFE2e4WTh>V2i6kGYMM zXPe+mav~qZ6V?9uDpel*8#Xb8T2LNquYzAsfK_?5QC`L;srNq=4x13)&VEJb^aOp= zhR{0DhwU;xg%Q!>$Wi#L9sj)XxN1XeE0xzMI&<(TZ=3@^V$;k|6;Gfam@ z6y^tQ^|ki zEuba#E_!~0s(X%aIq+eHqrBL!lz*ef)jf9^=PGZ~xM$a*&o?XFI|ov%NPqS8DSH9% zv9QEq<*oGFs=Q6f12HSfb@o|C->zs?c@jN%Hh?xr+aPJHaXTfrX}^ZAF!C0v`}kA0Q2FB2hxl70E4Hy3*-bsH z>X>6kQwKDz&V(wvc(20Yzr>$%AFNd8H_DCjix-FS+xy4yyAN(dBB#tT;O_=50 z-Q2qWq3fs_Tc$7~d9oJ!g&wN*0{dm(e-tBr6^BfXIN|7OMMrd_$Ar??H14fcaGR$- zrEzZ#D6)Y5J^l?}F|$SC+HXpp$QmCnzW-4wS?xEvUmo~2~<}ts3{{Ak2@> z>xp);-xOWyJe^fJi_SdVi`+;Kl6TXX^LjRoo?%ryUsv@Lj2~U3_?fe=I5lnXDRY0s zjm4=$poaX0s^5t0nAX%$^&Qk<ShdnZ`bD3hEVa5r!tMZTq=crUN z`lhDi*$UgK>f;~Lyoz7DgG$%V-T94N6?+}gb*TI53V%@7Q7hM~Pf#((3|1p*?Lzb~ zGJ53S&^f5_pPTc8%AFcVTnT#@+1;gajK6vvdg_>g^V?*VLxh<9$s0e|N6mP1rMY&o zSd`!QB=*6>X>3^VL@qMRiKd!d7YA1-hs<_t& zz`q$&+-=a8wGGTJy?BP|QohuXHD?+W+*>!5HvC1=f{zma&brh&>rl7!OKF>D6Tqe4 z2tKQMQfm?i#|f$03T%SMr>Q^I;E3NvmrO^$=ZEsZ3$kf!C}+f z-qJr6u5~PZ;HWq6(Y~6qZkqA9Iy#Jn8Ge7}Rk{rx&i(l4YZX4H{B)avi{D}y&D@}Hkp;Cu@&nfReX+ZH zsbp1`;M0grrv72jml&F5J#(F=ul$*c_sHYZA3x2lM5gY%{JaA11W~3S?4Q%-Iqd_D z@hLRpFky9<$at~4x@o^9Vl}yiWHveC-sg_Q1GnAgUUSXO;hlT-&`y3sD(*|Atcx$+ zvuBI7`z!Hudwa8$>&-XxWft})<3)OHna)XOZ90AzN~Yq;cwL%xg|>?QOTYNNYExCl zVs9T)IAkg7koOZ(l^N_=WdCu-p)vGFjFmDjG5x8ZC|rCf+0S&I%X>BgTzof>;vv|- zRrv(d!n)5Nai^5$2G-H*6|Fhr@eIv)lpT6~=95gts{?Hl{jwgXT~!{q#LwL3gUby% z$XQXWh?RSEAPcb{Al7t)L5J_9slL&UPb&}9%H!y@j6y1&-!jH;otsmyb#gXMi+iW% z|BU(k^r)gUN1sQ%zJ#_3uiUojI#nL>mbm(DgjDs3_*v+Gn($)fLH_jBidUuUS&R_1 zzI0hJ{4Y{Q{%MQ(q}YYtA~06H|8ZeZ>HD=_2a2uQOPQ=Ra<3!*5vFIzw+6a zl$UYqbByC#;1l{39X!Oir)SXTT*=}aD-WykQm-D*rv9dIktxA z%~_r#L_B(R&LVe5ij}X>XSMcc^r6aE6)nh+^MY26b9qyS<~aM5F0b-(az@TtotiPh z)4IIs)6-bv__yV!t2$NX`8D8b`RKoXMzYXxbj6z!L3d(%Uw;XG_Weh1W!$9CHp5vR zP5PjNGilUkh|h1(Z?Q4YCw-G~Pd@)2WA6cAS5>V6Pd&G{bIvW(`<ZrAX2D^eO-P*4k&EeJA1n z|A9>4JL{~y_u8xNa`r~KtQUp#C*a~&e{=#a^89fX4xN;oN&5aL^wiUB=Fg{I`t=08 z=)BPXRMUI-f1kkLuyK91CiocoP`F0%0dDvmeGf5kQy+e&%T@VO;rtWI<+xA~fAn*H zO1X!!DWeVgY($hHwuaua^!bs|=YMCm`3`@)r^-II?u4>s+`xQ{Gg*S^Sxg?)-1HY0t%vZ`FsMbgp2&MI8mrRR$ZI~1P`QH%ElH~e&Ws8satuCY5hJR<^ zVs}FS`xn45I*|VJ_CP=%toc6}^u|2*{2vY697iGxsg^63I|~o%;gVBgRHM%5hEAxy z5MGi~K)O;V74vZ?0`-X0>@Vt>njb5?ik_MJRxOXm4PMem;F6#HIKTCTQ9k;d`*r?F z^^W9y&`-wiKn5%I#r&ur!@YbR{VF~XJ#Ec?M$rS8wF_ip)pg}N+vcBU+;6v*oQU?-j{CtLeRZa=Y|do2aMQ-E#}d_4HWe^Ebr@^jv?wF}}K8 zhHex-X3%pV9EZ2`>5(r>{U?AI-l^%ma{pdM5C0%@MWWmPqv^f){oxbnP5XS0LC5zly*3G2mR!!W#_S@JsXmU~d0Zx`qAh zcn3bqD!kQrN9+*1^0UwLJO8KkSM*Ez=U?g_^pBMDZ>EM8c=jgpVEV$%20gFG&Vzft z2$);1{Esm%oAYuhw9$y~MRQEU@n{xSW6BV7E@&U?WU&r~5P#H_$2xa>u8JOO$BY;2 zffpMTz08w&a>^GQ3C|ZTrU_^oPp?G&?>afI&u@ht89q~=(~ABTocp&JH24_w#gKs; zvAY;Ha3gjW-eKU}M!7+w7*Y5FyU^#cioK)l(tkH7dVNl-%s1(CTD5AJoaeC(UE8~T?gPMEY(?QmcVuEq> zkVnsF;+o^OBKd#P5qygy@n8JJ2h}?ZbgyQ&ri>^=1jFuB+sp z;FB-fcv^H+eIHfx71C~ZA+O`B7w}TDRrxAqRm=x{B(^7YO&feze#HzS`NQxBTr;*A zv=9B1#WQ75ImHk5gn4b@*JSXMcbYv;n%?&>Rt?E%7GmB=!bg(*O4=yn0NMFD_zUi}@XVBPKa4k5`Ig>K%+3B<~Y^iNY83 z>Fi?~_hinpI>=tRxK!24%U@Z~jI)bXZdM#ejkF&Xd!Ssj@TDpoWgB`k`+HqBWTnTg z#bpLAZQyc`?^U>tK}Ght#Yux+=0t@4r3#m`eTYAwn7y!`&~NTLeRi>5Pw9v6Xg*#n zmcE|SxRP~oIUzoOoZs~3@MT|?K7jZA&n8QfQ<3@F0 zJyyQH@JD*)mo51swe4`VPxZ%=q8Eq+qI>8YZ7Xy4fm?BnDnsq9E3U071K-%QKQFFh zYRpi1ykwuJ=n~i9AbD?PcQVHc8LIORi$urIyzw49mR0m@4{edy$Z|hy<}^nBcbFow zF5l3z!>tA`WsBTT(YWGYJe3eX7x8l%X$NvRtGG$kRlQUA2fu@wd2N@nrHsuQ2fdcB zvacZ(?KEUgypA+-$$tN-x&GoV#?eaAO|J~r!J;>ZCUy1egv`;a ztKZ*N@l1`YbG=n;+oN&F+tUw=Pw*5zrruaZ&j;$9gHJy7<*ISweXFuxPU}mOk86^$z;{ zGj#JVXrd=u!&ep0#aqP}DPBrmhfmDWSVxNIRh0q#NWL4W-nvF~svAwI8a-L;ArD|%n{=ojlSWdT|yvWCuh z@e+-DK2_{>zrsg@f9+X^;aq53Zo2`HJ?)Iw*hSvo0QmhrK0!S#=5Rz-&ITbMD!x+7TljGtx#yqi9prF)_9vhEX_l|nFz!Ou=;P9-s2B4ozDn~^ewE zmNOG@=)1HzEI-Se={@BGi3v{a0gmDjZqu^0}y5A5B0#u=L$ zx8I-KvuPqSvF^g$a8n=?Xl!p!c1BXs-qv)?ZeJ7%2i<+iRf`g}ky@)W7!1&*$8?f@ zDDDR8Qw@=LC>E-VSIbZ4Adi0oBBGpef$bhd{$drc*UyajaoEcz7xvv76ffwQjPKtF zF09cgL;MEiREMkcU-%#6Tc;y5TB5SwWR$JrdGQ8ahUXW>58SA6*d3L@Cz76|Y!#p0 ztm&c0&`aTSlfp5!kbTDN%ZhIy+$!G8bwc}iji9J!Y!vQ|RoRAR&sOnmsvRnxirkBD zH_GvC*ebrms2ATWau}J7-ww!%V|MYKjH7lU+p4(`KhOV+K+H1<3kAoY*N6@V?nw{CYhkSWERsod8uU3j<>cXlF_&oZww_P$y@|i zMg-}<0<}m`S*Nj{K>8!+4Oi*98K>T@`^k%)qHnhtxa1MT@kJSI;1|Kso6jkPcOdC_baz+dc;|@7m?1VmmCcA5@+wIqWAIw zt9Vf1XqPF^I}Lh&Ucf3IGH@QZ6lVzW%auIU=U=Fzhu;-BA2x9DSAx$f9P;t=rhM@T zN-546zKM7phMxLmqs=_;aTi8`7SHZL7f;UXF0H51pHlwaM*03&#yaTdZPj_zQ7-A8 zlkz&Ic)`DO9~F;-x=IH)wkVyMH_A4~41B_|v;*I^=-74G(>=&sWF>7VYCdKhv<|Zl z(|Kt)BMi3LR?}^q=wx2ML{~52I6}TXeR9g)?_PT8c6YFMJh*ar@!H1ed~YtfWB-cg zu72lOSC`YD8f#64GNC3q#nVbRFLC-;jyg^KREv5#<4W?@_L?3#j}>R4Q5KXQr(*)A zYXim^f#SUB1i_xn6z58u`DB+)PAHc@?Tn8P)VH@@&}VgA+D*p=)5V#Q@X(?~F}HC% zw4;m8npzglk)IAXbT^JBh8j8^YP0*+_T`+mbTk!BHLbM!?Dw<|E`901z{L}EG~m#d z7mdUQc9VW!9*@TiN07Z(#gdYr#*1afD+<>-Ui=i}{|TJrnx*sf@oh*`4UM_HmKv8@ zDXH?=tk=5dowuv0uX{YWd|+rYGSS2B=oG=lgC{cbz6r#-{kdWzIZS2 z;-~4i=%tch@xOrcTflKvv&a<^QaJ6i&XT@9M|X#z4gKnj>lbbZWeRCN&98qVOUdy^ zoW^abK(pJO>aerDvA%3P97(i>D8L6s#!emVtnXVIa+f^N(B-ThY{{guO>Iuf>Bx24 ziAAY=Yxnr#%XUN)PAVSyYI+sSh3culIldE7$C`=JZyzULR{RX`Liz;!v%rg=Q@EZ} zD}KI;9)5}CQ2as_p4Rvmfor*?c&vhQzXZJaW%`Z!c=u@KS@Kr#D+&i6j#b64GW~rD z*X44}t>V`d?)M{l&?ZdQabAe=?SPm~qq=^3nFH+WTFF%eSlKH;dn6dPoWM zT0W}W?<-u-7Zra1dfo3BLvp*+EZGkgJ>($r`B4?U#3Qsz`sK$9=~X>{qHw=HKds{9 z_t$>|*LH_?ak+}m&lDfQ(cYg|@$vOjn&={-Csqzg6_Q{>9%h{(FTZUW+_|Sj9&*Ufte5C|v9pa{eRetNM%Q zxNsF{bz8fRszPlK-FSDfs*K5jp=w z;i8AAr?l6Tr_Oy9pT`ybLj8H-1U{lyPbwVWVjJx(KBe#s;gZ+?l@NP&2KqK#v*%abqaEx$H=OKZ$My>V*sz^2fifv!kbuG_hVf3~$pFKqgL z$cn}KGPU7&BHWm0u+r@f$*3KhJTsU`gy?#_Fr7(nxyeMxoep(|J45S2A-<bADX17!N31+g&M0NWK)}r(xC;(Jkl$_j@UVcPMYd9V~yPGiY*@ z^-^wz3rH#Dpi}$I+^J_AnN#v|CzXg?+#l?T_D)Baj}EPguNoXo^-ZVx`eKE)sGW84 z%L6UxjMLkZb<%AEt0%iUr$~N!j`6M+agCxVnsGJ8ECI1fUVef0aU4^4T+^%gR!T6v z#|QG}u~I1sd~O@)^}NduXeP2*pUJImxwmNYg;PUG==(YMgu>G0yHk@BS)9|Ir-?^B z6~nWY(At}V4HpbWJN5>DZ@{*%nR@Ee4vsWt1*>?+t2B4j_$}{vZOVgA_>{0?Fe+Y)oJN_oW#dc?6za6Zl6D}(V;Ke*_!;akKe2Y}zRM)85q zG}>1hJURao^#uLY^7jgVB|RbSRVR_->ruWTdun3xXR%G^-Mz|v(O{yd_LA>7vHC&h z=9@P!k1riRkDV^w$Gwja$|#RdGVe)K=V98ECQ>J4je$7*B(mxJqg(RrbkhIY(B#gZ zL|g6t2UF3yA!jLFZqc^k^jyjr8XO;u_xHWAmShMY^)&SN&O4}{7N5Wkc_8L<&Q%%) zUK*j_o}74nmT%!u^yE*IR6orBbjU3nG7_b8(*4t>5hHQJKSe)N0<5EJYbWiVh#gwG zqN&yG>};#=beA+tj8Rx?`A)cd^qe+#pf;LFrt52`j`lQkILkUa?e<1Huwq#-6X^vB0>)VjAn_J?U;h983OSU~UKzC)t zarv?{LANS*B>AW7o3XexFc54Bwj^UIx?`z#m~OC$ILTZr8LrQ#-uvFAOGgsWRq!W7J;4HijDF_4el4U@B3cY-p%UHRM9^ z+U{^uCX`PHj)ij_YhAmEKIN{zzG1MdtM83{-97obL~Z}edU_IFU56dV=}t|z*QM$r zBa53O4WU?MOIXuus?2b03=uF_HDf*#r#KWy;pW67jPP?niCQqsC z^(l@wQ`F~HX*s%{aLnO7OLHiB*|Ahwp>XITf5)ismB7g#VZ9VFkfNBRK7ny>hK*&l zrWT^e_rE?Cxab|VFH7b+>pP>Nx(gfEMLIe+TyBLQb~Dbv1-*3JQudT>-F9-#R>wgs z;yS`-LZ7Dzuu7{?q^dj5^)sF?t>&lXQPne^cU8~U^0RgNnebcB=mz@jmBagRRXH0q zuEyn6<(#5<@t9q`b1L2;{edn2k=FGB6qU)E`H~zmkN_>z@}$}XRDPUqrCw7D%_0pV zEeUuUHg#k8yob&YcBf8Fr4wWBoVz&I9bb~{ZLOcaFyuzhyQ%&)^>!xT(C^lLFYP$- zzSfoi%~_?oQ?KdCBojRycEU>A*~Kk1Z<$vzWItQlMD@#;q~)7+yTvyH%`=5nqS1+x zqxc^4*=hQj|DILail(cwBp;GePS-eW%Iin3oHO)05*PWMqdaFpxhG;W);n8ka8n*` zyP^8aEdk02!MIqOEKw|lPxQdQ;8G3w+Y_y)klvJUa=*Pg7IW)6t~tlqWUq71+~2cq z-R?~v!>`X=(dY#CzpMVbL|a=!S2T2Kaw5Dsxbbtg9SNrzl964haM<1*$wwlQ9{RI1 zXvI^B{&ZuikuLj=*wMu&ksb1BtF+x{uO|zugzUwWx35p0jCSg0qPM$<*n39u(q&Oj z!#$fX?dG!1)Mfeokou%vGVMlav z>B7nXC9zCjZ4bqjxwnZ!Sb#{A0@C&I_;^ADfciXn) zWN)Y=*OhA+?$0Hn*~FD+WzR^a!yUaz`|atKnOjGlo{KxkN1wZCAhPUICvArZgF`3S zk#(0#lJM+{_YEo;p2sqz+)Ta0Yx`BtF3_@!!MLB0nTF*^zT>6Q)3*;b5}GC0OhQn2Eavf?f0G6c+H+{Tf8=1XOFfdL#dtd z(~^77wf20~S?*jA2sB&m$x!6Lwz1^MdIwoaEysdqYQ93Z^HuSmI-vlL43wj_eRWsx zvhCUS2CLSsOAS#e&d%iN_GZgy}X7ktH8@9YUQHa1&bRMxqtEJ_VcrIt00w$aFs z~Wm2Z{EUn$(1SGkn&%Yaj?LJsuzns4w(yoK&cJhg`6fpnF!(;n|n4F*$Ayt8rYqN%B5Hv5e;uSrvi7~1#po6bCQLw2}jnZ4erk8KWy zIvW>J*jh5&mK<7{Tpn1o{=(I%7Rp^ls2$&@b_d8y(F_soIMY4_2K0URO|JVU`nm6C zj`Oo~Hr;s|&lfyLu>yBfd2f*hpw@T;6GCHm-s!%Mex@FM^uAm7Exm5Z0lp)xo67nl z=}f+KIm_}2mSsatKgk|@>*!?9#`%TmoTa>@6XekU3KmH-5ncZTh2O5*d!y^#NIws?hA2#jQ&wF=eM_(--p~-wzaf!$!=jcgn2Mp=Bj5Nd^&#%* zlKB(~KU4^Hoo>;<@$FY!;a+yxHur7x^NnlUoOSD*wskFAT1anXP6Dz0N^a9tV6AXz zDuf}1^bkE3<2bun*3YR%) z=<&;dAA^mfKER(c=wGgI)aU7%uM?lwfWGt!g`-`VGsqu7iB`$W2W;l^B|4o+=0snq z=&_dkEAY8n#>+mR$A~|*>(KpGd>kJCQVt{c=CJfoPw;;n^(=w2ReBZplg>$Q_#pKZ zX4Pqq2l_@C0H+T0H}~8^{YYGXmb<~-=%YC)YU58sBp0j@*9VK$T%zk^zGEPUmNv# zv%;afk8@wHWO`3`u~*>FwAVIYx{2|(DEd~a56k-K9~r+{;ppRMIVYAr{+`A$Mx{6^ zcO$W;qCTnT|H6JOf9N^pgC3Ic;iGg<&A0eg-9h$l$Vmcn?U~+`B5{C&f#*v{=U$oo zXuxv28~ZJ*!`_iRosM=}8=LAF>P`-3+S$#0>wNbNH%a$5r37JGh|!bNAu zkBI-0yIUyM#GZeWWO2W#1C%UCyrI7lZ}5kefMnrEpTXm&pMCbuofrT7vhCY9gkyGd z)UlTD;81k`c{w|4=jhURJ4+iubM1jdZqi-uN*^L`L7%e?&rGTMNqhj#?VLdr^7@?b zQj&VlEYtMf95&PQjV_>fNG=kW-c6L&OcwOix3a$dUEYg>TU~YEA}_$71>H-nM#fGZ zOjithX?yeT2B-eYYpknZ9)9;yrz_d!UQPp>*7TCK(Ultl+t($oj$Lp${d~cxPp0f7 zjq)6)>HJviTsP&U0i0^vD>ADyR8Pb=@hP`Z{k&d$k8ZQfDT$0I*VH(#Y0h9K%rfj7 zV_J;6Sr(=DDtfFZKZUai@BA^-zfa-t;rxxHk~M}#kX;As4(4V>ciyjX=+0xDgNoh# zTH#oC_zUac2MF=n@Im_T2A+d|mVArkV$=fUnV$cEyjjaK<9dG_3~Zuj$!)heuc4pu zUmn=EuVs6n<*NQb}yo7*wCq{JM{P&)aCY% zQ27=|72wI|pCWtkeZYrQ-QkPHPDD>86|VPlDg7K)coXT>?+ttVu%>@Z#WCrtw89Y^ zWQ-*B`6zJ8OXJT!!Tm0B@os{yk`C*ySu+} z$%@P>XXQ@E*|~EyeyF|ZThSfSg^#KFpuI9*@^M0}nbiu{I#T)saMl#a4SNM1)9uZd z{sT`-)X(%RL~Zz6&DW^MZ)Nn8iWkZ@bAa0v9)JEh!u?$3c7@|!cd=EL-Tb8rM_vDp zbLvXcH=K`iUwSrk2T@v_VWK|JPqqu?+q`m-V~CGD2zsp(pf~Mnw<_0u{%NWY+QoW4 zQika!$xPF@xV8&h*MZ%xK(`r_g(2 z&NkxnTdfmTsZd3ab_xAU6>d{Jm3c(54P;?bF8UGjIZQxx{U7J}j?~L49Z~eszgXL1 z`IP1qj+h}fCgoNX4mt3dtV(}8dYfYd<{6|upVIsvquiMAIm{kc=No@zy_J6P^c=C| zPh3yb&??;pK4jYovJ31v##qt6JDhBr#sT=pm`3#Cs`s~^LR{b_^Jh3a+S+!UfBsd! zym;^4?c4Y7KjXsb>FJN$eK#!(-hA_-U;p}R;c!!ezWoR%=wJSafN*&4x_+7z?oC48 zkO%LbR`U1)s!KTbi~P;#&$|_l7%J<)Y=5Pr3YW1O^iJCC>5-qu-9wZXXLC~SpGmK= zkKh>L`OjQF#Ru=A?N(FhM?>awSjd&>Gr(l z1D^xkV?L##!qH~Y)e>sSk^-NFD|deRLU&puRxbCs+4YcqpEr+__TTlWjt%N#|iZLN6*`^VIbcb9qixQx!ZlU+ZPrPcQcLkMFt{pQ_LG6h4TzBBvdiKgMX}Zwga{`0*d~e`6oP^s^jSmHrvI zI-ejW?RuPiiq6YQ4=DbKN4y_P+3&Y?xtKp9{hEcw`{g1}k@W}Bul9+Y zGM0q?eur^rG3q0Fhx)L-6p%9mcgZJ8p8FsH*3nLd%Uq+TFFmAi($B3oyELO?0Gx%Zg2|r@|$BG{9l0047^%I5TZfcg#EHuz6{nVhB7y}RQ_ZP+) z!vDX4^NDLBf3yqo;rf?;ruiT)Xg!>LQsI!lp;rZ#1FfN8>;^tE>yJ$CbQ!;L4o4Xp zuYIchq+SN64S1rb4bwr{@ibanrB{dW4fgwi|LjU-Zuv1mt^e3jcd5L}W>JGq1t?}*en^`QjKIoVD)Z7JQ9HQ#&zUeaO-i7xzsd>{IdWmzK6t>``7 zVO`VbWkJU!Ph$M821Os`T%X2lN1>Hg=@$l{r~NUBJ|9PXD{>Ce2`Sf?oi`q3y!3m`2Ysyj;BcM7vlK5LSgjgj%2l4i*3m-4H6P*Ab z#`!cB$Orq>|7y%X{Ymk6pNHS}-5c%6YeH8%I8CeQq0OPClgVHzoX$p5A$w{`YcLpW z4Tgd)?f#A=!--(9Et(8BhI%M2i%)_thkZdd>U)n8Wsb^!;u}FP5BdwlKse%{jE_aH zJpF;3CGTK4>+@Qq-=XJ%FH(GbTx{$KjUztlI3j0$P`Sw6WlmD^NZ(H)kJS8+Q|71Y z>9vjh`H>-mzu|}V`6sCVbLSJAINGQkZ(L>1chjfeom6le1h!^*}qkKR^cM2A5woxzdfgM^pB@Y)?J%4uIx

    pym>`DUt#SDIhx}WJj~wI6I!j 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/Jo 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 z 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 z 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 z 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

    ^2R>r;2iJA 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

    ePP}WPK?%)yI$Czqcs6)L^e$=tNe4< z3p{4-dO`YW*Us!ax5xE@bsy=#TIfr-ANRwB`u+~=V{$3d+03KONGxdH zpRBQbfOrM!%Tt1x^`Ll>SkOE>7BptZg2wDv(3l+y8na_TV|FZP%#H<(*|DH}SI?b! zZ_$_?3)-d~3(PCxSVv+(*^I=3=Gn2Jd64ObVu<@vqBUX1g62UMMLe_bC?6uRpn0u} zw8ya!)W|=;UhFT!C$<$_{~=tc@2?;#&z;>E?DE7jIg;k_^M&A9+k<4YiZ&z9+B6R$ zkZhV9=|{xtq`tr`5oU5E&4Upo%;ZR#2Obh;^jBlxrSLev&=~Y~K@56Cn0aSg^ST5x zIg-Y@eVgiD`F{4VM=+BkXUBA9t+ zTiYBG%sgvjjCnO5Q_mMGnOOKH@siY2h<7YQ-!%r~x*!Iz zO_+%V&4alT9_P~#0`AM_w4?P^`4yl|0(pvTz{JCz&W@OKKqZH2sX>QQ1;L8 zE8Z;YLfJq2KTkHl3ZHTO2>{d&bM{~JSQqf;WpR7|O}yKXC+{PbVLe3q!n%O95MlJw z0_tYuFlb=H{+bKMA9$oWT7s~MSO`|@rF1T&7F1USX zUGRP1^LZSXIUKq8Y@hVSw8!I#--z$KMlf^sU-xss$7nr}wfdg#l1i3tXUVZ zpAp`k?}<$_e|m0N7i|CjliFil2oE(GJLd8`ZW_Qt56!Mhee!(RAj z|NZN9>c2ksKZwdZ+df8D<>vy-9xe7vj)V+@9V3|N0-gG=<0&3EN%wQX%zY%yJ3%m` z3%?+n5dARcCktkDLGw-#%;C(jJ@vSrfAt z_!#Nl>H53osx%-*m2@uWv;V<$j;({#M^H?yC9-!g7U+WB9~g7%0zTI>^#bZil-D8cnLUU1 zv8SjnTrc3>807`Jz?kL*x)8+zU5H|VE<~|F7ou383sEf4g(w#2LKF*hfiXQteKKa| zy;zNLy-tqae94;;(knEV@!$*x5(w=OWx(goB4(2Qrv=J8@PtP9LLL9nnc z{GE7iU0|MD7ntYP1;*UEz?fSX7(2rs7p)77xpjfDvxN7gw}jGnLU0~nO z5u2u7;JuMCw=S?vw=VpH#`=7J9@sx^)6xaW6`1z|pU3rr=DBr&`{~vN#@xEVKDc#( zd2U@`jCCQ%cYcXp&!HxUW8v3up+5H;MCDmqz|q)c!ZSIN#$HDl)(cP2oKw9p2fG{8 zWi7%pv7mWx6wJiJZ>cZ8qrSXZFq0!`-dhASIg;jGE|`gRjlI?9aekq(w=IIb-M7il z+BEMSf|(piWAF5Bax7@Fta9pMqd9OKEts3- z?hnLs>Voi`x*$BKE(qq-1;L!UAlMoHm?>Ql%&7~4oh7`GE(qq-1;L!UAig_wK`^H- zh)t(1%>9wZ`h4l9dG4&|-Kh)0bLxWh#iILCBbwPM; zUBLV)919#<@YHKTU0}?u3ye8+0iP_uo--`%g>`{>Ze5@{W7e$;%ya7k^Deji<9&s( zxB6qLb%8OrE->cS1;*UEz?fSX7<-rWC9DgK*}9~w#eIZiastqaU^>jGnLU0}?u3yisSfqi%D0%LAnV4H4T_#2J2 zTNl`-TNjw;)&=Idb%FbGp*2T(4Z3xKd2U_c_T0L_Jk|w1`+q;IhG)_1Ijli27VtjO z|9X$Wb*zHwbN?jtUyESR35I9?ZQdcl@Z3CL^VmpzK87~un*_t(DR1%Sn+3yj<;ZIx zUMun9g5mjho0kv_&+rGlHsS$W`xmmA6zmTn9=DfT1WOBs=h1`qnAg4t&)i>g@v_2m z`JNNZ<$FiCJw1Q(dBJ3kLcSLS`>h_&`67*3Nif$Ol?9W2a(lw7xG-Kz^VKjG>Px3! zjx{*nC0KZFd91s`SjhLDMcV5n40C_F$28wZUiZVN(FMLf02k`>gYX%jU$O``B$(VA zo!7jYU~=|<9`YivIYKt;g30~55U(Ma+>@IhCEghEmI@~KR71RFg2@?h>V18FIq|>- z>9+A(+gxGsG&a5nwo))Tj~?phD#7F)X9!!p2sR;@%lApaT)t0PHuXGA3ufj>`?p3g zx!)?|IYVQ%RxsBb9VVFRC%4DEbxv%MY_7L3-Ioo5nK{xvY!uAQt>$gAFwNV%NPAld z^UwazZ>1g{4xhMI{CAG#x50(_{1Jq5EVwa_1^?`Sh{v(uzmGJ(oowzPn-CGyp41B= z9>)Tn*QWE%^E-)mB=I;F{ImZd9>;=zrar`jhzR+oZE`I5=lerEjs-WyvEZNm5Aiq_ z{ImZdjAH>Yy0;O+I2O=%I`169I2Qb~{~_Nw7W}jSA&g@I=ZNzDkWG#S|Lni;j-s*V zSn$vOhiq~zU_Yr|2=O=;5To~zLOhNI#OQaCg!;m<;9h4O3+}n)SU`+w=TLhb3)mjL zj}&Te3#|$Np3wX*@>=Tx<;Ai;Ks6B3g(w#20-gO2@d90-`(UCAP(^@Ej)e~MK2nGm z=mN(A?*YdWFVF?H$$J3zGtdRbG>>B;@LOYnF0g+Z3v?lh1-ig%O!ER=;I*Q$Ko>X` zG#2Or$AZQJU5L&@pbJqf(1mC}16`o^kz^i@qp=Qjfq8nY16^SM7-L?b3mglY7w7`V zg7z=ag{TjKE=1=x&;^bK-QH$d?ds_(Oceed{Vg7jV9rsPF7k(e);qxcpn9Tia z5$rj^@cDwDzYFh>VEFDo=F`|nef~tWsp^FYPt^;|<9gvF;sy0Wl$Vh9@XSDvzca5b z?1SW~j0N>Vl$R17o+GwxrUk?Ih;6KW5ng5yURE$XzhK+U35M^h1132-&Cz^ExV;dT z7fj|T3mRiyP%jV`>Pt{BM0r8I5ak8+LX;QO z3sD}|3;vp)KLx#>gGiP!kyw~N6)x20Pb1Wdg%D=NLI|^C;dHdQA44L1egWrPwHJwn zGpH|TB5&S`g%Hn<1{!s46$>HXtylY`&0ezDO`rFKFI{f|+{Z#l(9F z@%~LPdF~u)@1=stbLV-@dzoNz?>dCN+~=`2Yu+ms!7dU^-q{Y>e5GLW+&P53%EvfI z((S!kFjFsR>@|YPbLWun|L)slAM|)$ESRYmw9VHFCeNM4<|Q=NmkK8DY=_#rOfXX~ zaC^*qosZEw7$M&4EsXo}25Rq(f|)teKDmlmvtvPHb}VSjjs=a`v7mjoV?kqfENGi{EHLj18f!Ziv`sq}G|!F&&9h^H z`*J0{!t4U2d&w)`j;%U&67#v2_*o@#;me_X!r(1?Ih9u&^$C zfNWkPSXdXBcdcMyUHBmJt`jV*3(UJ-u<+i&yblRx_M8`kwfa0`ANF}#7a04I7ue>f1Pki|^FHlkS{Io284Kev`z*EhIl;^v={0zZV6M6SypL&J;P$@Yx2MON z+xt(#@Z1CEU8hhlz6hV8+F5e0FCl8z&LQkM;hDPZRAAKSnRiGqQ#+qd*q70!T{~-= z3)Bl=AzoZ;O8pq(B?L3Rac;;wcfG(^Qh265*1XgrSXwYsJ8NG1BD~BZysTiRcGfm? zg1LNm*9$Zc>RFr4wb^%fz3^2U>yosGKc69}>DXr3>L<@T^W60U^Qsn){kxUg>l7?p zvofzsFxT9=>jmby>jiGFmu-3}@GrQJ^fl;9C>G>C#BJC|I~GEi6$>HEjsV?kqfENIM*1&!IUps|dMwTU5(*|DH8D;7e& zTd@$r^3tB!ue41o7KC>@jkOgEA)8h#gm_jggm`u=a9?&)dsZxjcy=skAFNmi@$6X8 z?Qtylwex|E)Qf)j4ChD#aG^f`O+uF}f(;2~awN^G31)JnVX}D#*&Gqf%vDH4NpD(a~ z6M~r>N%JNJGdYs>eag4VK4@%OFq0!`n`;C!ITG`}MPt2IFq0!`n}-QzawN@L=VSW$ z0EpD%EGoBj5vCX#%W_~uF#^A03J$G?oP@~B+ z89u+DdG8R+oL|rw+(QtX6bm8$-X)mCLI`^|VIBV2fAp-5Cl_D_jV7A+RQ0%AAvPrz zLN>1yOkzRi0Td6$`YOLKR1byb=xQIMXKf+g`+SVg^60+2-@4jn#(g8)LO{ZF+KA{+8jt?EgQVXsoHu)Dl&IN;B|{1pG%8|6PUuH4=@P z#!U73xx|Ud)!TON+>~zWXek^ySjcW!wQ1AJ&Drdx@r@hDH)RjcWTwwZoK!w3Ut9H} zl`ovhwYR5J>0(K|#z7D}nq zmv8(~^2QwgncA?SB~i$PxrtlUN6G+gXrsBXVCTU;&m_X zrC|(kCs<0WZ-!xr=Z%yOq;J+^}oO8~LGO${F%y-f2y}s87ZdLCV$Y` z(a}=QcX#v_van_<`NLZ~TRSuD>v{${vbn**SB#DpE1jvalTNCYGNq9<=}cRDdbp5H zG>W-&DOD~dOKlz9nNn}B=QVq6Fa{V;Nf?8TvVYL**2Kl~WFk(J4o;vuu$2tN$i4Ac zBLNEsF3wEDm?f%f-dAip?c8iC-*ZW$II?1pZ94|MO%luGG=Y)^N* zRBP=WY0FI1a!cC^kHjm*-uBE8bbH{0^-blb+$p(dOOyL@%j5G4seh7GseLkuc50r^T@%Ne;TiU z?uT^!e!T9r(O&utT<`G)yqeeWmU*kZHQsg@4Sx(^`BMnMQim0ef2*?6&5Cc}TBy>j zL%j6ICKI(G+%>0bCu}cl-@bnR&YguFJJzq?-ZwhBZuA2D_+qgmTT7HWviV|cs(sm8 zk|*u#UDCc}@UDEm&~bX9P^}gUr*}-|^LhMxK`NW?8AxRd`SkE<=|risw^-VNe$bwX z{vPQa0GJ+0US?d6QyKRN4!0k$rMuEh3-w zf*yPI@19EN4~WBiBVf00psTntP+!x)c?$N1VQ;(?5w_RS313GybpYAgZDM@J=I5G|EqiBl1H56ofcmA z=-Lcu!^9fi1TmM$#uAN9u^Es^_F#c6uL0vzHQxa<9plCE@%nj<@dujX%}s?^GM7*G z#?skLdt0ola8%)KZD%)Sa)s`6cd62w>MiE`a&0Tx-nn`6(Z$JPadPtRj*ff>{OQ`# z(wb|jq}$q84)?>_=pEfT*4e#m9QL@8LOxY$FO`#pRH2$Ibajn%w|Lv zST|pL4*ZYLKZsLJdkKyM>?NP3yHKC~ox1)EUjJMReg8*z9pVjtt`x3~gjWVl9rq?+ zxA6B0a2n^G7Dah-W|Gtd7Ygp8FpMyK5Qz=gBWkd{)LyZsH1+09`Aj~)KHolbT)MRq zPc1FSda5m%Y}<=QAnubpb`%E(@2phvwa;CCW9Hh+&nT8!i@CzfE6wGW)C<>kC%U(9 z&i8>Im>1Cc|JtjmzYk$|;X39;avfvhY3~QHfBplm z)bIExef|?Z zU%sy|yQG)qupRnK`KoBtUhJ;FMnSv24)^ZBzkPDO8-=04A+{Cf?r&KQ%>-F2ax(eN$OA-@>crsI}yegGG zw>4KN7rHO*JiPNug<=sh=tBO)bo#`}L9c~!*Qa2Q8u3AE{fU*wt|_!6in(G_an-7!$D4YJM>Ov& z9$w0|=L_*-2Yi05udgsv7$~evmkX8dLi_OcmF1HQLr3IWHyoDAr(b{ROVhbrKHX^V z=qTc}z&v4H_LTQSul_|``SJN#oDTmw%!gdxFV{0>z90SqegA-5XZ?Zi|M+IQ{!?|G z;z+K~$#wksFMq;3_t9(U`}266asyodk9l2QuQv#4w%I!Z);X1QJgqc_IJG!jYpRp5 z5?~#`Uo3|vC69%C7M4Z5AtDE3xn^cVv3X@Sd06_`ty|zvu_?18Gt$*L4u9@DimHZhSpX3J*yQ*6%E+Lx5NR=}V8i>H;QAkjH(+tJ0ft5&TA z$A)rHt*~R)HD?BsrQ^V{7cKAZUS6$!ul?ptt6>JTu;FLfLnlO>^%{|k7eA8dEfCq?EMN( z5@|mU_ z)CMnZ&W>+Bmq|_Dw_wd9rx|+a&A>*MAnQNLC3^b@2Ty+cE%e1E?@Cxb{|n#i@JiSZ z>N~7=w4RNX;}fN!TbB3bDsA1x$))km!NC*yN1%=`WL9=I;2y>hbg8piL% zyh{)L6#Dp6XvM46@{?BSX0$u{74*+SJ-TRw_0v8HcW~Skh7H>#Hn_ z#RdjqFb>o&Z13}+=H3h&m})??lcn{siR$DU_?$l2R2%Com6z9=ip8a3@bfDM2VyJG z7}@BjzQBF9nM9)o>M?mRU;0of-+N0VIXar0_S^Xw#29?1)|jbI&K&H$r5C?;&GdA# z(V*{Sd^ea^^zp=kxBs+k^=u95`8GY&O6DB6`J57+U{*COk zLY9I(f)1flH)amDz2qfruX+`IHgXdax#?5s6FD^QxDJ^!Q$-GZ9+dAR>uYP)!1q_e z=j0^yw^Q1YR@gpU_IJd5B_BT>D%y1ddq5br;} zG*z0Y#cO~Ty?a4({)@hcqY16zT;ks+M@P>b9X+ejxEBi&c)W>wK+(GgzW=!S{u+p7 z!?~nXx^&yN4{zJ{c&SOgkL&hk_`v%P-pEj+UK_$dp?^(JKwMQ|8^zCi9eQAn6Z;tm5!#~Mk_yhLP<|pCfQQXN!hU!Cc{96NaWQ~kv#|mS;@Hd+r>m5ze z$0uv>CoML>k3+xqo`n4j#|QkzJ6aLHyP-14W6FtsANm!1|5@|>ip%drDJI{?J~qL} zm^X-h1fQv!;Qde?dRif;eg9)#9CjkJ4V8N0DZM|%dr||ufu;CgU_0hbz|RXh3N*=R z+L5tLDp6<}t^<~Y`$k*6eq4{370y()<_gtpZ!XhQ$aDg}=FoGXo<&-(BuBeSrM6TG zhM~z@4R&{Vr^2W}vNr?DGYtv^_l9dTyHapFyBV9=1>fC7wYinQ6G!fHtad3l?qQLWV0l^O^2g zu^8*lER8jHbhW3;-C(M_45o5qV;S`0ROkon(bdK@+^8>CPhGmSx3{x;dS^#=7knw^ z>F>-;H>RuQ#IoMrrAw2!UD=M#)4_!%%xb{OMRZ>fc1B1JVXEmb-SvjzK0$xsnZQi# zjMhqLJRL8?-%>eVt|ZclN+K06t*^9HwsodK(g)L>sU`3y)d^FKaZ`qT?-H2vGE|@t zy)!WSkaEC%)EUUTtF;D%#`M$-r6Vvo4Va1pe1$|d`8tomR#d4YE(DGKZbxQj!cTwB-Im+tRRuTI0i zp$y0Gt%mPy0M9(EyZUylhWmANy#UwGg>2TFq4}u3V8@QNYYT&kkxUPb1#v@% z^v%rd*wNqFlNm`2;&?T|cb0&iqiLU^782CTjvZUl=>cpC+QRhXc`#?#2N=SMvCP;- z7hQz>W^WMowDVvLI$<=H01k;iCMJ{9F!0#n2~f&1EbYd0yi_g2xNlG8Q`t;+cPf`^ zE%l6Ks@b-DzBQ9r(pD@tXS1#8*1=@HJlWe+DfKqBL$I~N{q#fLWiY3xzd4v$*xO+f zhwxof8-nSBoM9%e{(oDwQmGE5;UU?&jp>cqO0`-UYEP%zUwOp(iFFrUv<&`*eQ)yO z@bmOu@4XD}R4jv@)5@5HXEylgsWyZQV+L+8!E!;xfXoh`OY!9s6S>a8YEvq+bZSLM zK3h1f*4x63T<+Jx*J9=w2!<8 z^5>?(!Kt@@9x`<7+c_|%pYrf~k`;kmG%jh)weEnwyAOvy?86lN>mm3a-e>>+jHg@L zYV}kxJ(7Zl0JS9icOgapeZg?s@T~bi()prlWpuQ= zGM=gQmqsd`6N7{Ke7T%IXR@Q(4{>ra%-K~mXD}1B##OCZoGI)_%)8*wKJVLrK}5k$ zgt{;ugO&B^&chFf{eEQk=utZxnT^9E8{xZ0z;{2v-xY1>kHPvoTfRHm*m=}wZsW)> zes>+H=l8w)9DC5!@eR#~)hqoy)%s!0>s#-e$aXf5w@*y8k2iN_Ap&AhDK3GLxz65$ zE?vF40RNl_cW{cU@Ov*m^xyEUeqZ~q#d@}%>)G?62RC}h!%Csus>a*!*;sM@~+))Q8s@SROC z;I$zsLUXb5-6dj=2hO;p+&Bh87^%2Q2!og1N5Gq!hl zdE7x~%8jAKBy4T8v%zjXnHa(n7EOP#Jku0w@0l9t>K;0w*ik8W4DBv9?<&vq4URQl zc1Af<>Rt*XjN`K%KEDP10v&>9*RbIy&e?J9B|E&E%Z1P2{;?DKeFw~E9u#7b$B-o$ zT7(1|A`x~B3_WNYTCRVvKG1zwt*>WQ?^NHq?!g`H=a+jcy{iY|VN0>AtJs&wRJyw> zgSqbhfmA-?({yzL#xdBlYcqJ)q>j7!DcYw}u2RVjdEirJE&Ei;8lTJ_jrR~RT2+n- zYj|+*4R9CXEwqwxOkV=AaV^|$NZ=icAb-VsDc9n?iI!NrBcDOeE1SEAHq)5xfNbtg z@8e3l@4Wcpv(K(>$ZROBges2a3hvC_>AeX?5LY;kEBu8hxcFs-!c?(n+Yx==arW64 zU%YI5WeH5NotH)2c@d{Nu7TBS4D+r4h0wXGwU>zK;tmz28U zhRk@^XeL?r{T+aNZ2tom#~?2e&4e`sk3mT`VWcUeBH_dtww3ea?VY22o#jGvuG$zJ zU3pATZ)g9CiS^^7tGf#2WN}Hgt7)RLs(TQmHxhSNjw*K@Svhh|Pg9?F*kRxN=CQldr{Xv?5h);T?B) z(**Y}%p74K!2oWQsT&(NHddV5+rMptw|nKXb3XO{BX{6NgnP9I>w)zH!;J2!mM3xH zoPPS*-tO|+(pLRF$}Y_J&h5l+!I!qs-aG~Ue+c>yHxpn7fpFoOA`f65;qm%=xAxb@ z#wW)6x{}?M?c0Z!o_|(y^$PH!oZfX*%NpnpyyXbGWBNn)d*KH6>+J;$XQENVvb>7BDwHIzoryJ-ho+`#olUW|-c2{{ zzW(~%H{FExOwL6<32Cx1`B3M}fzkQ0SX0IO@P~JQ_`^8Y%fY9|VdiLmz;M7ka)vZ* z`6-PRD;lSK;Ihl^Tz%H+bB{V|7knR=2#zZ}NroPwYp_AXZB|&C%VOtuZrrl7e_(vs z(9WH^*Q_gzKt@JwJVb4@V|6t{8QIVjt*Qn!bW^gH8_J&x&2?UOS#vp8>=^p?>J>Y7 zV2j8{J$@M4#MtoLgkotWMMR@^R_BJT!xO#BmJg5B8^;{8duljy(lN!_U<}3r=j zOQF%xTx>t^O9p;^Q;`7fq@<`l_;9iP+ANqyM7ACnddHH0|;hl%~oORBtcJ6pJd}lp; z=YHrD$1#Ksgw5prSHA2e?|A7eyut^{g%7|N;CnBIT=C2BJs2-sytprXdFRemt49C3 z2(MI!b1kUdo)_d=G4CYcepI;da0b~YtzNxzXXVb~enP@W zQ|&k8D@_$x;7#6kn9n;PYc5fS1vjcuyf+7#S|7X+MUpc8`PNu|V0>H8l2Wy;t9QE6 zy`p!SS1gY%ZHl$^r}FLN=WdHNbyqN;!7k=)_d{Nsp^OP60`9kAwgXFM2Df=wn&&jN zoTi#tQ_YBsD`!-&9?8xwzm8nv) zKDeZDSe<>q*uE3y0DZt+8u#EeP~|p2s3&h-RUI9Ttr}?U&ZSpfcG+dwmfW(ILNnjf zZ3aK?gE71cW~K)3>p;BW+nI5=hk_3PF!-RvufsnO?$ruc%n2A*+^g#MceeF)x3`x% zS0A&X)}HU1DQAY33@uqPRA1Y1MYcKJQS6E(N+T=l-EFPCskZ)A&Ds9m&7GCrG^`d_ zJKNy%J1~Y6ld$w*>hK{s>?sg0+hE#q{ZmcV*uc`J>V4}9sV=-?CzBf0f$pJ7_h3`C*c@x`9!SPAy(_#k2gi>-b8zg0D+=Xmb@EJVm&f)h zsz78!LH2lvKTAUj7I1t$98_Sgcs}r&yv?v4zYG0Hk~Xoz;Il~*nax`v+36d8=}9MT z-&tP*|6mwl9P%2B9YB@^1WQ#lfD7FHLmG$0;H=p4eO+gn|5jP z>jUF(8#6OA(^<^7EIYnEK0J~?9&&b!1>k+hyMpGcTtTtJeFXQF#`IZwzOLZ;DlNzP zig|0{^8w(&{wccu$t*Rd8UGe(YUjZO|rv{&MV!Kfj(Su&0fZaF{OO|_TogK+k zrE8$OI_zECIQEL8#+M#@>7`cymvg`?s7hkV!zEw)_ch&POS{$_*1ddr_l|8-Q`_La zB(=2`=J8%>3#4@tg9Nq{DB3p1)^?7x$5I2;jk#J^rIL;snFB~!^N?3 zJ8(mKc>BvwI_|;~Pxd-qk}q7y{u~RMhV>}lFK zFD-Tr47N124EDoJLtB?ZKd*qegl%DFGGDv2P`K|9Uf&M3Z)4m3eRR10?%zj;;JkKd z+13>+Vq2ERc7VNsuHw>RXrVq@fJfY9dk5@LcfvhK%#s(CQgA-{c(?-!c`>{&32Q0^SnLgiwH^97+!d}9M$dGP?kEjp zhw}KILJx3rkQ;1+T*yP8;MIgI{Bw3Hn@uIN5Nhx}IHU4vh&;^IOZ3JI#2utF zuO6ypRF(*tgh@TAhlwPUZ3YGg6NWJ0KrrjI0kdnv zzyQXeX8m^U_t~|*ehy&3W--S8?0bLseShbc)arrH=RM7o)ZMB&_ncqOM=UTOdadHv zjvQ`Q55=qzE1{<&p-1{sYBm>+gjhJNN5ZN7Rb&Kvgby6Tnt!wFe$-@;9Y{hGA)C(q zB~~?N{I?D~dTZ5elLZ&rmH79+-gVcm=LMgMM}b30fCDt6cV+V0U>`5C(%p*_j^iIP z$JYf)#TkFP>mI-n_8-|`ZM?`1yXRuPaHLSP+{=tzruA*?;~wmTq*w)>w)j**P_I=y z%T_`?hHIh_E9%DjCF9oKf|2M6DGx>;j!&0X66p3bvEYq!HI};_xN`F ziDLGEJJKTE5?3o!@9cLRdm>gUS@}|Q$Z?$`%CusvFEQI%SXx%5uoF5bJh%JtMB+m{ z<^J1lI|PA9ar=J;w7=A)5n2^J1y~hl=N9Vdsi6L$kQa9?H8j`^osT&ap-_#LKW0p7 zdbSaYg#1v%lyZZ+t9E{-Upy=J@BgyvDx@XRGpdUNBDsoWT(7;B{ZcCTt}9Jvb`o#J zzG!~xy{P2`Hwv0YP-UA=?k(2!QhL;{`t@gzEV$fkuP&abkuip>D>(QOc({QtyiF&M z+&@sgQ04q4c?jnsT0uCQNDi^0E+hIN)Q7^^RM^qOVL#SzYvDrCfBy8|2)Z9` z4qfcGdXFa{EU``;d4Pwp4#hmSs4Yl#L6!NPhg-2ktUuHrsfB9cM7U9pwDv}ig^u7~ z2cllIH`KuQK?s^)Pd~w)zC~;KggRMl$CrtAfxnv7F~b#Dh-t-_OEQawEr&I44Toz5 zb7W4+hhkPlj=v^YD+*e847d>XtylJ5qgn1IoJsNN#_-=^#P{QdhkE+G|l1?(Ey6~pT_FqP4$1>E;?5K>;hxX)LhF=yDIh)hTMJ~WGc?=%iHn;;c1*d@j6!ZO6IgXy%M!$ zMNdSH)!uw!?6wg86w!yW@L1_Q(!c*4JoF9Ww*y?nKZyNytPnM}$zUZ4sU-LVrsozy zy-3;gg$FV&3wt0S*?e-KM_&uYPn&Wy8Fn+rqJCt0LXOz5G{B!R@W)j|_=A|}HrG>S zz*V`o=GLlGzpt4I=l74@l;X*KC(i4gl1`3WXjc^a;xTym1ZROp$PJLl7D`7u3I33~ zV3&B&$m-Ehzs}sW?#22f=Y0>2@Kh_~B=YG{Z^>>g#Zm8#4bfSD0)F~R;0Z#o*HG08 z87K6BPpt%xw36wl+8i1xNmE%x_gZILLyn>)mcd7ohk}1a9svHL;#`!I`=v7Nkmq>| za=C7oi}4Qre4o0aTIW_h=FFcysI7qOg)aYJpaEKgq#~r6Um;aPA_Q{u_;IV3rR{{- zf6qs~Bkcj#wM!#{{%WA}#~~9)KH&fmP@`VraV4Gi{mRYEQLp?Td(_~pKLcLBE@acz z%5}UM_Sxv819rhm+Mz*6fzZI!^*+w^%8=)^+t?cRMpE~oU7y6>g6IqO)*gNJnKSBZ zUh`|-C$SB{QUMGeg6t*ybZHNG^})oXqh$^fe8@?$f?EUxtR6SKv>tOqQPoP>wOWcL z`qHjjTM0!Hp(y@2-0s11!{Th;fV_j@4Xk&iFHA|H6-g{`gp)u%cbY6&G&`A4PpOpT zG21dcru%P5`M2y%JB|KOgv0oXI^ozU^m5q@`?bMy_rQy$*q@-Md-NrDUj5RqEV!LF z;Ms)J$B>!p)^^cD1V^kj%g$}2Ey65)soWewiPe~<5aQN+JwDr_Qc3Omw&94Y1yb%*8SDs@Rd zEgQ4yx|6$dCpH6a5iavG|l^q3QBX z59K3%)Vz=M%3Jm1aY|96y6#5af)@tHtQ zeMR8nIxQ!Bd^B;@$?%$8V+qe-u7y%{6g`ZUSbidHItDu^pFzNr*3du;S0IZ~a)FpJ z@INACDB2o3WabJ(@XB~dVWu9cq|Hzk|E10kj^8w`Nsyhkv*?X@9z_J{3_k^)z9FJL zf$ZDTv>l&>@k3hDVOpqV`Ia9}#Qa!Ww%#_ArNrXijujBbv&H& zZtzb~2?wGBm?RQX<0is6;aSA+6Kvu3hvtW#67LV=xsQW~4Pg;UZfbP~r8hXUjydmF;E9q?VutEv z>S&sggQ1GzE?M#n0u0%@>Bv_iwQIKG)qdtOSz4R9Shi-%ece+lpa) z@x4#ce#t)nXVCN)#QMZl5bnb7xIZi{ScQD3o&3U)qb1Ltn8=3qUcg5HlNdg86|g1S zfF$d6%V5T?o5@4wV6Rqh8gFxkET63{bC1m|(dXi@TRN!7js}_mpCf^g=pd-BD;iUc zFUJdUGppd6cusuRZ|-ViD!VFhI0nf9#37P^KOj?DDaQ>JM^Su~#Km>vEAZmbDXhsc z9p^fPIK<}=ttHtHpA`^5=#P*`DTg2o^BFW<4Guc!8ngADsx!jnR7##-KzcAFag>T< z4_h(mFN(MdeGr*9_)A>0%TO;Yq&|X6UqJCl7Hge*ER{-)BtPpa`5tt+s2-E@X}3yC zVXdHs;j)nL*ifbYC3f-hGO7UZy9#{xzYw*fLeu`mm%j88L`-;xe@}W&u&75~KK%Sk zvloMPX?e=gf$%9z(S4J6f-u}g#D20iI5?QZt7ig{`wI?tP&>w*3*ZnHv4Wq2#!!(a zY%Cv*tYhOr;TeigMB3d$)e=DdWF=Asn|AQ%0V z5HK(Xgs>5RlItJ$l(DrVM~;Vei$%B;i5zERV`E_zZ7EhnvDLO}$x_scT#MQJFil`S z6Sc$2(3_F#E?Cy3VyqC2<`asS?1|MvjZmHTW}wFNDfE+Au=uI-a|jtUM1)Z1jq(M& zV4ctlW#8hjVz;6(44FvKg6QdkmTGUc1+OVBH840y&5u4)C+}}EIpcR zGRT#2Y%f4PRVJ%#~G&) zw^^n*IjK32CE$;3Q@J)yO6`;NSNue&D9nXG{INLcDlq^i}P>)<+nb8bH{d_1t0tqvcnXk4o=asQBsdB5 z_|aM5KIi)t?tlC9(wjb^y2{6&>-x$rbl*GSE0fG6Yzev~G6RvqW|Uy$JmSQ>SnsHm z&$eS(<~iAcl-KBAH1_uPN$B=<%Omkbbw=uxW9|645vvI}g?81zlRrY`C&dMzN=1ro zo2ntGDnswt=$z{@Lw+nZy!%|JIK)vKcOftXiS_((uZr> ztN$=O!+$06Hhx>yHxrq7#y1j~C!AP1g))_s$B%%WT|KGWpct%az|MF#c#vY5ltU2M z+QuT~qqf*-H-y$IcTyHphKJ*oLwuI=+1c;Pourb}3Kfi)2(j`WiX+bT5gdsZ{$bZ! zv0vhD!XUw(=qa#Ez@f8zYO0^ldv$ky{@SQJc)w}he`Fq?-GbdQan1mCBfkuE_gUcx zASY=n`x7_cag4ipB^HqkBVLF=2&ry1k4KAGAEuxDJ@(?EvIa%VFnpmfVN_7C36vyA z7Lp~9F1!+Ap>gf9pT9H@)ePT^o_aD@%yV;WO5*3&7{gfW0f=6DXQsEA+9{ zpFVCr^frtQ8BWfxUcUS?OU%|ehC!4UDd&PXG&I5Afxm6kJ(2|Rh!TW+2gi;FB2n}- z1Ln7@%j4{%_{!~;BbTikT)dek3N zMv`t@U5IB@%StSGuIYLs(PBz%Y)U42m9>;xw76NS=&k|HW~DN^<1k~0Cp3?AHqBUg zAMA-3tXLD?Qj7M0=Z(;lKy-KsW~GK@Qe6Xih55q>?VX zlJ-<|GQ%VAo!jzE>DWEZ?=d~>dQ#d^s&%OuvRRy4=UlbHVM0X9(ECo>^~x~AsE_J^ z&;=>66QLM^NwXve*RHxc)J~lSJ-;~c(G%q6mj%mb-OlqJF7Y)dmF5*XvvWr+1 zpzR?G^<(sI1zpc%$${6w7Nd9|*>QBZwm2Ss;(&A*$zVLpqZ8SolTc&_W6(Ce5>Qc+b9FjdK|3-}^}D)61&RYYcrq+W$6jC>`z z)-_{yl3bmLV*GuazlzyL<#(CkYV0Uek#5*v7WB)P_1^v3;Y(&JZxlB7?St6Pg)j}K zkWu7HN=wO_1zXX!P$F;m1||b>$j;}W_lfqqdVhy0_#9XAYM4i?7FRZ3R#acgFa>Tk zqJ^N>Hvm6@Wlr)@fNKk61hfD@$O-{e9$v;6;^hM)(ol0`gtgm!<=9|m5no?S#+b`b z`);G*`ltCMYeT#RJh=uKk*;wCPj(5cOLNqKzLWd{t95)N=2(frvQ})atb|6dYL))u zIo4CL3ZwU;5hxdlWB zG630kXLxl99p@t&5nM?-^9gOiU)ST2>O3BlRMBp%*iFpp%JF{fb#6RU)=OxewVFmY zp^aK&RlPj&JpQCVXRx zwvreXA*w(k4bjyXLu891Xvg?5LTf3CjZbJ^|fBQ|QS4qBC^KT#!2O zM0mS-RK>`)*@=mT_biQ#P5yxq$K(aaM;^cl^2vGFDnG$AEclY}n*(DJrix5p3M`eE z-jSZ2Gcms<9`=_G<_{g7bh#akNSY?6Bw2P`=HNUga;`*s0snP*kJ#=yJ&~l@<~<^$ z<}%#3#9pmAe7g6x5A?_<4xCu7!neHgRRj6uvf98mQ&7x}BX`82nNY@#u=t=2 zqu$(uc#LCSL$=K|ByK7unv`Ou7D_9Ies|2$tf*;bQ5Y#DrIw?z_;B2c%^`yui8qHjyMvn@Na6rXM3q~Tgq&vJPY7p{GZ9%+;cKs%3_vfe%-6`(^3;Q>@;>JTPVr9AVoo^^g zQmRM8aRYm!nK|zT{lozEY3PhD)McTW6mc-|tk+kO>}kf;tYkV?WFl&)Io3(5e)jaVZsV;h zvPL5hlkkub1|HdjTyy#qInH8IN={mt*sDDZyo=vtDHwQ{m*bMIIQKto>xSJ23oHI4 z;$U%IQ6v+6o*Jn`WOFsd4&IM*GFU=+^pFiwm39X}CW;npDEJ1O_vv4Ru7dtWBO-oH zXGJ|KdED2z3;4kq31t^}GNDaJjJA-tfb&P0uaSxaNKqNfZ5YtTAeN4&}^M$;f4 zIuFh7c^2mhJm(-%^NVyvM1&VfLgHRouoN`MbYsGvVxn&_nhV=2~16`~a+i zBuSMKM(^gy#H&+o0b|8BPDs7i-ioCVSv7~ONBnf$iHBjYNJ&j{V}4db=m-%wDXmK+ zAE?qq?A_`)w*SR1Z32|O!O0jPyPecDZUxdBTtQ@PJ$Z(YPoI- zl4SZz{vOU37LF~xhrTVo`6IUdk@;4ubr)V@|0cR0U%CHh;?Z0F_Kx^9-Gr9L{!Pq! zc;$OuACF%8+q>e|6xDGIV3OvO{RG`~gj4e5fK?(?P;Ow0Z;K$vOawhX^(p@3leyp7 zd+}l>9ZBkU-8K5g54D*+2xPIeF#Ubz*pP9gBmWVTMhs-tXxf!nxvMS!K6*xAWe}cg z_14E$LWxqeEbZl2uVRc^OK&`u&)ezByY{bm5gyg2S$$cprtDPSFF1M1Q$&#)qnV2z z5qq~#|FymQ?a%>L18zla@Kg>uoC~3y`~B~CA9&y+?kCxMLN*2hvXEO$YEy-#-t<2* z9Ndi8@G z2KM{#_1?C_#_rIxJL=vP(O^u#=${}_2u2hIFWms8@gT5EEBOSYt^wcr=xzb2XqZ5C z_3FI^I6{>Z1hV?Gr)Q!6BeChW+ja(c#>u2rwV1H!ai9ks^n3ypyj17ajo*wfGX!ka z+OJE)S5M{mpn&TE!RPN1XAEKr-4oJYNT%I>;;fwKnQqUc;X6rSpAsQ~ zpb)kzg5E-x(VL%to;~n@IX5=8k8QHO0|S$9X|V7H=I@5xsFCJIXx7@TcI@HFPc{tW zBotD0Y_y`9nkj1qId01yMyk5is2%Z;qe0KW5P;=^rxhXoKf;)ZT$!k(ttrT@I^ zAQ^((co4{`Y?i0N{l}bi3p@b84qv2j@sP~XlXv8{d zOP_mKFD3h}!<x1wagOdrFh9}}- z^rExj;Q%&XuZY|@Ju+9Dw@NqNL=MeajJ8c8T%#$?NGr4SpG=9n=9tZgSt=&Ga*l<0 zB%4cI3OVyO?JAx!Hn4L3-3};`{d@fx9_F|Jt>nmx|`UodFH(l$UEf%~NXMrZoA< zH|6<=`1}RrrhkT9D*3O!+)umw_!)cA~8*^ec4H41m8Zdvm#eC??N2N1<2JLv%O%s)d-!VPxVxnKDe>l2^&JbMQPokMs} za1Sm-f3Vi|cryhz+LhD8e7}?MBfh4DC+D4+;g9zBziBYc!nylzTQug+V2z8=7e7PC z2G|bg3WBd9rhD<%hC{_}O*4Hl6zI4DeY8zW)_DfS^umhrRHJT1y`>T4=yBhyVB; zbBToyhQsgP%XR|>hk#$o!Hc-d4z&eK$qVqZ8IPeBCZsb*83^~A&9DAP6_!xSirb$& zvfgy6M-J23_W(ve#X2Gev^}sL9$sh5Os<@}U+s&yITlOmdZbSohdB`YLUjpzis#9hiCU&?|bNUWV57@b*cTA-A__dyYqwE@l~91!wfy?3kNCylA>=&YuN2;&Z35|G<~J(d&Q{ z`bS01<>_g4H1C!BTjP~8L*qJ1zWJf6@u!wT3L+->ys_&Je4cXTH^`jFcx-fBA0KN? ztNX7>a-YYO{R4RhJ%Z0Tz}G+Sdi^VT-MPiPeA&C@AfnDkkJ9^=kca$pR3Hhe-}35q zxFYQ(Z@Oyq&o_pgh=;2VrhC~v$O~A$HlpahR8(Z7RS>-OKJ~>~4DQ8tjaJMr;QkM;*IJ*L6hNlg@>4 z8Kf8kcaW?gq^a@x8%;+;K|IvN)ctxzkD~}(H5SSqDBrERA3B-Cu=!Q>{AuN)6bprv zM7)dyqJBAM%TsM-caVSF585C-AiO55DUN%coI6y6=~E%l@e_PxB#|D{`wN+d*7Wlj zv!8TMd>DgCQngZ=d2T+>-9)O|6D#C0xfF1E60js2-4*uv78I_h)r6~2KY7WkRzulr z)U>oq`Gm=g#0T1K_GaYhqS{kVzM_>O^$131z;i#uUb{Mi1Q)bCUjL2rtGvm3pZ}cs z(RY6BYxLe4p8elZ#q|sC{RZbR@ELFB*xlNN{SQ1q?>#8$2fiyZa)DJD*#A5IIY9lL zL-F-lWobRUfhZen8mp9Nvyp}0h;xL3thqQ>4k>D0s@ZYt7;;jTjo5w?>;sicfmIJ+!67) zuftE>KBpIauyXcS7gkrj)zz7=vqg603PV&ljD9|fJ%8{2XYBb+$g{r6O_}w`<#Uob zp3q?2Bs+b{*g{2wCRb8ROEB(F($3A zE#qz&PPv73z>@4rnjt`*E&M#NzQ~=ngYYGI5^KNDGd0(axGY*{cG^kb?c1K|fA>$E zc#KQRugQ!3+Thgiv@%PsHr74z@Ba^Q`(rO9pTeXDoiz>$wketVVOMZ-_RkXjHYLq zoRHijOzq1xjC#H_q6`)W46Zk7o9V2SPi3Qr26JdXD-=A}%e7Y*2FPT_`g=v5?>ktZ zG!q0Nd47@%l}Qg1k-B&D>;M~F;`M<>%VoG@B;J{mCch&en$V{5(yhHwt)bKhm5do> zqgXS78Bi26qI^^^6_?-%U~Gq=2q;e^+_=%+n@B``sk6xWwY=t-;jg67g{A)%`+c#u zHLUZ$VYg{5Vd1ExIdeKHInodU2zCLD-Xeowa(b1tf zSn^l~C=exc z2~17s{DnHac(0WA@@6*SRrHFNS9M%VV0)o`sTeM0kv1J&uFm!*;2I~BkY#>(WMSMh zi${)12a+sZL}3B>i^sb@1I>e?*>8f=1-`rSq9Drle$J;D@apbEj+eQ2ver$?vCUt- zztE%93Q=jKuGR|5!J;E<*$)7IKZ31Ia$0zHT@_1vYDL~EyV<%lsT9BIs_~~R zC!u{v$ms~=>JM<=3fU~dM5b3HNJZ|0LVA$1&wFxDpHXXMYu0E5u ztrs3}Pn>Wc7#KJ>GcyC+-wvCHazLt>F&F4-Iva$9IA_-i3euUkV;+4uI;8Aoy+%40 zjaxEI1k2~zclNSZ8Qf9->`28)*cW0EBPEw@6-c0c?#DjAk2*Kv3{lgy%@qOwqUew| z`+Ywf%f(N|J%)12qenx>j(+RqG`u=vuvOOE<9E!r?nVHa^lNZmjo{u_1~h2Nhq!#_ zv{voGiL4!-5hJ!@GjHHZC?4@^E0`6a$ZMby{DAJk_D3;v}t5nfq# z+uA_Vp3&yx^NZnu`0hV;^%1^5>!lZ`i*9)@ACMUJ3>?LI=}s4+<#(KR$BChoE2kE` z<>i?f=+~8%$;pM^s8&%YQe}&a_y&Q5c_^?e{t^}TB<};`Ll_~;ANb6N-}Z*yI)5Xt zLWYz6{weH_Z;F10uHMI^=n+EqkNjWi;_B++dl&H-dF7jKd=ERw@c)`f5#jSE(I-j% z9To#A1|h5K3sf$=a~@X%eQ0HBYUZnK1OL%CqBZih39sZ!LLlsvCfmAthi&tPT)`=& zYs~F4d*oLcmIp^97HWmFaFP8;YI8PcR%YVSxu#idUMPVU6DzF|*K#l-EetyR31Ym| zd()L&phY4_YRN#V-p7x#@4Q($={G)nNjVhvGTBvQ&({IatEg+WAGmi0=OlSgd4Hkx z@!6f51PKPcWA%?4i?@bOSRS$riX2{&hRn2I-mPucdE;yu6{2iuPu=13YrIG>*bun> zmVm*Q2JK2zpA;Msqc0)9^^#h%n(Cw%@3rgu5muFNmkL>)%xv&)EoYtLMl?2uHqo`l zkb>;pz>)aAra`kXNN&@fgUm>Poo$vT{@FtG^L+R2*$i@6QiC@c_-M1hi)WJv3#hBF zfBmfw7AYS{wEjcPwSKv~9zwtXBUNN~^&XK-ojL_8=b!fTb{mPZzHl)SOIo452m6dn zirw+Do%am4spfAuTNKEUtce_Ggw+JUc9&)gP%_n0qKCwe+)UlDduO=B1GO@S%RN% z^>+BX@OsX>JQ`^@KHW(o!@tt_KoEQzG zFv2l(<*8UBQ&(I0{D4Z=IOODg_BUp5*V1sMfNO^`y$`yhc{|FfGzWzrDGLL{$qpc2 zm2@T9V?icK$T~8gU<7YvOoBoUjO3zozdN6@(%BH#{b&?H9=po*!`whW*CkKpoL%$M zZjKMUMT%h1XWmrw*VPA)R~be&JRjPme5-36yibuq=Ey+YIx>tl)j=d&NH35q`U+xH=^$oC)ImZs zsEeU00!oyDUr76{%?`btu|xKNRx_%-k=Zx4!=3gU8*G|S4;I`^iD^0BXv~OsKwz`| z3_O$WQXW+vY#FaG5e03aQI67Yz!SLXme<-X4RaQ)KCgfxmV_&p>@wW=h+E-#PpL}w z=*!N??h2}$%iKcQre9fXnT?ymQ{%Xsrq?Dj7jRn?@`~c57197(ky2m8O9)q@fCSNm zEx+iW-PD@pwjUTbzrtqVY@B2>FJg8cor~->@;P#W-Mz)bh}c}$yESTML6(3B|M(JLULIrV zOha!JO1)Y$iw>WurF{u&kNz9A8pDNt8C*_iq|!Q96PX@Xe^nw2fl1HWjdPK`;095l z;91un6V%2Wo#y-3twpQjIn&ylI(bjQHrQKMR@nZ2-nX{g&qme`R%|5H!Xg$*F_*lU zf{VLqgm_2z3fRCL89@s-dXYa4?=wBr*QH!Tj<`}H>6cq-J7dH;k%@>GPI1Sy+4D@D z_H#---B*>z#xf4$scKbb^3wb?(pwfR0N`i=XZbfgTjURRoCM&|5h|mU9Do zJ;$@X2JhDwKZv@={bj$j__`wx`P@jh$qO;eF?UI*J>bpUYtJ2Lf6l~8{KM&x-prY zyVLh=o_UESe&zLc3_{#_FRWg zOoUceiUZnE4h?_P*6d=a^YOku*2ia(UUsToM3)@z%CaS_Nj6VG;QxBXpnN0oZbM?c zbFwGG!{;x?j)ZXcTaSutR!_W=^i;cK^lO!l%3bBt<#3Ue-B=^dFfAQr+DuC%OT#_R z=!r3alkyrC?0}zQcDF997t9GGrB6=cTurzW~D6SLme>Xz1 z#Y0N#(p`Mlb``O{NTAdC z@gf9LPCZbtfx3A%A+2u2&s@~byUDEHm{vO6IT<%wBg(+&wMd3#@n6nkZq7#z$rpbW z&j|7a#KYUq2&CzjB&40!@uc?X+qrt;T)KykkHazD*qDkrdZlkOnrEZ=JS(z^34BZB zAOdOc>q3@&T}U$WbMg6r04WAYmgFqxkk+j~%)IFXZ?3gkn(IcHULLmxsvYUYX#Xr@ zv+SIuM|ea%z1VM8W>Ccu&>;D!BqwRtggU%@sNs6?Fa^64 zwmW7lNiV(a(MR9bGhLaE$CDDOfQ=^NMp+PE5Csu zj~K31v6yl1ojkNZ6p#CbNJ)!N#Fw=hsn!2{!ZE6SQkGejv#u3k(N^mq#y>1j{_%w1 z{qJ;RufjqT!b|jdpxYmq6-MW4`Q3|rOr2+mYJAj4rB1n-oK^bHO>7~d7*pnu?XiSar8b1JrXWRzXDy4I13io6!OjSTu*|l_BobL&#E-w< ziS;z~dacx}Pt487OAT~5#QfHvbq7*f(OfLDsVa4(i~5>rr)T+iEP@P8F&?*GHJ*m{ zAoUMEJ^=rOZlkBjPEhOA^-*AcY&j{Yi$%AST))b-yFymebz>fPwfF_YwhFP`@s%Ty zGx2ND+~ce8PRy0P2#x0(K1Z{5B7-a*Vs(EVfQhpqmj z2bnJ=+3lXM`avD+QJjtR0#%$*q=M7}u@K!U=v6+9`z2sp%$l7Kedrsmx2HX^QT#1% zb)c*M6|t3||1Bt0zy}1)!lfO3tYl^%u30T@nAHv+zI?dP={bJ<@_IH=y6Ny7K7SlC zf$YV2P_;) zgpQkB{6sOLRpOOq9G3_&>Lb<@Aii3JC2%80O81?z?&3#X_qd$# zRWI$Ol@tt|$gcCi2lYLZy+$!EvBjV_o&q9WP$9OC7)kp_><-tx!{;9SDesWvzWf)i z`xjsAb?+YNRE%Q(z^&5Vv?lF2&;?Fc$8QsPAWi`D9rncgc&ygY>a~2+94pu=w%feQ z(!N!J!1m2co02l<^W@NA#%wUdRxP996f&T7&r0|>Lrm0#{DYvWAUi;D-|jgGTtwT1 zhOM9ffZW?WLzVV?AIh}n`(F40V_z5;SnqT?Pj&m^V*bd?e`#s(wF9pW>VA&{XTkl%lu4qf=N8`pVDn73DU`AAMQmr9{jeAIBq zFoWstIyZfW3-8^AS}otj%kg33TjgfFw?>gKbiL66kmvTb{J?PSt*q)|}pm}JcmI`YDv6qXZBy_|&q`SvDe zRhjiOPxM-i`-rzci5XizMx~9I_p?P|1mz#QMMn2|V}dEgXhbT7J*8g0Zbu-*PHtdAXaOfBttdzvV5r^%m?#PkF#@^*#wb7!`S? zU=9mSqr*P|=OUULUgHREYiy*# z>l1gsdZO2k95E>JPlFS0(*f;@DC)wKPXg4ZPPIP!*{}Wj$&m+#FN0XZ zpvS2@2J_@}+~S}%G<0V7FtA9u z${zxsbgzxbF>QG)Tk|G}JBj>=f=|BNPE?~kx*VRDhxJ~m^$vc4^9vWgwvmtU2p^bD zA^&jmotAay+8A)YCTc(a1pbPMoBWa_H;G?yW^(@^nL3~16&qbxiiT`=)btX@G1uX~ zkAjM!sPQMqDpuM)Erm5-E+Uxp+_TXy&#~Jj*HAdkz&nUM=FcD>;#;*hJFIOG88QHY z5;?hGd8#!3p8I^4O?>=>w`gO$s{L^k#wVE~ui;vtx%u|EG)Xe&d>22|H$bNl>Y@!x zjWTC&14QJPGDYaS@i2QyFxY*5tfn5W+5?gHXw*<-DeOda)y-p0RV0i?GfBPkj<~C7 z--_stI>E+D9*k&zd2VH-{hXVKdFU)4p4kxRxuG^kFbgq^I8R&9-E)@WDAw2qS7v6` zKeaJ4vwPEYRNL%fQ|=U_Z$!uQkZ&YgAb|sKfTBt}77}WqvcHW>B2S-FwYw&Fe|&G< zP8dVx&~H^EC0_E_I%Dfe=Jq35M)yqwIqqO0OE(TGRut4CSdK_$|76^YpE?&eF7pFC zuea>6@dF25XhoW^upY4O(|M;k^zndHC3(I5XK&lusd@N_v_;yA>?jVMiVRAP-@L zL{h$TYLcNcvK!T0?F}}j=UCtFwUd79$jnOg{6b2O#WGUa zR=m8CNFI#zSLI5jSX1f+(8o#S8UGh>sRtfUAVap~eRn@W(QmMyf8?*>yG^c23%tK* z*4lcys)rEE9`<{a+1vkhYXaM*+bNAD(5hE1URK!(ogZ6qBw2WJ0Zdrm<`ZL z(Lzk~8-EQNS`f(#Ezac{S}Vgx^)YL5E?iX%Gx4=(rni@k@=n6bc1BBXWdQT&xs7FG zBK}KyhGcZm^#VMR*rFHlV%MI7geEcy9*TDe?N4u``G)v~d;~*j-TwYg2p4)pSS%8* zx>*%DNCmIn*|eMLOS44mKT_MvYH7rWK2p+0jtrNaY|mPezK)gf1zZO;HN?+|+6209 zi|V#^@PMa2fSYpQi`hoP%x}i>tnSv??B@!YAd4lyZ&Y9TBh)HV9KIV*+Nw##QRo;D z{#cLr_-UqJQlw-dT2htpDVv*>y@C+GD`nqONTJTMac|l+tMyaX?Q3mN;Htn2&Hk6M zHug-EO?bh5v_e6Qu=e_e&0>5HtxIxb1sjP z1J>hZ-J&nM5tsLkxJAmTlTSmuO|z3SpamSTLljO=x*^2Tf$cv|gSWvKff#SBb#1mYW1`hRV?NibBA!Ty1zc653jw&HS?_)cPk!LjmkXC@3Wx+;WebrA%Umb z3~dTv{wVC6A9U${E4oE{AeAoQxn-Q(5MX$esjtT1i1Ui=WCwY&7_CO9TnJ+O5R*U@ zn^KY0v`i{#^rfCjg<<~O-0YJE>ao~hLv4ZrBAEZ3k|JvO~O4MUUFa{=TZVBjC(783f=Lth}%E|(j)M~ z&pICSEid<%_0hR=GZ<8OD_&xMYY zlS~ztJ;z=Lm2Lh00hlK_cyfTt9ubeFx~Z<@zOMfQ89;}->Ddj{Jqqx)-j0ufUccPW3?p5A*`U3-e<7PfsHj5Sh zT!pdI6*ij&m^^Ed`1vsGE$T0!x)S05P~Mg`7f2;y=k3%gwWretuQ2Hnn&hK;OgfGM zEXjRiO1X*Fl^DBV!l}F#OT4-cNt8RBK~-sf?{F*(2F|46i}z1p!k(AQ!UBX@ryzhD1c|%6|`GikusBZT(WhVd>+=0+*sn#6a7Aq5SfF z2TRe>rKk5VOdBIJ7aFd21m!33xkn$p=`Ihvb`xOsL+H*e-|Gg?i=NrR6Mjfu*By7b zyLYpE{wsg(x_|y3UMOC4XYu(UuNTOSim1f-1$j{?At-Ebzz*jLgyA!;a@b9yCbqX+ z7?SH*lmOd3vh5|!m7Do#&QG7dCb^hkU@KHbi$)*|`4T;+Gm9lIp4IiUG<}Y8UDV(9 zT`^yDTbBev3$A)sN#0P?1o{n9U+v1p3NM${wCB{uSL?$~WuRRs>L_y3;{7n8wX$u` zk5oQWEV5$0td6s~t|C^crYMn7z@P>L!R3@?vm)q*WGDF`BsE)=8J_#L0Uh!3K<0rPS1??6YU@ z;b%BMbLM-JR?E8CMl0<$`rPa#$GJ2Ip+@zDfnOIB_K8?koI5xf(W{W7Z9%2*93D2} zu56r6BnFmeXV=!ewY8a<#bf5C1>tY0@FpwxZ)!^XpbpWX2K1}l_}#Yl6C^}+G5{Kc zXXWTe_9`oIq6U=3`~`e{l@(v){Kevh{#TLgr5VW7Z+mmsvfSPsc!#8BCAE2O-@ZHk zzL)o&y&3uuH`tGk?xoKiL5JJtG1;)&t9sy?pX;(V-5;!T{0{(gKGlN#4Qv1c|si!$K-pF24F>2ewMo2+~Z*>MOv zc=@0S(sdNq+KP(`$dXfrGtmCGAq&T{a^YRvjV9Qw@s!tG5MM95S24kNmGf-jMgXBQGSjw1ZaZupeMCQDI(a zm>uJExzpM62}JNK-&5r(V%t5B&g@UT;>T zY90~g!MVi%t*zmYpX3uppJ~UDO}EpY(QpTx-f&CFCoiI8$YKvUxP#vQlUo|BXTPMd zc-l~nZ@zA>VU$NpnBsOssUfzVNM^OHpm)-JWG{aQu@aj6h(bq1m`DyFALh*jv(%WDb1cR! z&+)CiUPz=h&(5SVYs&Ytde(#81h~IO(AD?4wN2vbB$&X?kVK-Nmr8f$LLb0QL@9$Q z>li~g#6tO^Q?<0Fl}kOB&RC5JspJkQRXbc#*OPXkJzBE;Aa6L2r(D5pX4iY3y8}VN zt8Uy%JG#&OKk!iIk~nPiHOxAAisU58F5)PX2cnmfaMdm3Ad&};h_kk2`L{4)leJ7F zhN4Mr9a;C9#Z))8j<2`#iZ+ZUh9{CJYgaRq?>6o9xLnAzQY&5gvm1Osu`9AeU>tOI z$b?@+fry1b(shLCjEv`=J@boEtvIQU_au7ND&rV}z~j-`h1GOlsI}1dMIR^Jo55^I zPxX9Uu<2m-uw@v0uYUj)*1*9c=;1S{-QLRQ1eykVAxKaV#Z%63|9J~)I-9f8oSU=R zud@w)*ImmEqh}J;F&i61=iyzy2iQ@K5M`H0J_{oh&OQ-$<pOLo-qA0;MRBYhGYHZ<2kMS98L+Kk2PsA{W6!)?i#e~@x8K}zbP0eH* z^F#X3)JZnz>b-C?1{BiI2@%=m;lTkAr(aP#g+{E2wCPsR{e2R@6IZaK(emrL=#+mT} zOzmtA-YRf)7&#@H-QaFLNkXpzWI<3ZCk&NsG!PM-{nb^*S2#;z9@1z>%JR`@2NRO_ zd~~(*HP&ECE}pNzMULP?*((%)W{i4MNzRikNAn+1r#BxCWDGG7iJU<8NH<8E2c{g} zb5tA2FGrJ3|BB6ZdEumWfV;Tr9Eqi#G3Az5OS$-Z!Dg6~Lbi`=yDWoVsFds5l>2e2 zfFi{qsAhI+j{gp-q6+`MP#yPp?F<%y^8{T9Z3+EzY!;Ngun^iGMr$f?8kzKG^l6U| zx>I^5KGtr}9&Rm$s$mRXW%dMWk)4R!&lz3aXcQVagk5!<4w@~AzJ37PYZLxiU|~>f zf*{bfw`io@jsNoN+*~faR=G91h(SClW{j2{b-w&q{Qmr$?px`+HnbUa-C3~vVB9ge zV)`qJ>aO|RnN(d1ErC?~67TG+WAVto`o5^c&f)Bo=?I95kJ4o8EoSOQ&Oi`C=LB^H&+(O!h+-)ie`KY&o{eEh zMYOp(?CGxNJ;imKxtr(sDG67@#M8Q>pWSG&!U{i-&Z*gSTrT-4Qpyzj{XQl%Q9MHM z6IH|P0DY%&;B-^zkM6dnrJUxY21ie8*_T+)O?!=n-C5hgq52R<5AXUN&@tg~TefXC z_X2kRCrj8y)U+}7mu-GKLp375{cAu0&L8v%(VX$J(6&41kl1Ql+FehC!ReL*{ zCHH)CV@|)1mr6QEa7e$eVW~_tKcCOLdB*Yw5(zeA>S(K0ClHBJxQ*vgtefb5tIMPN zJh3K_9-N-|oXlMM+X0l0Ph%=_Ey+_&#Jf8HwyW_sI4-vmxTc!*p{{=5uDi#JPI2Ty zI;Z8*np$Qisc^t|8E~Q4eV4MY%kCSWNN1&|-Q~(f*!!y!UawX6x!;Gur|q>yT(kX` zB(GivA2lm(t##WSgFSYo4}Ucc7-dn!dw(K))nFDH)gEB?f|#&$FkgxEF}+aNq3<(3 zIL43xad+K;6Wr&&%ep$(JhKk%`sJ`vun7}W%QO43j8J)i=1 z6lg(=3fGyDTzJ8n=lAesRD+slvND@6CQFm*NPgVw>2EsnsJ&T28+~79JdA9uPw92k z+VFJUU1g<$paH_kHDOVZbsf+E=oJ6ack!n{+7Vv1UVx_X6HZOAIi$kY){Y)!8ynNp zlasLNH~RYeFkimzG`PcQdNO|Ct_03`4~8L;k3c!u??Hz`?qAmWt zo5&lglZ&x(60xkqY>mZ>h|@1E!T0I4P4?AH5kp)f4r@piTS-ktlZ65+uukXyFUfEW%>>2yd-S6D$?$;pYZLsK&TjcYoW+ob;9UMm4s58(H79@kxP&NEF87@m(Q7oU{Py?$>o8BA zV^gFzZWpnho3L?7`vtakfB6H;;ti1=%*wpr1U#GxZBpTCJpq#fazMDz|Bk#6@f}cHP&Bb~D}%HLT_8Bg zApBemb zWT;2QIYM~`(ib&xnv$zR_v!14K)2$aBKH@l@!AMt0lB-vG^gPYL=at$cjteNPqi1riXu~p@8%BqY5p&JKmx0=?$ z;b4|4ym)XUmAcEZvji&@^ZaA1XMigWyrMVaO3|(zj%#LG#j9zD>t(-rMe?^V8fH!!-cDgy9nE_S>Vmbf z7Mka}jLM{k(Nc(+KxH72jus5*NpL(BntV@nQ{ae5#Iuef&e9lir~d$Xex)Dd!oi0a zh>&88LP#_rNAcZaSeOo#|Lx7ZIr6!&7H@fYanC#9B7O8ig|W&D|EU5FQ;_Av`ZZg$ z7lT};u!ZnR^jUrRrNtxZ4fYKFQXm&;EzkYZ=Avn)QUI*qjdoB=Ye^JIHtwdk#9;<;jItLu-lKFNZ7cn;w50(w^WS;#Xh1 zz-E4*U%$@T>?}SYurGd$bDFZ+!8wK*faypJ5?ljjYj;zi{G^5SeH=|{t799f!?z_a z#F*QNwvocTqz@^j*6LjA4}72HGFfd1Y+uPKsyjB)0O8vuhLMx}{jG>W=fQLs#Ds## z+Cae{Vgt~cFr#Q3gTb7xqe_K&|1EqlDrIaHu8D9^lYXj@Qx_7^iO3lGO7DJQM&*cG zh0LO(X2O|*mPPa5Z=vN+0%Y5!rhBnk(u{LQ)1lJ~;r!ifE}lqB1yfd5DlIfTFCaok za(f%*ndXUNi$wkq ziGrD#tPvWY`e>5ACR@?(##V@7VUT#C>j(G)4(^FrX*BUJc_nsw%&MuQwr|WB zZEK_f+tjd)CCB-6F$!?5TtRbnz)Y)Y)5#1?HEm0)4&6`lLiRAl7RYW7Y*b;G(%^d{ zB*kxmWL2mwyL8GGg=IxYST=P%`j zvB@yUB%rwNG7Q2+Rd*?8Lgf6F5 z*3lP>Q|d^1+8bK8ha8Z;hjm`DQ!MX+Sw(lMS<}p79E5+T^(MQQq*3JH{q6(=M^x7# zAzgsm{?r*yC^~p&O_vwVsjOLwjVmw_XH#R&9y-nZ&TJLD9z zX*txc$&JP@?u}}rqZf}XXL9p*+MgQ^^I^vMXUb%t60IrK9thbJ>HwNN@HyzG z{x%>H37oUL9?JacLwBH4&zqO`HoWn~RLWaa*R}1vNl znhJtrzWN zAvQc3uFZuer=xRQM~=J*Y90TAqO5ubTD5Zcsj1XRGWiq?>Imwx3DZt}BIB^l#JPrZ zLd>|hKgK|hN7vOSpF}35_}O(N^1if#b|Zgwm^BWwBL2`DttZudlK=b?yfw12f^E}J zs-RM)n^O_0it^}g<%f?wIjb@dka<>G>FBH+ak2?JjFz{ht5;uQo2+SCNQs`3$QAEB5cAX}5|--pc(Nci#h_=8tpjDI|Vd@?@bnq@cQ3*EzDjZ+hhj(WLE^ zExXb*GPW!^3Dd&PMGpntM#C*}f8x{paX*(Q){JzqkP?VSuzpyt_smOs&I3*-HigW( z{J;Y*pUd2Dn)he;#0xME0{j0b_?&?Ifg+|T(Cw4!1tDx?je6xa;)5T0N=7A0G-E`h z`+%|e0KfCj(;FM$LHwY9hYu`k#BkQuCza{d%c~=qqbqh6_S0=*jlLyhjBpxIGo-3% z@oB6SzNFy;W{Rac^V!d8LeP$TGMoJJ?aq$N__uiKIB##n(?F&dlEBLeStE`D;(B!i z5&#PeU2v<=lG-I=i5WV1x_sItSIFo2s(YGo>YY{LPj&SMZcQ>t znxiid!Ksgj4)*jVk?;EGx)rT9m1ZN?Ry##GhI**+cb76|(!2ZHg`uIsL|B$`2D6Ge z$INMl6$iJI-NKfKxkCGxd{yG74G__RqVAejZ%hINoIRvG-eaKYq<+eCvS{Fej(Fe; zcYHk`VmTwll7~8H&;GfHjU}YkiESVV!BqlfdazlCjZi9|SVhu-_C3|2{G;GT5RuaU zG6W_R764BhEDqVr7!Zs+D3wm-)3E$Eo$JoZ!b0`#%KCaPAJHuR;KBUf_dK*(a^0rG zjyU-+Yx1ZQi&nv9P3OjKIHP`yGpdKD=iTV2kf@&R9emwK^YpOUGgFs7@)4)eSZH3Q zw_PW6o6NJ(oD>c(MpxCD=N3V*U6X8z)Anj_L z;Lsm<$bh@B_mnWy@VLQIfm6%9)OLnAYmBcuOU>oww4p~-L)+WSPOYd-v*{jPX&=e9 z|HyGHUmjs#O_o7(0FL)afjd^qN+Fj7414&?F2#-ZML+VU1EcPa}aL^sEmzM3C58bHYzK$lG8MbWvua%`U z(#{r|q?pc_O7*IBUA7Z?Y!qnP3u#D_Hd~xlMzYgh^)!o5vhOoJ!ns_ubqAywao3K3 zi;i2JOgP0VUWOH1IJTBoAGZr4_OT5=^?!8br|Xjk+6YTXe}eP9Yf<+O+;?5P2)}BH zJz=l&acu^@Am;Qbb9pnmbUZrxogG#VZBMeY?z8D}$F?dA$Wzh_2O%$n>5ajb7!Hs^ zwDCy`pv6-^at#>~I;`IUN~no$*yV;gvmr08*l4>mthuR3)>xKSCnFWlv2$ZNXQ*=$ z6c4CBwJ#Ib1HWN{jv#*ALvkm!8q|KE2EPkjV zaVc(FhZcNc3;L|BBQkD2-Uq6e|_I_{zvm?w9nj)dx zJ|(9c*q5Cdv^&#zA{I@A(1?~9uy=h+jL$hJei@WW^n@ zaC+-G8<^(UZsLD^3B?8p_ z*mkrVyOa1?N2;~8W-Z$=rln(rot;n?Qzmb2W)$Wn?d$^}RWnmJCAsRLJ_lu;l_JaV zZI4*NmU(7Qskvqc-c``MLsmi zB{XI(a?`vidtQEFv4AG5C$q?yH`1PBHnK83Yv{l;qORlL2YI3dFxA$V4z*YqY2CT5qx9*ii|VLO&f8Gd%&veSC9dMP# z1P1(!%|ME80JLF1B^$EhfygW#GwnQjgF33?DzH=wzLiG%SF;!8{zE*n$cIJm`pfGphSvfA7 zZ`BdHNKwBW_Lx85vtdxIL&LK zI-rPgK*I&WFY-TxRzuTm>;fo2kudtJj_ol6#o1+h!Osmv7vxDy>GY{nr@nqq5im&$ ztTc9E`>@SC`G194vr{SLujskM=sEObL@T}rZq%Tnp(huCxfzHExX~T6q9x6m%q85Z zsHM%u_oCq6v|8nyIoysGxNp^}1(S@q=z%u@&-FiW4h-OfgN;Iyg)xik|KgwUDAJGD z%ijXO_WIacQR$3-9~1cEA3z7texT|&ky*f*Iv6PxF@E|iviV6+}V(HquY~N}WEJW9a`4Hb4l7@y>hVP@d-!&a(F+=&7AGSks zc5H0!t3rGZ1wmip!ls^wLClR1W<6;okqI;l!lk|ZKe%6dBF*e@xrqt)h z@^MQ2`=w9@UW$=*L#^L!C)2~|oHoqTY$J};AOL6wn@yyviwKp+pvQ=hpK4S!tX#h5 z+me4qk}G8R)^B+NO}K%f?Z3P$sm@1C+`M{1$`fOaj?9du0WD7-StFSx6mjyVkOb5 zSw^j8JOh?qdcE?=F&TDiEgS-EWe3DQL-!=t{dFIEDB#(po;KoiAX)FP>%J}6m#62= zb@(gG`Zyp4lc@#@Uz}7^A4*QWnw~5aCi%re!I=aBTIcS|lQ}z2fX#qkm})_2M_{r$ zw2owE26yU8D($bpxVin4%h3+Mz-Ro1Hkn?{T)41ROrufo%PfBTeU^3KYTmQ*&EJ^4 z;(%k4W9`-;Gyf|5KULHXQOxkxLxD6y_kP$81Y3dIJyZEcDQjkm!*;T$XD7kzGY)Q! z^W40_STUE(m(CH*Gwx5^G!(BTyWc`Y z0h&PUYS9xru=+)hL2%&wyu1?}!T%;Lo`~Gm;RejtNjbulmH|!)Bl-a^gYLix=%vu4 zsP&ec499{SPcy~E@e~uCvAH$mFf+=BDH8=^c!P|QfNSq(7?UA-0}Cq?a{#G9<{=2= znIT_TaD$qOmL3yC`~BY4G0RT1)tS_EY%!H?@#r1b^l*t!gN4wRONjq^N}9DMzUOBY zQ%kafp);<<$0Ut;(U4`$39VH+eR^%#W>$e=b`Fc0pch5XwU3>EWRrB0IABHSBB6%p ziSQnMz5T;zXnW{|LrY7GPNT6{zl+{pe0z@PIR49RLUkMs)CcwsVM=H%C~n>kRstJU z?A3l1ivR@o+#5VDg;E7D5;F0Glh_4sM@#{F2(Z}{NNkK%bKaOx_1aWs!B;A==3;dC zX3Vy8hZk`kd+~y)7^|~otI*m=nAvnTJ10(N3AJ)RhAz9=KTG_;PZzWPhNld)+dx99 za$$)tJ;PhAC8}ClYQ67;w@O!IPAVTM0=V;LtqOqVxfy_rra9h?V1{W^+;TREQCxj|a(gM=R+FxH>-h0@%1#fl z4Ac{G8~v^D=M14Cadr(L|DY*pYvU3(>YYHC-Nr1aQ~6=n&T^)AR%68wkKZvBJ-FeH zB*v3$R2$P)w<2ZF&fJhnX55!i76KYFLT?xhY<++!3|D~~DcA*Hhe1sEw4jfV3ynhO zMAxbvg#N<75kv4XE}R|^e~jb8lC!-Nso^Oc}E1j&YVHl4xLSSm^xD zrqttEySlhiw4LqaTL2H&+Oa~>JQd5AO|;^KA00z4p@63;uob$vd>mAm0J=z~2kqX| zyQ-_N|C;_jyq*r&CBE*VT^c$=G3T_VpP5Avmp*p`HWc*}cVY2TeHtM9B40=`K2jk2 zvrCq3;L^}RMNMt#{bS(rHHxMeKWnFuSZbB3p?)R7Z*3u{k->o041^gCYuAYhA)fBWO5xBt$ol7g#5K(c-kVu7Vv8JHkP<&KWfs` zVIsH&M{A}MhiB#z zxD6W@o6?bg3@645S-A;qV!KyeH=UO)Baq2;(Z7Xq4FRhYdE2k^BysCooH3m9&QuTg z+&HxcmZ#;9F0LIcm_@)r5vsWdbt9%zaFmjYE~&%05YbPd#%yf2Znonnm8+JJEcLBS zaXuan7p0;F9yaKB;`9GU=r*#k_dA!#a7<-_2+%SZo5BL^6&UM$s)z{ zDF;h+UjsUpWKhg1ZWHW6I<-mlbgi5_=lJ5{)BJjUhDr)k}Qp!W>p=BOy zjKP+d?A@p0@7OdDfREvfqTU2l7i$WOlkCCQRpx*Yg5(2F63kejQ=fMd)ix@c^9^Oz zyXT(lc~A2!d*qk5RZs~kNge!$+V>?51!lZa^I2tx-90>nUP}DUxtvtYhVyx;B(N(n z!CObz^*};<(WzUtw@AoQY$A@fEi{vZ?;qju!$@UU zr(xi)Xj>g^^o)wqQHv!_C63Az1F=svZku|#u3I5CO3he-vdbcS5;vNfE%r0@+x~l0 z2)>3|9!<;+))E6C5nF%_YAeM8=dZ40cA_D?n?Su(UI1SYXx??8MB zm}tytPc!smZ=@T(EJrs#&KWxds$$t!n8wpH+;u}}5t~cQ_z1QEnaK85z^OcUI`tmp zJX=!vgU^)9?3x=!1^XRVD}lUiT;x9p>(ukndk8)fOo$@sVVI5mE11<_o&S=5!KJb_ z@zO01Z5$8fQl_7M<#UXEuI?;|KSLUV4w^$XZPa(}S;!)tNeC1NPu5ky&~4pPmoEa= zioin5QNuB(Wi=cSe>^#l3TQoZ@4YM9@*QISHlagbfLzkJ1D3fiz5=teAHeEr6ABd` zEvta`oLGgIk_Uso&09=MYOa-5lb{nz{bp7w^LR@ePDnXN_8m}}nSRl=+>Qg$f1CTf%y0&HWh-{F!+GnrD!L0K@#MmxBR^jl;D5xzmitdhr@@B znpSqyScJGoi=pkrx;+*_DB6fyx|+KXK4~FR>zPu7$K7P9Fp_8%*i2*;|HFUQbyMRq zEC^`JHyq2=JK;@N`!!$QB4wgaQe`Z~_`Wias@==hjXJD|*ON9Pnzuej4&)6?_62auS< zIIF9$(G_2JvnPukW@VIV({gh73)r#JfjP)l&{LKeFGk?4&6AXgg%RRRzSyA2SI5vQ zWCx0f9;W=37GZaxO-1XD;--2goYWl<)M*(#gEQ6)*OfEO)77Z1#XaOlEN9oCq|&Q7 z2E^ZteQhe4vOrDbTYh?&x3+erJ5x~}Lv2zurDU^iQb~&3G=>1VKY#4xphRZzn(Bu2jZf zm?)QNj49KU7q=Ih^uS>TToT#s#;v5mTQ#aBe2-8$mYZ{gkwE*F9u3Zx$5xxD3 zWqXoAPCg^{67{zf86!xokWRWc1_INvTgm#{j?~dnnpp>wiscnNJr8-Pp}i3;Sz|Ho z6>dvIvW<@KD0e$sy2Vw&2o+y#i|fLbI!~gaSRy$b=eU zkdxaw*cnVaBik%yNnoCj=@L`ovKF=?&gNWOZ4aHhb45aE&eyfMQWjyNH1bs7$Pwq_ zce;4R?y$viLOwc{GdN3vqlA>e-#v5>UQZm3YsjdfwL(T+@r#|vw(O<9pq~fT z+Y%(!P4Dg*=#zYwKS1}|MC{{BIJXG1)?bmHKSE0qWcBWLF!zKjq1c%hRQzGsq)6#mdfNfPx&H6=jfvUwXj8(h zBno;Uk)U-irQXKOd>$D?__eP770-*;z-F*i)2b6}ZV5dZ=Gc`hcq8CMtlL}URopiV zIU~iB)tqP29|G*3@gVBJt$oH)Yzs7yRK^a8Hn zd>PaVV%OqKA&aM{A?{fp)5wvsfBLHkJx?2-8$Xw}A%uO8g=y;wRn z?u_%zy%9q(QHiOkG4&LE8%}7lq`u6GpZ3W^ee&67pZl%iT75X4mORkimL&RCL(yom zgmntyoRlxh;#9mfUxc*^1Xrva9sE5j1(75{3L%s`OsF68xAAqA>)R~cPHbwkYEoe; z^7N@kGBJh6V5g}0RASv%Vru-GRmN+Mly1e;`&xGXB*vmqq0_Y(ltqHe3FGmtWXM*7 zxe97H3AbJhqQ62lh!w*I3bZjP(O!JAD`t(^&p7Mr`4M=~PNu4~3(LzbI#4Xz@UGc0 zPp5BgWY~5GkJLVWs_i++sa*zeV#&zl^<1O-4dPgF;G}*e_BG`vC<8+^NU$mbkEjl#MT{drR?m9rln5IN<~m?d+T<>LOr2%+(5~I z@eWtk(5csR(y|-2>Ur(vOo|m3!qQY$FXblClq||p6VfPG-C6SdSqPY&j30`ZJT;vh zj)xE>_Ec4-^O|_ve+Zk3d?$*>^;eoU9IoC;A+#U;?uYyl&L4S1Zld6@c(T|`kB+|d zm%9F!fAX94Y}U?hZ)cBJ@wwDn;vb>&w1JE@&J=u%NS@O-feJ+Jd_Xk(kNDs%5Ti;H z{N6KH_>ql`Bj0TKJ{k#W=C`yjt++>(`_iWZ-s~VZMEt{Xcwv2nM1SYvvvH$fw(%|9 zm&Sf>G2y5SAHC1xqhGsg7I4Uz{6qkf_yZVTJVCX>BPNS;^W;TExk$`V2Y}Yz6Z$)d z(FMFNWOd0%=D0*O5#kpcHn}r&wG87Z;gQL>-0~s z__pSxvT`k%YoH!KV}bia2m93G4asB~OOw!H#)jRgrJ0(I+u)(VGlxaK`kxM5#!4c9 zip>LiQnZGE6CkEFPypXktVsOqJOZ4HE8$wv$d%0zqa)8;hKG|#BHWJ>STlv&Fpe}R zok^6_qxcPtI}aQmc^9Pn2VF5SdT5on*TC#zixA`%8;C|h_w9OSALsEyh@}?fYOYw6 zvT2m_q}$wFjA+LgJIz5PmtcxfH?jr0r7l*1)3S}5@H0{<`(ZM3<8~aq_zbUN*iqB^ z+Fflu&OIcM^A-S7+)mdRC>2!UpGyLZ`XiAGC8li3{!m^QA{HIjWmEUsU$2N zc?hC`fGyhVClK(RlJ*iF`yeN~xYKL{XAI87{gt2D|NZj_kCcpJ)f&@>vr8z2=f+iT zIg4HxJsL(cZbv)1%2kuwR}uTZQT1#ee>`Rxt(=r{!QU7gmWI&B+H#yq$z$2JFXg!6 zv)G74XCmPTe~L4aW}T{-dsb-=K;GMUOu=b7}!fc5wbam_vvCk@X>Df!d|Bx-@5=prG>_w za}*?}yZ;q>y!!ck_VCu{HxH$9Ikq_`ZML!iwCBgO0Ei@6nKc=CwfItIUW8pJ<3*bt z;|MT~-l|s~PZbGwvsR zc5c_MVXp6heElMeMggyNqN($#Nj&=#Sdk_FGh| zSnGbAxA&wMRuTMMSr6AUTDoozDHHmF{_9>SlaA&SPr^awqocoUF4NDrQxAVEAevR<}vKEfY*ZNJHXU;clG|x?#=dKtcGU( zSc%W@QmOgd?Gos1F7wNrU&ael48oBT!-JPL-)`G)Z+Xk)^HH50ov$~#2q(%e;dJdj zCoOCL5_t*IT)2ehdK8oerlZEkr$_LbeUdv$c@r(;rl)U6)v|=?EQvq%Co+6^s8pJw z|8P%9#C-l<u3(U!3K$eD1ogUvIceRF_IM zqU0wAF}d!1iQ&^j1dkCov2oHycuEfsLetp0dK7!-R?xAu1Kyv71vV==$FlLLVdjve zG{6zLu`xftauR7lPzKqoYNLQI8)4`p4F9zeO@W>e{Ag&Jg#v~uquA2t5PzfkAd0^Q zmJ9OZ`x;{3@cIUePpb)3GZ-it=G3BBGQpdq$dSyeQiZQJ(=J#)QQXW5OQt$$)U$;V z#2_dR{2ZQJe7ab#Zc+sHP@s14fc3^ZwA5HzGredM^x%Ft3&2(@D&J_Z(mf?8J9hl= zm_Bi^!I%a4I|J-xP|p^u4OuQdje}cI)OK*EH^k1n{b0n2poU}O-b!S9azng2&WC^H zj~$1x_r90SIrGkfd+=RUJ_flvD!8l2-Y29Mp>jnI3-X1}r$k0K5hK)^xG8A+6lu$O zhqIxN&slSMEmc(;{s$NKzPi)7savC&{Di+SVofS`4)9>~edQb>ak2@vM1Q%PuaDN! zM~jufIk`V+J=av~f`Um{#3Msw;4j1*XFDiy*gB+K% zOQO4;e^7ps_Ir9snn@eAQIGSmZKX|=ub?a`uCr`ObK#*8$2sNu0$g6ts_2UK8wM%PC7SM@ zw|?i-vpXH$uqqw~rZtm`hv(r(%~vkb+bh>lJ(0JIjl)Mq({>6vbg zjW*mlnj4D!Q%;5=C7G_z-TSQWZXC4k;Ah|Jj|aIVQSE^;XY9SQ9*Xl}hYiafbS5&%mTN|1SXcPqj?5hy;Vc!I zfs|&ds6>u|Qm3g?Q%cd^3z{IGg(7#63FBjr|)}BB=M@7t8Fa9}**B_X( zH_B9R8~0@D>>7IQ&X1()gyqiE^hS1cZY@)*Az?#rI7Yd3xny}xV|$~H#6S z0T-!c(a-g;pTgp9HJU)WLGJ z>TI3ZLRq9`qHMFw!2F2tO8Cw@qL3lV)&4->>Gtc1`#AlcJY!jeS3kJ_E_NmO%9X}% z{KlNdn{xRC_E|Ff$_K8vi!hIuSVTu_JK<8fda%cPc0XBoO_9qc8}H|=$^Wm7adr|E zlZS^{)oA!UH6oY1M(N0r;G;kvFejEXg-T(d za1jRA6I;&CTpGEroRe&tL*DF7hGe1*GF!vtWtk%b6!+KyHd;I7=EpCb9nILeChQaH z#};te2Wa*;oYN#0LX!LE8Wt%yrT?81s}3uzR(VKSkdGHvX1#G^EXk+rS#xFqjjx+a z?boC@!cDAN@$6#Wc2-MZSguxm!!N8l8v&r6d|=`-3V3${?y~*e8;B+CZxT|m$;nI* zgAv2J4VKa3qO-Nt=^Xy*$N5=j)(M|h4x@MiwRevj%wSNv^u^eon%ONJirbMS!Falu zQ{o{Z90g%c$wnBZvjumfL!I2h4m>uDhGdhN+dG&>xaFv-nw*)YgmGnN_oAvs489yS zl&r8iN*{CF43Lnr2MEqf_WPl9r^j?B^67H{S@iDemE|n3xK!j-PyZ=WZvqyzr zLUE8@RDJ)96LT;F4Kgs6?wD?0fo7fJU(JrKRE~9DzYkE5|BP)v<1g}AXBJK~bQI}O z;xkvfk+j!YV`B5;x$%^Jy-CabIUcKkI41>7}I!eu7UeE#<=}PGD_;QgrGy zV19E5;``@J^Blgsql&Zo81DIA@SflV>Gme0r??Y^(Hg5fc86`I^{>wfe<^a{QOF?0 zolNoU`+k53KoR6RaBJZ>HU5rwoML3?`Y2{R9GlZ8W4Wf;`r^|MJ^Wr65Kd!#E@^wC zxu!KDY;QX2UxOFs!oMIL2rVa647rVXP6ToVy-}bWD5%~Lg4L^%|FW{;8?EPuB8k*e zJW|x>5-V+RuwE&~*u1)uomPjE6RdQS$7l4{(smPIaBe$Co6c4`oCLKy>U%k`sH$D4 zS`LLIFs2^gCNY~3%BH)@Gl853^A9=4IB(r_bbi2^6xQ*H3IYT$9P#!Ew(1Tgrjq88 zI%RD+vuw5!s?Iil9~K#Ug5p(ObXrL3cZPB-S#)5nEh2q_2r~I!Jv~G*M&eqSKd^jY zon{G>Fi=;7!dEdCaYWGG7<5!fS_C|Ub_q!gef=9{>8!Ln?n} zqe-?s=~5kjTu_TcGb%>gGrcit8m|Dc3E>_XK0OSaf4A~D4Npy8;~r~%`9mBv+CbIp zHTf|Q@cuZ)*{m^kQ#TW)R%pbF%zPi(pGTGK{I9$#i;ZmDi-zJ`caraO0enB?SN3qD zL7!{74>lHwUkCF;+N3wWTcl3#SpDn+ANXAT>Q$Q>Lu4B<9$ia?)vDTbsw#TS8~I5k zqeNfkzsvtiehWNcT1ySfwv8yKW5n!8Lh}qcVN&coz#dYaC7~T~Z`iV=yCxCI4(z4w zen)y~@O%t3{mJJxrA<_Q89+1O51*DcLaQib*jsnOKa;dO+N3%E9ggTHn7tz{bP4XP zpK>0jPFO|FF`I4V^bz~O>Kp;CjP!fY7u@%mXjXa`skebkcu%)t$^JrKID`tVwY5Vp z99~^T{rJ|Dv@+T+Ub&DZ4{RvF=loKS~z_ zhr9`zn|^2{hzJ30+FiF(3lS%>xdR+u{92V!ANPZx)aOQiNUjaXW{b!5S(!SY{xOdL z!UvFz3*zJRns&}a3IK>3`#hV2WlQ5BPM3c{Jt%Rxri6alpA8``IBzg2nv|d4ck{WK zDZJ2%q`bDXGcj=(fFVam(BA{kk_p(5X2fP*ybXP3*!W*853!@Hb!4onqcFh)zFje# z47zT56cY}5KoGAip|Hqi>dMOi3b~(h6tz|X4N@S;w1Rj4;wkmIl>$6jkHp5Mnr?zx z((n_tw1J>MKrv^}ruf;neCLdPz64WRvpa@ofJIONpM+~Nf6AJ$?#j`D5b#0%1pAui zrH73PR!Yo95TT>>>WL1m8FV&H6m2h9dNUWBQ8%)|zdS6J#}}s;K0Mj!tggD-30*(B z;a<5CRj2yCW#l7G#)&B>ZIZ)D=O z+fWmSQBlTZI2l8(_@b`wAof(e9k9UO{{0!|An+l8C!^ib*QYqOg0Od2F7{zv_dfCn zC)>zG=1uoEKeaSA#wI0xB(K1Q`}0d3q@0gMfwoO-;dEk|h*NeggD9||&(Dc?LC*&# zD^cL0g8SmJ`*D*%e~18wIDfi41eI$~K8gJ~Q$9y;kA7}5t`eHpv69Myml=sI$+PFQMLG_1!*Lv9Di$FB;l02{2>QN{H$JUHnZ~%B)o8ru5d#UBl_MYaZ(75%$Gv z=?Q{RQnwx2pS|9|L9KO{Z5U$_Te4ds)iwpA{n^33B$J+IjH(`lp-1+7cXs|Fj0P2E%u0pt%GsG*J|k6YiBh3p zz{9np#dZ{t9D?zE_uU86($JL$&#ugCV@vm*N{21olyiGU_{pPjQv-^tVmBHDDhN24 z{}DOmKwe)Ly`jnK$L6WZBiOOQyEuI=|H3Z-k$&b({cCSl?lJvjET=}IT5?-mOuFuv z+F;3yp0`@xJw9%ZnxnS4okazatT$%!K*p4rY4|`EknK zx6rk?12KRQ;HD%MgNWZ55%LQZmoRLxZz{K=<6|?{QFfhCeKCfpH&No2T=Zv^chM!S z?NN`k@1;55Gmd%*Ek0a776BVV1}B^)nGfsw!!3V}^4-*LgyN6H*3#vnq^(Idw-5+S zeP3nLA`qEb&-A!9!Y4F~Wyg0)7x+=0QVYeI`H}T}p+GoKv}ZNt6z2RLmh~pEhaoPE z*J;#!lC2!ntlxk%$e8(oyJPlAU-ja&1NZk$FrPz0g6p%KFQc!h%1=RCSnku#Ik2Xk zn9;|qJf$Pfox8Cym(0o8R9r2ir_<7V67pN)%&D8%c*UNwCn+t_m4P1(@GS>8yRHoE z`}bJ$?np>~U3>Up2jp$M$bn&aMl>3$ym*oipMBUc9zLS6W|2mT&DAL*u^ z$0rU(F|Ek{it~`Nd;@+!ceSw)zoM=;EUOOwiKd}f<`YWVTDqFC5g%+gML?Qgb9pQ~ zn$3?V;hb!g&aH@}yLs;1))}hjrQVzW?}6umnUBTUFaC16~@5N(eowAcD z7Bl7VkFe2ms(aTcdqVUL1wXEccfKleVm-Tq{wZDEj}qrh@ZsWbpx*wgjQ)Sah(Jv9 z`_azVU~aKEw7oqS--4BqVNbWM9DBba|6*J<)mX-EJ`HF}U~iEx_|tBko+UgfjC=qO zK-+VFY4AXOD8|vXIFCoRp3_8_?!EkJo_=IBB)7(>@F8x@(2rL4-G8 z(Hlu18Z#BJjjg|LG<^xL!sjP;kn7yM;fDN0!m5lzHct!NT)z;)iLKYGjby} zmKol(%a-~Ib2m5P!@CnS359Jdq5~A^T1iV{Vbv<66h+v)687>>5i@?Zi!dZRV}kb7 zz-n~oKx~2iI33127(>30;)_lulYQzJpVbSg;YIOcwqY68EJOK&{Y{u(DRzN%*dE@& zw?E4oauOtsHel+g7$Lnvc_YfF+PzW4_f0(^0FCZW#i=qV6F5PGvHXz}GSJ@4H9(Q9 zDHXLD8Im);pF@@f&?FFbm(uatloggO`Nmx?dNd{1q3|ZBb9UwA6(%=0f{Dp%S5vN4 z80O^|m&(z4F#-4jadXj`LUpzQ`j={v`}-HrgP!Q1&?rzuy`6J@MR60+_0N_Jxy~KC z@x>;4Cr2g2X}tarO;B}EIyzM;kC68IgPQhW(_8UyzoXqVjB@A1)+hY=Da=PtCLuIk zb%j|8OyqK(PY5xH#gH(Y-{qz>$+gDjMuCtTpP#UYL-yMB3}exh!DE?|l6(F7_3u|W zOXQgIykR_#CR-zpb06BDqk$QC@nVIyIM^%m-SGsr@sXa4h~3fOBlPIKebW0%Qcc;Q z*VEW8Qg7xU6j*P3u)x~3-5wd4o<=Pms^-tOKA|ZLk78z74H(R@3u1Dep)T zW|HxJUj~y*Ue2wjS8qKpemV+#>j-kyvoYtktZX1@V@Gvo<-<8YnpV$qejcyyTBw6S z){#Z*B;-F+0STMbId@gCtr^Y7%Jvuq$4L+VK;#DM-5vu$fgh5%n8;wUMZlzMvO@5M zutNy?zY*EekJ*V1(=w?cx#%{gQ96ENgcWr^e?~c+8IPkJiYJ;gI4G+3DwohISA#Mx z%PXIa>CCCR7RXp#B;JxPhzvW}D|HD}c(P$NC0(0mOmE4yqQJ@$_C=4|;(IuMtD^qk z_2-CaP=`of(XiryzgO0_b|bd~(JCA7Q>w3^A@ z0J__K>g{MF={a+37KIc|lREyXx`_V_KC2bU6p!Y&`w8DhWCsetPo zc%VG*lEXi`kO(2K!? zz7r+oat`DI7QpzWo9Zwsgf-3ge&H&oZWp9~KOpva(5Fmz{@oR%slsS_ODIee*bLA% zlrH!ql&!l#kFttPR8Z-u`Oye=Y?^6bgy(KO= z)cGZX&<|QASO%3-qX~|lHqC^EFs=bt2E@ANE-@_d`vBx+M#*VMqHsX0Vl(vX8LnqX zqV{RWMpO+AMm@z+JoNo$@eJ3%m1;^!)I?gRZ2WU%zA{QWsYn%&A7Sf7qi#H_QSn!R zTckc!y*yZ-vsVbC(C0zijn;lpD9=2%Dev%mKq1M^ai*iQFZU>ZsuqnBw4;PiLHft3A#7M-pRhDj3VV! zx++F!b9%~w)2P!!=s}_gh(*;N`}(y@4O}^uMhCBCGM(lK*!k(>dm2Nq6`VC*SVyg0 z#5lc+;QXO2XIz=^(Uf=AUI&g7@n)Mr{oqUTe3nFHd!%OS?&_mJ=>gm6n2k25GJ-h$ z3Um_H{{>v4fp^;TKWM<+ttLc$2Cb&!E(rr^Cc6Gc>CDfMz=Rr^3rErEGIUm*%b~|C zUN`J`#`Zp{>mT*DR!VyQzU^o`6?Kog^Ul1mMP>L+R6j=Ch`r273j2?^3WQ%k>(bLc z;;YcrSjnD$0KGow$6kKVdjOf}RBorY8r6Adc^+bzFCMd}H6n3V?fY32Y2gTo!VM#t2-}=+~%uKxl&aqQ2m~o`lLx&C@KKo|CnRaoISop--`j@$Em&Y5$XIE^kOh%+3e3)F90Q~t%XW|{gR)3X6axt6D{a7V4wj7SL}GCF~xV5 z_Sx&cdzqh3MI10E7sICHCgaF*M9UYiV^j{1djJzronpY{ph456yV->xA0=!Vaqa>n z4pq@jeasB-OJD=^Bp&*_@);hhkEo?fC3QhMHZ%(|#Z)8}pGqTlnV<&ocPXVLPqmd4vYNSfkhHeD{i7Lx@; zqlTt6XgMvFQpJkgtgJ{g8;NFl;bE|-%J#^IkN|}QVLcPjZ2^C3fGz6fU8ypbtd}=b zuL-amZIQu{PH!{Qe14KAc5!0X<)KWe7|*4B)2e{Knw#@Gj6KJ1Lr;prc;PmBE8GBC zU(!}l1B=ZJFp_6z8O@S)JNCJw531^eZLoT5!kr@>d=dKWuMg~YHA){>&|AX4CSnJw zAlSX4X;(@}K;hr4AJ`E&We=8k!0CkTfJgdyHR5ryji^=nTUopvQmy1k$y?5&yGjzo z9Y!IZP|SEPg78CIyBUR7Q^5J|0Q#q!uBK-V9P9{j3|&kYh3y*P+{o?-_?%{ebnBlR zV!d&e3~N=kx#JL)4N@U*M7ow3>QM0}`mIeNmt^gXD6 z$3-#FNjf5<#19CE85ue!@me%LHnvs85zEJu27JXaoGDkqKJhV>^?5vm%wEz7OJ(%^ zO?p0<#jus28)?rIAA*Yg-m9afsiCt2Qw2TL{XY1420!mx}1l;Bj-XdNaStHt0xL45-gI;q0dAx7UCxf!7(ciJyJzo%}rzZ97-M$RntrS?QFB|fQHS!d^z>WPYyepxoO%S zaC#FRDS2axp~HkVS8vP@6~U!=1T}e4DG9)olF6h0M8u{IAqg9b`h@kO)uUoZV9(H$ z+zMb1_668N$TX!54hu?rg%{92T4q1&#u7UflS^UrKreWDL|Ij*wb63IN7S@jp3aAh z6SYbcR(DiSM9pwDs=O9e6ZhT*BK9~}6Uv$GD$6b0tIk5hY~h-U79}-mGL%K=1U~F> zqTYbjCr%ZFFln$s%&IH;^z)#S6i_5AHZe~iit;p0>QZT#4I?-mims*-1=?!FtusrEf~C8eO3kp-@JNo63WxFh}na4%4fEP^^3>S03s z%X7eG3Gb_$7^4mbVtlR$H9(V4EB6jM1B#F<5mI%q?A@Fmf)0K5A2?VJCLMilexNSh zmNER(2{tyiq?z&ILbwz|1~VM8BYFjx{IHWwTFH?KS&G?V)ySk#0cR@+N{0__FX)}c z3n2%ISThBbbQFMSl;np(aV3sMkxJN%xC`Sor8cs8el!*{5ved5ITzp9WU}Jfc0^9; zRe=lsId*n@H3WI-NkBhvO)8$owxVY)dj{U&h2GT|8g1%2)Z=BfV zX+`77U6^k8v$UD+LwMfz2yktoj2F>#`H^Y?U6_CkS7paGFTsPcFCo!snj`SKR#l+t zL@j4B?gQ%rSs?x@;_IcJay_KF$aePR7i%mO$9_RkfLx<#++Y8Het(u_ZgaKiAxGDu zx*i=V>f3l70)_1^2vbb;&^qnZx^Jj;(QFseX6Fv>qVFbB8 z-e;%k&L7Pov_N&cFLx_zDL;<;iaPYF>~07!Ks5i(cg+!o_GR1dQu;# zr!z`1C)X1Bx}3|_(Z!8k-|_zkEQjN{-aorUy~Jw|rSkFdtQ zdb$>}XEWlw9vpa=UAaRcWD+!7)Lxs+u>fRxi#7Ix*>SuU!_2QoTWTa0d3>E(U{}yA zMb%{(V2K4B)C}Fl@qPRiu1Zhe4^W?Yy5=}_)MtXl#6nvFbk&NvJQT|%hwe*!Hh&p#mXMw_LsM zJmm}-bK2Hj;R_+=B1@Am&rG1>GLl=i?J{elo^Ub);D(V#^Yru_ zid6B61F!u9*tdgtaGKGs{t#0t#wk`im_)J2G^Zq;-Fdt~<%4t97p&>!citYn)(V+; zE!cjLKW$aO76y1V!y{)wnb_FEQmJJF=CTJ{yjY>5F0dLkctO(c;xP4a; zg+d8tDG6O90bvRGW2$lM*lh8lD4%7#GtuV>on z)kFN~dZw+k@;qJBn>V7YG3uFU`D+>=b;#O?={3M8VO68~#zPe0t5^&wJ-;P&Vk1M5l8cJA8u<0wN6ed+6=4Z*gQ_q;kR{P1 zXkA^Oa+2WWa&1ROCcFlsRq(6E%wz=gU@@+TQ&JiB3iiYn_QX%cGf|Yf0(&XwbS7pN zUeP|<3mUK=TM{O0Xa8qRLI=N-$zaj%!wc=Wz{f-Q)1b#5;n{<}j5Ip9V!@6h0qV%y`48W11LlIK%-xx|chJ_dkI@IFN|Hs&ShDUl`XM(8k<(%rPoO1z% zLIH)Gy3y!vpffu%tD8AWv_wmkL`tHlL|W1)P_i79rI}snk-VCH#va?_Y>EnIH|1w$ z_s8tc&W{<*+A?j)Gq(5HAKv%eTU7v>l-EU81R8a}d(S=R+;iUZ9^(niE;RDJOe}dj zV%8vsY9_G%i4)=Pz!9tsEe_#?$2l4<5Ev3o9r)TCAqIz&7&H-A=VTy1UubBHpsTAj zw0hHv9rhi!R)uv=MUoyEo@$JP=D`EO)q7k2a$>2 zJRB=zyRpEW{G@-)2Ow>=evKaL|JIg3LToE>N3WPs(UXIejQFTx2~aJ!-e;QkfqfUK z1{i9ZHy&@`=Z!@~Og3q(On@*5zKSq=dy!c_V|zkKb4QwOG-P_dLXJhXI`w4i5x`14 zq39JUM_Z7xQ{+}y#o}!7JU#p-4$Ud7s{J?vm)gx{`+VS9tsWJtAROl}khnqKs29K& zfTJSraCf4(Z$9^2b-W746+7W>1s#{-xr<9_9aIuHCpdlJ)L_esTFyc99WYsgdP@wg zjH2cp(@#px&|{>2#8O9V)Y1cG^)~N3@wfh4cqes7(u|~zl5Pam5>^N-jFLf+3-$F* zP(EuIXJ?RkAbn1l3yQCe^f`;RVo}~mpEIS+&N^&8v9?%4w!&nL{|8n97%x~6k1{-;R_#^4x@fl%7Xsg4vX&a zT|%RG60-DQ2xE^Ja|F2%;!(cNVqGJTkEU*Pr!9d=+cS!I$1sHN_t8GrtRIgZIVRqA zRlBpl@rlhEDlbZIZBlA>Vhc_4dJ!$(Dc6HLDh84HxI*1={h5N8glI@$i6VLF+~=d8J7Sk^ zqUP>mtqtnp2fU?npCppAn}zx+=^lbO={AW@OCnfr}X)@z`(Bv7 zXeHRK3aF2dtF6noH4(s!Xh^UahSEH{y?qtzj&bAk)|TZScdNf)YN8GgL+JOt_k$4` zt(Kn=fPKsgdEj8~u&-RPojSk+6sP07Q&bO0x|%i!eIbk)eK{m>cs9j0N4+PbvKx#5 zL2PySo61j!)Dv9LXP@6zv2_zh-pH6~OOxPMCXGnBtISqnu`CMT^LjEgDyi;omr!)z zh+*5+3`YkU4tf)12k|h|j(V}AQ^2k)o3Rk?cxWQgMctTbyd%9`+0V(%#)|PWQMpM( zAuAzSU%=5uCq)b#vJ@^{Tt@TjBgciU9r5mtpH-{LCJxV`Rh*QmglW~26NcB+=OVx+ zI6^8f*L}1v`ZsBGe`V=p?4)WTX?g7JxfZI9yp&zWIoye=F7g{bu{%HujOya)*H zJHxdit@vs0u>V$XdjYoEw9bK7T++0A6Zl@7w%wp1BRsh);5 zC#EAi=I+t9qJ%;oEIWE{7VA-SSzMI!8NLSlN#hHK@h6^{;gXI-ChRuT$v2;p_^1C{ z=spX*HCwt+D&0S%76z9d_=LAR>CEJIrHmX${~^XFYbO3i7^E z{7gMMMvp?`wBLXtz##U6HNPmux4gG|+v=h{)w-uR{iWPoxz`iWMZ?UVNvE|`=7!-+ zWdOjQvkfpB*IoCrcxQbLB(R7oD;_#7vHf!FAOCLRql}}H@J3vhax55PO80<6S2EPL zW#FGBzYom5?<_x_(854}0=~yPp}#mrf6Sgj>WbEslmqT;4w(~2wt;%P4d?Rtf|moY zq+jVL4Wg@IrnM^{}Lty|-jj^3%HX5^_vbXG98>@@n2%~{nW+K~mneO0^TRl(CltT!4R z12&KrK(;J8fn-9pIzk@E?~))8V!{t}xCSzQr>}Sh)Q6n)Oz?R+7N$iS#_GSzsw27Y z%+H=!mGSYI#H@h~%1GZrXE7O}ZBDyw>^0MM4~?_;65 zAuRO~?d<~8vD$fn9+V6r#CNPj(#(GMtbC-)57UtT3@ zyv+~!x}Dx3L7)BOOrwG7Hqo=uVH-v92*Vlo*#=U)2+P$dEd|eh6}sZ56Mqitz*$|k zkgGqzEX7FTN#^NWM;;>S5T-{4%uf7Mfu{Wv{&hLNvEJA9{z49DJGBaEF6sqV;Fs+v z=E_R%Fj8%|fWohOnI8UJMsX~n{p!U4-i{*W^QDJXN4slQn_a)dXsLD0aWpNhX-9Nj zZyJ>N)4(god4={+lze^<@YT>Pv+H4_r~Nw;iT$Ic*ZU6?cw4zR;{{&7-}-24=GLH< zNVEbk@c@6)IO+VQOMeJb8sM4Eo~7pk#$_19Q-etD9h!DW!I&~3$J;Eg!{cTZoL9-` z+@{^i)EcWUfDn`SLr4z11k^MQKyqs`!f2dZfJ zu317yLygfvX-N(esvgbUC z7=4Muc_#|mdS6n_)UA%0Hc}e-VtV?rTd!*+Nt^X$q$ZJ(m8=`_8Up`Kqt=h7kTFTR zrcvuDjf|7cD(!dNZo8Q{IDBIMBpQKMw>wD-c47%*{tSE`!gw$V9zZg2=Ytwb_I~6A zjr~$k&SY?&Ef&-1{A8qq%>xfzh@`~8&D@S4j}Iyc^ru7|d^3s4J-yY?9XUE=mauHqN3IXSegPIm;By2G@z_D5;CD*uk$lKalMrppZxD!9JxOgaA zt1UJ_N4409Nx3VJ!?l#1R4gk#4lr^8Oi+%#i_;@A4N+@XZzH@wd#kP(C3Jjh=m+Alb10b zk{uHG*vAKQ(nLc)@Ig0TuQxOxqhb!4cp@#LXvr&)c>oU5>MBxV+0E0ZYoFafCqpQu zttY{cc*^!NTH<ADIHyafL^MAqSXGw)+lbxG_|AO%y@EtMPTQYi4yma1kof9XP5gM>9#^ zOk_lq02Yk2lku)y+tD2~+^EXgv{ndQWm$7FMWs>5HRN*AR71Vqa+EpYw-bVMyXAr3 zQjRAAbR%>ZqADZ;;$aw?bv%v;nxP@YZP{=FR1lmPejY`hq!W4nn*F(zgK=&0BiVg? zeSEoiJa1^w4!|ESR=r82%Zsb4Ya7v%o9Tu&nRgfEX>0XJY;`TNx>~5-Gnpgs${)bj zw(X4BL%$!eCi-Tcg3$@Qv3h0(8)J>4?=@v_J* z*$6Jm7dKT+S9?cvJxNyGWzKlDdSyDBfbC1Qq!ptBWHr zoztFSdU~(klg^ps9St`WL5uje9JCPce|#$5ep4wvnWj#0%ge}S<>cgQ(JZ5s^TQto zA=6r7E$Cn~qkTrsEVA#S*w4?vgG4p{Ery0$=HE41g#pu6I6PA#wG(NOPl?OK;y}6> z7+|*PJ9u74nk<*14#`rkw_XqIW-8$2~MTWNw;iP6Cl#nYIb*XAa2Yc%%`1l zY(f3LEh91Q*vVYCU36_Q}PAUe&jS|Q4PoPIO(X-WsuZHp$$dsR;GXkF{ z4CKICz87Hx6k^1!RK{v0jnn`{VZQZV;Gq?Bb0r>=bW|~_`eMq=ic&SHX48q3oF-6} z48NIl7Vlk6QDw?s9RXHmWc_H5k9YaljfT>KD>T~UgO%t_ZX)EK)<_}^cH0W^BrdO? z74B)s`mDB$>g8IhV>f4|sm&E|>9<idzRu3l` zX@SN|qDNj8d&Wgvs?dpr4lNba72gxFd?Z64S|U0Ud5V#I%nr5KTa^oVo1MaczXR3e zI;1i5xbsxqjlktFOQrICik@;Vd$CCLDFm!>E6{@jbRE@?{4MG^M)f1)ffC+z-wwy_ zKA=k3><%>z%pZdOjHhOQT+uYpVhRgiT6U0HbwpJ`ZFoUAtjV=-AJ5Ju30aFctf?$)v(~OnJ zX<;3A(*N(o{WavsMqWG9|D<2I)UxNH&S!HtlFZ@rJ7=6;uhqiIU}mP(nn|NuQiu}E zX81dRYT37f4;B-3t39AhD(=`a$Q^95eh; z)$(o1aw)H6^laj{s;cWQ+=J37!_GOuMeIE~UlWd4VXU%6_+-2~lGzZ*B>oUt6OvB6 z@{8Nvtg_layY01=bgI9i5FZ2ePLHcGEuNoLd-+ONUGC_` z8FhA`x7O4{hxG34%5ATp-5voBFG1If8lc#QV5t0Ypr8l`y>sA1SQ>haT1MQ+0?#Iy zFjUMQD#JSV5uX%!nRJ?(9N{EKHkbSbdQCDsl;b`4_5w~cvy?7+(|h0Rk_j$+?sGsT zPG;QnbDyw5;w$v?`G&p(Xl~gCiTd}qTSmiZ&RMkKf}WYMr3fMhx&S>9qI8^mOj@tM zgC5`O!pil-hz(gOyA zungQTg6j?Ar{0m|hiR}x9J|lw^nei1ISR7Elc}R46=rzvXi8-bLZhX%Tg9ffoHp7{ z>BA?3^OI`+9(GHZ$*NJhWyMSvZiqsN?h?5)8UUbowe#@9j%}RKntB`Ob3l|px@GG? zv(cG?`daSCHIFO@vl{<@`|m{2saDJ7dL1NBrBV@2UkTJUctB|1_OAIh0FwSSZxw3k zFk!_M#XK(6HJ0^3>GBCsCl7d$N9}Z%l93p$ks4^XCuP37Ndu4aEF+Sarcj zN}25k_=dAgz452}Egq8w=v!R=Fa$uF>bIk6AVg3%P)JCtZYuQv-ixR#z$rqe_fti0 ziqe2zZx?5$rX(|wGqR@^%~bB=Zajjc>Jo17(IoAbf9Mu~1dvbmM5?U@vM&JVEwi&~bEzz5!2zqmpnXkhP(%;Nr*M z50l^fW$*xB$UA&}7M@^jYkmFraR>a##V_V{!2XK6yBixvYR=OHO1gIKMu^y~XCX6V zXMx_cZPcL(Sv=X6|EouIW4lFI5yI;899xoM^+yaq=(mcY!Bh~3%1FJzU!^n{<`U8| z^swidD-`0FNi+YsvZ`Hbdj+L%4b>Qaxv#gx)!dpal#TWE2T)vO>d}YX^6swPYF)P_ z91OsSoh^942su{NT^Hq!**QxEnd17z`*U4N`C#9Y98i8j8>6yeJ@J+7yJs6g$l-68 zO`1=BiXx|fH1Lsjo5zF?aAgC!f-kDuXzsWnqm1$Hs@73tlr^Z2f>k*~3ID9nnU0oZ zkRhOpps;n~+_^tbRedmC)lpf6w7Ocfi`KfL^a2NZj&3TPb{mT50vUVWpONa$N7jt@ zSbAM-kQB|xrjazzYf`>+--`|2f%@#F6W=(wgk#i7;}<{j5sz!$6u`=QY3qo5=#K$~ z(-EGtaK_!fdkdzmVH80yN~CF45)l-h_~B`oJo!>MR6!HVY?car-y&`ll8GHO(}1#LrHBghlw z{D~u#{C3`lV3Acaka}jTKiX0B%*J&9jX~E!;VLRYBu&qcUhjwRGF#NzM^;y3r&gUw zbrw7nb2=(wj>T73w;Nh^PA;qSmpsQ&A9vy4Tn9Q5@F6&QZW_&RT4mtq@IT%r-F9+C zEUKoFLANH_UxdM-a}t+>3Om;xuyi!Tqx}PH`&bF=&pe$y>TPeYesuk)_Ms2C_uPXB zjpPZnZ#2ZGyn8&z0#+Zztd`N9wymmdiz-IiT+_6*68IM=FHC#_uV4(kAM7kYrxCN4 z6~Qz>VWQHEW##wY^Na_7+#3r824GO=*Z_sfkFwyo16OJ+rzcgw=j-ASWMA|eouMXiQ>cvKYx2l#y zD|N)1N{N^UZ2^oC9yiG+>IK0HSkvO^#43n&CgEFu8P`ZLG^&LjX3==v7PkgiYYK~r z;qN%&v=-M@$4G*sH))unWoM*l5Q*Lp>+VW3mvW|wH?TTzwEkAM9vNcqkH8oF8qSJT zlgYDMwmWMEYO!xRRQlrfTzq@7DV#=tx#k|Qolu-kY|zc7BrxZtC* z4RL{vrIku&XXW|T-A-k`-KNM{^Im#5qX&7dbS@PDmC1^lV41Bu??lBYK%pTx%W;$e zi@6GNB}B?$rbX5ZhV&dEOsH~h86F5`hKq3`#52AXR%9<5PkNbxm$1js+jIuv>TaL2 zak{U0^2wHh;xZ^SE!hKCPCOw_gRBLdmu_>@GS`i3;^|bUk0b#vIh^V#Nx+M6 zCIu!EYfSYMui=dG1MJOFbuHyN$h$$%gwGzGY=$vyOdF(_)WyhHK>P0LjPC&Q0xO{8 z^&*K1by{UzT^dpZzkwjIojBVNc)w=P66v&~`X$CzS(DEj~<0y+B z4nH_*npEkrw<4R2~BE{S)pZkKFxGzBz+ZZCTak=Tp1O%RxGwvZ96_ z$>+_=)>4RqR^N_UN*GI9<iN)QUtMB&ZC+DX9#PL0CxvI+EhSbW$P&%`lIK{nMvKp^EmsT+^ui9oZA|GHHjg zkSQ;0=cQBxP#$f*|3h8AAZ}L-(f5EClU(o+#1o1beTU>ZS^u1LC3=tWz$_%kE&>be zKBS?7K~Y&8wFeFvy(7oKoqXNZV_x6$#Zs+)h_S4;8YO*dX}0Dq`Bzj;36PXmoL@xX z(6b_R1c5^}t0vL4dl+Zsbu@nqn~;Di#eqQ(`*_A{ zfE}vlYk`_XlET&vRTkp504fA8C5OH}839K#GBi1}6iL6|2?PUco01WR5K^AticKJ+ zO?+%Zz(d9M@{u0Qx7 z;x1K+E~%(3e~q0l_UGt(@bZpK?2^}mR(BYARg-1B4 zouf!fu86SDn>(>%D=SCy%_hRI^dJ|J(n{w1NFpoalxo*o(fff!()=gU8^|?&4@W(7 zr-CN906thdW(Tfn3-^YK1~FP*Yzrdxg=$SF(n>0f#WSIT!!g-G&du-&_9mey6VQ|$ z*c!^TLgsEl-qTriK0XQ;dRRUn+ zoGPd3=I;8 zJAY;-0k3JQG4y@s9WH$5x3@togVQXSdhP(Z&~fkN$$e}>FZaQXK4UxG%dq@S@O|NI zFpE3M24Nm3|4#mO0U4vc{KMEM!laBBo4&m zJ(&U5SNTdMb2&+@__32B0tVlhj|0gVbpXxY~Bb~D>u)Bie6&X_x z4yGd{(4QtAMQua~rrT-oOk!X=N59rfk=Mqc^@{ zV{f(Fv8D>H^Ce9*L44r|V$6&vMiBYb(vthwq|4_|zdXzOFqb}$#f5G_nC~(KbfJr{x=}7mQmr(ps^4-?Lt77Ca?h6^u2gV$DzKrTn0+N&csDemqoF z<>+ee5fI%7+Pt5yR==p|;N>$>1&ZRqR0;6hsN^P0Bp~jW)a|G4O;D1$rz%q?l9@bW z42t5;vRpJ__kRNUpq>VFE*Mq0(oPxPNuSW2bPQf$QIP)Q+Xk01i*5qL%qu@e^X+`w zCnnqN!Pf?@R(myUx5HM;Vbu`@FOBM+h+WKE*frpnd;v~@sDIB%EFeA_EGF)$hxK}L z6=w&>j?93bB`s!jMVS{Xl$uRu!TC<}FSCBlgpJ|nRO%u#8aw<~>@Bw0_gw~N9_viA zJ-+YT`)t%hSN0b?r5=}kYX&i1^y7Yqmw+dZ`qAm>2W-_>&BqaOGMsCuo)GnvhH85C zx|%RGbZSC*AJE6j?HRL)dR90sz#r!VpuMnvvyKJqVNy(au^X|kjNHn z{W_|1cUe>$!zPW*r3RP6-0nB}5WmGVJT1gndETr{&KyfdQ(2*C<;0`_mM}A#zvXx) znlB1DGbJRU;Uy!QtvgygDWA2Xak#LuVS~fqPW+GC%U0g5rF1`Ug246R3zxkkTRQu(Xl09)&Y(R-w0zviyzbWzPUF4Z76Hgi@hyxd)BX* z)zI^5M)qEZs%Y|vQ#YGll87~@#3{H-u~JoCL{CMXkW~J41k{XK5I?(g!VNk=gF4Et z3U^(5zm#sc(57fKUb1&$N@vzKlZ(tDBL=f)=h%JuzIzc@N6{091) zO-?$~(=GIZm4$FtLt}2&(^9vEZfk1F9{-@OX3GX)7_^2QxR*W0d#ewFdjEqB*jkS>88R2yA(WCV8k9aufmnsubIN4k%{{ zE`idSCaTN+10Jjl0L_P#+7nM~5iGlWT{8w#RtD{SKq$asqpot7(Y|#@do=-58dSdL*h@nJ#UuE7OeP)*C!0q956p=HT;5*?*Ws2+4T-L99K;Nxf(ddh4m^RLMbX&mcgR#eoKK6px zdJNZwE|tv7&H9Nxzxd*d!V5283$L|NNVC@d;McyUf9zxE=)K-~h#o%nt#5tL(l+a; z=BNUsQ?-Y$@xF#&8Ra_vV&We#&pcN}c(y$b1ZI*KMp!58L$+N>Y!b|u#0yHgv)4lz z`f+b=E@en?;l0&*q}S_S@FKO`rA#K5TPnRB_m`K=2eT2;ltbCeK432Y@VCDs;hcn9 zpTc_WREjdol-uK2R1dk=G5(h;OH4Cq1m+uj=ctnpqK`6s8Ifd_YR{fF?McZj-fwRhu9v`xkP}+fL-XLP!PU?2HYF<&-eje-7Kp!z;%uH zB1y#S^aw75WEE?}?&F+Wy>a#{vz-^GX75aPQmIbTOTO!a9~{z0rOi}TFYYWGnfwpH zQZs;n>exNFOS-^yry&N?8j&4vQ`H^g<&ip!FYd6K_7gfSEfAUw6cLyT5j7T)RV}z{O#-xA*UR z{+jQ7Hg?i*Y-TAoda(mK?y1khy0?MHd4fMZ|CO(pAIe)w>)TU6N_$tYhSU1a?*nS= zo}MQ4YxmeC^lYQ2Ad77&w!Mhc3Fec|v6NG@hg~ly#zj_|*OiX#J4&K>*qO^TGiWrI zm~Fnyu-wzgbMHU=A0V&(U4&dMTTf~!P04EYuAIqcOMnyNvmnUjVFLROV$2HUA&b%< zltv)Koyl5vBXFWv4|*CJzFwcrzyn6Td{`-lPGP!hgYG4sMHxvyfs`HS2yl9L;~99u zcc;yqI>%s_uBPfe2DX%>azbVJm64tNAuJBzd8l4&hgIp36V{hlD0Y07W_}1t3)mH6 zlfu#?mItXKEas5QoWf!Y^#P?6qy$86c-a4s>e6}fNXIOIY1Y+%UrBrK_H)WQDti$+ z@W~v=v9&foxsiP}Ko`EQH825&cW@R)t+Vfx3$VS!*bD93v)7@zkjEe_KnyuD zUL%r0#^e$k`@a3nbiinj(}D$WSeB17Gh(y&cO13J)Gmu(F@eVCjVIj(8cJ4?#Xk1+ zUDOcO^l7Qk0335+PEO$rEKA`1M7@XIl3RMa9IHhj)-g?&YhtI}&WO(gq;w-iIW#D1 zB=c?EvG2CxMzLt;Lxge7P^=|E4%Ku(!kTeW?Sl$n2lX>x2UUEDE)}PS!#MH(72-Uj zoF#eO!!r%DFMDbY!Z#))3uXt8cv2hOt^-!Wy7IKAn|X_9=X$S-wu!Fplr*zk@g&m0 zG0Q^89Q+ON?TIV*Z-76BqmTVh8fp|+V0IT?$7bqqB;g<~mEA~tinf(IW8bqqPVr7$$?z=a)KQ%IzGXx7rTFnL>L32Fd+)sl zgXy&1{ce|<)il5MwLjEE3DBnV=7L(*)uoNPhOUr=LneJpymX@uDx7bCSD&+U2K{ju z1iHfoW8TB)d&AKzQLK^c;=#y^8|tH9k>ZCkYWEvmDZ3%pmHF1t5YOw#uxdL1TPgNk zzM23CXStA$Bmy zuZq6WBu^v{JWfgM<9mK4By4DfDg6Wd2u4pF_1w}8e?$g)WE<)AuXtPTTirt|R$%CN zny6Sd?z_)Dbm%_!UY9WJEu`Mj4E%a!Dx2$;R9}}B@M=1<2z&SLRg`<{z^5+ZPU9mE z;lG^tHuK%~VTrhm4!@oyIlym$*&~bwn|s;|wBInAlc@6af&dNUecOpI#bQAS>KP$2 ztxdxA#x-ycIn2pLmlT|>`UfwknweqESTJWH=+if|Er zunhWa+y*%N8k&TRpC-H6Zla`tdp2W=wgvPjTSv~}|0C=M?i12(sEyAHWcWtNgoTDh zU^f~F3F9#I%(T;4F*3pX> zzu?-btR#Yu#Svf+@`vqGTvm~2ES2IyAS?X~igF>3P%N#f%(yTA9{Xp%4r((N%ze=c zT1UFmIHBp-GfX*+n9by{gmC^dU{agbr)&9+wk+@N7B@EmgI;5gJFbFmq&dyBa&K~# zI!K}I+^eFJM?1b!DRc{ftgkpJ2lr_)&@4OcU>V9{kaO~Ro!V1F{tmNP%5|)Flbz8a zSYyYE?GA8CyzaAr;Rz}1%amov0Pn+5Qx~nLJ+ZI-$^M#*9z?c%3T>Cv zB~@K2I+*996OXVOZ(h61tSF`xX+N9+aK9gc*t4N9i5n;>PoFOG;Clpo{QnJoFYiO9 zfUz0UfQO-WZkh(9gx@B{^8Ky~p6^i1#emdxtI~b4>bQMSCPu5}gzYUjDE-7f=W$r- zS88L$yO7FbtP2xu6ee;sU3l5x;Z`Sz*!*Fzov)fv$KWQuOTpGm)u^4@K#U8{C&$s0voMbt{*%^lg=bEOmGm zY)_AJsB|(t!~G~G=n8Xyk1NUq}PQb%f`@fH*~ zg%Nj7nlfuqSGP3k8yA!N$D_KQH}h@+EnE|N%8=)#4H@0BKwVYrC(2qg1rCQ)!z?A+ zMe916*;ui5V4+(&lF_;ugtA;D_(vKg+eq0XItOy(E1;IHm1VHm8iC)~*r?&OmU8IW z2t7-D(&VQQCmv@MBE0h(@Q%UHrbHD(s$s3L<#1=wPlh;v)Q-+df9<`~+Y&u#>Au#q zU6?!bY$%*<-AnZ+cf@rkBZrsf&H1{XsA}~;s3F{qR6x%1fwj`_JRft-6wW&-{I5Nv zXtEW58Wp$TVZ}mYyi^xMnDJ3vObJl~US-E{yW9ehF2HEm`Y@w5hVE=caShm+WFW9b z>4${~tq#TINB72E&pqc+>y?6Q3d`W+D#Xx{Nzr}H4$`O_2Ct2mNQ3N0vV?^=Qr`gA z*`|ziMhZur5ZUf5oQCh8?ID41xeDL|4s@bz1cI%_z_b{M3L?PttfEbff{;84qVZF7 zfK>xms)8q{ELS9{s^EG#Cnoik--|ySV$#TzE*62CW43$f>PPmFKV!Z2Lh}4K>0iLz zJpH-tlim^t^>+_Bt=7qQ`(nR;ac=JZZ{8xDO`9=C%2Bs@Z%H`%eb;CvmX{MvgNP;I zQ{Vt>uJ}=O1FbINwsr;2_^rVB{A z@LRZJW#Af1yC>XJr`A8dal-o0hY)A_ko#eGwfqhPc!B2X>WP1a61PD-an8&nUQ&ot z)KW@SQz$MH9-UfQvR4e$P;sOyQX91x<0y3X=I<9I`fO)1Ge>(R| zK>d_ZcngwJmo|Ye9RMAKVDp-$%8hS)I-W|Sw6=aoZ_s%=waKW-4LT=DVl$lG4v&AxUepCaZFa!kYpav|=9;OUK zqyaO{Gh6_i`59p@gocNv0B&N}&liCf0{7o>rA}XhJ?|85yOIxlB600>!c$4#2*Qr@ zTRvPsq(4xed?SY5-3IiI^FAjryOTh)t(-{chHLr8VAXL}S6S~eh!3k*{Huvi125uX zl%wd{{%9FRD=-*#Cp9zD_%Iob`4e6p4xN|~ssD&pOhpng zgY;L@D9~4ADT+vYLbMQGfD@`hl_b!8F`08xzD6}Pkzw!2KZRYU(U2YDlFKCZCN7=< z$;bk{w$GeH>>`eaTA+bOO`W7nB5;9Rl@muz^K?PC+~q$7=b|b&ImPcdb1?*gOcYft z8`Av_Is`Keng+k|HMZw@Tw|0|r+UC)UK#>M|6za7BW;(_ourS}kKtLEYcR~Fv)6C9 zpqH0D6xObv`3Cx%96!E%3XAeK8)@2KM`@X??+{)QLddT_>$4B8QRyPbmkArGr z&^1u-1{OZ2>uV_H)*1CB6WA4`0@#BANnr+=g&J4H1ZL@oS*4!oT zW8$f!e$sn-9-$cgZTi!E4u>;HvP~ZE@CTfY3yaPL4eL*3vv5H$x>HTR;Z03dK2dD0 zq9hPOme4^|c1t~4J7?||R!Oc<>0fh8{vXhITyuUNPji&bNz679hBJ%AcujN_bg8hs zFiELBb~Ym${OZ2k9#z=ghVe3Yhpjk9OKq~ZirO7tuEj~r{icws(=T?4S@~U-8!QqJdE5XZZ%D_bLiu2rs7@>I*RyM zf66dX9Fg8+=X$E|CmiW;SKYq$c))bAO5At3#qID=AP( zx{<&WBVaYorOn%OM((PG@Ui(}^J_LVSv?FJiNt-MUT2gm^47mASQZ_gLZp<$w17U2 zwjwF%yitxTo~rAGhHW<*EKD$GXFbH^Wl|rIJK|2~_VDM{!ORaDEQ??b>tg0{Q6y~~ zz%#bx!*yfMF6M;GeGafval<>d7EW39 zl$WiV)7jPQ=nZNpLdr^l{m?HY556@By@qaB^te@_rYSxei6xvcvo@c0;H%;KICkUz zLEg3o?D`sV0~fJkkU-K%+z))6heW#vA_qNAjtM`=4Fd^q9ShMn{5br~u`e7QWYsWK z#FT@sxzp~HCo5%F3mSc(H9!Xg%dV-5`(7W1Hd5gL;;5zZ&-v@$bX_pyfk8F?2}bhw z+~+_4`LD!GXfHbulfa1EN)SkvO|K!m^tvZz5}>z5`w$u6%DvaL#tJ*H5{{quawhgU zVk_$n^MJ!c3fqEgP8g0Bs)rdddM0&7_dOT?lO8C!t)lldn(H6|?{y!2)H`;p^uh~1 z2lXA_kTHed|-lOOg6jKmihXy`_6UuX^K$N%2& z0v)G9dIXCo9-|-sxcl(K7Zrrn3k@lm6dR}9Ost_SgLJN`ETKb$83k#l43bMxJqq?t zQJscqIg0y_G&Iu8WcNMhcI;+El?kq+ixM~SeHu`+#Y6SPANdPCAmL za5QB0Os>_?Z3vmBIjD6%0$Y0)4%FizJi0^CezvT5QF}7$f}qN+Aoc_ng!EB*sA!UF zA7VW1Z?a>k;YtE-7>EQ0Er$9H8LcG)co(bF>h$7y--JUZYNDlxM$`oTW^1Dk`jisx zSp?D1q~2G3a7l)~?0W?+~N5h@R*u;4=qa9O5|2V?ko`p>QJ+LNwxOR?_ z7!R0@V;tldFl#?jAfsqOIOhHy!(FkI*o_MhJsBcxU&Fzz;I#dso(MYKYBg}r;sVM%J>n-gHEe?tDT9P0LlSBssWWN znNV724MRHS5{r9qtl=I{At8B&9WwTof|h~yR5+|!!P}8cV#S7AccQpHr=(BL$ulph@IRo*OTC^&D2ev@Rk~t2J8Oqdva&K&J4SA0k zw1Nv8>A{dzjshU074d?$*Vo0^TDS8dWPf)hxFe|J>t?)AG5w5X#=&}^CegOwj9aOc zVqN($Q+8$J4sd1O<#}kopo*?}1Adj$J2j)tF5hbP3AjL<6mUdv$`vKa6cXrKIpcY# zMUrjkKifl~OO|U&3HWr-%sFzA=77%Z{}q_ySAcPvg$<_@FVFE)=ndCRi-GZShl7F} z5V`RWm`LvZi2p9k08=Rkm+yQwVxtHIo*=;+sNrWRk~vdwa`{LluLmfNRRYk6C3DgI z_H)H)J( z&}5Vm=#;ITmW0=X?hlSf4R&6-(?6X9ZN5LVST;+YdeR88ASy~O1k04{yoeAI$35i|Dr#()^tM{OQ=1?>^_+ zQ?b=N@59#xd_6b>250*g083KXX%Tx`yhXE@m1eQpms{Y4Ordxxu2miNP5^&Z`-ir2 z1Q@s65ja-hnLvCIom-@|h6*|-9*HP|DFQgD>MoLlBFJE66e^oRTx>X!I;#LKOzCoX zUR0M){pNUnW!RUCE}3c#Zi?K|d?fZonL-|DguUW^+8YCIBB-pHv^G>vW)a`_KeHB9eb)ra!$LL0_pP61I!ooQbN97!p2DKbERIm_44`$>qS2 zPS}x;!*BS9eZ32rBpwJjaUWrCm(l3Hd=!Nb=(|>7Ylwe{@_?KbX^d20^ERHC0lor4L3dW>%Y>OMN8=ZSXkL~5 zd?ph~g2z@V6iTS-%?qk3rBQ(l0Mr&}jrHp=4Go|Wc04Skwux6js~>MXq~t&rlfZt2 z4;%-lGxs+XjA)H@oWx>rD@U#(mJyo{i^Nq828AsZ(z24);i{79!r`yLAkvCrO}Tye z>le~a@~nikf2bn8qywN9AVQE|@{_KZOM<)}dK{Jsu{qUU`&=5nRsUu8#F2Gn=h5IS)Ir zC{xeXbC3}@(70|~3fq%-Gkzvs%VBjDE}UiuKSG9{3l(kF1Hq1w{d!8v>||o%Epzi| zj)0p`#v&T2ygC^8^B>>cq67KH?Sf3TC==9O^5vfOzun7t%i6!Ih z?zZQMsZape*6y(uEUMmqw(6sEGwtaQ;F>7jl-u(jXqapPx!|*vCCh=WihS}|<9-_6 zrwpiMaWY(WyRNFW%9TvlFcRc9{I8jet$^k%^`zsxNj94Za(Qn_Z}AuqJje zfNhLwifA%vx9vYO9|jknpWG4G)*|cc>t4!3Da3aikZ4l#!SEKtxinj1dwG}TBB>`E zp}Y#n#$13$e#gX{ChnzmV)BT!BCW)b61W_a!UkIxytvsRCs}64-Ge_E9jL~ChqHE3 z4C6^Bc2X~WSkiLGv`sy7@4eA>d_i`a+scfCEQ1-<^P%P}JMoiRw(kZKOq5{XC=Mdw5q*O77_ zOEq&cD6awciO(KscP1Q6K!yjMUsJb#^^n+KTLa7F>c$4r>vxyDCIAG*V(W-#cnSjB zRb$c37KE-6XqjxU0pRi-u*$C*t}9nNK&s&0mT&`=3!rkEqCh>Nx7?(cB9vhoER-fX zjZsBG28Vi`olA&cho8-O-Nh2>@~Gm0?^SMyXcJ=iq_&`w7f9adim^G_oi2m!Gy||} zdtfVCVKQXnNQcyT7kbodj&P;{G)bY57pJ6Xq4XZdslRiuw6yuj&84MTs`%0kZMp*H zD^0ltnRWe&=@(&VLmxLC4l2q`&*okX~SzrsGQ592#0pqsd#JX*tX@^pNi!`Z;r9vLh4yr-0K zseHe%^abVu@knyGuJ|p#>mSosRtAH)xz&$rdP4W&6;VHajL@*XXR<^mRLB_mh6Fc1 z=gsMA*8*o<;d?|bP(*~)0F{zC0}NpXJOWAR8)vt=ePh3pZJ z1i6L#S9CD-p z(GxdCIjqcKN7cg`v6%)<1u!n9ZATPKs>xPV{N4icNw{5zr^Lw=6kT1?QN^87EGH+V zasucp(1X(st%RfA3ser;VKtB&Lerukp70~_ELbGMcASxP%ZPUpFBSD!7e53=Gd)Ij`1QZU$-EIGE02GdD-K8*{sG;G=Y9OOTT#$0m~kD_o<`rP ztgJ{G9W5yvy*%6)H4dgR;1w$wQAGk@v4aR;?;2np+aLJAsD4LHm*ni(Ib-%aaD8yP zL>LXUG6>qsg^X)}v<#6O6BIRZXj1&dmIN6rwq_VYH9D=^4{25WmqSZo2in#~b}0`2 zpud>-HRuTHK(_=B9(#pmVK@`xm8Z+XHPHS59SQlgqz&1fDGJg6^v{l&#~VbENWLBi^HcRSSF;sJmTtB^4`6w;MtuFQ7%ZQ^9}cbEeZp1aq!ZnX8cR zzl%5);VgM1Zw7jVBEYAR+n_ieE|HWyCIhRB%O|aWAQdx`pV90LG3;z|=pXWAI{gh6 z%Hv_YdgDcO4M)VZh?aRZ>}uJbdFxx9bLWbm+}zwe@%5dJjZNEAbVbm6hY^pFoL|Iw z$230-FAlwF9Z^ZJ4)!-PkOUtz+Xe7+`8L~I3u#4wbfXK4Kgc6Xg-^Tkj1gwDE%fN@m!W>9BGNnqOkVYuZ8Z8@%+ zHoR{gxOog2a)fp|i62fQc-OV9rc;9k)UEZX8AsC1jqI*B)%Nu9^Jd%Z2-*Xv2P$VB z4e`qWzP?{DRY160xS27=H~cgBg(DWVP?Sahw1ZVExIDmw_Z`_9-*HR%Bfw>XR1QZL zS&ZR?wj(UmVjZ(OGi7=RQ{J0Ssp<4BLKX)r$q8gjEW4E4O^K$504+{3a{$odY%8FC z1pqn=vC~W7&e)GpKN$TUA#a8&LHlmB|3>O(|7YC#9Zb$#LO!Y4TxwpWhv!b8hT_QE zU3y6GfAfRIGJLHx?%9R1EXz6E%i~w0cpUKob9~8durAjo?w@#g;_;Ct!LGwN=?+;K zYYmbPK1TZ4fW&D0d-S`MKqSi6H}EEDYmp$*pOA(YnndZsArP3XtQ>RR;~ZaFI+Ur` z7n_eRXhnT4Xtm1aDPMQfQa@C@TD-56w0x@9t5!Rm6fDdp=*$pyDF>Pel$t4*q#CS< zRFZR`)tD)Oi>9FH#BHLWO|V)+`x=NI%H$w}_*6$vAx)c+(0UVb6NS!&kqH}n>1Pw) zhGg_lH2tG{2H{KrY}EC9qHRMXPJc~slwrIIb{mt$uNZhA9nGpuN2!hwzZTSSP;n1A}y`(>G%E2734ee=bZ zSWEkf)YXKWMqVt)hYEdfwd9u6L+0|yn46py+kuvs^Hn8?pOEBG$|AsUI<}jmK0;CW z)$ati-m5Gp4BgBwhebCo*r{o4>WM?o&Fl)Wtgf3EIW@D zz4q?{*ZZz_erq0dcyD5J*u)(EbmANAS|BV#2_b%xVTJ^%g=*>7k#-x*zAM$=hAAV6lo!7H#2?s8!4yk9g(8Zya=7B?9NqmJ6`G{e#PhOHJm)r*7xSQ8q=U) znS6F(Y^9!X6NTG+CxeJekj%#8e$;GcoMN@D)g2>J5-Kl%`%Lk*6tc|Gbs1Vu%me(i z6>rouABX`s?rg1ytKk96!xvsZcjvs^l-_uIJ!@xcUr>{_tD`TeouuAUCezVhV*iFP z0te=tcK;imOKHEH^YW9UKl;EY>gkLU38HorMH1q!by%+Y4?XmyeczQm-k}CYDfAKQ z&m_?J*n>z#Clq`?akLORVdyK2)&;eFv@+tTM=hT-w&iKBnq6cM&bw*kkm2?}b$U4Eht%Jm_mCI8Z*&8`u#4NpDV1`_t1Uwfh6dUhvMG z@p|AF!{3ihJO$tRzawWtxkr!>(1s-|O-sKQv|`+epq;J!8K|;6G!H=OdNO(zk^8t8 zi$-#hhUwZ7qAM%dulaW&&7%vvG+Yo&xo#sHp3FMbVA6YpRZOET%mw!#|(-c z`FGO3dlqYl+2sBkQxGs6dz%aMHFRZr)xQ-1_<7aX<~Rz{zJ4v-mED6evoQT4f0!RxgIkq-w>= zc7c6kr8WGPFE2Ln98P_&Vcj?eki0Y&FB&j=vzG&U?%}R5=`Mp& zu@O=qqLd2Qc83YY&TNUX9X5g#a3_Vi zxu_>6&BT#oDb!4&^ncDm#op!8a(pGULXt1cKg|s>rqa&cKk)}Ag=`${8U8)*=|W(u zX;BlvGmRPnWwzB#EiFYn8NGkd<_BN3AxkMCjri|2?Uv>EG8l<*P2$8`fZO>g=0+LU z4ou;jNljq!i6U#bd+|(PIx?=@Hgg;O*H;owkUo(w7HfARAd`jjmD5}F@RD<6siRKK zp2=NCe39Ur#@rBl!snBCFJ58a%utzZE23sYtoU9?-Vk2ecdH4jH|J|OF(+?d zLxRLNQTtj!t7dBwq;YZem22)rF&;s^K}vD&x&?TN9rv7gSl%d>g(|J3j0j%@*L~wA zEXPrP?fgRN8uylVI01ZG=-f*#)t*~5bXVBA(U4*vm<|KXGPpRKpFA+Mz?*Mpx}F+=Ao$5o-&;lnQ}UV3}-eTbn=y zB4qK$6AwXFgfXIkb`-O$G_>KWakYloyLq53)&pe~&=j1Vx86*fzIGc^qMv7xYt{pjqAUtzFs%p1w> z^FC^mf*>;$mkmH2ZOu{Jrk#zVDH7WHrXo+EZs2s_qfGSU83b)zfTvB6r6SXbR8F{r zc3ZZ5Y^tIz_8(blhL_m*A`?lB@5k^RPyw`$?+wEH<4j7(DgTrA-Ive>G^&34hyN$$ zF@o9wXX5v8!Ue_Kh@E%{LulMG8yKFIXqk;v*(`^1pYCQdLaETRr*lawlLdAh_U;5? zXa5T<51omaX2GtloVfpfe|`OfcX;#oofx9zPfq*?=<-p`8%9H_XSBEeL-0#M z@m+Kv(f5|OHT!+l&BlxJ#>V2KZq99*8c`b7+#LP{=E0lz1Y&_Nv8xz<+h6(L@n0HL zs{{JEi|_cmiCgK<1+WmCrXnza!5rT2+(tr)MPEb488m4cIA zTE}<6Cq$jef13C@i@CxJ-ABC6M3jidi-T1nf7Fr z{spNtmZ^9mu-CtmOpHdvHWXqtwHI{V%@_TS$?SATN2 zruY#10Dlb_a{M`L33mT}=fAc6N7(I?ANRbE_j0H5r)a`s6B^|7XJD-i*vV+D>)Ecs z-{D$syq_Cr{c`W6PEVii`n5%4P(9ZK;8F8m3^M+m@N2qhKQp*^d8XhLTPNLw7I>=C z1R{Xe^_Q`(FYlipTGyAspwy%N+{Ie_SM+A*vI!&2XKAk@6LZF#wgZbkxHqBQ^OaWc zF5CitcU9RsndmN~Ww;O=T~B{Ya4ue~I5T!Tj~1?u68rxsdlM*0uJTN@GBYyv{YGSD z-Ys=&>6XyiXhTRKBqY#gFpH2t27`^+ZDYX3#$#+B+vA}n zB(RZMjL-PYjL*Dz@0_s(7#K72?04Qf@A!THjm)ZQA}LbdVi)LCux(skMH+6$I^+rn27Kn+Iqlxe^tdCiq^2%+f>a46a^_h$ zBnK2VE#{HE(2u2-0*i6@OI-hP*l9n)-qN(Vot@<++Au*;9}w_eetd!Da?M?v868L*M7~_kd6pUMB+lX zI4z`e<5*rUXrj%%>1Tk%fvh2*J~NomZJQ8DV$auozGr{!nSjMj+I}};pKmB01bAb9 zMw|@@C!QWF^)?l~SKiq~+Qp|RbSIG&nJ%cdnf&n^HRq+T(-1VAZP zQ>&75^HMWJ-#rqHP$SjJ!CavV&8c&H>+7(0BP@hT>>=MPhWDiJ2$+#x#ODzq zo%7UF-qd2gsKT>!n?;nD9WuB4SyLMqw!LlElBU*|XF9+*lk~4+vW~x9mw|wph3C{7 z_g%X>qq?QEe-N5@L8BZ8oofJj{QA}M_;vp`{GL1(A=h39Uw;8KNt{bFzI(hx`iJBX zW^Rx?+9?a9t?Yi{6W+b}m{V^44>wCw^@>uftzs<K&SgX{XB?RIpPsJ(flvQ`%xw z_KLN<6ZiO=f!~0nA{xVG@q+UPTH@yeYU0VfPosBt$kwtZu#ogL%bR&iSWf>2`d+Oh z+64e238JyGY6v_TTvr|_gLeNjrcd;rp&!NKluX)@o+ZFjMB1_+5sJ)*&Zj?}eExaw zuDgE8`-JDMub)}}1btfnl533H_Sgkgy?{m%djjl4bx{tmJpK#fEp>FfL<+{MplePIT;_gf&&G?=2DP+jdBF(M`CjR=3xGU!MxPwFT3p8d1Ubx? zfBtW(Tyc~gJ>>;21E4&czD=8GStIzHeW0lyz;=qza$z$<7{gg_Ag0Yjv_$xR^}0u_ z3c3h&p(Yfq*d+jQ&*-=M?|kP=w;m02G2z8eTpQmw`BYDK&f|@Gx;$B>T#<9=j z&CV)lDGuzn{|$paL_A+73;~LxtCVIz1?@FU89x)2LI4?|6$<8z70au#(8KjGIg{8jR)M+%IRl^#>QfKgg{gyQJHbZ z>vQ6-Cr5#Dx5RD^6273FUvD{;MbLGe&v*Do&<52N^XKlxcXsq>bYbG88{b_-M+87m zUeGsyA?WJC>Esv=b zpjRBONmJeC{s0w4>R-8~ z(lvuHtP&i5f$C-oi0U-?X%QXl80uWy^!5Q(DpxK&k@E?-6KLuc{KUH8+4V7fOgUY0swmE_p^BaMJw9Ne-*frR znPMS$;Ck#Txj@(`lrMg*=PM7)@I&b-N_qka=$$@*o+Kq2pMiAc4WbVMNV|*yQwL1A z=-x1Lmw-x}ojq`%wQA^y=X@0~BN;Sc*x?wP)5i6F!rl@72jN*o z2nV1S@DSY_uSl5mZRRfN47~8`?&cA8;B!bR4nxR4y*XSvcjM1Xl)6{{(ZlX}a8g>)lUp&+?XeYh z;J}*W9FcA>DpprtC@d-?xe0q@N*0wmY$dKvN<-to>PxsIoNqMn z&CHweP2NU5rX2#hfY~pjogmVu<_J!O`oF06IElD4p>9R=#N}uN)ffe|@GQt>QG}*< zVsNN;gaREMG!8GM_$zDnta44q)eO5VqmEA=q^WJ@*1|K4t*Wk{NGl5qTTcNy=QUds zUC|MJLkSH_w2VXwIjF6)+jN>0Q-hRHiU4mzb9EZ~z5rSLBRm_S5s)PeI@*Pt=*I!y zNKKJ-_M_BLa#(r?aDfVSgn>tH8>)+^Ph)RizMO-OHotOuUss!6y*PokCLhtJ?ur}L z^UZ>v2^*?UV-$7VL$UudPxm8PN4C+eNW85NXIXXB7%Po0Z|8SFc>jzVa&D+#%E!o| zgQF>o9K8WUggh@o93vk831k{!$x|m3J#&OP)lXf!Fhn=bw@Dk%CX4L{gYT8floDqJE^ zM3hUvg75n1%00^tycR?rH~DS6>ycAEX(2ibw9_>vxvuP6$bZd?dmAlLlQFPBkul7j zp_(_X<}D?D6uTa~DaK-F=jY?Iv)GR-s*ZA!jC(v5R>aBjNGUNn5&)njH@vyMFs6-+ z+=S7uF57ZY??Am86zAAGiyQm^FMvy4+Mb}h+tNldcW-!wet+;wlOrD=oxBiYnD%JM z!l&1Ot#RTHPOg2&4UQcP@Ub*PALlUn9Kfw*$od7&HAZ4*?Rxk!!X+4}0{;iRAIK(%l6kZKo!;kGS*txQi;4W*V?%V{)~boPONe zG}o&ID_8k5CxJ2~DDz`D6-my-*F5vF$6rzPVxh>F8gsB&07HWKF zI2D6ixUt+nBR&BUN}b56fqVrUVIS7M_(hw;)JT5A@)K&~D{cE*px}JlcCAG>-6`ZH z(2fgBTI|))6UI+82`S32ahl~-iPJFEd$nn}C&gK5i}u=RpYo)7Q*SmZO?45?gHCDD zw7m{*e#)}L48v(&6XnqKoI>7pGw&K5)JJC8j+#9@kE)x}rX+2S@Hq_qxr-DljJlDd zYy}>zAJwF%rs5awz=0WHE#45kv73nyOZx^x825WzkSVjCnlg!W2mb57-qTj@`qS9ku#p;tcT1b z`}m8c;o(w;^i+f$_H3`Ffif51M+gVL7_?dM99_yaF4!0%)72DSdDKg}?R ziDAIk;CCG@S$E&}zMC5cn|}u-_K1gngh;`w*t^KXj%0lQ`Fg7+UM0JMj*DKsDi-kC zrUB>>RMXsS8zrh6N3nxrGTog_nW=BkXh8Q)*S!;w7EA)1(12~?cp0;R`|iiS{{!?& zzh0;}2_n)Q(dJ$)FNi<-Penye(B&r8mWX9 zqO<S37d36xYF88U*Rn!7WTRkPXeBe$hB&N!3OpsCEF@M>76j6w*g zO$`-T5^OC6Kr=cRjcaa;aTw`%J!*^LS1VX$;2Oe4Fk)S>M5rq)eQ9xS4W4wEntwm?3?*9bZI%% zD5nifbDpBOc%LiCI-@C{TaYg#CrH_LXL5Nbd%|wDJ|>oYHT1nuYA5}SlEsjjv`DcG zjbqVJezQ*(yZzo%92u@p_4HswAM||xquyw;JjhHvy2UV%`@;)czw+^O@EOAJTqdLR zfNL*aWa@&PJB^mi{AIL>5t>)A*Bd>2W=TOP01C#!Tq4UhlSCUaRFnz>e}X&;f*HLq z;vUE9+=wk4c}p@qVl`3?z3z|QS4-#I@#=^*k^%f>2(yi@p@P2t3I012Js_HGX9?Y4w`_=WjSIHVC??9N7&|w zc2ESOI^l^Eh;{EfAm#5WxiI!omWgo|ri6l&%Bw=**i1=?`OS>yxVh9|(Vj?-WJVC0 zk0FznhA(g#UI5kz#=~y*x)uFMaeoivO974;SL$jp4q*Gs&j}*td1|u$p7n0o$*rvL zXWd2~?wbQ&=GWO{rANA#4)vQp8W)8;QhaUq{nrDZFsAJL(1&h%dl@bko^=U%#XlMN zBxEx3|DbYirHImACu*j8`16YB_R6@m2!wN>)3vNg$ zP&`}rpZ{Ut-yoky&-SK*a|0DMO~0(>e9y}ngRJ=|hC@wTFVwPymY2J0rCW+P-{p@31cu@O}O_U^`^td2$-)xnMZ-9i&lw-z7|$ zdgD${IfDvmVC*I1_k9Y`3Yg$2#6Q)R8m8lYUt|-wWn2lDCw+w5lxL3-sESn*G%)ljqCT^bE`Y&x^wvWWjA<4RUa8I96@DJ44JJ{s6@Sj=sB$t zTnpMl5PQ zcO4l(0~oC9VuCCF98bFb&p#XZL)5WFvS^3uz@WImZvD;rJG$Z|TVd#k0kyBJe1@f- z()FiO+l7-vyRm`$dF{~U-g)m#zoM33F0Geh-&YfHFQ$QHOL;qU`HyAM7c;1M|LRTC z<9cKA?X(`$^dVpW2>88c4}xj14u5jd3*AdB{pxgcX%Uiza>qXfe%SrkbG~NER-x~! zTV)rw)`a8g)}i}1nhdk85AqzkFfao?cyT9}3ikGEzb@u+c zhmp@m)9;xcA76fEsokFbZP7Y>xL~%dQIzS^ln9$#4y?(Cjr!iJ)=nH(^<4~IWp90< z*lZS|04P8GlY#f4@+q>tcplW>u>$-6b8sc@&CWE8haZ;jyb~D|JF5Y@Cec|G(#BJ+ zHRJfBMIkHMfXW_j2OlnqzL*sC|1w`lhlg_=DCfP4Wkq=y-ljPgI6%Jw${KXO9q_;g=Cr@0`5{? zN?~djm?3RGiT9wg5sjjw@bdUK1j^K0vQU(eLm^lr>c$9=JuQ^#^s@3zv+@KP`O zwG5CzTvKS+)ryO(uh7Vvo}cPu5&N`LHu!G}-rB!KF3rT(R8-A}`+6fWJn|B%L;Hp~ z;67=|-flK^?unVSl`yo?Ta)ACpuV%dHMW`x%@l@uxmx-quXvx!Vu^PK^&8!JEvTR_ zvRO0BnE7Sek?b#kNB{SM2d>_e?|I(uc)#-Y52%mdOY*^lwG_>VaC-K5#7LaGI8imC zXczf`oEC}cXnW~}-%U=N$K3)u^|uYA{1xYOE+!h_?%Hj%2JG8MaAv$Nc-IW2PWFNsGlp_)8XM5+q zbAHiMcTPPN@@gkK^MsdBew)r*$KU)G&Yb4o_G|@WH8SZ?htSJDHmWU_Ja?0N^DUa4 z*6uU~K|~!Rn@SsZ)TX z`@WY&dUv)XjRj zW4H9=*@cAsYAVG#m9E_>hinnkR2mhk~L5pmSkgP?M6U&rG!vOTv0K0%`SvP8K=H- zy^zp+se~TS`)9HVclB0{0B zbI7e=3_~2~vk4uJYS#6H78*cCv=SyR0KVUKkN9?#u~!j2-KflDkuTCJr%p{Gq&c*& zOx~Ul4ZPKrXryqJrz4z?r??i;GNpJ>5+WTRo4i`nGqfQUQbJH8lw!@44{u=ZZl* z71xiSTsb{ucJ^}{KtMh1f5Uu`7hzdPNFF%<$iLYM+fk$GlYV05h~RsR{Nu&nNg#gX z#s6e!VtGw*%os}6AMmz4 zZ+rWN^%{hHYIrr{raBjHv#i@TCva^Wd-qlJ9T9FTfMhL zO)8&oxAB3sP~GUSylKq~B2zm>FOZD=nwJlc#yjKi9^$x`%=E0>YzSS2oovSI-#%1h zHNux0ZceP*o~M2vm>t*GU~H34`ddVFXcoQGtAE<%9{wFR*q^UP>*lJ2+ghS@b#xADrs}snAd|1VcBx{a(U6G< z(FJyEuKm?&l}&o%PF$`k)nO&TWYJ*MqX1iM;32I0@4;&nC*4_T-%6gTK6z)%_QH5Z zlZP~2ZZ?QA=fc})l(%|Nyrx0Me}B;%q1bP3sfz_F@BQGAPZ?ngnRbe2)t!3SyX zm26~^J*A+QC7UrD9?N0yWoN1_FJEzWjB(9Wt%+N1uVC6xn+?hyEZC?I^LJq1?9K}$ zy8sW~{=+?bjA*_`k5t9qlV4=*_U1~L@3;fTUa9HD7Rqx-oppSW{Jexc z{wJ>UqiFk%-tQAB>Hi)u3NhlluhS5e6I>&a^kSGtmJKTa05)ywl9F)M%fDH`oRyeU zd++r}N_P6-HG@JSBWJ==Darj;vituYXG*y+JX@r7@eFjRSUrw1+O3|sPz^c^$@vc~ zbYdNEa&lf+J|rx3ey3b!fMzb83qw}Zn5Cp7$S0f$^|FwD^LdAOFGh(qN3|X}RElr= zxC`m?8R`q3sj^v#B^TOVdr7sH_vMwUGbTKFEV(YG8bVH$xi2AIb1O5BFk`zy}a=?3C#zK3poDES-}fw4%NI z0oUD)o{Z_A3{e~+DLkx0vHm^G2pb$nIP4^S(DeK~YO&E|S@H^AXGzmoGiQD`X=gI1 zB+YE|RM_~9Hy*qp!<4Xss#2mw3A9Ld5ZR67iIVlTgpdUlH3n~TPjo|JtkQ!w9Z82$ z5=C~9(sl32({sky;<=6SeE!I>G>m6;=F+9JccysE95jL~Ct-}y{7~!_HfoZRshli& z<*PmOozfvu@GX7X!Z;qFNZ6zI*zcPSYg#+IFW*3px3%gX95H3Y)W6&SdLP4>r;Ot& z%q|pdMA@9oERZ14L=qdw;MraT<{;%(`+5M>5edtgXRK6FC?n}Or*2x9czj?Jo@Crb ztev@}7X|eEy^gF6#V2T@4^`-Kiywba9YiDqBhKlExcaSCz2eL#j1r<{&WJWSVNIsa z&9ZJcmeMr=*6Zw@46#gS1J#(e{fbq{*(J0G1GG77T?Y|#%0qRdcF@iiv|?5j%UK0( zXB02_BxF*rV!U_vt0{v&94L?TcH}*}b3P!|JdFGmi#{u${i^6q&RrLv5h8_&pe$Gb zeppN#{MgZA=oFjPm6O4J2p;$d#6^5Ywm}MeFu-Szfu%WH_xzozNRo%p9CWmUL>{n8(CA4FAYX=*R9!=B0y0%P-0fgVPVBmt0B8A^Z~Nd#aCONq`~hOER3qD~cJmfuezgLU_ac(p;f8)8dPIEhhJ_ncA#cN2eh$ut zm&zIC)Wps3ZJ77+EZPiP)f@mrGlQ2f!1m??gT9k)0=v=)5I^Q;^ZLMNL4Op}BZ}zN zne9*<=fp_IG{EEJboeW%y@nvONA&T+xY7vga>tTx#;mUe&rX}n`u&ucV?aeizmV<% zs)n#%kG}QJb`x_zD!8YDbNLnAGm1Na>-*wruYc3iCsBu`_xlupjhDn9edL8vJf}sl*2L@$a?&d z?n2@zdA{=!lf{(NP%|k%E!G=qnDRrhQAa_|G;2r>?4c&DgKYV~hkropAp0%KV{xqx zTY@6dGu#f2?1y^8dCz;~d+$XQAZAH~FbrVN#O#(-7Oj_%GS(E#%oe;QkB)MP>w%jNiMonaXLEx|YqG zf0$0@X(}3Z>r<|k;(s53e(T$w)Nc$b+O<4!$vw7Ky^* zd_)4slh^G6QztM1eP#wHoVes8#cQS^7nnTAKKMaa`AuQ8WMu)eIXEhWUTFJi6Sqk6 zxX81h{pcL1YKorcY8?Yx3lD=AKXMX>jf3uFm`>&-pvB~m;o}5BE$e4eW^iTcqiM9G zs)dE$8ZR8qze@_xFyK@)7#jmz22x+kYp@JJY*IdI^c86m~e2Nne(=>erjQ#OVgNIuOSNFN)-eLo8?;%`vX zp+LLS6Gqk*Pgi`0WiUEh9d_OCemV{r&!Tyac|3JB1UPfa=7QtcC zOF!WH!N4i-XaMauHXHW=KwO^;u5#5u6OF-64&5`uW;0zhJFVo5*Xa~}qv3f4qnK)4 z?`!_cVJYdkSu5|Ec0RZcw!P^4tiE-0IPIodlf1kVd-PV^|0h6)pzd1iQ50_lv+v{; zBOm3-x5h0G$;E^jD^&|-SglEpU^&*GeW{HMV@&zdty>{7j2Fv74aokSu75c2Zk##g z4>)~c)ufT=wa2r4E|vfqix8yG(l2R+lQ!r zR+y;Q53{3;QF!HdF$<~SlpP0jxp}{3-9L;PXWT2oZy??D|95^y^{s2#HKy+-14$B7 zZDSZBcGReQc7W;&AHl+njhAlpjso;5PV+PD;z$$1slZG|^D`*^NIiT%Ks`74vpm{^ zrvuf{lhKPytB963J*6rPS*CKia-0JxH=FD?hX1bPj<_QW!|o`)qFe}jN7p2|C&Tje zc~=hhj_PirgQHtO$3yF0wR2-2KcRj98PBdfez0z!w&W(Z!O-CGO)m*_MmgDZ-LVSb zTuz@?)$_}M1nb*0bWQ@+zXr}C4yFVRNCUwnFgYqO$;8Gd=s=p*MvVU^zXFN@{qZfP zqIoOvO|7C=3@HiRcHauN+6%;2ZMj$%LyjZ#(tV|yD2$^fj{2zn926h*|6(h5^Fk5$9R-F+G(UbrsGD&U)6soZ zh+#-h+Vs=0qUaowx7HSl-r!tWZuX0ceBrzF)$5_3=JeNE+_) zlu!DRORiq55k_&J8v9?#I^+rgk55*Ny~0*kyWJUGXEn@c7nlY}#Y_2mHOCE_XSQltm|Mr`iE*ZhKdsiq(iku< z$)KWq<=;UEz5K+Gl(FC%7&-RMx|bTlTmqvkIQNd&Y!Db7W0jmy*X~W*W#hw}++(Hn zP#&FnJE$KBoJ`&Bq)fOz3AkNK6t+`1!I#%1UIvB*bU?jvX+ui8!ol>=5}}G%R^13Q zu`GsQ=$WEa&99!SDT~UftfkrSw`L{9opwhhFQtVxD&*X1iZX>+;D0%(F&8y0C$lC2 zRFTd6L&S(k7Skk>$hP4f`H|S?>!6Iu-ewAtHDpqUlW`X7%*26mA0jfKHqR0Pjv@JF*u4%k>=bamL9uYABCwCQRRS ztdyEE3hVQ64PfV9TE!Sl-Al%5-!7$5TZl1`D!N0kwQdFc>|qQL(CKN$?S1K@Gnhrq zSD?GPSE>|4G(qLT4r#zR>n3=Td}p%7B<>kfe1^+w+CqBaz@xGw@FHz#ubYQQ6W9`D z;{1oKyGLSKRZggyJcgLFWLutr-#fSu4PaW%XLmQ{h_JAl9`1fgSL^6b^N5I72>6~ z+NmZpD4a}b0iBtyH;sB}^+i;&1*UI>c4CB8vdh@8kwOc#xRWTH*9=5&J=Mh+>Xf5J zejf4bXP{@vqKz^s{7g6}L~8|4M%=+=C*(Gv&5+A+%7dX}W{UaEOmhObj&_hW^I8$8 z2ZfY5Dq$>QJCVJTRNR!E2J)Q0CVQa+j~abCc4y}z~2>QB(ZMd;z<@F z`Sg|}M~>Z`Spt+d=B`wY)M*k`g(3+ivD6bx=&N&&xE;YyYiI#+y~B}|BHc|k;}>xr zyZte|%7P0~Y)W6vaVbuMp6n8CL2_+|WzyFMKSO^U_^pdufKg@b_Ecg`$ukA8M1#3} zemsZSjpI2NgH&_*KTOLu&d2l47di(+*CdIe8Wdl#3XD7@*=Dd`5Z6UjrRS z9iLRYiWNoS=^Xh97GWoEOVP)Hte07iY-yr}--0~Jff|-^|J@uc zG*{29t&F7a< zl%hL<3L1-$K*lI41hLoV>QmkyEjfkI7BQUSOQv(iMZrhrMH zh^e4@n|iBsM1>kmX~jL-76Z<3s8_?4IRzIy@bB+ND5sgCW^HI2-$#2BU$HS@BTBd zaK^d)T&>D?46l)BsAB8}ZOdFVHpeG?xTH#Y5Ud#4GnBug8bs>DN0q<~9XB0&@962E zDJ4Q(=l$`e{#CMKruyXve7EK?cF<3uFnLMxG__W`O|vTcV7h|j(xBA#kNvTmMdO>} zHX5asjy5rNn<;vyeZL5BC_*j<_#z#uO8uxD=ZY@k1+hoinKP-x-OBXPP)V}1%uQXd4X}RMPI^N_&$c!J zSlzjMw(dQPf@dXkorG=RR7*e%cYR40JU0b>&Tx)jfDKFau2IbZ*3zdUC~@#XA6t+t zSP&T3>mTv5NT@59n6(jLj!L1B*xJJIn3vAn$6fXF5B=hqGaKoV+{Us^K~ER%}mC-gO!Gh~%3%C-X&s^t(s-Ecb7%s)@$v%xb?1Ct#1u`O1!p-;%@s;!(EdFWi z4E}G-)EjA5VrBNQ^nnkkZ+|FUperqmw)?y>H;IfpzzPl|$d37&z}_1?$6)>A5ZV>w$_yISZ3v2hs|t$Pq3 zX?NCjXJ@ZS8X#r{v&_vsI95?>)dQvy9Gr(AVYW7PeY3%9lgYlM{2}#LUF8k-tzeRA zz1nns29dG3V{(#T_z;E#yTT!_ye*kh$}v*uIEsT~B?PUEVpD0Cg=|%=Vr*wtD|?*_ zqsp56oG~fMb{nX77*%0mba2(l&%zkIoc>>;G@Zuu(iOA{OEc_%a1A|R{X;YVtn4S>W{dNJ!E;aa#^3!O;>c;&`_n) zh+j%f3=W1E*#0VJ`W2n|_Mkf0+9~`Ku!>CYvd&M15@ePUX(b)om(r*rQvn`r>kI?nd01s=sMQ)#%bp$TWoxKazmn8Yj|ndlQ{qHh z1a76CN|>4om{rV8w&E$n!+0dj55?4RlHD5OKR+9|2z!CzZ6Jk+T!X$8-y_6-_Qx

    G9_1M+w!AZS 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%0Ae!lJ{_hgz3k%Od*m; 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 z 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] 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 z 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 z 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

    r_(2Mn?JNe~-^((^ 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%0AiS&2GHGp{^YLF(b1jH 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

    dA`iYJ?bWuq)xnh%ZZE9QWXf|pLcM4AkO&@s+ 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⋙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 C&D16`4guFd=wPHxj;lO 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

    oR7+%WW)VINVUfOym>iw{Xz~uI9;?Ee zj1R1Pe~Ac20fLit<)V}d-UAaoBrma1CVL|J19Kg};O4LN$9IKG`GVt}63ZRHv2(IG zGp73hEU5Oy>9Lth>2@0bTbZ-FTCcmZ@~WkFQ8}xI<07BHKmlJ6L>TIpWTZ^F3qhk6 ziD8T*DpmDJkdcIs_XDP{s3PSssOMND??;P{gEBaH8gUh!^&k$_U?;4vka5C|ObsSS zn1WpePT*@hLqQ7!C!v=s3Dh^{2gtv2NqG5%00Z#46%4~`G$wyBgTeK7VTJw1FW z>vDnoPG<_U6g8(0{J{3%!&b5QO#!ToI5P^SEyqlnDG`turl8c%BIK8p*Ur7emQ~RZ z1T_5OqI5|4qqvv-nEigo2CII)@sMdz5y9-+Sw4P7p?hMOiwl@Dcj6nn3y7vJbRI)g z6*(ciO3FaKxFjroUy|CgWdX=sQ5G-2om47vPFFFT$|C2EYEx(}pN~4M@GJMk3f8gb z%+V81)iuknD}mD4X}K%Pv|Lx_-LdT_Rh49d(+JvizN_?!@$vi9rfcAhd);Mzzz-P?1X+KvRf@gh-;p&%LK;*$stabS zkli|5^j|gA^TL$sh`UW0^APk<3C0s>NOgpsg;Em?u4=3VtE$vHhF8*XvU>X7rq%d! zA8|SeV<>A|pB{H1>EwD>L#e#3cm>T~gsEE75S>Ic($b)Tw�bn3@1u^#cJ_p zG>A1HlwYK~2P2SvEE?Nlm3_3aQ3{rERirSXk%qO8ImeEjQcZqsHaW+Kc>!}0v_@UY zBy$xs0?ikmSdqD;XKKJ6Z6lPMGPG<>Y8Db|m5e7FK`CWoggaz7?xkj*cAV1!CN9CNQ_*LD-)T3w zAVYaN5qW~Bzes|0<+C2k16~ExBpbzrI5o4iB1&WT7n@W}k?x6z*ZE}eR7pII?(q#I zmQJD8q*5xO=D0oysjaSH*to7=Lmz}=A6+S#*`=k8nTm@^FgXX&;+#{@iMiP`z=+~m z{Q=cDMI6$>_hhZGBO_%&To-+R&@3gZlpSw~zqnVkw>DCWSnRt!p>!f65(efiw%D_i zN)8}50sL)@92F9tARG3q)SORD;8;_xkVus!PtPZEMnoc6-E zq&6c?U=)JCh|V1BIFfepXBfYaQP)NX9~zDKWgvn@K-cnTQthsLWZ|RB^Lt4oU(#sa z9EL3_iv8e%m$JaLWl_TjLT7$g-q?_5@W%~!oJWvsiRprL`&$Rrd=$7{(H-C#mwR>$IP=T6&Dn-nZgJp;&Bt^3X4p|Do zLI93jLv$LmPc$u$QHuBwp1^eSl+FR=FQ@vP{}!iP-ntbaI^&{kz0p7mm)a*-3?bL= zPb-zvoQ{e#^oj∾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

    ;1P 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

    rVxrIDJULl{5Unn3H6bcE2g(5;xp_ouy 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 z

    &_I7OXePI0G%Q_?Brly=HEWu0Ns_s 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 Bdd&a; literal 0 HcmV?d00001 From c518296a68b50bd6ca6e42fb155d640394774b09 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 6 Jul 2026 01:13:47 +0300 Subject: [PATCH 45/56] Add EPDF session-free form model and utilities Introduce a session-free EPDF form snapshot API and related utilities to support EmbedPDF use-cases. Adds a large new implementation (fpdfsdk/epdf_form.cpp) and public/epdf_form.h plus embedder tests and test PDF resources. Extend CPDF_InteractiveForm with ResolveCurrentDict and ReconcileWidget to rebind dictionaries to a document's current view and recover widgets reachable from page /Annots but missing from /AcroForm /Fields. Make ExportToFDF honor a skip_empty_required flag to preserve historic omit-empty-required behavior. Add whitespace-exact XML serialization APIs (CFX_XMLNode::SaveCompact and CFX_XMLElement::SaveCompact) to avoid corrupting xml:space="preserve" payloads, and unconditionally include CFX_MemoryStream in the build. Numerous helper routines implement form snapshotting, write transactions (toggles, text, choice), FDF/XFDF import/export, and layer-correctness rules. Update BUILD.gn files to expose new sources and tests. Tests/resources for recovered/orphan widgets and toggle fields are added. --- BUILD.gn | 5 + core/fpdfdoc/cpdf_interactiveform.cpp | 84 +- core/fpdfdoc/cpdf_interactiveform.h | 24 +- core/fxcrt/BUILD.gn | 13 +- core/fxcrt/xml/cfx_xmlelement.cpp | 31 + core/fxcrt/xml/cfx_xmlelement.h | 3 + core/fxcrt/xml/cfx_xmlnode.cpp | 6 + core/fxcrt/xml/cfx_xmlnode.h | 8 + fpdfsdk/BUILD.gn | 4 + fpdfsdk/epdf_form.cpp | 2800 +++++++++++++++++++++ fpdfsdk/epdf_form_embeddertest.cpp | 1204 +++++++++ fpdfsdk/fpdf_annot.cpp | 377 +-- public/epdf_form.h | 636 +++++ public/fpdf_annot.h | 133 - testing/resources/orphan_widgets.in | 107 + testing/resources/orphan_widgets.pdf | Bin 0 -> 2079 bytes testing/resources/toggle_fields.in | 162 ++ testing/resources/toggle_fields.pdf | Bin 0 -> 3130 bytes testing/resources/widgets_no_acroform.in | 84 + testing/resources/widgets_no_acroform.pdf | Bin 0 -> 1594 bytes 20 files changed, 5161 insertions(+), 520 deletions(-) create mode 100644 fpdfsdk/epdf_form.cpp create mode 100644 fpdfsdk/epdf_form_embeddertest.cpp create mode 100644 public/epdf_form.h create mode 100644 testing/resources/orphan_widgets.in create mode 100644 testing/resources/orphan_widgets.pdf create mode 100644 testing/resources/toggle_fields.in create mode 100644 testing/resources/toggle_fields.pdf create mode 100644 testing/resources/widgets_no_acroform.in create mode 100644 testing/resources/widgets_no_acroform.pdf diff --git a/BUILD.gn b/BUILD.gn index 3ba3799196..b5866bf395 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -198,6 +198,11 @@ source_set("pdfium_public_headers_impl") { sources = [ "public/cpp/fpdf_deleters.h", "public/cpp/fpdf_scopers.h", + # EmbedPDF: public runtime font registration API used by page fallback + # rendering and annotation authoring. + "public/epdf_font.h", + # EmbedPDF: session-free AcroForm model, write transactions, FDF/XFDF. + "public/epdf_form.h", "public/epdf_redact.h", "public/fpdf_annot.h", "public/fpdf_attachment.h", diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp index 4f85fde2db..c740a1bc05 100644 --- a/core/fpdfdoc/cpdf_interactiveform.cpp +++ b/core/fpdfdoc/cpdf_interactiveform.cpp @@ -856,6 +856,20 @@ CPDF_InteractiveForm::GetControlsForField(const CPDF_FormField* field) { return control_lists_[pdfium::WrapUnowned(field)]; } +// EmbedPDF: layer documents resolve references held by frozen base objects +// through the base holder, which returns stale instances once an object has +// been promoted into the layer. Rebinding by object number restores the +// document's current view. Identity on plain documents. See header. +RetainPtr CPDF_InteractiveForm::ResolveCurrentDict( + RetainPtr dict) const { + if (!dict || dict->GetObjNum() == 0) { + return dict; + } + RetainPtr current = + ToDictionary(document_->GetIndirectObject(dict->GetObjNum())); + return current ? current : dict; +} + void CPDF_InteractiveForm::LoadField( RetainPtr field_dict, int nLevel) { @@ -865,6 +879,9 @@ void CPDF_InteractiveForm::LoadField( if (!field_dict) { return; } + // EmbedPDF: bind to the document's current view so layer promotions win + // over frozen base instances reached through base-held references. + field_dict = ResolveCurrentDict(std::move(field_dict)); uint32_t dwParentObjNum = field_dict->GetObjNum(); RetainPtr kids = @@ -907,6 +924,51 @@ void CPDF_InteractiveForm::FixPageFields(CPDF_Page* page) { } } +// EmbedPDF: recover form fields that are reachable from a page's /Annots +// array but missing from the /AcroForm /Fields tree (a common producer +// bug); used by the EPDFForm_* model build instead of the page-load hook +// FixPageFields(), which requires an expensive CPDF_Page. See header. +void CPDF_InteractiveForm::ReconcileWidget( + RetainPtr widget_dict) { + widget_dict = ResolveCurrentDict(std::move(widget_dict)); + if (!widget_dict) { + return; + } + if (GetControlByDict(widget_dict.Get())) { + return; + } + + // A widget that carries no field type anywhere on its /Parent chain is + // not a form control; leave it alone. + if (!CPDF_FormField::GetFieldAttrForDict(widget_dict.Get(), + pdfium::form_fields::kFT)) { + return; + } + + // Climb to the field root, cycle-guarded, so every sibling widget of the + // same field lands on one logical field. + RetainPtr root = widget_dict; + std::vector visited = {root.Get()}; + for (int i = 0; i < kMaxRecursion; ++i) { + RetainPtr parent = + ResolveCurrentDict(root->GetDictFor(pdfium::form_fields::kParent)); + if (!parent || pdfium::Contains(visited, parent.Get())) { + break; + } + visited.push_back(parent.Get()); + root = std::move(parent); + } + LoadField(root, 0); + + // If the widget is still unlinked (e.g. its parent does not list it in + // /Kids), load it directly. AddTerminalField() resolves the owning field + // through the inheritance-aware attribute lookup, so the control still + // attaches to the field with the correct fully qualified name. + if (!GetControlByDict(widget_dict.Get())) { + LoadField(std::move(widget_dict), 0); + } +} + void CPDF_InteractiveForm::AddTerminalField( RetainPtr field_dict) { RetainPtr field_storage_dict = field_dict; @@ -917,7 +979,10 @@ void CPDF_InteractiveForm::AddTerminalField( field_storage_dict.Reset(); if (kids) { for (size_t i = 0; i < kids->size(); ++i) { - RetainPtr kid = kids->GetDictAt(i); + // EmbedPDF: rebind to the layer's current view (see + // ResolveCurrentDict). + RetainPtr kid = + ResolveCurrentDict(kids->GetDictAt(i)); if (CPDF_FormField::GetFieldAttrForDict(kid.Get(), pdfium::form_fields::kFT)) { field_storage_dict = std::move(kid); @@ -957,7 +1022,9 @@ void CPDF_InteractiveForm::AddTerminalField( return; } for (size_t i = 0; i < kids->size(); i++) { - RetainPtr kid = kids->GetDictAt(i); + // EmbedPDF: rebind to the layer's current view (see ResolveCurrentDict). + RetainPtr kid = + ResolveCurrentDict(kids->GetDictAt(i)); if (kid && kid->GetNameFor("Subtype") == "Widget") { AddControl(field, pdfium::WrapRetain(const_cast(kid.Get()))); @@ -1019,20 +1086,22 @@ bool CPDF_InteractiveForm::CheckRequiredFields( } std::unique_ptr CPDF_InteractiveForm::ExportToFDF( - const WideString& pdf_path) const { + const WideString& pdf_path, + bool skip_empty_required) const { std::vector fields; CFieldTree::Node* pRoot = field_tree_->GetRoot(); const size_t nCount = pRoot->CountFields(); for (size_t i = 0; i < nCount; ++i) { fields.push_back(pRoot->GetFieldAtIndex(i)); } - return ExportToFDF(pdf_path, fields, true); + return ExportToFDF(pdf_path, fields, true, skip_empty_required); } std::unique_ptr CPDF_InteractiveForm::ExportToFDF( const WideString& pdf_path, const std::vector& fields, - bool bIncludeOrExclude) const { + bool bIncludeOrExclude, + bool skip_empty_required) const { std::unique_ptr doc = CFDF_Document::CreateNewDoc(); if (!doc) { return nullptr; @@ -1067,7 +1136,10 @@ std::unique_ptr CPDF_InteractiveForm::ExportToFDF( continue; } - if ((dwFlags & pdfium::form_flags::kRequired) != 0 && + // EmbedPDF: |skip_empty_required| makes the historic omit-empty-required + // submission behavior optional so interchange exports stay faithful. + if (skip_empty_required && + (dwFlags & pdfium::form_flags::kRequired) != 0 && field->GetFieldDict() ->GetByteStringFor(pdfium::form_fields::kV) .IsEmpty()) { diff --git a/core/fpdfdoc/cpdf_interactiveform.h b/core/fpdfdoc/cpdf_interactiveform.h index 3de7645fd2..8e05e56ef7 100644 --- a/core/fpdfdoc/cpdf_interactiveform.h +++ b/core/fpdfdoc/cpdf_interactiveform.h @@ -82,11 +82,17 @@ class CPDF_InteractiveForm { bool CheckRequiredFields(const std::vector* fields, bool bIncludeOrExclude) const; - std::unique_ptr ExportToFDF(const WideString& pdf_path) const; + // EmbedPDF: |skip_empty_required| preserves the historic submission + // behavior of omitting required fields whose value is empty; pass false + // for faithful interchange exports. + std::unique_ptr ExportToFDF( + const WideString& pdf_path, + bool skip_empty_required = true) const; std::unique_ptr ExportToFDF( const WideString& pdf_path, const std::vector& fields, - bool bIncludeOrExclude) const; + bool bIncludeOrExclude, + bool skip_empty_required = true) const; void ResetForm(); void ResetForm(pdfium::span fields, bool bIncludeOrExclude); @@ -94,6 +100,13 @@ class CPDF_InteractiveForm { void SetNotifierIface(NotifierIface* notify); void FixPageFields(CPDF_Page* page); + // EmbedPDF: Load a widget annotation that is reachable from a page's + // /Annots array but not from the /AcroForm /Fields tree. Climbs the + // /Parent chain to the field root first, so sibling widgets of a + // partially linked field reconcile onto a single logical field. + // In-memory reconciliation only; never writes to the document. + void ReconcileWidget(RetainPtr widget_dict); + // Wrap callbacks thru NotifierIface. bool NotifyBeforeValueChange(CPDF_FormField* field, const WideString& value); void NotifyAfterValueChange(CPDF_FormField* field); @@ -108,6 +121,13 @@ class CPDF_InteractiveForm { CPDF_Document* document() { return document_; } private: + // EmbedPDF: Rebind an indirect dictionary to the document's current view + // of that object number. On layer documents this returns the promoted + // clone when one exists; references held by frozen base objects resolve + // to stale frozen instances otherwise. Identity on plain documents. + RetainPtr ResolveCurrentDict( + RetainPtr dict) const; + void LoadField(RetainPtr field_dict, int nLevel); void AddTerminalField(RetainPtr field_dict); CPDF_FormControl* AddControl(CPDF_FormField* field, diff --git a/core/fxcrt/BUILD.gn b/core/fxcrt/BUILD.gn index 45eec12371..09c2f00b33 100644 --- a/core/fxcrt/BUILD.gn +++ b/core/fxcrt/BUILD.gn @@ -179,12 +179,13 @@ source_set("fxcrt") { "win/win_util.h", ] } - if (pdf_enable_xfa) { - sources += [ - "cfx_memorystream.cpp", - "cfx_memorystream.h", - ] - } + # EmbedPDF: CFX_MemoryStream was XFA-gated upstream because XFA was its + # only consumer; the EPDFForm_* XFDF serializer (fpdfsdk/epdf_form.cpp) + # uses it as the in-memory write target, so build it unconditionally. + sources += [ + "cfx_memorystream.cpp", + "cfx_memorystream.h", + ] } source_set("test_support") { diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp index 185bd93927..bedd7e9315 100644 --- a/core/fxcrt/xml/cfx_xmlelement.cpp +++ b/core/fxcrt/xml/cfx_xmlelement.cpp @@ -109,6 +109,37 @@ void CFX_XMLElement::Save( pXMLStream->WriteString(">\n"); } +// EmbedPDF: identical to Save() minus the injected newlines, so text +// content round-trips byte-exact under xml:space="preserve" (XFDF form +// data values). See CFX_XMLNode::SaveCompact(). +void CFX_XMLElement::SaveCompact( + const RetainPtr& pXMLStream) { + ByteString bsNameEncoded = name_.ToUTF8(); + + pXMLStream->WriteString("<"); + pXMLStream->WriteString(bsNameEncoded.AsStringView()); + + for (const auto& it : attrs_) { + pXMLStream->WriteString( + AttributeToString(it.first, it.second).ToUTF8().AsStringView()); + } + + if (!GetFirstChild()) { + pXMLStream->WriteString(" />"); + return; + } + + pXMLStream->WriteString(">"); + + for (CFX_XMLNode* pChild = GetFirstChild(); pChild; + pChild = pChild->GetNextSibling()) { + pChild->SaveCompact(pXMLStream); + } + pXMLStream->WriteString("WriteString(bsNameEncoded.AsStringView()); + pXMLStream->WriteString(">"); +} + CFX_XMLElement* CFX_XMLElement::GetFirstChildNamed(WideStringView name) const { return GetNthChildNamed(name, 0); } diff --git a/core/fxcrt/xml/cfx_xmlelement.h b/core/fxcrt/xml/cfx_xmlelement.h index d48bf9fe01..e7f1d6a1f3 100644 --- a/core/fxcrt/xml/cfx_xmlelement.h +++ b/core/fxcrt/xml/cfx_xmlelement.h @@ -23,6 +23,9 @@ class CFX_XMLElement final : public CFX_XMLNode { Type GetType() const override; CFX_XMLNode* Clone(CFX_XMLDocument* doc) override; void Save(const RetainPtr& pXMLStream) override; + // EmbedPDF: element serialization without formatting whitespace. + void SaveCompact( + const RetainPtr& pXMLStream) override; const WideString& GetName() const { return name_; } diff --git a/core/fxcrt/xml/cfx_xmlnode.cpp b/core/fxcrt/xml/cfx_xmlnode.cpp index c7a4f6641a..97741b73d0 100644 --- a/core/fxcrt/xml/cfx_xmlnode.cpp +++ b/core/fxcrt/xml/cfx_xmlnode.cpp @@ -14,6 +14,12 @@ void CFX_XMLNode::InsertChildNode(CFX_XMLNode* pNode, int32_t index) { InsertBefore(pNode, GetNthChild(index)); } +// EmbedPDF: see header - whitespace-exact serialization entry point. +void CFX_XMLNode::SaveCompact( + const RetainPtr& pXMLStream) { + Save(pXMLStream); +} + CFX_XMLNode* CFX_XMLNode::GetRoot() { CFX_XMLNode* pParent = this; while (pParent->GetParent()) { diff --git a/core/fxcrt/xml/cfx_xmlnode.h b/core/fxcrt/xml/cfx_xmlnode.h index 5934bc7036..8f0b961ab5 100644 --- a/core/fxcrt/xml/cfx_xmlnode.h +++ b/core/fxcrt/xml/cfx_xmlnode.h @@ -29,6 +29,14 @@ class CFX_XMLNode : public TreeNode { virtual CFX_XMLNode* Clone(CFX_XMLDocument* doc) = 0; virtual void Save(const RetainPtr& pXMLStream) = 0; + // EmbedPDF: whitespace-exact serialization for xml:space="preserve" + // payloads (XFDF form data). Save() pretty-prints by injecting newlines + // into element content, which corrupts text values on round-trip. Kept + // as a separate method so existing Save() output (XFA checksummed XML) + // is untouched. Default forwards to Save(); CFX_XMLElement overrides. + virtual void SaveCompact( + const RetainPtr& pXMLStream); + CFX_XMLNode* GetRoot(); void InsertChildNode(CFX_XMLNode* pNode, int32_t index); }; diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index b9be6f88d4..9e7a92fb62 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -10,6 +10,8 @@ source_set("fpdfsdk") { "epdf_base_document.cpp", # EmbedPDF: implements EPDFFont_* runtime font registration APIs. "epdf_font.cpp", + # EmbedPDF: session-free AcroForm model snapshot (EPDFForm_* APIs). + "epdf_form.cpp", "epdf_layer.cpp", "epdf_outline.cpp", "epdf_page_content_helpers.cpp", @@ -139,6 +141,8 @@ pdfium_embeddertest_source_set("embeddertests") { sources = [ "cpdfsdk_annotiterator_embeddertest.cpp", "cpdfsdk_baannot_embeddertest.cpp", + # EmbedPDF: covers the EPDFForm_* session-free form APIs. + "epdf_form_embeddertest.cpp", "fpdf_annot_embeddertest.cpp", "fpdf_attachment_embeddertest.cpp", "fpdf_catalog_embeddertest.cpp", diff --git a/fpdfsdk/epdf_form.cpp b/fpdfsdk/epdf_form.cpp new file mode 100644 index 0000000000..050740e799 --- /dev/null +++ b/fpdfsdk/epdf_form.cpp @@ -0,0 +1,2800 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_form.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "constants/form_fields.h" +#include "constants/form_flags.h" +#include "core/fpdfapi/parser/cfdf_document.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpdf_generateap.h" +#include "core/fpdfdoc/cpdf_interactiveform.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/cfx_memorystream.h" +#include "core/fxcrt/cfx_read_only_span_stream.h" +#include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/containers/contains.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "core/fxcrt/span.h" +#include "core/fxcrt/span_util.h" +#include "core/fxcrt/stl_util.h" +#include "core/fxcrt/widestring.h" +#include "core/fxcrt/xml/cfx_xmldocument.h" +#include "core/fxcrt/xml/cfx_xmlelement.h" +#include "core/fxcrt/xml/cfx_xmlnode.h" +#include "core/fxcrt/xml/cfx_xmlparser.h" +#include "core/fxcrt/xml/cfx_xmltext.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace { + +struct WidgetRecord { + uint32_t objnum = 0; + uint32_t page_objnum = 0; + ByteString on_state; + WideString export_value; + bool checked = false; +}; + +struct OptionRecord { + WideString label; + WideString value; + bool selected = false; +}; + +struct FieldRecord { + uint32_t objnum = 0; + int family = EPDF_FORMFIELD_FAMILY_UNKNOWN; + uint32_t flags = 0; + int origin = EPDF_FORMFIELD_ORIGIN_ACROFORM; + int max_len = 0; + WideString fqn; + WideString alternate_name; + WideString mapping_name; + WideString value; + WideString default_value; + std::vector options; + std::vector widgets; +}; + +// A detached, immutable snapshot. Holds no pointers into the document, so +// it stays valid after the document is closed and can never dangle or +// observe stale pre-promotion objects. +struct FormModel { + int kind = EPDF_FORMKIND_NONE; + bool need_appearances = false; + std::vector fields; + std::map field_index_by_objnum; + std::map field_index_by_widget_objnum; +}; + +FormModel* FormModelFromHandle(EPDF_FORM_MODEL model) { + return reinterpret_cast(model); +} + +EPDF_FORM_MODEL HandleFromFormModel(FormModel* model) { + return reinterpret_cast(model); +} + +const FieldRecord* GetFieldRecord(EPDF_FORM_MODEL model, int field_index) { + FormModel* form = FormModelFromHandle(model); + if (!form || field_index < 0 || + field_index >= fxcrt::CollectionSize(form->fields)) { + return nullptr; + } + return &form->fields[field_index]; +} + +const WidgetRecord* GetWidgetRecord(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field || widget_index < 0 || + widget_index >= fxcrt::CollectionSize(field->widgets)) { + return nullptr; + } + return &field->widgets[widget_index]; +} + +const OptionRecord* GetOptionRecord(EPDF_FORM_MODEL model, + int field_index, + int option_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field || option_index < 0 || + option_index >= fxcrt::CollectionSize(field->options)) { + return nullptr; + } + return &field->options[option_index]; +} + +int FamilyFromFieldType(CPDF_FormField::Type type) { + switch (type) { + case CPDF_FormField::kPushButton: + return EPDF_FORMFIELD_FAMILY_PUSHBUTTON; + case CPDF_FormField::kRadioButton: + return EPDF_FORMFIELD_FAMILY_RADIO; + case CPDF_FormField::kCheckBox: + return EPDF_FORMFIELD_FAMILY_CHECKBOX; + case CPDF_FormField::kText: + case CPDF_FormField::kRichText: + case CPDF_FormField::kFile: + return EPDF_FORMFIELD_FAMILY_TEXT; + case CPDF_FormField::kListBox: + return EPDF_FORMFIELD_FAMILY_LISTBOX; + case CPDF_FormField::kComboBox: + return EPDF_FORMFIELD_FAMILY_COMBOBOX; + case CPDF_FormField::kSign: + return EPDF_FORMFIELD_FAMILY_SIGNATURE; + case CPDF_FormField::kUnknown: + return EPDF_FORMFIELD_FAMILY_UNKNOWN; + } + return EPDF_FORMFIELD_FAMILY_UNKNOWN; +} + +bool IsToggleFamily(int family) { + return family == EPDF_FORMFIELD_FAMILY_CHECKBOX || + family == EPDF_FORMFIELD_FAMILY_RADIO; +} + +bool IsChoiceFamily(int family) { + return family == EPDF_FORMFIELD_FAMILY_COMBOBOX || + family == EPDF_FORMFIELD_FAMILY_LISTBOX; +} + +size_t CountFormFields(const CPDF_InteractiveForm& form) { + return form.CountFields(WideString()); +} + +// Collect the set of field dictionaries currently known to |form|. Used to +// tell recovered fields (found only by the page sweep) apart from fields +// reachable through /AcroForm /Fields. +std::set CollectFieldDicts( + const CPDF_InteractiveForm& form) { + std::set dicts; + const size_t count = CountFormFields(form); + for (size_t i = 0; i < count; ++i) { + CPDF_FormField* field = form.GetField(i, WideString()); + if (field) { + dicts.insert(field->GetFieldDict().Get()); + } + } + return dicts; +} + +// Walk every page dictionary (page-tree traversal only - no CPDF_Page, no +// content parsing) and reconcile widget annotations that the /AcroForm +// /Fields walk did not reach. Also records which page references each +// widget, which the snapshot uses as the widget's placement. +std::map SweepPageWidgets( + CPDF_Document* doc, + CPDF_InteractiveForm* form) { + std::map widget_pages; + const int page_count = doc->GetPageCount(); + for (int i = 0; i < page_count; ++i) { + RetainPtr page = doc->GetPageDictionary(i); + if (!page) { + continue; + } + RetainPtr annots = page->GetArrayFor("Annots"); + if (!annots) { + continue; + } + for (size_t j = 0; j < annots->size(); ++j) { + // Resolve each annotation by object number through the document so + // layer promotions win over the frozen instances that references + // held by frozen base objects would yield. + RetainPtr element = annots->GetObjectAt(j); + if (!element) { + continue; + } + RetainPtr annot; + if (const CPDF_Reference* ref = element->AsReference()) { + annot = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + } else { + annot = ToDictionary(std::move(element)); + } + if (!annot || annot->GetNameFor("Subtype") != "Widget") { + continue; + } + widget_pages.try_emplace(annot.Get(), page->GetObjNum()); + if (!form->GetControlByDict(annot.Get())) { + form->ReconcileWidget(annot); + } + } + } + return widget_pages; +} + +uint32_t PageObjNumForWidget( + const std::map& widget_pages, + const CPDF_Dictionary* widget_dict) { + const auto it = widget_pages.find(widget_dict); + if (it != widget_pages.end()) { + return it->second; + } + // Fall back to the widget's /P entry for widgets that no swept page + // references (e.g. pages outside a layer's page list). + RetainPtr page = widget_dict->GetDictFor("P"); + return page ? page->GetObjNum() : 0; +} + +FieldRecord SnapshotField( + CPDF_FormField* field, + const std::set& initial_fields, + const std::map& widget_pages) { + FieldRecord record; + const CPDF_Dictionary* field_dict = field->GetFieldDict().Get(); + record.objnum = field_dict->GetObjNum(); + record.family = FamilyFromFieldType(field->GetType()); + record.flags = field->GetFieldFlags(); + record.origin = pdfium::Contains(initial_fields, field_dict) + ? EPDF_FORMFIELD_ORIGIN_ACROFORM + : EPDF_FORMFIELD_ORIGIN_RECOVERED; + record.fqn = field->GetFullName(); + record.alternate_name = field->GetAlternateName(); + record.mapping_name = field->GetMappingName(); + record.value = field->GetValue(); + record.default_value = field->GetDefaultValue(); + if (record.family == EPDF_FORMFIELD_FAMILY_TEXT) { + record.max_len = field->GetMaxLen(); + } + + if (IsChoiceFamily(record.family)) { + const int option_count = field->CountOptions(); + record.options.reserve(option_count); + for (int i = 0; i < option_count; ++i) { + OptionRecord option; + option.label = field->GetOptionLabel(i); + option.value = field->GetOptionValue(i); + option.selected = field->IsItemSelected(i); + record.options.push_back(std::move(option)); + } + } + + const int control_count = field->CountControls(); + record.widgets.reserve(control_count); + for (int i = 0; i < control_count; ++i) { + const CPDF_FormControl* control = field->GetControl(i); + if (!control) { + continue; + } + const CPDF_Dictionary* widget_dict = control->GetWidgetDict().Get(); + WidgetRecord widget; + widget.objnum = widget_dict->GetObjNum(); + widget.page_objnum = PageObjNumForWidget(widget_pages, widget_dict); + if (IsToggleFamily(record.family)) { + widget.on_state = control->GetOnStateName(); + widget.export_value = control->GetExportValue(); + widget.checked = control->IsChecked(); + } + record.widgets.push_back(std::move(widget)); + } + return record; +} + +} // namespace + +// --------------------------------------------------------------------------- +// Write transactions. +// +// Layer-correctness rules, load-bearing on CPDF_LayerDocument: +// 1. Plan with const reads resolved per object number through +// doc->GetIndirectObject() (layer-first lookup), never through cached +// references captured from frozen base objects. +// 2. Validate fully BEFORE the first mutable access: a failed transaction +// must promote nothing. +// 3. Mutate ONLY objects obtained from doc->GetMutableIndirectObject() +// (which promotes) or reached through such a promoted clone. Never +// mutate an object reached by resolving a reference held by a frozen +// base object - that would corrupt the shared base. +// --------------------------------------------------------------------------- + +namespace { + +constexpr char kOffState[] = "Off"; + +// One widget of a terminal field, resolved for a transaction. +struct TxnControl { + uint32_t objnum = 0; // 0 for direct (spec-violating) kid dictionaries. + size_t kids_index = 0; + bool merged = false; // The control IS the field dictionary. + RetainPtr dict; // Planning-phase resolution. + ByteString on_state; + WideString export_value; + ByteString current_as; +}; + +// GetOrParseIndirectObject parses on demand on plain documents (the const +// GetIndirectObject is a map-only lookup) and is the promoted-first lookup +// on layer documents, where it never promotes - safe for planning reads. +RetainPtr ResolveFieldDict(CPDF_Document* doc, + uint32_t field_objnum) { + if (!doc || field_objnum == 0) { + return nullptr; + } + return ToDictionary(doc->GetOrParseIndirectObject(field_objnum)); +} + +ByteString InheritedFieldType(const CPDF_Dictionary* field_dict) { + RetainPtr ft = CPDF_FormField::GetFieldAttrForDict( + field_dict, pdfium::form_fields::kFT); + return ft ? ft->GetString() : ByteString(); +} + +uint32_t InheritedFieldFlags(const CPDF_Dictionary* field_dict) { + RetainPtr ff = CPDF_FormField::GetFieldAttrForDict( + field_dict, pdfium::form_fields::kFf); + return ff ? static_cast(ff->GetInteger()) : 0; +} + +ByteString ReadWidgetOnState(const CPDF_Dictionary* widget_dict) { + RetainPtr ap = widget_dict->GetDictFor("AP"); + if (!ap) { + return ByteString(); + } + RetainPtr normal = ap->GetDictFor("N"); + if (!normal) { + return ByteString(); + } + CPDF_DictionaryLocker locker(normal); + for (const auto& it : locker) { + if (it.first != kOffState) { + return it.first; + } + } + return ByteString(); +} + +WideString OptExportAt(const CPDF_Array* opt, size_t index) { + RetainPtr element = opt->GetDirectObjectAt(index); + if (!element) { + return WideString(); + } + const CPDF_Array* pair = element->AsArray(); + return pair ? pair->GetUnicodeTextAt(0) : element->GetUnicodeText(); +} + +// Resolve the widgets of a terminal field, each through the document so +// layer promotions win. Fails when a kid carries /T: the target is a +// non-terminal field and value transactions must address terminal fields. +bool CollectTxnControls(CPDF_Document* doc, + const CPDF_Dictionary* field_dict, + uint32_t field_objnum, + bool want_toggle_info, + std::vector* out) { + RetainPtr opt_array; + if (want_toggle_info) { + opt_array = ToArray( + CPDF_FormField::GetFieldAttrForDict(field_dict, "Opt")); + } + + auto finish_control = [&](TxnControl control) { + if (want_toggle_info && control.dict) { + control.on_state = ReadWidgetOnState(control.dict.Get()); + control.current_as = control.dict->GetNameFor("AS"); + // Mirrors CPDF_FormControl::GetExportValue(): toggle /Opt entries are + // plain strings indexed by control ordinal, with a "Yes" fallback. + const size_t ordinal = out->size(); + ByteString export_bytes = control.on_state; + if (opt_array && ordinal < opt_array->size()) { + export_bytes = opt_array->GetByteStringAt(ordinal); + } + if (export_bytes.IsEmpty()) { + export_bytes = "Yes"; + } + control.export_value = PDF_DecodeText(export_bytes.unsigned_span()); + } + out->push_back(std::move(control)); + }; + + RetainPtr kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); + if (!kids) { + TxnControl control; + control.merged = true; + control.objnum = field_objnum; + control.dict = pdfium::WrapRetain(field_dict); + finish_control(std::move(control)); + return true; + } + + for (size_t i = 0; i < kids->size(); ++i) { + RetainPtr element = kids->GetObjectAt(i); + if (!element) { + continue; + } + TxnControl control; + control.kids_index = i; + if (const CPDF_Reference* ref = element->AsReference()) { + control.objnum = ref->GetRefObjNum(); + control.dict = + ToDictionary(doc->GetOrParseIndirectObject(control.objnum)); + } else { + control.dict = ToDictionary(std::move(element)); + } + if (!control.dict) { + continue; + } + if (control.dict->KeyExist(pdfium::form_fields::kT)) { + return false; // Child field: |field_dict| is not terminal. + } + finish_control(std::move(control)); + } + return !out->empty(); +} + +// Resolve a control for mutation. Everything routes through promotion: +// indirect widgets promote themselves; direct kids are reached through the +// already-promoted field clone. +RetainPtr MutableControlDict( + CPDF_Document* doc, + const TxnControl& control, + const RetainPtr& promoted_field) { + if (control.merged) { + return promoted_field; + } + if (control.objnum != 0) { + return ToDictionary(doc->GetMutableIndirectObject(control.objnum)); + } + RetainPtr kids = + promoted_field->GetMutableArrayFor(pdfium::form_fields::kKids); + return kids ? kids->GetMutableDictAt(control.kids_index) : nullptr; +} + +void ReportChangedWidgets(const std::vector& changed_objnums, + unsigned long total_changed, + uint32_t* buffer, + unsigned long buffer_size, + unsigned long* out_changed_count) { + if (buffer && buffer_size > 0) { + pdfium::span out_span = + UNSAFE_BUFFERS(pdfium::span(buffer, static_cast(buffer_size))); + const size_t n = std::min(out_span.size(), changed_objnums.size()); + fxcrt::Copy(pdfium::span(changed_objnums).first(n), out_span); + } + if (out_changed_count) { + *out_changed_count = total_changed; + } +} + +CPDF_GenerateAP::FormType ChoiceFormType(uint32_t flags) { + return (flags & pdfium::form_flags::kChoiceCombo) + ? CPDF_GenerateAP::kComboBox + : CPDF_GenerateAP::kListBox; +} + +// Toggle transactions mirror CPDF_FormField::CheckControl semantics: +// checkboxes are always in unison; radios only with the RadiosInUnison +// flag; /V holds the export value name, or the control index when the +// field carries /Opt. +struct ToggleContext { + RetainPtr field; + uint32_t flags = 0; + bool is_radio = false; + std::vector controls; +}; + +bool PrepareToggle(CPDF_Document* doc, + uint32_t field_objnum, + ToggleContext* ctx) { + ctx->field = ResolveFieldDict(doc, field_objnum); + if (!ctx->field || + InheritedFieldType(ctx->field.Get()) != pdfium::form_fields::kBtn) { + return false; + } + ctx->flags = InheritedFieldFlags(ctx->field.Get()); + if (ctx->flags & pdfium::form_flags::kButtonPushbutton) { + return false; + } + ctx->is_radio = ctx->flags & pdfium::form_flags::kButtonRadio; + return CollectTxnControls(doc, ctx->field.Get(), field_objnum, + /*want_toggle_info=*/true, &ctx->controls); +} + +bool RejectClearForNoToggleToOff(const ToggleContext& ctx) { + return ctx.is_radio && + (ctx.flags & pdfium::form_flags::kButtonNoToggleToOff); +} + +bool ExecuteToggle(CPDF_Document* doc, + uint32_t field_objnum, + const ToggleContext& ctx, + const TxnControl* target, + size_t target_ordinal, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + const bool unison = + !ctx.is_radio || (ctx.flags & pdfium::form_flags::kButtonRadiosInUnison); + + // Plan: new /AS per control, new /V for the field. + struct Step { + size_t control_index; + ByteString new_as; + }; + std::vector steps; + for (size_t i = 0; i < ctx.controls.size(); ++i) { + const TxnControl& control = ctx.controls[i]; + bool checked = false; + if (target) { + checked = unison ? control.export_value == target->export_value && + control.on_state == target->on_state + : i == target_ordinal; + } + ByteString new_as = checked ? control.on_state : ByteString(kOffState); + if (new_as != control.current_as) { + steps.push_back({i, std::move(new_as)}); + } + } + + RetainPtr opt_array = + ToArray(CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), "Opt")); + ByteString new_v = kOffState; + if (target) { + new_v = opt_array + ? ByteString::FormatInteger( + pdfium::checked_cast(target_ordinal)) + : PDF_EncodeText(target->export_value.AsStringView()); + } + RetainPtr current_v = + CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), + pdfium::form_fields::kV); + const bool v_changes = !current_v || current_v->GetString() != new_v; + + if (steps.empty() && !v_changes) { + ReportChangedWidgets({}, 0, changed_widget_objnums, buffer_size, + out_changed_count); + return true; + } + + // Apply. First mutable access happens here; promotion is now safe. + const bool need_promoted_field = + v_changes || + std::any_of(steps.begin(), steps.end(), [&](const Step& s) { + const TxnControl& c = ctx.controls[s.control_index]; + return c.merged || c.objnum == 0; + }); + RetainPtr promoted_field; + if (need_promoted_field) { + promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + } + if (v_changes) { + promoted_field->SetNewFor(pdfium::form_fields::kV, new_v); + } + + std::vector changed; + unsigned long total_changed = 0; + for (const Step& step : steps) { + const TxnControl& control = ctx.controls[step.control_index]; + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (!widget) { + continue; + } + widget->SetNewFor("AS", step.new_as); + ++total_changed; + if (control.objnum != 0) { + changed.push_back(control.objnum); + } + } + ReportChangedWidgets(changed, total_changed, changed_widget_objnums, + buffer_size, out_changed_count); + return true; +} + +// Select the target widget by appearance state name ("Off"/empty clears). +bool ApplyToggle(CPDF_Document* doc, + uint32_t field_objnum, + const ByteString& requested_state, + bool lenient_unknown_state, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + ToggleContext ctx; + if (!PrepareToggle(doc, field_objnum, &ctx)) { + return false; + } + const bool clearing = + requested_state.IsEmpty() || requested_state == kOffState; + if (clearing && RejectClearForNoToggleToOff(ctx)) { + return false; + } + const TxnControl* target = nullptr; + size_t target_ordinal = 0; + if (!clearing) { + for (size_t i = 0; i < ctx.controls.size(); ++i) { + if (ctx.controls[i].on_state == requested_state) { + target = &ctx.controls[i]; + target_ordinal = i; + break; + } + } + if (!target && !lenient_unknown_state) { + return false; + } + } + return ExecuteToggle(doc, field_objnum, ctx, target, target_ordinal, + changed_widget_objnums, buffer_size, + out_changed_count); +} + +// Select the target widget by export value - the identity FDF/XFDF carry. +bool ApplyToggleByExport(CPDF_Document* doc, + uint32_t field_objnum, + const WideString& export_value, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + ToggleContext ctx; + if (!PrepareToggle(doc, field_objnum, &ctx)) { + return false; + } + const bool clearing = export_value.IsEmpty() || export_value == L"Off"; + if (clearing && RejectClearForNoToggleToOff(ctx)) { + return false; + } + const TxnControl* target = nullptr; + size_t target_ordinal = 0; + if (!clearing) { + for (size_t i = 0; i < ctx.controls.size(); ++i) { + if (ctx.controls[i].export_value == export_value) { + target = &ctx.controls[i]; + target_ordinal = i; + break; + } + } + if (!target) { + return false; + } + } + return ExecuteToggle(doc, field_objnum, ctx, target, target_ordinal, + changed_widget_objnums, buffer_size, + out_changed_count); +} + +// Regenerate the /AP of every control and report them all as changed. +bool RegenerateControlAppearances(CPDF_Document* doc, + const std::vector& controls, + const RetainPtr& promoted_field, + CPDF_GenerateAP::FormType type, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + std::vector changed; + unsigned long total_changed = 0; + for (const TxnControl& control : controls) { + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (!widget) { + continue; + } + CPDF_GenerateAP::GenerateFormAP(doc, widget.Get(), type); + ++total_changed; + if (control.objnum != 0) { + changed.push_back(control.objnum); + } + } + ReportChangedWidgets(changed, total_changed, changed_widget_objnums, + buffer_size, out_changed_count); + return true; +} + +// Internal text transaction; the public wrapper converts the wire string. +bool ApplyTextValue(CPDF_Document* doc, + uint32_t field_objnum, + const WideString& new_value, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || InheritedFieldType(field.Get()) != pdfium::form_fields::kTx) { + return false; + } + + RetainPtr max_len_obj = + CPDF_FormField::GetFieldAttrForDict(field.Get(), "MaxLen"); + const int max_len = max_len_obj ? max_len_obj->GetInteger() : 0; + if (max_len > 0 && new_value.GetLength() > static_cast(max_len)) { + return false; + } + + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return false; + } + + RetainPtr current_v = + CPDF_FormField::GetFieldAttrForDict(field.Get(), + pdfium::form_fields::kV); + const WideString current_value = + current_v ? current_v->GetUnicodeText() : WideString(); + if (current_value == new_value && !field->KeyExist("RV")) { + ReportChangedWidgets({}, 0, changed_widget_objnums, buffer_size, + out_changed_count); + return true; + } + + RetainPtr promoted_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + promoted_field->SetNewFor(pdfium::form_fields::kV, + new_value.AsStringView()); + // A rich text value would now contradict /V; drop it rather than lie. + promoted_field->RemoveFor("RV"); + + return RegenerateControlAppearances( + doc, controls, promoted_field, CPDF_GenerateAP::kTextField, + changed_widget_objnums, buffer_size, out_changed_count); +} + +// Internal choice transaction; the public wrapper converts the wire strings. +bool ApplyChoiceValues(CPDF_Document* doc, + uint32_t field_objnum, + const std::vector& new_values, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || InheritedFieldType(field.Get()) != pdfium::form_fields::kCh) { + return false; + } + const uint32_t flags = InheritedFieldFlags(field.Get()); + const bool is_combo = flags & pdfium::form_flags::kChoiceCombo; + const bool is_edit = flags & pdfium::form_flags::kChoiceEdit; + const bool is_multi = flags & pdfium::form_flags::kChoiceMultiSelect; + if (new_values.size() > 1 && (is_combo || !is_multi)) { + return false; + } + + // Match every value against the option export values. `matched` pairs are + // (option index, value), used for option-ordered /V and a sorted /I. + RetainPtr opt_array = + ToArray(CPDF_FormField::GetFieldAttrForDict(field.Get(), "Opt")); + std::vector> matched; + bool all_matched = true; + for (const WideString& new_value : new_values) { + bool found = false; + if (opt_array) { + for (size_t i = 0; i < opt_array->size(); ++i) { + if (OptExportAt(opt_array.Get(), i) == new_value) { + matched.emplace_back(i, new_value); + found = true; + break; + } + } + } + all_matched = all_matched && found; + } + const bool free_text = !all_matched; + if (free_text && !(is_combo && is_edit && new_values.size() == 1)) { + return false; + } + + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return false; + } + + RetainPtr promoted_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + + if (new_values.empty()) { + promoted_field->RemoveFor(pdfium::form_fields::kV); + promoted_field->RemoveFor("I"); + } else if (free_text) { + promoted_field->SetNewFor(pdfium::form_fields::kV, + new_values[0].AsStringView()); + promoted_field->RemoveFor("I"); + } else { + std::sort(matched.begin(), matched.end(), + [](const auto& a, const auto& b) { return a.first < b.first; }); + matched.erase(std::unique(matched.begin(), matched.end(), + [](const auto& a, const auto& b) { + return a.first == b.first; + }), + matched.end()); + if (matched.size() == 1) { + promoted_field->SetNewFor(pdfium::form_fields::kV, + matched[0].second.AsStringView()); + } else { + auto value_array = + promoted_field->SetNewFor(pdfium::form_fields::kV); + for (const auto& entry : matched) { + value_array->AppendNew(entry.second.AsStringView()); + } + } + auto index_array = promoted_field->SetNewFor("I"); + for (const auto& entry : matched) { + index_array->AppendNew( + pdfium::checked_cast(entry.first)); + } + } + promoted_field->RemoveFor("RV"); + + return RegenerateControlAppearances( + doc, controls, promoted_field, ChoiceFormType(flags), + changed_widget_objnums, buffer_size, out_changed_count); +} + +// --------------------------------------------------------------------------- +// FDF / XFDF interchange helpers. +// --------------------------------------------------------------------------- + +// The interchange view of the form: the /AcroForm tree reconciled with the +// page sweep, so recovered fields participate and promoted values win. +std::unique_ptr BuildReconciledForm(CPDF_Document* doc) { + auto form = std::make_unique(doc); + SweepPageWidgets(doc, form.get()); + return form; +} + +unsigned long CopyPayloadToBuffer(const ByteString& payload, + void* buffer, + unsigned long buflen) { + const auto length = static_cast(payload.GetLength()); + if (buffer && length > 0 && buflen >= length) { + fxcrt::Copy(payload.unsigned_span(), + UNSAFE_BUFFERS(pdfium::span(static_cast(buffer), + static_cast(buflen)))); + } + return length; +} + +struct ImportStats { + uint32_t total = 0; + uint32_t applied = 0; + uint32_t skipped = 0; + uint32_t widgets_changed = 0; +}; + +void WriteImportResult(const ImportStats& stats, + EPDF_FORM_IMPORT_RESULT* out_result) { + if (!out_result) { + return; + } + out_result->fields_total = stats.total; + out_result->fields_applied = stats.applied; + out_result->fields_skipped = stats.skipped; + out_result->widgets_changed = stats.widgets_changed; +} + +// Route one imported (fqn, values) entry through the typed transactions. +void ApplyImportedValues(CPDF_Document* doc, + CPDF_InteractiveForm* form, + const WideString& fqn, + const std::vector& values, + ImportStats* stats) { + ++stats->total; + CPDF_FormField* field = + form->CountFields(fqn) > 0 ? form->GetField(0, fqn) : nullptr; + if (!field || values.empty()) { + ++stats->skipped; + return; + } + const uint32_t field_objnum = field->GetFieldDict()->GetObjNum(); + if (field_objnum == 0) { + ++stats->skipped; + return; + } + + unsigned long changed = 0; + bool applied = false; + switch (field->GetType()) { + case CPDF_FormField::kCheckBox: + case CPDF_FormField::kRadioButton: + applied = values.size() == 1 && + ApplyToggleByExport(doc, field_objnum, values[0], nullptr, 0, + &changed); + break; + case CPDF_FormField::kText: + case CPDF_FormField::kRichText: + case CPDF_FormField::kFile: + applied = values.size() == 1 && + ApplyTextValue(doc, field_objnum, values[0], nullptr, 0, + &changed); + break; + case CPDF_FormField::kComboBox: + case CPDF_FormField::kListBox: + applied = ApplyChoiceValues(doc, field_objnum, values, nullptr, 0, + &changed); + break; + default: + break; // Push buttons, signatures, unknown: never written. + } + if (applied) { + ++stats->applied; + stats->widgets_changed += static_cast(changed); + } else { + ++stats->skipped; + } +} + +// Walk an FDF /Fields array: flat entries with dotted /T names and +// hierarchical /Kids trees both resolve to fully qualified names. +void WalkFdfFields(CPDF_Document* doc, + CPDF_InteractiveForm* form, + const CPDF_Array* entries, + const WideString& prefix, + ImportStats* stats, + int depth) { + if (!entries || depth > 32) { + return; + } + for (size_t i = 0; i < entries->size(); ++i) { + RetainPtr entry = entries->GetDictAt(i); + if (!entry) { + continue; + } + const WideString name = entry->GetUnicodeTextFor("T"); + WideString fqn = prefix; + if (!name.IsEmpty()) { + fqn = prefix.IsEmpty() ? name : prefix + L"." + name; + } + RetainPtr value = entry->GetDirectObjectFor("V"); + if (value && !fqn.IsEmpty()) { + std::vector values; + if (const CPDF_Array* value_array = value->AsArray()) { + for (size_t j = 0; j < value_array->size(); ++j) { + values.push_back(value_array->GetUnicodeTextAt(j)); + } + } else { + values.push_back(value->GetUnicodeText()); + } + ApplyImportedValues(doc, form, fqn, values, stats); + } + RetainPtr kids = entry->GetArrayFor("Kids"); + if (kids) { + WalkFdfFields(doc, form, kids.Get(), fqn, stats, depth + 1); + } + } +} + +// XFDF field tree, keyed by fully-qualified-name component. +struct XfdfNode { + std::map children; + std::vector values; +}; + +// Assemble / elements into the document-owned DOM. +void EmitXfdfFieldNodes(const std::map& nodes, + CFX_XMLDocument* xml, + CFX_XMLElement* parent) { + for (const auto& it : nodes) { + CFX_XMLElement* field = xml->CreateNode(L"field"); + field->SetAttribute(L"name", it.first); + parent->AppendLastChild(field); + for (const WideString& value : it.second.values) { + CFX_XMLElement* value_element = + xml->CreateNode(L"value"); + value_element->AppendLastChild(xml->CreateNode(value)); + field->AppendLastChild(value_element); + } + EmitXfdfFieldNodes(it.second.children, xml, field); + } +} + +ByteString BuildXfdf(CPDF_InteractiveForm* form, + const WideString& pdf_path, + bool skip_empty_required) { + std::map root; + const size_t field_count = form->CountFields(WideString()); + for (size_t i = 0; i < field_count; ++i) { + CPDF_FormField* field = form->GetField(i, WideString()); + if (!field) { + continue; + } + const CPDF_FormField::Type type = field->GetType(); + if (type == CPDF_FormField::kPushButton || + type == CPDF_FormField::kSign) { + continue; + } + const uint32_t flags = field->GetFieldFlags(); + if (flags & pdfium::form_flags::kNoExport) { + continue; + } + RetainPtr value_object = + field->GetFieldAttr(pdfium::form_fields::kV); + if (skip_empty_required && (flags & pdfium::form_flags::kRequired) && + (!value_object || value_object->GetString().IsEmpty())) { + continue; + } + const WideString fqn = field->GetFullName(); + if (fqn.IsEmpty()) { + continue; + } + + // Nest by fully-qualified-name component. + std::map* level = &root; + XfdfNode* node = nullptr; + size_t start = 0; + while (true) { + std::optional dot = fqn.Find(L'.', start); + const size_t end = dot.value_or(fqn.GetLength()); + node = &(*level)[fqn.Substr(start, end - start)]; + level = &node->children; + if (!dot.has_value()) { + break; + } + start = dot.value() + 1; + } + + if (value_object) { + if (const CPDF_Array* value_array = value_object->AsArray()) { + for (size_t j = 0; j < value_array->size(); ++j) { + node->values.push_back(value_array->GetUnicodeTextAt(j)); + } + } else { + // Toggles surface the checked export value ("Off" when cleared), + // matching the FDF exporter. + node->values.push_back(field->GetValue()); + } + } + } + + // Serialize through the CFX_XML DOM: EncodeEntities() is the single + // escaping authority (the exact inverse of the parser used on import), + // and SaveCompact() keeps text content whitespace-exact as XFDF's + // xml:space="preserve" requires. + CFX_XMLDocument xml; + CFX_XMLElement* xfdf = xml.CreateNode(L"xfdf"); + xfdf->SetAttribute(L"xmlns", L"http://ns.adobe.com/xfdf/"); + xfdf->SetAttribute(L"xml:space", L"preserve"); + CFX_XMLElement* fields = xml.CreateNode(L"fields"); + xfdf->AppendLastChild(fields); + EmitXfdfFieldNodes(root, &xml, fields); + if (!pdf_path.IsEmpty()) { + CFX_XMLElement* filespec = xml.CreateNode(L"f"); + filespec->SetAttribute(L"href", pdf_path); + xfdf->AppendLastChild(filespec); + } + + auto stream = pdfium::MakeRetain(); + stream->WriteString("\n"); + xfdf->SaveCompact(stream); + return ByteString(ByteStringView(stream->GetSpan())); +} + +CFX_XMLElement* FindXmlChildByTag(CFX_XMLNode* parent, WideStringView tag) { + for (CFX_XMLNode* child = parent->GetFirstChild(); child; + child = child->GetNextSibling()) { + CFX_XMLElement* element = ToXMLElement(child); + if (element && element->GetLocalTagName() == tag) { + return element; + } + } + return nullptr; +} + +// Accepts nested elements and dotted name attributes; multiple +// children form a multi-select selection. +void WalkXfdfField(CPDF_Document* doc, + CPDF_InteractiveForm* form, + CFX_XMLElement* element, + const WideString& prefix, + ImportStats* stats, + int depth) { + if (depth > 32) { + return; + } + const WideString name = element->GetAttribute(L"name"); + WideString fqn = prefix; + if (!name.IsEmpty()) { + fqn = prefix.IsEmpty() ? name : prefix + L"." + name; + } + std::vector values; + for (CFX_XMLNode* child = element->GetFirstChild(); child; + child = child->GetNextSibling()) { + CFX_XMLElement* child_element = ToXMLElement(child); + if (!child_element) { + continue; + } + const WideString tag = child_element->GetLocalTagName(); + if (tag == L"value") { + values.push_back(child_element->GetTextData()); + } else if (tag == L"field") { + WalkXfdfField(doc, form, child_element, fqn, stats, depth + 1); + } + } + if (!values.empty() && !fqn.IsEmpty()) { + ApplyImportedValues(doc, form, fqn, values, stats); + } +} + +// --------------------------------------------------------------------------- +// Repair helpers. +// --------------------------------------------------------------------------- + +// Climb /Parent to the field root, re-resolving every hop by object number +// so layer promotions win. Cycle-guarded. +RetainPtr ClimbToFieldRoot( + CPDF_Document* doc, + RetainPtr dict) { + std::vector visited = {dict.Get()}; + for (int i = 0; i < 32; ++i) { + RetainPtr parent = + dict->GetDictFor(pdfium::form_fields::kParent); + if (parent && parent->GetObjNum() != 0) { + parent = ToDictionary(doc->GetOrParseIndirectObject(parent->GetObjNum())); + } + if (!parent || pdfium::Contains(visited, parent.Get())) { + break; + } + visited.push_back(parent.Get()); + dict = std::move(parent); + } + return dict; +} + +// Resolve /AcroForm for mutation, handling all three storage shapes: +// missing (optionally bootstrap one), an indirect reference (promote the +// target), or a direct dictionary inside the catalog (promote the root and +// mutate the embedded clone). Never mutates through a reference held by a +// frozen base object. +RetainPtr GetMutableAcroForm(CPDF_Document* doc, + bool create_if_missing, + bool* out_created) { + const CPDF_Dictionary* root = doc->GetRoot(); + if (!root) { + return nullptr; + } + RetainPtr entry = root->GetObjectFor("AcroForm"); + if (!entry) { + if (!create_if_missing) { + return nullptr; + } + RetainPtr acro_form = + CPDF_InteractiveForm::InitAcroFormDict(doc); + if (acro_form && out_created) { + *out_created = true; + } + return acro_form; + } + if (const CPDF_Reference* ref = entry->AsReference()) { + return ToDictionary(doc->GetMutableIndirectObject(ref->GetRefObjNum())); + } + RetainPtr mutable_root = doc->GetMutableRoot(); + return mutable_root ? mutable_root->GetMutableDictFor("AcroForm") : nullptr; +} + +// Resolve an array member of an already-mutable dictionary, following (and +// promoting) an indirect reference when present, creating the array when +// absent. +RetainPtr GetMutableArrayMember(CPDF_Document* doc, + CPDF_Dictionary* dict, + const ByteString& key) { + RetainPtr entry = dict->GetObjectFor(key.AsStringView()); + if (!entry) { + return dict->SetNewFor(key); + } + if (const CPDF_Reference* ref = entry->AsReference()) { + return ToArray(doc->GetMutableIndirectObject(ref->GetRefObjNum())); + } + return dict->GetMutableArrayFor(key.AsStringView()); +} + +// Membership of a raw array: indirect references by object number, direct +// dictionaries by pointer identity. +bool ArrayReferencesDict(const CPDF_Array* array, + uint32_t objnum, + const CPDF_Dictionary* dict) { + if (!array) { + return false; + } + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr element = array->GetObjectAt(i); + if (!element) { + continue; + } + if (const CPDF_Reference* ref = element->AsReference()) { + if (objnum != 0 && ref->GetRefObjNum() == objnum) { + return true; + } + } else if (element.Get() == static_cast(dict)) { + return true; + } + } + return false; +} + +} // namespace + +FPDF_EXPORT EPDF_FORM_MODEL FPDF_CALLCONV +EPDFForm_LoadModel(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return nullptr; + } + + auto model = std::make_unique(); + + const CPDF_Dictionary* root = doc->GetRoot(); + RetainPtr acro_form = + root ? root->GetDictFor("AcroForm") : nullptr; + if (acro_form) { + model->kind = acro_form->KeyExist("XFA") ? EPDF_FORMKIND_XFA + : EPDF_FORMKIND_ACROFORM; + model->need_appearances = + acro_form->GetBooleanFor("NeedAppearances", false); + } + + // Phase 1: the declared field tree. + auto form = std::make_unique(doc); + const std::set initial_fields = + CollectFieldDicts(*form); + + // Phase 2: reconcile widgets only reachable through page /Annots. + const std::map widget_pages = + SweepPageWidgets(doc, form.get()); + + // Phase 3: detach into a plain snapshot. + const size_t field_count = CountFormFields(*form); + model->fields.reserve(field_count); + for (size_t i = 0; i < field_count; ++i) { + CPDF_FormField* field = form->GetField(i, WideString()); + if (!field) { + continue; + } + FieldRecord record = SnapshotField(field, initial_fields, widget_pages); + const int index = fxcrt::CollectionSize(model->fields); + if (record.objnum != 0) { + model->field_index_by_objnum.try_emplace(record.objnum, index); + } + for (const WidgetRecord& widget : record.widgets) { + if (widget.objnum != 0) { + model->field_index_by_widget_objnum.try_emplace(widget.objnum, index); + } + } + model->fields.push_back(std::move(record)); + } + + return HandleFromFormModel(model.release()); +} + +FPDF_EXPORT void FPDF_CALLCONV EPDFForm_CloseModel(EPDF_FORM_MODEL model) { + delete FormModelFromHandle(model); +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFormKind(EPDF_FORM_MODEL model) { + FormModel* form = FormModelFromHandle(model); + return form ? form->kind : EPDF_FORMKIND_NONE; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_GetNeedAppearances(EPDF_FORM_MODEL model) { + FormModel* form = FormModelFromHandle(model); + return form && form->need_appearances; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFields(EPDF_FORM_MODEL model) { + FormModel* form = FormModelFromHandle(model); + return form ? fxcrt::CollectionSize(form->fields) : 0; +} + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldObjNum(EPDF_FORM_MODEL model, int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->objnum : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldFamily(EPDF_FORM_MODEL model, + int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->family : EPDF_FORMFIELD_FAMILY_UNKNOWN; +} + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->flags : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldOrigin(EPDF_FORM_MODEL model, + int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->origin : -1; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->fqn, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldAlternateName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->alternate_name, + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldMappingName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->mapping_name, + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldValue(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->value, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldDefaultValue(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->default_value, + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldMaxLen(EPDF_FORM_MODEL model, + int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->max_len : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? fxcrt::CollectionSize(field->options) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldOptionLabel(EPDF_FORM_MODEL model, + int field_index, + int option_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const OptionRecord* option = + GetOptionRecord(model, field_index, option_index); + if (!option) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + option->label, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldOptionValue(EPDF_FORM_MODEL model, + int field_index, + int option_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const OptionRecord* option = + GetOptionRecord(model, field_index, option_index); + if (!option) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + option->value, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_IsFieldOptionSelected(EPDF_FORM_MODEL model, + int field_index, + int option_index) { + const OptionRecord* option = + GetOptionRecord(model, field_index, option_index); + return option && option->selected; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? fxcrt::CollectionSize(field->widgets) : 0; +} + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldWidgetObjNum(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + const WidgetRecord* widget = + GetWidgetRecord(model, field_index, widget_index); + return widget ? widget->objnum : 0; +} + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldWidgetPageObjNum(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + const WidgetRecord* widget = + GetWidgetRecord(model, field_index, widget_index); + return widget ? widget->page_objnum : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldWidgetOnState(EPDF_FORM_MODEL model, + int field_index, + int widget_index, + void* buffer, + unsigned long buflen) { + const WidgetRecord* widget = + GetWidgetRecord(model, field_index, widget_index); + if (!widget) { + return 0; + } + return NulTerminateMaybeCopyAndReturnLength( + widget->on_state, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldWidgetExportValue(EPDF_FORM_MODEL model, + int field_index, + int widget_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const WidgetRecord* widget = + GetWidgetRecord(model, field_index, widget_index); + if (!widget) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + widget->export_value, + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_IsFieldWidgetChecked(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + const WidgetRecord* widget = + GetWidgetRecord(model, field_index, widget_index); + return widget && widget->checked; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldIndexByObjNum(EPDF_FORM_MODEL model, uint32_t field_objnum) { + FormModel* form = FormModelFromHandle(model); + if (!form || field_objnum == 0) { + return -1; + } + const auto it = form->field_index_by_objnum.find(field_objnum); + return it != form->field_index_by_objnum.end() ? it->second : -1; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldIndexForWidget(EPDF_FORM_MODEL model, + uint32_t widget_objnum) { + FormModel* form = FormModelFromHandle(model); + if (!form || widget_objnum == 0) { + return -1; + } + const auto it = form->field_index_by_widget_objnum.find(widget_objnum); + return it != form->field_index_by_widget_objnum.end() ? it->second : -1; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetToggle(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_BYTESTRING on_state, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return false; + } + return ApplyToggle(doc, field_objnum, + ByteString(on_state ? on_state : ""), + /*lenient_unknown_state=*/false, changed_widget_objnums, + buffer_size, out_changed_count); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetTextValue(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return false; + } + return ApplyTextValue(doc, field_objnum, + value ? WideStringFromFPDFWideString(value) + : WideString(), + changed_widget_objnums, buffer_size, + out_changed_count); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetChoiceValues(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* values, + unsigned long value_count, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || (value_count > 0 && !values)) { + return false; + } + std::vector new_values; + if (value_count > 0) { + pdfium::span values_span = + UNSAFE_BUFFERS(pdfium::span(values, static_cast(value_count))); + for (FPDF_WIDESTRING wide_value : values_span) { + new_values.push_back(wide_value ? WideStringFromFPDFWideString(wide_value) + : WideString()); + } + } + return ApplyChoiceValues(doc, field_objnum, new_values, + changed_widget_objnums, buffer_size, + out_changed_count); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ResetField(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field) { + return false; + } + const ByteString field_type = InheritedFieldType(field.Get()); + const uint32_t flags = InheritedFieldFlags(field.Get()); + RetainPtr default_value = + CPDF_FormField::GetFieldAttrForDict(field.Get(), + pdfium::form_fields::kDV); + + if (field_type == pdfium::form_fields::kBtn) { + if (flags & pdfium::form_flags::kButtonPushbutton) { + return false; + } + // Lenient: a /DV naming no widget state simply clears the group. + const ByteString default_state = + default_value ? default_value->GetString() : ByteString(kOffState); + return ApplyToggle(doc, field_objnum, default_state, + /*lenient_unknown_state=*/true, changed_widget_objnums, + buffer_size, out_changed_count); + } + + if (field_type != pdfium::form_fields::kTx && + field_type != pdfium::form_fields::kCh) { + return false; // Push buttons handled above; signatures are never reset. + } + + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return false; + } + + RetainPtr promoted_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + if (default_value) { + promoted_field->SetFor(pdfium::form_fields::kV, + default_value->CloneDirectObject()); + } else { + promoted_field->RemoveFor(pdfium::form_fields::kV); + } + promoted_field->RemoveFor("RV"); + if (field_type == pdfium::form_fields::kCh) { + promoted_field->RemoveFor("I"); + } + + const CPDF_GenerateAP::FormType type = + field_type == pdfium::form_fields::kTx ? CPDF_GenerateAP::kTextField + : ChoiceFormType(flags); + return RegenerateControlAppearances(doc, controls, promoted_field, type, + changed_widget_objnums, buffer_size, + out_changed_count); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_ExportFDF(FPDF_DOCUMENT document, + FPDF_WIDESTRING pdf_path, + uint32_t export_flags, + void* buffer, + unsigned long buflen) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return 0; + } + std::unique_ptr form = BuildReconciledForm(doc); + const WideString path = + pdf_path ? WideStringFromFPDFWideString(pdf_path) : WideString(); + std::unique_ptr fdf = form->ExportToFDF( + path, !!(export_flags & EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED)); + if (!fdf) { + return 0; + } + return CopyPayloadToBuffer(fdf->WriteToString(), buffer, buflen); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_ExportXFDF(FPDF_DOCUMENT document, + FPDF_WIDESTRING pdf_path, + uint32_t export_flags, + void* buffer, + unsigned long buflen) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return 0; + } + std::unique_ptr form = BuildReconciledForm(doc); + const WideString path = + pdf_path ? WideStringFromFPDFWideString(pdf_path) : WideString(); + const ByteString payload = BuildXfdf( + form.get(), path, + !!(export_flags & EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED)); + return CopyPayloadToBuffer(payload, buffer, buflen); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ImportFDF(FPDF_DOCUMENT document, + const void* data, + unsigned long size, + EPDF_FORM_IMPORT_RESULT* out_result) { + if (out_result) { + *out_result = {}; + } + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !data || size == 0) { + return false; + } + pdfium::span payload = UNSAFE_BUFFERS(pdfium::span( + static_cast(data), static_cast(size))); + std::unique_ptr fdf = CFDF_Document::ParseMemory(payload); + if (!fdf || !fdf->GetRoot()) { + return false; + } + RetainPtr main_dict = + fdf->GetRoot()->GetDictFor("FDF"); + if (!main_dict) { + return false; + } + + std::unique_ptr form = BuildReconciledForm(doc); + ImportStats stats; + RetainPtr fields = main_dict->GetArrayFor("Fields"); + if (fields) { + WalkFdfFields(doc, form.get(), fields.Get(), WideString(), &stats, + /*depth=*/0); + } + WriteImportResult(stats, out_result); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ImportXFDF(FPDF_DOCUMENT document, + const void* data, + unsigned long size, + EPDF_FORM_IMPORT_RESULT* out_result) { + if (out_result) { + *out_result = {}; + } + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !data || size == 0) { + return false; + } + pdfium::span payload = UNSAFE_BUFFERS(pdfium::span( + static_cast(data), static_cast(size))); + auto stream = pdfium::MakeRetain(payload); + CFX_XMLParser parser(stream); + std::unique_ptr xml = parser.Parse(); + if (!xml || !xml->GetRoot()) { + return false; + } + CFX_XMLElement* xfdf = xml->GetRoot()->GetLocalTagName() == L"xfdf" + ? xml->GetRoot() + : FindXmlChildByTag(xml->GetRoot(), L"xfdf"); + if (!xfdf) { + return false; + } + + std::unique_ptr form = BuildReconciledForm(doc); + ImportStats stats; + CFX_XMLElement* fields = FindXmlChildByTag(xfdf, L"fields"); + if (fields) { + for (CFX_XMLNode* child = fields->GetFirstChild(); child; + child = child->GetNextSibling()) { + CFX_XMLElement* field_element = ToXMLElement(child); + if (field_element && field_element->GetLocalTagName() == L"field") { + WalkXfdfField(doc, form.get(), field_element, WideString(), &stats, + /*depth=*/0); + } + } + } + WriteImportResult(stats, out_result); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_Repair(FPDF_DOCUMENT document, + uint32_t repair_flags, + EPDF_FORM_REPAIR_REPORT* out_report) { + if (out_report) { + *out_report = {}; + } + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !doc->GetRoot()) { + return false; + } + EPDF_FORM_REPAIR_REPORT report = {}; + + std::unique_ptr form = BuildReconciledForm(doc); + const size_t field_count = form->CountFields(WideString()); + const bool bake = repair_flags & EPDF_FORM_REPAIR_BAKE_APPEARANCES; + const bool bake_all = bake && form->NeedConstructAP(); + + // ---- Plan (const reads only; a no-op repair must promote nothing). ---- + RetainPtr const_acro_form = + doc->GetRoot()->GetDictFor("AcroForm"); + RetainPtr const_fields = + const_acro_form ? const_acro_form->GetArrayFor("Fields") : nullptr; + + std::vector roots_to_link; + std::set seen_roots; + struct KidFix { + uint32_t field_objnum; + uint32_t widget_objnum; + }; + std::vector kid_fixes; + struct BakeStep { + uint32_t field_objnum; + int family; + }; + std::vector bake_fields; + + for (size_t i = 0; i < field_count; ++i) { + CPDF_FormField* field = form->GetField(i, WideString()); + if (!field) { + continue; + } + RetainPtr field_dict = field->GetFieldDict(); + + // Recovered roots -> /AcroForm /Fields. + RetainPtr root = ClimbToFieldRoot(doc, field_dict); + const uint32_t root_objnum = root->GetObjNum(); + if (!ArrayReferencesDict(const_fields.Get(), root_objnum, root.Get())) { + if (root_objnum == 0) { + ++report.fields_unrepairable; + } else if (seen_roots.insert(root_objnum).second) { + roots_to_link.push_back(root_objnum); + } + } + + // Stray widgets -> parent /Kids (only when /Parent already points at + // this field, so the fix is purely additive). + const uint32_t field_objnum = field_dict->GetObjNum(); + RetainPtr kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); + if (kids && field_objnum != 0) { + for (const auto& control : form->GetControlsForField(field)) { + RetainPtr widget = control->GetWidgetDict(); + if (widget.Get() == field_dict.Get() || widget->GetObjNum() == 0) { + continue; + } + if (ArrayReferencesDict(kids.Get(), widget->GetObjNum(), + widget.Get())) { + continue; + } + RetainPtr parent = + widget->GetDictFor(pdfium::form_fields::kParent); + if (parent && parent->GetObjNum() == field_objnum) { + kid_fixes.push_back({field_objnum, widget->GetObjNum()}); + } + } + } + + if (bake && field_objnum != 0) { + const int family = FamilyFromFieldType(field->GetType()); + if (family != EPDF_FORMFIELD_FAMILY_PUSHBUTTON && + family != EPDF_FORMFIELD_FAMILY_SIGNATURE && + family != EPDF_FORMFIELD_FAMILY_UNKNOWN) { + bake_fields.push_back({field_objnum, family}); + } + } + } + + // ---- Apply. ---- + if (!roots_to_link.empty()) { + bool created = false; + RetainPtr acro_form = + GetMutableAcroForm(doc, /*create_if_missing=*/true, &created); + if (!acro_form) { + return false; + } + report.acroform_created = created ? 1 : 0; + RetainPtr fields_array = + GetMutableArrayMember(doc, acro_form.Get(), "Fields"); + if (!fields_array) { + return false; + } + for (uint32_t objnum : roots_to_link) { + fields_array->AppendNew(doc, objnum); + ++report.fields_linked; + } + } + + for (const KidFix& fix : kid_fixes) { + RetainPtr field_dict = + ToDictionary(doc->GetMutableIndirectObject(fix.field_objnum)); + if (!field_dict) { + continue; + } + RetainPtr kids = GetMutableArrayMember( + doc, field_dict.Get(), pdfium::form_fields::kKids); + if (!kids) { + continue; + } + kids->AppendNew(doc, fix.widget_objnum); + ++report.widgets_linked; + } + + for (const BakeStep& step : bake_fields) { + RetainPtr field_dict = + ResolveFieldDict(doc, step.field_objnum); + if (!field_dict) { + continue; + } + std::vector controls; + if (!CollectTxnControls(doc, field_dict.Get(), step.field_objnum, + /*want_toggle_info=*/false, &controls)) { + continue; + } + RetainPtr promoted_field; + for (const TxnControl& control : controls) { + RetainPtr ap = control.dict->GetDictFor("AP"); + const bool has_normal_ap = ap && ap->GetObjectFor("N"); + if (has_normal_ap && !bake_all) { + continue; + } + if (!promoted_field && (control.merged || control.objnum == 0)) { + promoted_field = + ToDictionary(doc->GetMutableIndirectObject(step.field_objnum)); + if (!promoted_field) { + break; + } + } + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (!widget) { + continue; + } + switch (step.family) { + case EPDF_FORMFIELD_FAMILY_TEXT: + CPDF_GenerateAP::GenerateFormAP(doc, widget.Get(), + CPDF_GenerateAP::kTextField); + break; + case EPDF_FORMFIELD_FAMILY_COMBOBOX: + CPDF_GenerateAP::GenerateFormAP(doc, widget.Get(), + CPDF_GenerateAP::kComboBox); + break; + case EPDF_FORMFIELD_FAMILY_LISTBOX: + CPDF_GenerateAP::GenerateFormAP(doc, widget.Get(), + CPDF_GenerateAP::kListBox); + break; + case EPDF_FORMFIELD_FAMILY_CHECKBOX: + CPDF_GenerateAP::GenerateCheckboxFormAP(doc, widget.Get()); + break; + case EPDF_FORMFIELD_FAMILY_RADIO: + CPDF_GenerateAP::GenerateRadioButtonFormAP(doc, widget.Get()); + break; + default: + continue; + } + ++report.appearances_baked; + } + } + + if (bake_all) { + RetainPtr acro_form = + GetMutableAcroForm(doc, /*create_if_missing=*/false, nullptr); + if (acro_form) { + acro_form->RemoveFor("NeedAppearances"); + report.need_appearances_cleared = 1; + } + } + + if (out_report) { + *out_report = report; + } + return true; +} + +// --------------------------------------------------------------------------- +// Authoring: field lifecycle and adoption. +// --------------------------------------------------------------------------- + +namespace { + +// Family-defining /Ff bits are immutable through EPDFForm_SetFieldFlags. +constexpr uint32_t kFamilyDefiningFlags = pdfium::form_flags::kButtonRadio | + pdfium::form_flags::kButtonPushbutton | + pdfium::form_flags::kChoiceCombo; + +// Widget-plane keys that move to the new kid when a legacy merged field is +// split by EPDFForm_AttachWidget. Field-plane keys (/FT /T /Ff /V /DV /Opt +// /MaxLen /TU /TM /DA /Q /AA) stay on the field dictionary. +constexpr const char* kWidgetPlaneKeys[] = { + "Type", "Subtype", "Rect", "AP", "AS", "MK", "BS", "Border", + "F", "P", "H", "OC", "CA", "NM", "M", "StructParent", +}; + +struct AuthorFamily { + ByteString field_type; + uint32_t flags; + bool toggle; +}; + +bool AuthorFamilyFromCode(int family, AuthorFamily* out) { + switch (family) { + case 4 /* EPDF_FORMFIELD_FAMILY_TEXT */: + *out = {pdfium::form_fields::kTx, 0, false}; + return true; + case 2 /* CHECKBOX */: + *out = {pdfium::form_fields::kBtn, 0, true}; + return true; + case 3 /* RADIO */: + *out = {pdfium::form_fields::kBtn, pdfium::form_flags::kButtonRadio, true}; + return true; + case 5 /* COMBOBOX */: + *out = {pdfium::form_fields::kCh, pdfium::form_flags::kChoiceCombo, false}; + return true; + case 6 /* LISTBOX */: + *out = {pdfium::form_fields::kCh, 0, false}; + return true; + default: + return false; + } +} + +int FamilyOfFieldDict(const CPDF_Dictionary* field_dict) { + const ByteString field_type = InheritedFieldType(field_dict); + const uint32_t flags = InheritedFieldFlags(field_dict); + if (field_type == pdfium::form_fields::kBtn) { + if (flags & pdfium::form_flags::kButtonPushbutton) return 1; + if (flags & pdfium::form_flags::kButtonRadio) return 3; + return 2; + } + if (field_type == pdfium::form_fields::kTx) return 4; + if (field_type == pdfium::form_fields::kCh) { + return (flags & pdfium::form_flags::kChoiceCombo) ? 5 : 6; + } + if (field_type == pdfium::form_fields::kSig) return 7; + return 0; +} + +std::vector SplitFqnSegments(const WideString& full_name) { + std::vector segments; + size_t start = 0; + while (start <= full_name.GetLength()) { + std::optional dot = full_name.Find(L'.', start); + const size_t end = dot.value_or(full_name.GetLength()); + if (end == start) return {}; // empty segment -> invalid + segments.push_back(full_name.Substr(start, end - start)); + if (!dot.has_value()) break; + start = dot.value() + 1; + } + return segments; +} + +// Find a direct child (of /Fields or a /Kids array) whose own /T equals +// |segment|, resolving every entry through the document. +RetainPtr FindChildFieldByName(CPDF_Document* doc, + const CPDF_Array* entries, + const WideString& segment) { + if (!entries) return nullptr; + for (size_t i = 0; i < entries->size(); ++i) { + RetainPtr element = entries->GetObjectAt(i); + if (!element) continue; + RetainPtr child; + if (const CPDF_Reference* ref = element->AsReference()) { + child = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + } else { + child = ToDictionary(std::move(element)); + } + if (child && child->GetUnicodeTextFor(pdfium::form_fields::kT) == segment) { + return child; + } + } + return nullptr; +} + +bool RemoveObjNumFromMutableArray(CPDF_Array* array, uint32_t objnum) { + if (!array) return false; + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr element = array->GetObjectAt(i); + const CPDF_Reference* ref = element ? element->AsReference() : nullptr; + if (ref && ref->GetRefObjNum() == objnum) { + array->RemoveAt(i); + return true; + } + } + return false; +} + +// Locate the page whose /Annots references |annot_objnum|. Page-tree walk +// only; returns the page's object number or 0. +uint32_t FindPageContainingAnnot(CPDF_Document* doc, uint32_t annot_objnum) { + const int page_count = doc->GetPageCount(); + for (int i = 0; i < page_count; ++i) { + RetainPtr page = doc->GetPageDictionary(i); + if (!page) continue; + RetainPtr annots = page->GetArrayFor("Annots"); + if (!annots) continue; + for (size_t j = 0; j < annots->size(); ++j) { + RetainPtr element = annots->GetObjectAt(j); + const CPDF_Reference* ref = element ? element->AsReference() : nullptr; + if (ref && ref->GetRefObjNum() == annot_objnum) { + return page->GetObjNum(); + } + } + } + return 0; +} + +// After toggle AP generation, make sure the /AP /N "on" state carries the +// requested name so EPDFForm_SetToggle can address it. +void NormalizeToggleOnState(CPDF_Dictionary* widget, const ByteString& on_state) { + RetainPtr ap = widget->GetMutableDictFor("AP"); + if (!ap) return; + RetainPtr normal = ap->GetMutableDictFor("N"); + if (!normal) return; + ByteString current_on; + { + CPDF_DictionaryLocker locker(normal); + for (const auto& it : locker) { + if (it.first != kOffState) { + current_on = it.first; + break; + } + } + } + if (current_on.IsEmpty() || current_on == on_state) return; + RetainPtr stream = normal->GetMutableObjectFor(current_on.AsStringView()); + if (!stream) return; + normal->SetFor(on_state, stream->Clone()); + normal->RemoveFor(current_on.AsStringView()); +} + +// Bake the family-correct appearance for an attached widget. +void BakeWidgetAppearance(CPDF_Document* doc, + CPDF_Dictionary* widget, + int family, + const ByteString& on_state) { + switch (family) { + case 2: // checkbox + CPDF_GenerateAP::GenerateCheckboxFormAP(doc, widget); + NormalizeToggleOnState(widget, on_state); + break; + case 3: // radio + CPDF_GenerateAP::GenerateRadioButtonFormAP(doc, widget); + NormalizeToggleOnState(widget, on_state); + break; + case 4: + CPDF_GenerateAP::GenerateFormAP(doc, widget, CPDF_GenerateAP::kTextField); + break; + case 5: + CPDF_GenerateAP::GenerateFormAP(doc, widget, CPDF_GenerateAP::kComboBox); + break; + case 6: + CPDF_GenerateAP::GenerateFormAP(doc, widget, CPDF_GenerateAP::kListBox); + break; + default: + break; + } +} + +} // namespace + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_CreateField(FPDF_DOCUMENT document, int family, FPDF_WIDESTRING full_name) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + AuthorFamily author; + if (!doc || !doc->GetRoot() || !AuthorFamilyFromCode(family, &author)) { + return 0; + } + const WideString name = + full_name ? WideStringFromFPDFWideString(full_name) : WideString(); + const std::vector segments = SplitFqnSegments(name); + if (segments.empty()) { + return 0; + } + + // ---- Plan (const reads only): walk existing nodes, find conflicts. ---- + // existing_path[i] holds the object number of the node matching + // segments[i], for the leading run of segments that already exist. + std::vector existing_path; + { + RetainPtr acro_form = + doc->GetRoot()->GetDictFor("AcroForm"); + RetainPtr entries = + acro_form ? acro_form->GetArrayFor("Fields") : nullptr; + const CPDF_Array* level = entries.Get(); + RetainPtr keep_alive = entries; + for (size_t i = 0; i < segments.size(); ++i) { + RetainPtr found = + FindChildFieldByName(doc, level, segments[i]); + if (!found) { + break; + } + if (i + 1 == segments.size()) { + return 0; // sibling name collision at the terminal level + } + if (found->KeyExist(pdfium::form_fields::kFT)) { + return 0; // cannot nest under a terminal field + } + if (found->GetObjNum() == 0) { + return 0; // direct-object intermediate: not authorable + } + existing_path.push_back(found->GetObjNum()); + keep_alive = found->GetArrayFor(pdfium::form_fields::kKids); + level = keep_alive.Get(); + } + } + + // ---- Apply. ---- + bool created = false; + RetainPtr acro_form = + GetMutableAcroForm(doc, /*create_if_missing=*/true, &created); + if (!acro_form) { + return 0; + } + + RetainPtr parent_array = + GetMutableArrayMember(doc, acro_form.Get(), "Fields"); + RetainPtr parent_field; // null at the root level + for (uint32_t objnum : existing_path) { + parent_field = ToDictionary(doc->GetMutableIndirectObject(objnum)); + if (!parent_field) { + return 0; + } + parent_array = + GetMutableArrayMember(doc, parent_field.Get(), pdfium::form_fields::kKids); + } + if (!parent_array) { + return 0; + } + + for (size_t i = existing_path.size(); i < segments.size(); ++i) { + auto node = doc->NewIndirect(); + node->SetNewFor(pdfium::form_fields::kT, + segments[i].AsStringView()); + if (parent_field) { + node->SetNewFor(pdfium::form_fields::kParent, doc, + parent_field->GetObjNum()); + } + const bool terminal = i + 1 == segments.size(); + if (terminal) { + node->SetNewFor(pdfium::form_fields::kFT, author.field_type); + if (author.flags != 0) { + node->SetNewFor(pdfium::form_fields::kFf, + static_cast(author.flags)); + } + } + parent_array->AppendNew(doc, node->GetObjNum()); + if (terminal) { + return node->GetObjNum(); + } + parent_field = node; + parent_array = + GetMutableArrayMember(doc, parent_field.Get(), pdfium::form_fields::kKids); + if (!parent_array) { + return 0; + } + } + return 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_AttachWidget(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t widget_objnum, + FPDF_BYTESTRING on_state) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0 || widget_objnum == 0 || + field_objnum == widget_objnum) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || !field->KeyExist(pdfium::form_fields::kFT)) { + return false; // must address the terminal field dictionary itself + } + const int family = FamilyOfFieldDict(field.Get()); + if (family == 0 || family == 1 || family == 7) { + return false; // unknown / pushbutton / signature are not authorable + } + const bool toggle = family == 2 || family == 3; + const ByteString state(on_state ? on_state : ""); + if (toggle && (state.IsEmpty() || state == kOffState)) { + return false; // toggles need a real on-state name + } + + RetainPtr widget = + ToDictionary(doc->GetOrParseIndirectObject(widget_objnum)); + if (!widget || widget->GetNameFor("Subtype") != "Widget" || + widget->KeyExist(pdfium::form_fields::kParent) || + widget->KeyExist(pdfium::form_fields::kFT)) { + return false; // must be an unattached, non-merged widget annotation + } + + // ---- Apply. ---- + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) { + return false; + } + + // Legacy merged field: split it first. The field keeps its object number; + // the previously merged widget half moves into a new kid annotation. + if (mutable_field->GetNameFor("Subtype") == "Widget") { + const uint32_t page_objnum = FindPageContainingAnnot(doc, field_objnum); + auto split_widget = doc->NewIndirect(); + for (const char* key : kWidgetPlaneKeys) { + RetainPtr value = mutable_field->GetMutableObjectFor(key); + if (!value) continue; + split_widget->SetFor(key, value->Clone()); + mutable_field->RemoveFor(key); + } + split_widget->SetNewFor("Type", "Annot"); + split_widget->SetNewFor("Subtype", "Widget"); + split_widget->SetNewFor(pdfium::form_fields::kParent, doc, + field_objnum); + RetainPtr kids = GetMutableArrayMember( + doc, mutable_field.Get(), pdfium::form_fields::kKids); + if (!kids) { + return false; + } + kids->AppendNew(doc, split_widget->GetObjNum()); + if (page_objnum != 0) { + RetainPtr page = + ToDictionary(doc->GetMutableIndirectObject(page_objnum)); + RetainPtr annots = + page ? page->GetMutableArrayFor("Annots") : nullptr; + if (annots && RemoveObjNumFromMutableArray(annots.Get(), field_objnum)) { + annots->AppendNew(doc, split_widget->GetObjNum()); + } + } + } + + RetainPtr mutable_widget = + ToDictionary(doc->GetMutableIndirectObject(widget_objnum)); + if (!mutable_widget) { + return false; + } + mutable_widget->SetNewFor(pdfium::form_fields::kParent, doc, + field_objnum); + RetainPtr kids = GetMutableArrayMember( + doc, mutable_field.Get(), pdfium::form_fields::kKids); + if (!kids) { + return false; + } + kids->AppendNew(doc, widget_objnum); + + if (toggle) { + mutable_widget->SetNewFor("AS", kOffState); + BakeWidgetAppearance(doc, mutable_widget.Get(), family, state); + // The generator may key the "on" stream off a default; make sure the + // requested state name is addressable even when generation bailed. + NormalizeToggleOnState(mutable_widget.Get(), state); + } else { + BakeWidgetAppearance(doc, mutable_widget.Get(), family, ByteString()); + } + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_DetachWidget(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t widget_objnum) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0 || widget_objnum == 0) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + RetainPtr widget = + ToDictionary(doc->GetOrParseIndirectObject(widget_objnum)); + if (!field || !widget) { + return false; + } + RetainPtr parent = + widget->GetDictFor(pdfium::form_fields::kParent); + if (!parent || parent->GetObjNum() != field_objnum) { + return false; + } + RetainPtr kids = + field->GetArrayFor(pdfium::form_fields::kKids); + if (!ArrayReferencesDict(kids.Get(), widget_objnum, widget.Get())) { + return false; + } + + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + RetainPtr mutable_widget = + ToDictionary(doc->GetMutableIndirectObject(widget_objnum)); + if (!mutable_field || !mutable_widget) { + return false; + } + RetainPtr mutable_kids = GetMutableArrayMember( + doc, mutable_field.Get(), pdfium::form_fields::kKids); + if (!mutable_kids || + !RemoveObjNumFromMutableArray(mutable_kids.Get(), widget_objnum)) { + return false; + } + // An empty /Kids array would make CPDF_InteractiveForm skip the field + // entirely; drop the key so the field stays visible as "unplaced". + if (mutable_kids->IsEmpty()) { + mutable_field->RemoveFor(pdfium::form_fields::kKids); + } + mutable_widget->RemoveFor(pdfium::form_fields::kParent); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_DeleteField(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t* out_detached_widgets, + unsigned long buffer_size, + unsigned long* out_detached_count) { + if (out_detached_count) { + *out_detached_count = 0; + } + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || !field->KeyExist(pdfium::form_fields::kFT)) { + return false; + } + + // Collect widget kids (a terminal field's kids are widgets; a kid with + // /T is a child FIELD, which makes this node non-terminal -> fail). + std::vector widget_objnums; + RetainPtr kids = + field->GetArrayFor(pdfium::form_fields::kKids); + if (kids) { + for (size_t i = 0; i < kids->size(); ++i) { + RetainPtr element = kids->GetObjectAt(i); + const CPDF_Reference* ref = element ? element->AsReference() : nullptr; + if (!ref) { + return false; // direct kid: not authorable + } + RetainPtr kid = + ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + if (!kid) { + continue; + } + if (kid->KeyExist(pdfium::form_fields::kT)) { + return false; // non-terminal field + } + widget_objnums.push_back(ref->GetRefObjNum()); + } + } + + // ---- Apply: detach widgets, unlink the field, prune empty ancestors. ---- + for (uint32_t objnum : widget_objnums) { + RetainPtr widget = + ToDictionary(doc->GetMutableIndirectObject(objnum)); + if (widget) { + widget->RemoveFor(pdfium::form_fields::kParent); + } + } + + // Walk up: remove |current| from its container; prune empty non-terminal + // ancestors (never the /AcroForm itself). + uint32_t current = field_objnum; + for (int depth = 0; depth < 32; ++depth) { + RetainPtr node = + ToDictionary(doc->GetOrParseIndirectObject(current)); + if (!node) { + break; + } + RetainPtr parent = + node->GetDictFor(pdfium::form_fields::kParent); + if (parent && parent->GetObjNum() != 0) { + RetainPtr mutable_parent = + ToDictionary(doc->GetMutableIndirectObject(parent->GetObjNum())); + RetainPtr parent_kids = GetMutableArrayMember( + doc, mutable_parent.Get(), pdfium::form_fields::kKids); + if (!parent_kids || + !RemoveObjNumFromMutableArray(parent_kids.Get(), current)) { + break; + } + if (!parent_kids->IsEmpty() || + mutable_parent->KeyExist(pdfium::form_fields::kFT)) { + break; // parent still has children, or is itself a real field + } + mutable_parent->RemoveFor(pdfium::form_fields::kKids); + current = parent->GetObjNum(); // parent is now empty: prune it too + continue; + } + // Root level: remove from /AcroForm /Fields. + RetainPtr acro_form = + GetMutableAcroForm(doc, /*create_if_missing=*/false, nullptr); + if (acro_form) { + RetainPtr fields = + GetMutableArrayMember(doc, acro_form.Get(), "Fields"); + if (fields) { + RemoveObjNumFromMutableArray(fields.Get(), current); + } + } + break; + } + + ReportChangedWidgets(widget_objnums, + static_cast(widget_objnums.size()), + out_detached_widgets, buffer_size, out_detached_count); + return true; +} + +// --------------------------------------------------------------------------- +// Authoring: field-plane property setters. +// --------------------------------------------------------------------------- + +namespace { + +// The array holding this field: the parent field's /Kids, or /AcroForm +// /Fields at the root. Const view for sibling checks. +RetainPtr SiblingArrayOf(CPDF_Document* doc, + const CPDF_Dictionary* field) { + RetainPtr parent = + field->GetDictFor(pdfium::form_fields::kParent); + if (parent) { + if (parent->GetObjNum() != 0) { + parent = ToDictionary(doc->GetOrParseIndirectObject(parent->GetObjNum())); + } + return parent ? parent->GetArrayFor(pdfium::form_fields::kKids) : nullptr; + } + const CPDF_Dictionary* root = doc->GetRoot(); + RetainPtr acro_form = + root ? root->GetDictFor("AcroForm") : nullptr; + return acro_form ? acro_form->GetArrayFor("Fields") : nullptr; +} + +// Regenerate appearances after a field-plane change that affects rendering +// (options, flags, MaxLen). No-op for families without generated text APs. +void RegenerateFieldAppearances(CPDF_Document* doc, uint32_t field_objnum) { + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field) return; + const int family = FamilyOfFieldDict(field.Get()); + if (family != 4 && family != 5 && family != 6) return; + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return; + } + RetainPtr promoted_field; + for (const TxnControl& control : controls) { + if (!promoted_field && (control.merged || control.objnum == 0)) { + promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) return; + } + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (widget) { + BakeWidgetAppearance(doc, widget.Get(), family, ByteString()); + } + } +} + +} // namespace + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING partial_name) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) return false; + const WideString name = + partial_name ? WideStringFromFPDFWideString(partial_name) : WideString(); + if (name.IsEmpty() || name.Find(L'.', 0).has_value()) return false; + + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || !field->KeyExist(pdfium::form_fields::kT)) return false; + + RetainPtr siblings = SiblingArrayOf(doc, field.Get()); + if (siblings) { + for (size_t i = 0; i < siblings->size(); ++i) { + RetainPtr element = siblings->GetObjectAt(i); + if (!element) continue; + RetainPtr sibling; + if (const CPDF_Reference* ref = element->AsReference()) { + if (ref->GetRefObjNum() == field_objnum) continue; + sibling = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + } else { + sibling = ToDictionary(std::move(element)); + if (sibling.Get() == field.Get()) continue; + } + if (sibling && + sibling->GetUnicodeTextFor(pdfium::form_fields::kT) == name) { + return false; // sibling name collision + } + } + } + + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + mutable_field->SetNewFor(pdfium::form_fields::kT, + name.AsStringView()); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldFlags(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t set_bits, + uint32_t clear_bits) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) return false; + if ((set_bits | clear_bits) & kFamilyDefiningFlags) return false; + + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || !field->KeyExist(pdfium::form_fields::kFT)) return false; + + const uint32_t current = InheritedFieldFlags(field.Get()); + const uint32_t next = (current & ~clear_bits) | set_bits; + if (next == current) return true; + + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + mutable_field->SetNewFor(pdfium::form_fields::kFf, + static_cast(next)); + // Rendering-relevant text/choice bits (multiline, comb, ...) changed. + RegenerateFieldAppearances(doc, field_objnum); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, + uint32_t field_objnum, + int max_len) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0 || max_len < 0) return false; + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || InheritedFieldType(field.Get()) != pdfium::form_fields::kTx) { + return false; + } + if (max_len > 0) { + RetainPtr value = CPDF_FormField::GetFieldAttrForDict( + field.Get(), pdfium::form_fields::kV); + if (value && + value->GetUnicodeText().GetLength() > static_cast(max_len)) { + return false; // never truncate an existing value implicitly + } + } + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + if (max_len == 0) { + mutable_field->RemoveFor("MaxLen"); + } else { + mutable_field->SetNewFor("MaxLen", max_len); + } + RegenerateFieldAppearances(doc, field_objnum); // comb cells follow MaxLen + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDefaultValue(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) return false; + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field) return false; + const ByteString field_type = InheritedFieldType(field.Get()); + if (field_type != pdfium::form_fields::kTx && + field_type != pdfium::form_fields::kCh) { + return false; + } + const WideString text = + value ? WideStringFromFPDFWideString(value) : WideString(); + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + if (text.IsEmpty()) { + mutable_field->RemoveFor(pdfium::form_fields::kDV); + } else { + mutable_field->SetNewFor(pdfium::form_fields::kDV, + text.AsStringView()); + } + return true; +} + +namespace { + +FPDF_BOOL SetOptionalFieldText(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value, + const char* key) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) return false; + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || !field->KeyExist(pdfium::form_fields::kFT)) return false; + const WideString text = + value ? WideStringFromFPDFWideString(value) : WideString(); + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + if (text.IsEmpty()) { + mutable_field->RemoveFor(key); + } else { + mutable_field->SetNewFor(key, text.AsStringView()); + } + return true; +} + +} // namespace + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldAlternateName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value) { + return SetOptionalFieldText(document, field_objnum, value, "TU"); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldMappingName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value) { + return SetOptionalFieldText(document, field_objnum, value, "TM"); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* labels, + const FPDF_WIDESTRING* exports, + unsigned long count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0 || (count > 0 && (!labels || !exports))) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || InheritedFieldType(field.Get()) != pdfium::form_fields::kCh) { + return false; + } + const uint32_t flags = InheritedFieldFlags(field.Get()); + const bool free_text_combo = (flags & pdfium::form_flags::kChoiceCombo) && + (flags & pdfium::form_flags::kChoiceEdit); + + std::vector new_labels; + std::vector new_exports; + if (count > 0) { + pdfium::span labels_span = + UNSAFE_BUFFERS(pdfium::span(labels, static_cast(count))); + pdfium::span exports_span = + UNSAFE_BUFFERS(pdfium::span(exports, static_cast(count))); + for (unsigned long i = 0; i < count; ++i) { + new_labels.push_back(labels_span[i] + ? WideStringFromFPDFWideString(labels_span[i]) + : WideString()); + new_exports.push_back(exports_span[i] + ? WideStringFromFPDFWideString(exports_span[i]) + : WideString()); + } + } + + // Current selection, filtered against the new export values. + std::vector kept; + { + RetainPtr value = CPDF_FormField::GetFieldAttrForDict( + field.Get(), pdfium::form_fields::kV); + std::vector selected; + if (value) { + if (const CPDF_Array* array = value->AsArray()) { + for (size_t i = 0; i < array->size(); ++i) { + selected.push_back(array->GetUnicodeTextAt(i)); + } + } else { + selected.push_back(value->GetUnicodeText()); + } + } + for (const WideString& v : selected) { + if (pdfium::Contains(new_exports, v)) { + kept.push_back(v); + } + } + // An edit combo's free text is not an option; it survives verbatim. + if (kept.empty() && free_text_combo && !selected.empty()) { + kept = std::move(selected); + } + } + + // ---- Apply: rewrite /Opt, then re-sync selection + appearances. ---- + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) return false; + if (count == 0) { + mutable_field->RemoveFor("Opt"); + } else { + auto opt = mutable_field->SetNewFor("Opt"); + for (unsigned long i = 0; i < count; ++i) { + if (new_labels[i] == new_exports[i]) { + opt->AppendNew(new_exports[i].AsStringView()); + } else { + auto pair = opt->AppendNew(); + pair->AppendNew(new_exports[i].AsStringView()); + pair->AppendNew(new_labels[i].AsStringView()); + } + } + } + + if (free_text_combo && !kept.empty() && + !pdfium::Contains(new_exports, kept.front())) { + // Free text survives; only the index hint is stale now. + mutable_field->RemoveFor("I"); + RegenerateFieldAppearances(doc, field_objnum); + return true; + } + return ApplyChoiceValues(doc, field_objnum, kept, nullptr, 0, nullptr); +} diff --git a/fpdfsdk/epdf_form_embeddertest.cpp b/fpdfsdk/epdf_form_embeddertest.cpp new file mode 100644 index 0000000000..0e739aab4d --- /dev/null +++ b/fpdfsdk/epdf_form_embeddertest.cpp @@ -0,0 +1,1204 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_form.h" + +#include +#include + +#include "public/fpdf_annot.h" +#include "public/fpdf_save.h" +#include "public/fpdfview.h" +#include "testing/test_loader.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/utils/file_util.h" +#include "testing/utils/path_service.h" + +namespace { + +using WideStringGetter = unsigned long (*)(EPDF_FORM_MODEL, + int, + FPDF_WCHAR*, + unsigned long); + +std::wstring GetWideString(WideStringGetter getter, + EPDF_FORM_MODEL model, + int field_index) { + unsigned long length_bytes = getter(model, field_index, nullptr, 0); + if (length_bytes == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, + getter(model, field_index, buffer.data(), length_bytes)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetWidgetExportValue(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + unsigned long length_bytes = EPDFForm_GetFieldWidgetExportValue( + model, field_index, widget_index, nullptr, 0); + if (length_bytes == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, + EPDFForm_GetFieldWidgetExportValue(model, field_index, widget_index, + buffer.data(), length_bytes)); + return GetPlatformWString(buffer.data()); +} + +std::string GetWidgetOnState(EPDF_FORM_MODEL model, + int field_index, + int widget_index) { + unsigned long length_bytes = EPDFForm_GetFieldWidgetOnState( + model, field_index, widget_index, nullptr, 0); + if (length_bytes == 0) { + return std::string(); + } + std::vector buffer(length_bytes); + EXPECT_EQ(length_bytes, + EPDFForm_GetFieldWidgetOnState(model, field_index, widget_index, + buffer.data(), length_bytes)); + // |length_bytes| includes the trailing NUL. + return std::string(buffer.data()); +} + +int FieldIndexByName(EPDF_FORM_MODEL model, const wchar_t* name) { + for (int i = 0; i < EPDFForm_CountFields(model); ++i) { + if (GetWideString(EPDFForm_GetFieldName, model, i) == name) { + return i; + } + } + return -1; +} + +class EPDFFormEmbedderTest : public EmbedderTest { + protected: + // A base document plus a fresh empty layer over it, for delta assertions. + struct LayerDoc { + std::vector bytes; + EPDF_BASE_DOCUMENT base = nullptr; + FPDF_DOCUMENT layer = nullptr; + + ~LayerDoc() { + if (layer) { + FPDF_CloseDocument(layer); + } + if (base) { + EPDF_ReleaseBaseDocument(base); + } + } + }; + + bool OpenLayer(const char* file_name, LayerDoc* out) { + std::string file_path = PathService::GetTestFilePath(file_name); + if (file_path.empty()) { + return false; + } + out->bytes = GetFileContents(file_path.c_str()); + if (out->bytes.empty()) { + return false; + } + out->base = EPDF_LoadMemBaseDocument( + out->bytes.data(), static_cast(out->bytes.size()), nullptr); + if (!out->base) { + return false; + } + EPDFLayerOpenStatus status; + out->layer = EPDFLayer_OpenLayer(out->base, nullptr, nullptr, &status); + return out->layer && status == EPDFLayerOpenStatus_kSuccess; + } +}; + +} // namespace + +TEST_F(EPDFFormEmbedderTest, NoFormYieldsEmptyModel) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_NONE, EPDFForm_GetFormKind(model)); + EXPECT_FALSE(EPDFForm_GetNeedAppearances(model)); + EXPECT_EQ(0, EPDFForm_CountFields(model)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, TextFormModel) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_ACROFORM, EPDFForm_GetFormKind(model)); + ASSERT_EQ(1, EPDFForm_CountFields(model)); + + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_TEXT, EPDFForm_GetFieldFamily(model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, EPDFForm_GetFieldOrigin(model, 0)); + EXPECT_EQ(L"Text Box", GetWideString(EPDFForm_GetFieldName, model, 0)); + EXPECT_EQ(4u, EPDFForm_GetFieldObjNum(model, 0)); + + // Merged field/widget dictionary: one widget sharing the field's object + // number, placed on the page (object 3). + ASSERT_EQ(1, EPDFForm_CountFieldWidgets(model, 0)); + EXPECT_EQ(4u, EPDFForm_GetFieldWidgetObjNum(model, 0, 0)); + EXPECT_EQ(3u, EPDFForm_GetFieldWidgetPageObjNum(model, 0, 0)); + EXPECT_EQ(0, EPDFForm_GetFieldIndexForWidget(model, 4u)); + EXPECT_EQ(0, EPDFForm_GetFieldIndexByObjNum(model, 4u)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ClickFormModel) { + ASSERT_TRUE(OpenDocument("click_form.pdf")); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_ACROFORM, EPDFForm_GetFormKind(model)); + ASSERT_EQ(4, EPDFForm_CountFields(model)); + + // Field 0: merged read-only checkbox, checked via /AS /Yes. + EXPECT_EQ(L"readOnlyCheckbox", GetWideString(EPDFForm_GetFieldName, model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 0)); + EXPECT_TRUE(EPDFForm_GetFieldFlags(model, 0) & 1); // ReadOnly. + EXPECT_EQ(L"Yes", GetWideString(EPDFForm_GetFieldValue, model, 0)); + ASSERT_EQ(1, EPDFForm_CountFieldWidgets(model, 0)); + EXPECT_EQ("Yes", GetWidgetOnState(model, 0, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 0, 0)); + + // Field 1: merged checkbox, unchecked. + EXPECT_EQ(L"checkbox", GetWideString(EPDFForm_GetFieldName, model, 1)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 1)); + EXPECT_EQ(L"Off", GetWideString(EPDFForm_GetFieldValue, model, 1)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 1, 0)); + + // Field 2: read-only radio group with three separate widget kids. + EXPECT_EQ(L"readOnlyRadioButton", + GetWideString(EPDFForm_GetFieldName, model, 2)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_RADIO, EPDFForm_GetFieldFamily(model, 2)); + ASSERT_EQ(3, EPDFForm_CountFieldWidgets(model, 2)); + EXPECT_EQ("value1", GetWidgetOnState(model, 2, 0)); + EXPECT_EQ("value2", GetWidgetOnState(model, 2, 1)); + EXPECT_EQ("value3", GetWidgetOnState(model, 2, 2)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 2, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 2, 2)); + EXPECT_EQ(L"value3", GetWideString(EPDFForm_GetFieldValue, model, 2)); + EXPECT_EQ(L"value3", GetWidgetExportValue(model, 2, 2)); + + // Field 3: radio group; widgets 13/14/15 all map back to it. + EXPECT_EQ(L"radioButton", GetWideString(EPDFForm_GetFieldName, model, 3)); + ASSERT_EQ(3, EPDFForm_CountFieldWidgets(model, 3)); + EXPECT_EQ(3, EPDFForm_GetFieldIndexForWidget(model, 13u)); + EXPECT_EQ(3, EPDFForm_GetFieldIndexForWidget(model, 14u)); + EXPECT_EQ(3, EPDFForm_GetFieldIndexForWidget(model, 15u)); + EXPECT_EQ(-1, EPDFForm_GetFieldIndexForWidget(model, 9999u)); + + // Everything in this document is properly linked into /AcroForm /Fields. + for (int i = 0; i < 4; ++i) { + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, + EPDFForm_GetFieldOrigin(model, i)); + } + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, OrphanWidgetsRecovered) { + ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_ACROFORM, EPDFForm_GetFormKind(model)); + + // /AcroForm /Fields only lists the text field; the checkbox and the whole + // radio group are reachable through page /Annots alone. Without the sweep + // this model would contain one field instead of three. + ASSERT_EQ(3, EPDFForm_CountFields(model)); + + EXPECT_EQ(L"linked_text", GetWideString(EPDFForm_GetFieldName, model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_TEXT, EPDFForm_GetFieldFamily(model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, EPDFForm_GetFieldOrigin(model, 0)); + EXPECT_EQ(L"hello", GetWideString(EPDFForm_GetFieldValue, model, 0)); + + EXPECT_EQ(L"orphan_check", GetWideString(EPDFForm_GetFieldName, model, 1)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 1)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, + EPDFForm_GetFieldOrigin(model, 1)); + EXPECT_EQ(5u, EPDFForm_GetFieldObjNum(model, 1)); + ASSERT_EQ(1, EPDFForm_CountFieldWidgets(model, 1)); + EXPECT_EQ("Yes", GetWidgetOnState(model, 1, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 1, 0)); + EXPECT_EQ(L"Yes", GetWideString(EPDFForm_GetFieldValue, model, 1)); + + // The radio group's parent field dictionary is not referenced anywhere in + // /AcroForm /Fields. The sweep climbs /Parent from the first widget it + // sees, so BOTH widgets must land on ONE logical field. + EXPECT_EQ(L"orphan_radio", GetWideString(EPDFForm_GetFieldName, model, 2)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_RADIO, EPDFForm_GetFieldFamily(model, 2)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, + EPDFForm_GetFieldOrigin(model, 2)); + EXPECT_EQ(6u, EPDFForm_GetFieldObjNum(model, 2)); + EXPECT_TRUE(EPDFForm_GetFieldFlags(model, 2) & 0x8000); // Radio. + ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, 2)); + EXPECT_EQ(8u, EPDFForm_GetFieldWidgetObjNum(model, 2, 0)); + EXPECT_EQ(9u, EPDFForm_GetFieldWidgetObjNum(model, 2, 1)); + EXPECT_EQ(3u, EPDFForm_GetFieldWidgetPageObjNum(model, 2, 0)); + EXPECT_EQ("a", GetWidgetOnState(model, 2, 0)); + EXPECT_EQ("b", GetWidgetOnState(model, 2, 1)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 2, 0)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 2, 1)); + EXPECT_EQ(L"a", GetWideString(EPDFForm_GetFieldValue, model, 2)); + + EXPECT_EQ(2, EPDFForm_GetFieldIndexForWidget(model, 8u)); + EXPECT_EQ(2, EPDFForm_GetFieldIndexForWidget(model, 9u)); + EXPECT_EQ(2, EPDFForm_GetFieldIndexByObjNum(model, 6u)); + EPDFForm_CloseModel(model); +} + +// Building a form model must be a pure read: over a layer document it must +// not promote a single object into the layer, even while it reconciles +// orphan widgets in memory. +TEST_F(EPDFFormEmbedderTest, LayerModelLoadIsPure) { + std::string file_path = PathService::GetTestFilePath("orphan_widgets.pdf"); + ASSERT_FALSE(file_path.empty()); + std::vector contents = GetFileContents(file_path.c_str()); + ASSERT_FALSE(contents.empty()); + + EPDF_BASE_DOCUMENT base = EPDF_LoadMemBaseDocument( + contents.data(), static_cast(contents.size()), nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status; + FPDF_DOCUMENT layer = EPDFLayer_OpenLayer(base, nullptr, nullptr, &status); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(layer); + ASSERT_TRUE(model); + EXPECT_EQ(3, EPDFForm_CountFields(model)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, EPDFForm_GetFieldOrigin(model, 2)); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(layer)); + EPDFForm_CloseModel(model); + + FPDF_CloseDocument(layer); + EPDF_ReleaseBaseDocument(base); +} + +// The radio walkthrough: flipping the group promotes exactly the field plus +// the two widgets whose /AS changed - the minimal FDF-shaped delta. +TEST_F(EPDFFormEmbedderTest, SetToggleRadioOnLayer) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &doc)); + + uint32_t changed[4] = {}; + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetToggle(doc.layer, 6u, "b", changed, 4, + &changed_count)); + EXPECT_EQ(2ul, changed_count); + EXPECT_EQ(8u, changed[0]); // /AS a -> Off + EXPECT_EQ(9u, changed[1]); // /AS Off -> b + EXPECT_EQ(3ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 6u)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 8u)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 9u)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(doc.layer); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 6u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); + EPDFForm_CloseModel(model); + + // Idempotence: re-setting the same state changes nothing and promotes + // nothing further. + ASSERT_TRUE(EPDFForm_SetToggle(doc.layer, 6u, "b", nullptr, 0, + &changed_count)); + EXPECT_EQ(0ul, changed_count); + EXPECT_EQ(3ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); +} + +// A failed transaction must be side-effect free: zero objects promoted. +TEST_F(EPDFFormEmbedderTest, SetToggleFailuresAreSideEffectFree) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &doc)); + + // Unknown on-state. + EXPECT_FALSE(EPDFForm_SetToggle(doc.layer, 6u, "zz", nullptr, 0, nullptr)); + // Not a toggle field (the text field). + EXPECT_FALSE(EPDFForm_SetToggle(doc.layer, 4u, "Yes", nullptr, 0, nullptr)); + // Unknown field object number. + EXPECT_FALSE(EPDFForm_SetToggle(doc.layer, 9999u, "a", nullptr, 0, nullptr)); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); +} + +TEST_F(EPDFFormEmbedderTest, SetToggleClearRadioGroup) { + ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); + // orphan_radio has no NoToggleToOff flag, so clearing is legal. + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetToggle(document(), 6u, nullptr, nullptr, 0, + &changed_count)); + EXPECT_EQ(1ul, changed_count); // Only widget 8 was checked. + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 6u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"Off", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ToggleSemantics) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + + // NoToggleToOff: clearing the group is rejected; switching is fine. + EXPECT_FALSE(EPDFForm_SetToggle(document(), 5u, nullptr, nullptr, 0, + nullptr)); + ASSERT_TRUE(EPDFForm_SetToggle(document(), 5u, "y", nullptr, 0, nullptr)); + + // Radios in unison: both /u1 widgets check together. + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetToggle(document(), 8u, "u1", nullptr, 0, + &changed_count)); + EXPECT_EQ(2ul, changed_count); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 5u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"y", GetWideString(EPDFForm_GetFieldValue, model, field)); + + field = EPDFForm_GetFieldIndexByObjNum(model, 8u); + ASSERT_GE(field, 0); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 2)); + EXPECT_EQ(L"u1", GetWideString(EPDFForm_GetFieldValue, model, field)); + EPDFForm_CloseModel(model); + + // Switching to /u2 unchecks both unison widgets: three /AS flips. + ASSERT_TRUE(EPDFForm_SetToggle(document(), 8u, "u2", nullptr, 0, + &changed_count)); + EXPECT_EQ(3ul, changed_count); + + // Checkbox with /Opt: /V becomes the control index name, and the field + // value reads back as the /Opt export value (Acrobat convention). + ASSERT_TRUE(EPDFForm_SetToggle(document(), 12u, "On", nullptr, 0, nullptr)); + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EXPECT_EQ(L"Alpha", GetWideString(EPDFForm_GetFieldValue, model, field)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, SetTextValue) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + + ScopedFPDFWideString text = GetFPDFWideString(L"Hello EmbedPDF"); + uint32_t changed[2] = {}; + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, text.get(), changed, 2, + &changed_count)); + EXPECT_EQ(1ul, changed_count); + EXPECT_EQ(4u, changed[0]); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(L"Hello EmbedPDF", + GetWideString(EPDFForm_GetFieldValue, model, 0)); + EPDFForm_CloseModel(model); + + // The widget's normal appearance stream was regenerated. + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 0)); + ASSERT_TRUE(annot); + EXPECT_GT(FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_NORMAL, + nullptr, 0), + 2u); + } + UnloadPage(page); + + // Idempotence: same value again reports zero changes. + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, text.get(), nullptr, 0, + &changed_count)); + EXPECT_EQ(0ul, changed_count); +} + +TEST_F(EPDFFormEmbedderTest, SetTextValueMaxLenAndLayerDelta) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &doc)); + + // Six characters against /MaxLen 5: rejected, side-effect free. + ScopedFPDFWideString too_long = GetFPDFWideString(L"abcdef"); + EXPECT_FALSE(EPDFForm_SetTextValue(doc.layer, 4u, too_long.get(), nullptr, + 0, nullptr)); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + + ScopedFPDFWideString fits = GetFPDFWideString(L"abcde"); + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetTextValue(doc.layer, 4u, fits.get(), nullptr, 0, + &changed_count)); + EXPECT_EQ(1ul, changed_count); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 4u)); + // Merged field/widget plus the regenerated appearance machinery; the + // delta must stay small. + EXPECT_LE(EPDFLayer_GetPromotedObjectCount(doc.layer), 4ul); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(doc.layer); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"abcde", GetWideString(EPDFForm_GetFieldValue, model, field)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, SetChoiceValuesCombo) { + ASSERT_TRUE(OpenDocument("combobox_form.pdf")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int combo1 = FieldIndexByName(model, L"Combo1"); + const int editable = FieldIndexByName(model, L"Combo_Editable"); + ASSERT_GE(combo1, 0); + ASSERT_GE(editable, 0); + const uint32_t combo1_objnum = EPDFForm_GetFieldObjNum(model, combo1); + const uint32_t editable_objnum = EPDFForm_GetFieldObjNum(model, editable); + EPDFForm_CloseModel(model); + + // Non-edit combo: option values only. + ScopedFPDFWideString cherry = GetFPDFWideString(L"Cherry"); + FPDF_WIDESTRING one_value[] = {cherry.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), combo1_objnum, one_value, + 1, nullptr, 0, nullptr)); + ScopedFPDFWideString bogus = GetFPDFWideString(L"NotAnOption"); + FPDF_WIDESTRING bogus_value[] = {bogus.get()}; + EXPECT_FALSE(EPDFForm_SetChoiceValues(document(), combo1_objnum, bogus_value, + 1, nullptr, 0, nullptr)); + + // Edit combo: free text is accepted and clears /I; an option export value + // selects that option. + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), editable_objnum, + bogus_value, 1, nullptr, 0, nullptr)); + ScopedFPDFWideString bar = GetFPDFWideString(L"bar"); + FPDF_WIDESTRING bar_value[] = {bar.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), editable_objnum, bar_value, + 1, nullptr, 0, nullptr)); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(L"Cherry", GetWideString(EPDFForm_GetFieldValue, model, combo1)); + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, combo1, 2)); + EXPECT_EQ(L"bar", GetWideString(EPDFForm_GetFieldValue, model, editable)); + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, editable, 1)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, SetChoiceValuesListbox) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int multi = FieldIndexByName(model, L"Listbox_MultiSelect"); + const int single = FieldIndexByName(model, L"Listbox_SingleSelect"); + ASSERT_GE(multi, 0); + ASSERT_GE(single, 0); + const uint32_t multi_objnum = EPDFForm_GetFieldObjNum(model, multi); + const uint32_t single_objnum = EPDFForm_GetFieldObjNum(model, single); + EPDFForm_CloseModel(model); + + // Multi-select accepts several values regardless of input order. + ScopedFPDFWideString cherry = GetFPDFWideString(L"Cherry"); + ScopedFPDFWideString apple = GetFPDFWideString(L"Apple"); + FPDF_WIDESTRING two_values[] = {cherry.get(), apple.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), multi_objnum, two_values, + 2, nullptr, 0, nullptr)); + // Single-select rejects multiple values. + EXPECT_FALSE(EPDFForm_SetChoiceValues(document(), single_objnum, two_values, + 2, nullptr, 0, nullptr)); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, multi, 0)); // Apple + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, multi, 1)); // Banana + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, multi, 2)); // Cherry + EPDFForm_CloseModel(model); + + // Clearing the selection. + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), multi_objnum, nullptr, 0, + nullptr, 0, nullptr)); + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, multi, 0)); + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, multi, 2)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ResetField) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + + // Toggle reset restores the /DV state. + ASSERT_TRUE(EPDFForm_SetToggle(document(), 5u, "y", nullptr, 0, nullptr)); + ASSERT_TRUE(EPDFForm_ResetField(document(), 5u, nullptr, 0, nullptr)); + + // Text reset with no /DV removes the value. + ScopedFPDFWideString text = GetFPDFWideString(L"xyz"); + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, text.get(), nullptr, 0, + nullptr)); + ASSERT_TRUE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 5u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"x", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); + + field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"", GetWideString(EPDFForm_GetFieldValue, model, field)); + EPDFForm_CloseModel(model); +} + +namespace { + +std::string ExportFdf(FPDF_DOCUMENT doc) { + unsigned long length = EPDFForm_ExportFDF(doc, nullptr, 0, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, + EPDFForm_ExportFDF(doc, nullptr, 0, buffer.data(), length)); + return std::string(buffer.data(), length); +} + +std::string ExportXfdf(FPDF_DOCUMENT doc) { + unsigned long length = EPDFForm_ExportXFDF(doc, nullptr, 0, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, + EPDFForm_ExportXFDF(doc, nullptr, 0, buffer.data(), length)); + return std::string(buffer.data(), length); +} + +} // namespace + +TEST_F(EPDFFormEmbedderTest, ExportFDF) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + const std::string fdf = ExportFdf(document()); + ASSERT_FALSE(fdf.empty()); + EXPECT_NE(std::string::npos, fdf.find("%FDF-1.2")); + EXPECT_NE(std::string::npos, fdf.find("(maxlen_text)")); + EXPECT_NE(std::string::npos, fdf.find("(abc)")); + EXPECT_NE(std::string::npos, fdf.find("(ntto_radio)")); + // Hierarchical fields export with their fully qualified name. + EXPECT_NE(std::string::npos, fdf.find("(billing.name)")); +} + +TEST_F(EPDFFormEmbedderTest, ExportFDFIncludesRecoveredFields) { + ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); + const std::string fdf = ExportFdf(document()); + ASSERT_FALSE(fdf.empty()); + // Only linked_text is reachable through /AcroForm /Fields; the exporter + // must see the reconciled view. + EXPECT_NE(std::string::npos, fdf.find("(linked_text)")); + EXPECT_NE(std::string::npos, fdf.find("(orphan_check)")); + EXPECT_NE(std::string::npos, fdf.find("(orphan_radio)")); +} + +TEST_F(EPDFFormEmbedderTest, ImportFDF) { + ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); + static const char kFdf[] = + "%FDF-1.2\r\n" + "1 0 obj\r\n" + "<< /FDF << /Fields [\r\n" + "<< /T (linked_text) /V (imported) >>\r\n" + "<< /T (orphan_radio) /V (b) >>\r\n" + "<< /T (no_such_field) /V (x) >>\r\n" + "] >> >>\r\n" + "endobj\r\n" + "trailer\r\n" + "<< /Root 1 0 R >>\r\n" + "%%EOF\r\n"; + + EPDF_FORM_IMPORT_RESULT result; + ASSERT_TRUE(EPDFForm_ImportFDF(document(), kFdf, sizeof(kFdf) - 1, &result)); + EXPECT_EQ(3u, result.fields_total); + EXPECT_EQ(2u, result.fields_applied); + EXPECT_EQ(1u, result.fields_skipped); + EXPECT_EQ(3u, result.widgets_changed); // text widget + both radio kids + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_EQ(L"imported", GetWideString(EPDFForm_GetFieldValue, model, field)); + field = EPDFForm_GetFieldIndexByObjNum(model, 6u); + EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); + EPDFForm_CloseModel(model); + + // Garbage payloads are rejected. + EXPECT_FALSE(EPDFForm_ImportFDF(document(), "not fdf", 7, &result)); +} + +// Fill a layer, export its FDF, and replay it onto a second fresh layer of +// the same base: values must survive and only touched objects promote. +TEST_F(EPDFFormEmbedderTest, FdfRoundTripAcrossLayers) { + LayerDoc first; + ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &first)); + ScopedFPDFWideString bob = GetFPDFWideString(L"Bob"); + ASSERT_TRUE(EPDFForm_SetTextValue(first.layer, 4u, bob.get(), nullptr, 0, + nullptr)); + ASSERT_TRUE(EPDFForm_SetToggle(first.layer, 6u, "b", nullptr, 0, nullptr)); + + unsigned long length = + EPDFForm_ExportFDF(first.layer, nullptr, 0, nullptr, 0); + ASSERT_GT(length, 0u); + std::vector fdf(length); + ASSERT_EQ(length, + EPDFForm_ExportFDF(first.layer, nullptr, 0, fdf.data(), length)); + + LayerDoc second; + ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &second)); + EPDF_FORM_IMPORT_RESULT result; + ASSERT_TRUE( + EPDFForm_ImportFDF(second.layer, fdf.data(), length, &result)); + EXPECT_EQ(3u, result.fields_total); // linked_text, orphan_check, orphan_radio + EXPECT_EQ(3u, result.fields_applied); + EXPECT_EQ(0u, result.fields_skipped); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(second.layer); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_EQ(L"Bob", GetWideString(EPDFForm_GetFieldValue, model, field)); + field = EPDFForm_GetFieldIndexByObjNum(model, 6u); + EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ExportXFDF) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + const std::string xfdf = ExportXfdf(document()); + ASSERT_FALSE(xfdf.empty()); + EXPECT_NE(std::string::npos, xfdf.find(". + EXPECT_NE(std::string::npos, xfdf.find("abc")); + EXPECT_NE(std::string::npos, xfdf.find("x")); + // Hierarchical names nest per component. + EXPECT_NE(std::string::npos, xfdf.find("")); + EXPECT_NE(std::string::npos, xfdf.find("\n" + "" + "" + "" + "Bob & Co" + "y" + ""; + + EPDF_FORM_IMPORT_RESULT result; + ASSERT_TRUE( + EPDFForm_ImportXFDF(document(), kXfdf, sizeof(kXfdf) - 1, &result)); + EXPECT_EQ(2u, result.fields_total); + EXPECT_EQ(2u, result.fields_applied); + EXPECT_EQ(0u, result.fields_skipped); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int billing_name = FieldIndexByName(model, L"billing.name"); + ASSERT_GE(billing_name, 0); + // Entity decoding round-trips. + EXPECT_EQ(L"Bob & Co", + GetWideString(EPDFForm_GetFieldValue, model, billing_name)); + const int radio = EPDFForm_GetFieldIndexByObjNum(model, 5u); + EXPECT_EQ(L"y", GetWideString(EPDFForm_GetFieldValue, model, radio)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ImportXFDFMultiSelect) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + static const char kXfdf[] = + "" + "" + "" + "CherryApple" + "" + ""; + + EPDF_FORM_IMPORT_RESULT result; + ASSERT_TRUE( + EPDFForm_ImportXFDF(document(), kXfdf, sizeof(kXfdf) - 1, &result)); + EXPECT_EQ(1u, result.fields_total); + EXPECT_EQ(1u, result.fields_applied); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int multi = FieldIndexByName(model, L"Listbox_MultiSelect"); + ASSERT_GE(multi, 0); + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, multi, 0)); // Apple + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, multi, 1)); // Banana + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, multi, 2)); // Cherry + EPDFForm_CloseModel(model); +} + +// The full circle: export XFDF from a filled document and re-import it into +// a pristine copy via a fresh layer - values must match exactly. +TEST_F(EPDFFormEmbedderTest, XfdfRoundTripPreservesValues) { + LayerDoc first; + ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &first)); + ScopedFPDFWideString tricky = GetFPDFWideString(L"a&\"c\" 'd'"); + ASSERT_TRUE(EPDFForm_SetTextValue(first.layer, 17u, tricky.get(), nullptr, + 0, nullptr)); + + unsigned long length = + EPDFForm_ExportXFDF(first.layer, nullptr, 0, nullptr, 0); + ASSERT_GT(length, 0u); + std::vector xfdf(length); + ASSERT_EQ(length, EPDFForm_ExportXFDF(first.layer, nullptr, 0, xfdf.data(), + length)); + + LayerDoc second; + ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &second)); + EPDF_FORM_IMPORT_RESULT result; + ASSERT_TRUE( + EPDFForm_ImportXFDF(second.layer, xfdf.data(), length, &result)); + EXPECT_EQ(0u, result.fields_skipped); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(second.layer); + ASSERT_TRUE(model); + const int billing_name = FieldIndexByName(model, L"billing.name"); + ASSERT_GE(billing_name, 0); + EXPECT_EQ(L"a&\"c\" 'd'", + GetWideString(EPDFForm_GetFieldValue, model, billing_name)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, RepairLinksRecoveredFields) { + ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); + + EPDF_FORM_REPAIR_REPORT report; + ASSERT_TRUE(EPDFForm_Repair(document(), 0, &report)); + EXPECT_EQ(0u, report.acroform_created); + EXPECT_EQ(2u, report.fields_linked); // orphan_check + orphan_radio root + EXPECT_EQ(0u, report.widgets_linked); + EXPECT_EQ(0u, report.fields_unrepairable); + + // The reconciliation is now durable structure, not an in-memory patch. + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + ASSERT_EQ(3, EPDFForm_CountFields(model)); + for (int i = 0; i < 3; ++i) { + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, + EPDFForm_GetFieldOrigin(model, i)); + } + EPDFForm_CloseModel(model); + + // Idempotent: a second pass fixes nothing. + ASSERT_TRUE(EPDFForm_Repair(document(), 0, &report)); + EXPECT_EQ(0u, report.fields_linked); + EXPECT_EQ(0u, report.widgets_linked); +} + +TEST_F(EPDFFormEmbedderTest, RepairCreatesAcroFormAndLinksKids) { + ASSERT_TRUE(OpenDocument("widgets_no_acroform.pdf")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_NONE, EPDFForm_GetFormKind(model)); + ASSERT_EQ(2, EPDFForm_CountFields(model)); + EPDFForm_CloseModel(model); + + EPDF_FORM_REPAIR_REPORT report; + ASSERT_TRUE(EPDFForm_Repair(document(), 0, &report)); + EXPECT_EQ(1u, report.acroform_created); + EXPECT_EQ(2u, report.fields_linked); // orphan_text + gap_radio + EXPECT_EQ(1u, report.widgets_linked); // widget 7 into gap_radio's /Kids + EXPECT_EQ(0u, report.fields_unrepairable); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_ACROFORM, EPDFForm_GetFormKind(model)); + ASSERT_EQ(2, EPDFForm_CountFields(model)); + const int radio = EPDFForm_GetFieldIndexByObjNum(model, 5u); + ASSERT_GE(radio, 0); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, + EPDFForm_GetFieldOrigin(model, radio)); + EXPECT_EQ(2, EPDFForm_CountFieldWidgets(model, radio)); + EPDFForm_CloseModel(model); +} + +// Repair on a layer is a tiny structural delta, and it survives a delta +// save/reload: the repaired document stays repaired. +TEST_F(EPDFFormEmbedderTest, RepairOnLayerIsDurable) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &doc)); + + EPDF_FORM_REPAIR_REPORT report; + ASSERT_TRUE(EPDFForm_Repair(doc.layer, 0, &report)); + EXPECT_EQ(2u, report.fields_linked); + // /AcroForm lives inline in the catalog, so linking promotes exactly the + // root object and nothing else. + EXPECT_EQ(1ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 1u)); + + // Round-trip the delta into a second layer over the same base. + ClearString(); + EPDFLayerSaveStatus save_status; + ASSERT_TRUE(EPDFLayer_SaveDelta(doc.layer, this, &save_status)); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS file_access = {}; + file_access.m_FileLen = static_cast(delta.size()); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + + EPDFLayerOpenStatus status; + FPDF_DOCUMENT second = + EPDFLayer_OpenLayer(doc.base, &file_access, nullptr, &status); + ASSERT_TRUE(second); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(second); + ASSERT_TRUE(model); + ASSERT_EQ(3, EPDFForm_CountFields(model)); + for (int i = 0; i < 3; ++i) { + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, + EPDFForm_GetFieldOrigin(model, i)); + } + EPDFForm_CloseModel(model); + FPDF_CloseDocument(second); +} + +TEST_F(EPDFFormEmbedderTest, RepairBakesMissingAppearances) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + + EPDF_FORM_REPAIR_REPORT report; + ASSERT_TRUE(EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, + &report)); + // maxlen_text (4) and billing.name (17) ship without /AP. + EXPECT_GE(report.appearances_baked, 2u); + EXPECT_EQ(0u, report.need_appearances_cleared); // flag was never set + + // billing.name is /Annots index 7 on the page; it has an /AP now. + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page, 7)); + ASSERT_TRUE(annot); + EXPECT_GT(FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_NORMAL, + nullptr, 0), + 2u); + } + UnloadPage(page); + + // Idempotent: everything has an appearance now. + ASSERT_TRUE(EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, + &report)); + EXPECT_EQ(0u, report.appearances_baked); +} + +namespace { + +// Create an unattached widget annotation through the ANNOTATION API - the +// authoring model's first step (widgets are born as annotations). +uint32_t CreateWidgetAnnot(FPDF_PAGE page, float left, float bottom, + float right, float top) { + // EPDFPage_CreateAnnot creates an INDIRECT annotation (durable object + // number), unlike upstream FPDFPage_CreateAnnot. + ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page, FPDF_ANNOT_WIDGET)); + if (!annot) { + return 0; + } + FS_RECTF rect{left, top, right, bottom}; + if (!FPDFAnnot_SetRect(annot.get(), &rect)) { + return 0; + } + return EPDFAnnot_GetObjectNumber(annot.get()); +} + +} // namespace + +TEST_F(EPDFFormEmbedderTest, CreateUnplacedFieldBootstrapsAcroForm) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + + const uint32_t field = EPDFForm_CreateField( + document(), 4 /* text */, GetFPDFWideString(L"billing.name").get()); + ASSERT_GT(field, 0u); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(EPDF_FORMKIND_ACROFORM, EPDFForm_GetFormKind(model)); + ASSERT_EQ(1, EPDFForm_CountFields(model)); + EXPECT_EQ(L"billing.name", GetWideString(EPDFForm_GetFieldName, model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_FAMILY_TEXT, EPDFForm_GetFieldFamily(model, 0)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, EPDFForm_GetFieldOrigin(model, 0)); + EXPECT_EQ(0, EPDFForm_CountFieldWidgets(model, 0)); // unplaced + EPDFForm_CloseModel(model); + + // Sibling collisions fail without touching the tree. + EXPECT_EQ(0u, EPDFForm_CreateField(document(), 4, + GetFPDFWideString(L"billing.name").get())); + EXPECT_EQ(0u, EPDFForm_CreateField(document(), 4, + GetFPDFWideString(L"billing").get())); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(1, EPDFForm_CountFields(model)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, AttachWidgetsFormsARadioGroup) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + const uint32_t field = EPDFForm_CreateField( + document(), 3 /* radio */, GetFPDFWideString(L"gender").get()); + ASSERT_GT(field, 0u); + const uint32_t w1 = CreateWidgetAnnot(page, 20, 200, 40, 220); + const uint32_t w2 = CreateWidgetAnnot(page, 60, 200, 80, 220); + ASSERT_GT(w1, 0u); + ASSERT_GT(w2, 0u); + + ASSERT_TRUE(EPDFForm_AttachWidget(document(), field, w1, "male")); + ASSERT_TRUE(EPDFForm_AttachWidget(document(), field, w2, "female")); + // Re-attaching an already attached widget fails. + EXPECT_FALSE(EPDFForm_AttachWidget(document(), field, w1, "male")); + // Toggles demand a usable on-state name. + EXPECT_FALSE(EPDFForm_AttachWidget(document(), field, w1, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int index = EPDFForm_GetFieldIndexByObjNum(model, field); + ASSERT_GE(index, 0); + ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, index)); + EXPECT_EQ("male", GetWidgetOnState(model, index, 0)); + EXPECT_EQ("female", GetWidgetOnState(model, index, 1)); + EPDFForm_CloseModel(model); + + // The newborn group is immediately fillable through the P1 transaction. + unsigned long changed = 0; + ASSERT_TRUE(EPDFForm_SetToggle(document(), field, "male", nullptr, 0, &changed)); + EXPECT_EQ(1ul, changed); + model = EPDFForm_LoadModel(document()); + EXPECT_EQ(L"male", GetWideString(EPDFForm_GetFieldValue, model, + EPDFForm_GetFieldIndexByObjNum(model, field))); + EPDFForm_CloseModel(model); + UnloadPage(page); +} + +TEST_F(EPDFFormEmbedderTest, AttachToLegacyMergedFieldKeepsFieldId) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + const int annots_before = FPDFPage_GetAnnotCount(page); + + // maxlen_text (object 4) is a merged field/widget. + const uint32_t widget = CreateWidgetAnnot(page, 20, 20, 280, 36); + ASSERT_GT(widget, 0u); + ASSERT_TRUE(EPDFForm_AttachWidget(document(), 4u, widget, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int index = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(index, 0); // the FIELD object number never changes + ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, index)); + // The split widget is a NEW object; neither widget is the field dict. + EXPECT_NE(4u, EPDFForm_GetFieldWidgetObjNum(model, index, 0)); + EXPECT_EQ(widget, EPDFForm_GetFieldWidgetObjNum(model, index, 1)); + EPDFForm_CloseModel(model); + + // /Annots: merged entry swapped for the split widget, new widget appended. + EXPECT_EQ(annots_before + 1, FPDFPage_GetAnnotCount(page)); + + // Both widgets still fill together. + ScopedFPDFWideString value = GetFPDFWideString(L"ab"); + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, value.get(), nullptr, 0, nullptr)); + UnloadPage(page); +} + +TEST_F(EPDFFormEmbedderTest, DetachWidgetKeepsFieldVisible) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + const uint32_t field = EPDFForm_CreateField( + document(), 4, GetFPDFWideString(L"note").get()); + const uint32_t widget = CreateWidgetAnnot(page, 20, 200, 200, 220); + ASSERT_TRUE(EPDFForm_AttachWidget(document(), field, widget, nullptr)); + ASSERT_TRUE(EPDFForm_DetachWidget(document(), field, widget)); + // Detaching twice fails (no longer attached). + EXPECT_FALSE(EPDFForm_DetachWidget(document(), field, widget)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int index = EPDFForm_GetFieldIndexByObjNum(model, field); + ASSERT_GE(index, 0); // the field survives, unplaced + EXPECT_EQ(0, EPDFForm_CountFieldWidgets(model, index)); + // The widget is inert again: no field claims it. + EXPECT_EQ(-1, EPDFForm_GetFieldIndexForWidget(model, widget)); + EPDFForm_CloseModel(model); + UnloadPage(page); +} + +TEST_F(EPDFFormEmbedderTest, DeleteFieldDetachesAndPrunesAncestors) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + const uint32_t field = EPDFForm_CreateField( + document(), 4, GetFPDFWideString(L"billing.name").get()); + const uint32_t widget = CreateWidgetAnnot(page, 20, 200, 200, 220); + ASSERT_TRUE(EPDFForm_AttachWidget(document(), field, widget, nullptr)); + + uint32_t detached[4] = {}; + unsigned long detached_count = 0; + ASSERT_TRUE(EPDFForm_DeleteField(document(), field, detached, 4, &detached_count)); + EXPECT_EQ(1ul, detached_count); + EXPECT_EQ(widget, detached[0]); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + // The empty "billing" ancestor was pruned along with the field. + EXPECT_EQ(0, EPDFForm_CountFields(model)); + EPDFForm_CloseModel(model); + UnloadPage(page); +} + +TEST_F(EPDFFormEmbedderTest, FieldSettersValidateAndApply) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + + // Rename: the /T segment only; sibling collisions fail. + ASSERT_TRUE(EPDFForm_SetFieldName(document(), 17u, + GetFPDFWideString(L"fullName").get())); + EXPECT_FALSE(EPDFForm_SetFieldName(document(), 4u, + GetFPDFWideString(L"unison_radio").get())); + EXPECT_FALSE(EPDFForm_SetFieldName(document(), 4u, + GetFPDFWideString(L"a.b").get())); + + // Flags: masked update works; family-defining bits are immutable. + ASSERT_TRUE(EPDFForm_SetFieldFlags(document(), 4u, 1u << 1, 0)); // +Required + EXPECT_FALSE(EPDFForm_SetFieldFlags(document(), 4u, 1u << 15, 0)); + + // MaxLen: cannot cut below the current value ("abc"). + EXPECT_FALSE(EPDFForm_SetFieldMaxLen(document(), 4u, 2)); + ASSERT_TRUE(EPDFForm_SetFieldMaxLen(document(), 4u, 10)); + + ASSERT_TRUE(EPDFForm_SetFieldDefaultValue(document(), 4u, + GetFPDFWideString(L"dflt").get())); + ASSERT_TRUE(EPDFForm_SetFieldAlternateName( + document(), 4u, GetFPDFWideString(L"Your name").get())); + ASSERT_TRUE(EPDFForm_SetFieldMappingName(document(), 4u, + GetFPDFWideString(L"name_x").get())); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int index = EPDFForm_GetFieldIndexByObjNum(model, 17u); + EXPECT_EQ(L"billing.fullName", GetWideString(EPDFForm_GetFieldName, model, index)); + index = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_TRUE(EPDFForm_GetFieldFlags(model, index) & (1u << 1)); + EXPECT_EQ(10, EPDFForm_GetFieldMaxLen(model, index)); + EXPECT_EQ(L"dflt", GetWideString(EPDFForm_GetFieldDefaultValue, model, index)); + EXPECT_EQ(L"Your name", + GetWideString(EPDFForm_GetFieldAlternateName, model, index)); + EXPECT_EQ(L"name_x", GetWideString(EPDFForm_GetFieldMappingName, model, index)); + EPDFForm_CloseModel(model); + + // Reset now restores the fresh /DV through the P1 transaction. + ASSERT_TRUE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); + model = EPDFForm_LoadModel(document()); + index = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_EQ(L"dflt", GetWideString(EPDFForm_GetFieldValue, model, index)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, SetFieldOptionsResyncsSelection) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int index = FieldIndexByName(model, L"Listbox_MultiSelectMultipleValues"); + ASSERT_GE(index, 0); + const uint32_t field = EPDFForm_GetFieldObjNum(model, index); + EPDFForm_CloseModel(model); + + // Current /V is [Epsilon, Gamma]; the new option list keeps only Gamma. + ScopedFPDFWideString alpha = GetFPDFWideString(L"Alpha"); + ScopedFPDFWideString gamma = GetFPDFWideString(L"Gamma"); + ScopedFPDFWideString zeta = GetFPDFWideString(L"Zeta"); + FPDF_WIDESTRING labels[] = {alpha.get(), gamma.get(), zeta.get()}; + ASSERT_TRUE(EPDFForm_SetFieldOptions(document(), field, labels, labels, 3)); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + index = EPDFForm_GetFieldIndexByObjNum(model, field); + ASSERT_EQ(3, EPDFForm_CountFieldOptions(model, index)); + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, index, 0)); // Alpha + EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, index, 1)); // Gamma kept + EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, index, 2)); // Zeta + EPDFForm_CloseModel(model); +} + +// Authoring on a layer produces a minimal, durable delta. +TEST_F(EPDFFormEmbedderTest, AuthoringOnLayerIsDurable) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("hello_world.pdf", &doc)); + + const uint32_t field = EPDFForm_CreateField( + doc.layer, 4, GetFPDFWideString(L"layer_field").get()); + ASSERT_GT(field, 0u); + FPDF_PAGE page = FPDF_LoadPage(doc.layer, 0); + ASSERT_TRUE(page); + const uint32_t widget = CreateWidgetAnnot(page, 20, 200, 200, 220); + ASSERT_GT(widget, 0u); + ASSERT_TRUE(EPDFForm_AttachWidget(doc.layer, field, widget, nullptr)); + FPDF_ClosePage(page); + + // Duplicate create fails without growing the delta. + const unsigned long promoted = EPDFLayer_GetPromotedObjectCount(doc.layer); + EXPECT_EQ(0u, EPDFForm_CreateField(doc.layer, 4, + GetFPDFWideString(L"layer_field").get())); + EXPECT_EQ(promoted, EPDFLayer_GetPromotedObjectCount(doc.layer)); + + ClearString(); + EPDFLayerSaveStatus save_status; + ASSERT_TRUE(EPDFLayer_SaveDelta(doc.layer, this, &save_status)); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS file_access = {}; + file_access.m_FileLen = static_cast(delta.size()); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + EPDFLayerOpenStatus status; + FPDF_DOCUMENT second = + EPDFLayer_OpenLayer(doc.base, &file_access, nullptr, &status); + ASSERT_TRUE(second); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(second); + ASSERT_TRUE(model); + const int index = EPDFForm_GetFieldIndexByObjNum(model, field); + ASSERT_GE(index, 0); + EXPECT_EQ(L"layer_field", GetWideString(EPDFForm_GetFieldName, model, index)); + EXPECT_EQ(1, EPDFForm_CountFieldWidgets(model, index)); + EPDFForm_CloseModel(model); + FPDF_CloseDocument(second); +} diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 10ee70472b..45b781c5a7 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -803,42 +803,6 @@ CPDF_FormField* GetFormField(FPDF_FORMHANDLE hHandle, FPDF_ANNOTATION annot) { return pPDFForm->GetFieldByDict(pAnnotDict); } -RetainPtr GetMutableFieldDict(CPDF_FormField* pFormField) { - if (!pFormField) { - return nullptr; - } - - return pdfium::WrapRetain( - const_cast(pFormField->GetFieldDict().Get())); -} - -bool ArrayContainsDictWithObjNum(const CPDF_Array* pArray, uint32_t obj_num) { - if (!pArray || obj_num == 0) { - return false; - } - - for (size_t i = 0; i < pArray->size(); ++i) { - RetainPtr pDict = pArray->GetDictAt(i); - if (pDict && pDict->GetObjNum() == obj_num) { - return true; - } - } - return false; -} - -void RemoveDictWithObjNumFromArray(CPDF_Array* pArray, uint32_t obj_num) { - if (!pArray || obj_num == 0) { - return; - } - - for (size_t i = pArray->size(); i > 0; --i) { - RetainPtr pDict = pArray->GetDictAt(i - 1); - if (pDict && pDict->GetObjNum() == obj_num) { - pArray->RemoveAt(i - 1); - } - } -} - // If `allowed_types` is empty, then match all types. const CPDFSDK_Widget* GetWidgetOfTypes( FPDF_FORMHANDLE hHandle, @@ -1110,6 +1074,10 @@ FPDFAnnot_IsSupportedSubtype(FPDF_ANNOTATION_SUBTYPE subtype) { case FPDF_ANNOT_POLYLINE: case FPDF_ANNOT_LINE: case FPDF_ANNOT_CARET: + // EmbedPDF: widgets are born through the annotation API and adopted by a + // form field via EPDFForm_AttachWidget (public/epdf_form.h). An + // unattached widget is an ordinary, inert annotation. + case FPDF_ANNOT_WIDGET: return true; default: return false; @@ -5084,117 +5052,6 @@ EPDFAnnot_ClearMKColor(FPDF_ANNOTATION annot, EPDF_MK_COLORTYPE type) { return true; } -FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV -EPDFPage_CreateFormField(FPDF_PAGE page, - FPDF_FORMHANDLE handle, - int field_type, - FPDF_WIDESTRING field_name) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { - return nullptr; - } - - CPDFSDK_InteractiveForm* pSDKForm = FormHandleToInteractiveForm(handle); - if (!pSDKForm) { - return nullptr; - } - - // Validate field_type - switch (field_type) { - case FPDF_FORMFIELD_TEXTFIELD: - case FPDF_FORMFIELD_CHECKBOX: - case FPDF_FORMFIELD_RADIOBUTTON: - case FPDF_FORMFIELD_COMBOBOX: - case FPDF_FORMFIELD_LISTBOX: - case FPDF_FORMFIELD_PUSHBUTTON: - break; - default: - return nullptr; - } - - CPDF_Document* pDoc = pPage->GetDocument(); - - // Determine /FT and base /Ff from the field_type - ByteString ft_value; - uint32_t base_flags = 0; - switch (field_type) { - case FPDF_FORMFIELD_TEXTFIELD: - ft_value = "Tx"; - break; - case FPDF_FORMFIELD_CHECKBOX: - ft_value = "Btn"; - break; - case FPDF_FORMFIELD_RADIOBUTTON: - ft_value = "Btn"; - base_flags = (1 << 15); // kRadio - break; - case FPDF_FORMFIELD_PUSHBUTTON: - ft_value = "Btn"; - base_flags = (1 << 16); // kPushbutton - break; - case FPDF_FORMFIELD_COMBOBOX: - ft_value = "Ch"; - base_flags = (1 << 17); // kCombo - break; - case FPDF_FORMFIELD_LISTBOX: - ft_value = "Ch"; - break; - } - - // Create the parent field dictionary (indirect) - RetainPtr pFieldDict = pDoc->NewIndirect(); - pFieldDict->SetNewFor("FT", ft_value); - if (base_flags != 0) { - pFieldDict->SetNewFor("Ff", static_cast(base_flags)); - } - - // Set field name /T - if (field_name) { - WideString ws_name = WideStringFromFPDFWideString(field_name); - if (!ws_name.IsEmpty()) { - pFieldDict->SetNewFor("T", ws_name.ToUTF8()); - } - } - - // Create the widget annotation dictionary (indirect) - RetainPtr pAnnotDict = pDoc->NewIndirect(); - pAnnotDict->SetNewFor(pdfium::annotation::kType, "Annot"); - pAnnotDict->SetNewFor(pdfium::annotation::kSubtype, "Widget"); - - // Link widget -> parent via /Parent - pAnnotDict->SetNewFor("Parent", pDoc, - pFieldDict->GetObjNum()); - - // Link parent -> widget via /Kids - RetainPtr pKids = pFieldDict->SetNewFor("Kids"); - pKids->AppendNew(pDoc, pAnnotDict->GetObjNum()); - - // Ensure /AcroForm exists on document root - RetainPtr pRoot = pDoc->GetMutableRoot(); - if (!pRoot) { - return nullptr; - } - - RetainPtr pAcroForm = pRoot->GetOrCreateDictFor("AcroForm"); - - // Append field to /AcroForm/Fields - RetainPtr pFields = pAcroForm->GetOrCreateArrayFor("Fields"); - pFields->AppendNew(pDoc, pFieldDict->GetObjNum()); - - // Append widget annotation to page /Annots - RetainPtr pAnnots = pPage->GetOrCreateAnnotsArray(); - pAnnots->AppendNew(pDoc, pAnnotDict->GetObjNum()); - - // Register the new field with the interactive form - CPDF_InteractiveForm* pPDFForm = pSDKForm->GetInteractiveForm(); - pPDFForm->FixPageFields(pPage); - - // Build and return the annotation handle - auto pContext = std::make_unique( - pAnnotDict, IPDFPageFromFPDFPage(page)); - return FPDFAnnotationFromCPDFAnnotContext(pContext.release()); -} - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GenerateFormFieldAP(FPDF_ANNOTATION annot) { CPDF_AnnotContext* pContext = CPDFAnnotContextFromFPDFAnnotation(annot); @@ -5268,204 +5125,6 @@ EPDFAnnot_GenerateFormFieldAP(FPDF_ANNOTATION annot) { return false; } -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFAnnot_GetButtonExportValue(FPDF_ANNOTATION annot, - FPDF_WCHAR* buffer, - unsigned long buflen) { - const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) { - return 0; - } - - RetainPtr pAP = - pAnnotDict->GetDictFor(pdfium::annotation::kAP); - if (!pAP) { - return 0; - } - - RetainPtr pN = pAP->GetDictFor("N"); - if (!pN) { - return 0; - } - - ByteString on_state; - CPDF_DictionaryLocker locker(pN); - for (const auto& it : locker) { - if (it.first != "Off") { - on_state = it.first; - break; - } - } - - if (on_state.IsEmpty()) { - return 0; - } - - return Utf16EncodeMaybeCopyAndReturnLength( - WideString::FromUTF8(on_state.AsStringView()), - UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); -} - -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFAnnot_GetFormFieldRawValue(FPDF_FORMHANDLE hHandle, - FPDF_ANNOTATION annot, - FPDF_WCHAR* buffer, - unsigned long buflen) { - const CPDF_FormField* pFormField = GetFormField(hHandle, annot); - if (!pFormField) { - return 0; - } - // SAFETY: required from caller. - return Utf16EncodeMaybeCopyAndReturnLength( - pFormField->GetRawValue(), - UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldValue(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - FPDF_WIDESTRING value) { - CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) { - return false; - } - - return pFormField->SetValue(WideStringFromFPDFWideString(value), - NotificationOption::kDoNotNotify); -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldName(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - FPDF_WIDESTRING name) { - CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) { - return false; - } - - RetainPtr pFieldDict = pdfium::WrapRetain( - const_cast(pFormField->GetFieldDict().Get())); - if (!pFieldDict) { - return false; - } - - WideString ws_name = WideStringFromFPDFWideString(name); - pFieldDict->SetNewFor("T", ws_name.ToUTF8()); - return true; -} - -FPDF_EXPORT int FPDF_CALLCONV -EPDFAnnot_GetFormFieldObjectNumber(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot) { - RetainPtr pFieldDict = - GetMutableFieldDict(GetFormField(handle, annot)); - if (!pFieldDict) { - return 0; - } - - return static_cast(pFieldDict->GetObjNum()); -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION source_annot, - FPDF_ANNOTATION target_annot) { - CPDFSDK_InteractiveForm* pSDKForm = FormHandleToInteractiveForm(handle); - if (!pSDKForm) { - return false; - } - - CPDF_FormField* pSourceField = GetFormField(handle, source_annot); - CPDF_FormField* pTargetField = GetFormField(handle, target_annot); - if (!pSourceField || !pTargetField) { - return false; - } - - RetainPtr pSourceFieldDict = - GetMutableFieldDict(pSourceField); - RetainPtr pTargetFieldDict = - GetMutableFieldDict(pTargetField); - if (!pSourceFieldDict || !pTargetFieldDict) { - return false; - } - - if (pSourceFieldDict->GetObjNum() == pTargetFieldDict->GetObjNum()) { - return true; - } - - if (pSourceField->GetType() != pTargetField->GetType()) { - return false; - } - - CPDF_AnnotContext* pSourceContext = - CPDFAnnotContextFromFPDFAnnotation(source_annot); - CPDF_AnnotContext* pTargetContext = - CPDFAnnotContextFromFPDFAnnotation(target_annot); - if (!pSourceContext || !pTargetContext) { - return false; - } - - IPDF_Page* pSourcePage = pSourceContext->GetPage(); - IPDF_Page* pTargetPage = pTargetContext->GetPage(); - if (!pSourcePage || !pTargetPage) { - return false; - } - - CPDF_Document* pDoc = pSourcePage->GetDocument(); - if (!pDoc || pDoc != pTargetPage->GetDocument()) { - return false; - } - - RetainPtr pSourceKids = - pSourceFieldDict->GetMutableArrayFor("Kids"); - RetainPtr pTargetKids = - pTargetFieldDict->GetOrCreateArrayFor("Kids"); - if (!pSourceKids || !pTargetKids) { - return false; - } - - for (size_t i = 0; i < pSourceKids->size(); ++i) { - RetainPtr pKidDict = pSourceKids->GetMutableDictAt(i); - if (!pKidDict) { - continue; - } - - pKidDict->SetNewFor("Parent", pDoc, - pTargetFieldDict->GetObjNum()); - - if (!ArrayContainsDictWithObjNum(pTargetKids.Get(), - pKidDict->GetObjNum())) { - pTargetKids->AppendNew(pDoc, pKidDict->GetObjNum()); - } - } - - pSourceFieldDict->RemoveFor("Kids"); - - RetainPtr pRoot = pDoc->GetMutableRoot(); - if (pRoot) { - RetainPtr pAcroForm = pRoot->GetMutableDictFor("AcroForm"); - if (pAcroForm) { - RetainPtr pFields = pAcroForm->GetMutableArrayFor("Fields"); - if (pFields) { - RemoveDictWithObjNumFromArray(pFields.Get(), - pSourceFieldDict->GetObjNum()); - } - } - } - - CPDF_InteractiveForm* pPDFForm = pSDKForm->GetInteractiveForm(); - if (CPDF_Page* pSourcePdfPage = ToPDFPage(pSourcePage)) { - pPDFForm->FixPageFields(pSourcePdfPage); - } - if (pTargetPage != pSourcePage) { - if (CPDF_Page* pTargetPdfPage = ToPDFPage(pTargetPage)) { - pPDFForm->FixPageFields(pTargetPdfPage); - } - } - - return true; -} - FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetCalloutLineCount(FPDF_ANNOTATION annot) { if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FREETEXT) { @@ -5571,34 +5230,6 @@ EPDFAnnot_SetCalloutLine(FPDF_ANNOTATION annot, return true; } -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldOptions(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - const FPDF_WIDESTRING* labels, - int count) { - if (count < 0 || (count > 0 && !labels)) { - return false; - } - - CPDF_FormField* pFormField = GetFormField(handle, annot); - if (!pFormField) { - return false; - } - - RetainPtr pFieldDict = pdfium::WrapRetain( - const_cast(pFormField->GetFieldDict().Get())); - if (!pFieldDict) { - return false; - } - - RetainPtr pOpt = pFieldDict->SetNewFor("Opt"); - for (int i = 0; i < count; i++) { - WideString ws_label = WideStringFromFPDFWideString(labels[i]); - pOpt->AppendNew(ws_label.AsStringView()); - } - return true; -} - FPDF_EXPORT unsigned int FPDF_CALLCONV EPDFAnnot_GetObjectNumber(FPDF_ANNOTATION annot) { CPDF_AnnotContext* pCtx = CPDFAnnotContextFromFPDFAnnotation(annot); diff --git a/public/epdf_form.h b/public/epdf_form.h new file mode 100644 index 0000000000..5beca4af93 --- /dev/null +++ b/public/epdf_form.h @@ -0,0 +1,636 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PUBLIC_EPDF_FORM_H_ +#define PUBLIC_EPDF_FORM_H_ + +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Experimental EmbedPDF Extension API. +// +// Session-free AcroForm model API. +// +// EPDFForm_LoadModel() builds an immutable, detached snapshot of the +// document's interactive form: the /AcroForm field tree, reconciled with a +// sweep over every page's /Annots array so that widget annotations that were +// never linked into /AcroForm /Fields (a common producer bug) still appear +// as fields. The sweep walks page-tree dictionaries only; it never loads +// pages and never parses content streams. +// +// The snapshot is a pure read: it NEVER mutates the document, so it is safe +// to build over a frozen shared base document or a layer document without +// promoting a single object. +// +// All strings are copied into the snapshot at build time. The model stays +// valid after the document is closed, and is invalidated (in the sense of +// becoming stale, not dangling) by any document mutation - callers should +// rebuild after a mutation. Free with EPDFForm_CloseModel(). +typedef struct epdf_form_model_t__* EPDF_FORM_MODEL; + +// Document form kind, as declared by the document catalog. +// Note that a document with no /AcroForm dictionary can still yield +// recovered fields from the page sweep; kind reports what the catalog +// declares, not whether fields exist. +#define EPDF_FORMKIND_NONE 0 +#define EPDF_FORMKIND_ACROFORM 1 +// /AcroForm has an /XFA entry. Fields describe the AcroForm shell only. +#define EPDF_FORMKIND_XFA 2 + +// Field families. Text-family subtleties (password, file-select, rich text, +// multiline, comb) are expressed through the /Ff flags, not extra families. +#define EPDF_FORMFIELD_FAMILY_UNKNOWN 0 +#define EPDF_FORMFIELD_FAMILY_PUSHBUTTON 1 +#define EPDF_FORMFIELD_FAMILY_CHECKBOX 2 +#define EPDF_FORMFIELD_FAMILY_RADIO 3 +#define EPDF_FORMFIELD_FAMILY_TEXT 4 +#define EPDF_FORMFIELD_FAMILY_COMBOBOX 5 +#define EPDF_FORMFIELD_FAMILY_LISTBOX 6 +#define EPDF_FORMFIELD_FAMILY_SIGNATURE 7 + +// Field provenance. +// kAcroForm: reachable from the /AcroForm /Fields tree. +// kRecovered: only reachable through a page's /Annots array; the document +// needs repair for other processors to see this field. +#define EPDF_FORMFIELD_ORIGIN_ACROFORM 0 +#define EPDF_FORMFIELD_ORIGIN_RECOVERED 1 + +// Experimental EmbedPDF Extension API. +// Build a form model snapshot for |document|. +// +// Returns a model handle, or NULL if |document| is NULL or the build failed. +// Documents without any form yield a valid empty model with kind +// EPDF_FORMKIND_NONE. +FPDF_EXPORT EPDF_FORM_MODEL FPDF_CALLCONV +EPDFForm_LoadModel(FPDF_DOCUMENT document); + +// Experimental EmbedPDF Extension API. +// Release a model returned by EPDFForm_LoadModel(). +FPDF_EXPORT void FPDF_CALLCONV EPDFForm_CloseModel(EPDF_FORM_MODEL model); + +// Experimental EmbedPDF Extension API. +// Return the document's declared form kind (EPDF_FORMKIND_*). +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFormKind(EPDF_FORM_MODEL model); + +// Experimental EmbedPDF Extension API. +// Return whether the /AcroForm dictionary sets /NeedAppearances. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_GetNeedAppearances(EPDF_FORM_MODEL model); + +// Experimental EmbedPDF Extension API. +// Return the number of terminal fields in the model. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFields(EPDF_FORM_MODEL model); + +// Experimental EmbedPDF Extension API. +// Return the indirect object number of the field dictionary, or 0 when the +// field dictionary is a direct object (spec-violating; identity is weak). +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldObjNum(EPDF_FORM_MODEL model, int field_index); + +// Experimental EmbedPDF Extension API. +// Return the field family (EPDF_FORMFIELD_FAMILY_*), or UNKNOWN when +// |field_index| is out of range. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldFamily(EPDF_FORM_MODEL model, + int field_index); + +// Experimental EmbedPDF Extension API. +// Return the effective /Ff flags (inheritance resolved), or 0 on error. +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, int field_index); + +// Experimental EmbedPDF Extension API. +// Return the field provenance (EPDF_FORMFIELD_ORIGIN_*), or -1 on error. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldOrigin(EPDF_FORM_MODEL model, + int field_index); + +// Experimental EmbedPDF Extension API. +// Copy the fully qualified field name ("parent.child") into |buffer| as +// UTF-16LE, including the trailing NUL. Returns the byte length of the +// string, or 0 on error. |buffer| may be NULL to query the length. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy the field's alternate name (/TU, the tooltip) into |buffer| as +// UTF-16LE. Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldAlternateName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy the field's mapping name (/TM, the export name) into |buffer| as +// UTF-16LE. Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldMappingName(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy the field's current value into |buffer| as UTF-16LE. For checkbox +// and radio fields this is the checked export/state value ("Off" when +// nothing is checked). Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldValue(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy the field's default value (/DV, inheritance resolved) into |buffer| +// as UTF-16LE. Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldDefaultValue(EPDF_FORM_MODEL model, + int field_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Return /MaxLen for text fields, or 0 when absent or not applicable. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldMaxLen(EPDF_FORM_MODEL model, + int field_index); + +// Experimental EmbedPDF Extension API. +// Return the number of /Opt options for choice fields, 0 otherwise. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, int field_index); + +// Experimental EmbedPDF Extension API. +// Copy a choice option's display label into |buffer| as UTF-16LE. +// Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldOptionLabel(EPDF_FORM_MODEL model, + int field_index, + int option_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy a choice option's export value into |buffer| as UTF-16LE. +// Same conventions as EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldOptionValue(EPDF_FORM_MODEL model, + int field_index, + int option_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Return whether a choice option is currently selected. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_IsFieldOptionSelected(EPDF_FORM_MODEL model, + int field_index, + int option_index); + +// Experimental EmbedPDF Extension API. +// Return the number of widget annotations bound to the field. A merged +// field/widget dictionary counts as one widget whose object number equals +// the field's. Zero widgets means the field is unplaced. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, int field_index); + +// Experimental EmbedPDF Extension API. +// Return the widget annotation's indirect object number, or 0 for direct +// (spec-violating) widget dictionaries. +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldWidgetObjNum(EPDF_FORM_MODEL model, + int field_index, + int widget_index); + +// Experimental EmbedPDF Extension API. +// Return the object number of the page whose /Annots array references the +// widget (resolved during the sweep, falling back to the widget's /P +// entry), or 0 when the widget is not reachable from any page. +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_GetFieldWidgetPageObjNum(EPDF_FORM_MODEL model, + int field_index, + int widget_index); + +// Experimental EmbedPDF Extension API. +// Copy the widget's on-state name (the non-"Off" key of its /AP /N +// dictionary) into |buffer| as raw PDF name bytes, including the trailing +// NUL. Only meaningful for checkbox and radio widgets; empty otherwise. +// Returns the byte length of the string, or 0 on error. |buffer| may be +// NULL to query the length. The returned bytes are an opaque token for use +// with future toggle APIs. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldWidgetOnState(EPDF_FORM_MODEL model, + int field_index, + int widget_index, + void* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Copy the widget's export value (/Opt entry for its control index when +// present, else the on-state name) into |buffer| as UTF-16LE. Only +// meaningful for checkbox and radio widgets. Same conventions as +// EPDFForm_GetFieldName(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldWidgetExportValue(EPDF_FORM_MODEL model, + int field_index, + int widget_index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Return whether a checkbox/radio widget is currently checked +// (its /AS equals its on-state). +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_IsFieldWidgetChecked(EPDF_FORM_MODEL model, + int field_index, + int widget_index); + +// Experimental EmbedPDF Extension API. +// Return the index of the field whose dictionary has the given indirect +// object number, or -1 when unknown. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldIndexByObjNum(EPDF_FORM_MODEL model, uint32_t field_objnum); + +// --------------------------------------------------------------------------- +// Write transactions. +// +// All write APIs below are stateless, field-local transactions keyed by the +// field dictionary's indirect object number (from EPDFForm_GetFieldObjNum). +// They take the DOCUMENT, not a model: models are immutable snapshots and +// become stale after any successful write - rebuild with EPDFForm_LoadModel. +// +// Transactions validate first and mutate second: on FALSE the document is +// untouched (on a layer document: zero objects promoted). On success, only +// the objects that actually change are written (on a layer document: only +// those promote), which keeps layer deltas minimal. +// +// /Ff ReadOnly (bit 1) is deliberately NOT enforced here: the PDF spec +// forbids USER modification of read-only fields, not programmatic writes +// (calculated fields are read-only yet script-written). Enforcing fill +// policy is the caller's responsibility. +// +// Changed-widget reporting (uniform across all write APIs): +// changed_widget_objnums - optional caller buffer receiving the object +// numbers of widget annotations whose appearance +// changed (may span multiple pages). May be NULL. +// buffer_size - capacity of |changed_widget_objnums| in +// elements. +// out_changed_count - optional; receives the TOTAL number of changed +// widgets, which may exceed |buffer_size|. +// Widgets stored as direct objects (no object +// number) are counted but not reported. +// --------------------------------------------------------------------------- + +// Experimental EmbedPDF Extension API. +// Set the value of a checkbox or radio field. +// +// |on_state| is the target widget appearance state, exactly as returned by +// EPDFForm_GetFieldWidgetOnState(), and selects WHICH widget of the group +// is checked. NULL clears the group (rejected for radio fields with +// NoToggleToOff). Every sibling widget's /AS is updated (checkboxes and +// in-unison radios check all widgets sharing the target's export value and +// on-state) and the field's /V is set to the export value name, or to the +// control index for fields carrying /Opt, matching Acrobat conventions. +// +// No appearance streams are regenerated: toggle widgets carry one appearance +// per state, so flipping /AS IS the visual change. +// +// Fails when |field_objnum| is not a checkbox/radio terminal field or +// |on_state| matches no widget. Returns TRUE with zero changes when the +// field is already in the requested state. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetToggle(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_BYTESTRING on_state, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + +// Experimental EmbedPDF Extension API. +// Set the value of a text field. +// +// Writes /V, drops any stale rich-text /RV, and regenerates the /AP stream +// of every widget of the field. Fails when |field_objnum| is not a text +// terminal field, or when the value exceeds the field's effective /MaxLen. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetTextValue(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + +// Experimental EmbedPDF Extension API. +// Set the selection of a combo box or list box field. +// +// |values| holds |value_count| option export values. Zero values clears the +// selection. Multiple values require a multi-select list box. For combo +// boxes with the Edit flag a single non-option value is accepted as free +// text; otherwise every value must match an option's export value. +// +// Writes /V (string, or array for multiple values ordered by option index), +// keeps /I in sync (sorted ascending; removed when free text is set), and +// regenerates every widget's /AP stream. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetChoiceValues(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* values, + unsigned long value_count, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + +// Experimental EmbedPDF Extension API. +// Reset a field to its default value. +// +// Restores /V from the effective /DV (removing /V when no default exists), +// clears stale /RV and /I, updates toggle widget /AS states, and +// regenerates /AP streams for text and choice widgets. Fails for push +// buttons and signature fields. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ResetField(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + +// --------------------------------------------------------------------------- +// Form data interchange (FDF / XFDF). +// +// Exports read through the same reconciled view as EPDFForm_LoadModel, so +// recovered fields (origin kRecovered) are included, and on layer documents +// promoted values win. Imports replay each entry through the typed write +// transactions above, so validation, appearance regeneration, and minimal +// layer promotion apply per field; one bad entry never poisons the rest. +// --------------------------------------------------------------------------- + +// Omit required fields whose value is empty (Acrobat's form-submission +// behavior). Off by default: interchange exports are faithful. +#define EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED 0x1 + +// Experimental EmbedPDF Extension API. +// Serialize the document's form data as FDF. +// +// pdf_path - optional /F filespec recorded in the FDF; NULL to omit. +// export_flags - EPDF_FORM_EXPORT_* bits. +// +// Returns the byte length of the FDF payload, or 0 on error. When |buffer| +// is non-NULL and |buflen| is large enough, the payload is copied into it. +// Call with a NULL buffer first to query the size. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_ExportFDF(FPDF_DOCUMENT document, + FPDF_WIDESTRING pdf_path, + uint32_t export_flags, + void* buffer, + unsigned long buflen); + +// Experimental EmbedPDF Extension API. +// Serialize the document's form data as XFDF (UTF-8 XML, form data only - +// no annotations). Field names nest per fully-qualified-name component. +// Same conventions as EPDFForm_ExportFDF. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_ExportXFDF(FPDF_DOCUMENT document, + FPDF_WIDESTRING pdf_path, + uint32_t export_flags, + void* buffer, + unsigned long buflen); + +// Per-import accounting. A field entry is "applied" when its value was +// written (including no-op writes of an unchanged value) and "skipped" when +// the name is unknown, the field family cannot take the value, or the value +// failed validation (unknown toggle state, MaxLen, non-option choice, ...). +typedef struct { + uint32_t fields_total; + uint32_t fields_applied; + uint32_t fields_skipped; + uint32_t widgets_changed; +} EPDF_FORM_IMPORT_RESULT; + +// Experimental EmbedPDF Extension API. +// Apply form data from an FDF payload to the document. +// +// Accepts both flat entries with dotted /T names and hierarchical /Kids +// trees. Returns TRUE when the FDF parsed, regardless of per-field skips +// (see |out_result|); FALSE when the payload is not FDF. On a layer +// document only the fields that actually change promote. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ImportFDF(FPDF_DOCUMENT document, + const void* data, + unsigned long size, + EPDF_FORM_IMPORT_RESULT* out_result); + +// Experimental EmbedPDF Extension API. +// Apply form data from an XFDF payload to the document. Accepts nested +// elements and dotted name attributes; multiple elements +// select multiple options of a multi-select list box. Same conventions as +// EPDFForm_ImportFDF. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_ImportXFDF(FPDF_DOCUMENT document, + const void* data, + unsigned long size, + EPDF_FORM_IMPORT_RESULT* out_result); + +// --------------------------------------------------------------------------- +// Repair ("form doctor"). +// +// EPDFForm_LoadModel() reconciles broken documents in memory on every load; +// EPDFForm_Repair() makes those fixes durable in the document so any other +// PDF processor sees the same form. Validate-then-apply: the document is +// only touched when there is something to fix, so on a layer document a +// no-op repair promotes nothing and a real repair promotes only the +// structural containers it edits. Idempotent: a second call reports zero +// fixes. +// --------------------------------------------------------------------------- + +// Also regenerate widget appearance streams: widgets with no /AP get one, +// and when the /AcroForm sets /NeedAppearances every widget is re-baked and +// the flag is cleared, making rendering deterministic across viewers. +#define EPDF_FORM_REPAIR_BAKE_APPEARANCES 0x1 + +typedef struct { + // 1 when a missing /AcroForm dictionary was created (with /DR + /DA). + uint32_t acroform_created; + // Recovered field roots appended to /AcroForm /Fields. + uint32_t fields_linked; + // Stray widgets appended to their parent field's /Kids (only when the + // widget's /Parent already references that field). + uint32_t widgets_linked; + // Recovered fields stored as direct objects: they cannot be referenced + // from /Fields and stay reconciled-in-memory only. + uint32_t fields_unrepairable; + // Widgets whose appearance stream was (re)generated. + uint32_t appearances_baked; + // 1 when /NeedAppearances was cleared after re-baking. + uint32_t need_appearances_cleared; +} EPDF_FORM_REPAIR_REPORT; + +// Experimental EmbedPDF Extension API. +// Repair the document's form structure. |repair_flags| is a bitset of +// EPDF_FORM_REPAIR_* values. Returns TRUE when the repair pass ran (even +// with zero fixes); FALSE on error. |out_report| may be NULL. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_Repair(FPDF_DOCUMENT document, + uint32_t repair_flags, + EPDF_FORM_REPAIR_REPORT* out_report); + +// --------------------------------------------------------------------------- +// Authoring: field lifecycle and adoption. +// +// Widgets are born, styled, moved, and deleted through the ANNOTATION APIs +// (FPDFPage_CreateAnnot with the Widget subtype, EPDFAnnot_SetMKColor, +// EPDFAnnot_SetBorderStyle, EPDFAnnot_SetDefaultAppearance, ...). The forms +// API below only does the field-tree side: create a logical (unplaced) +// field, ADOPT an existing widget annotation as one of its views, detach +// it again, and configure field-plane properties. An unattached widget is +// an ordinary, inert annotation - adoption is what turns it into a form +// control (and what bakes its family-correct appearance stream). +// +// All operations are validate-then-apply: a FALSE/0 return leaves the +// document untouched (on layer documents: zero objects promoted). +// --------------------------------------------------------------------------- + +// Experimental EmbedPDF Extension API. +// Create a logical form field with no widgets ("unplaced"). +// +// family - EPDF_FORMFIELD_FAMILY_TEXT / CHECKBOX / RADIO / COMBOBOX / +// LISTBOX. Push buttons, signatures, and unknown are not +// authorable. +// full_name - dotted fully qualified name ("billing.name"). Missing +// non-terminal ancestors are created; a sibling name +// collision at any level fails. +// +// Bootstraps /AcroForm (with /DR and /DA) when the document has none. +// Returns the new field dictionary's object number, or 0 on failure. +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFForm_CreateField(FPDF_DOCUMENT document, + int family, + FPDF_WIDESTRING full_name); + +// Experimental EmbedPDF Extension API. +// Adopt an existing widget annotation as a view of |field_objnum|. +// +// The widget must be an unattached widget annotation (no /Parent, not a +// merged field). For checkbox/radio fields |on_state| names the widget's +// checked appearance state and must be non-empty; for other families pass +// NULL. Adoption wires /Parent + /Kids, seeds toggle /AP states and /AS, +// and bakes the family-correct appearance stream. Adopting into a legacy +// MERGED field first splits it (the field keeps its object number; the +// previously merged widget becomes a new kid annotation - widget identity +// changes, field identity never does). +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_AttachWidget(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t widget_objnum, + FPDF_BYTESTRING on_state); + +// Experimental EmbedPDF Extension API. +// Detach a widget from its field. The widget keeps its page placement and +// last appearance but becomes an ordinary inert annotation (deletable via +// the annotation APIs). The field survives, "unplaced" when this was its +// last widget. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_DetachWidget(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t widget_objnum); + +// Experimental EmbedPDF Extension API. +// Delete a terminal field: detaches every widget (reported through the +// caller buffer so they can be deleted as annotations), removes the field +// from the tree, and prunes non-terminal ancestors left empty. Fails for +// non-terminal fields (nodes with child FIELDS). +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_DeleteField(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t* out_detached_widgets, + unsigned long buffer_size, + unsigned long* out_detached_count); + +// --------------------------------------------------------------------------- +// Authoring: field-plane property setters. Each is an independent +// validate-then-apply transaction; the TypeScript layer composes them into +// one updateField() call. +// --------------------------------------------------------------------------- + +// Experimental EmbedPDF Extension API. +// Rename the field's own /T segment (NOT the dotted path - reparenting is +// not supported). Fails when a sibling under the same parent already +// carries that name, or when |partial_name| is empty or contains '.'. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING partial_name); + +// Experimental EmbedPDF Extension API. +// Masked /Ff update: bits in |set_bits| are set, bits in |clear_bits| are +// cleared. Family-DEFINING bits (Radio, Pushbutton, Combo) are immutable - +// touching them fails. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldFlags(FPDF_DOCUMENT document, + uint32_t field_objnum, + uint32_t set_bits, + uint32_t clear_bits); + +// Experimental EmbedPDF Extension API. +// Set /MaxLen on a text field. 0 clears the limit. Fails when the current +// value is already longer than the new limit. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, + uint32_t field_objnum, + int max_len); + +// Experimental EmbedPDF Extension API. +// Set /DV (restored by EPDFForm_ResetField) on a text or choice field. +// An empty string clears it. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDefaultValue(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value); + +// Experimental EmbedPDF Extension API. +// Set /TU (the accessible tooltip). An empty string clears it. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldAlternateName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value); + +// Experimental EmbedPDF Extension API. +// Set /TM (the export mapping name). An empty string clears it. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldMappingName(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING value); + +// Experimental EmbedPDF Extension API. +// Replace a choice field's /Opt with |count| options. Entries where label +// equals export are written as plain strings, otherwise as [export label] +// pairs. The current selection is re-synced: selected exports that vanish +// are dropped, /V and /I are rewritten consistently, and widget appearance +// streams are regenerated. |count| of 0 removes /Opt (an edit combo's free +// text value survives; other selections clear). +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* labels, + const FPDF_WIDESTRING* exports, + unsigned long count); + +// Experimental EmbedPDF Extension API. +// Return the index of the field owning the widget annotation with the given +// indirect object number, or -1 when the object is not a known widget. This +// is the join key for decorating widget annotations in page annotation +// listings with their logical field. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldIndexForWidget(EPDF_FORM_MODEL model, uint32_t widget_objnum); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_EPDF_FORM_H_ diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 43ab5fa281..1d3cfa57f4 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -2063,103 +2063,6 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetMKColor(FPDF_ANNOTATION annot, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ClearMKColor(FPDF_ANNOTATION annot, EPDF_MK_COLORTYPE type); -// Experimental EmbedPDF Extension API. -// Create a form field widget annotation on a page. This is the form-field -// counterpart of FPDFPage_CreateAnnot -- it creates the /Widget annotation, -// a parent field dictionary with /FT and base /Ff, wires /Parent//Kids, -// registers the field in /AcroForm/Fields, and notifies the interactive form -// model so that subsequent FPDFAnnot_SetFormFieldFlags etc. calls work. -// -// page - handle to the page. -// handle - handle to the form fill module -// (FPDFDOC_InitFormFillEnvironment). field_type - one of -// FPDF_FORMFIELD_TEXTFIELD, FPDF_FORMFIELD_CHECKBOX, -// FPDF_FORMFIELD_RADIOBUTTON, FPDF_FORMFIELD_COMBOBOX, -// FPDF_FORMFIELD_LISTBOX, FPDF_FORMFIELD_PUSHBUTTON. -// field_name - the partial field name (/T). May be NULL for unnamed fields. -// -// Returns a handle to the new annotation, or NULL on failure. -// Caller must call FPDFPage_CloseAnnot() when done. -FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV -EPDFPage_CreateFormField(FPDF_PAGE page, - FPDF_FORMHANDLE handle, - int field_type, - FPDF_WIDESTRING field_name); - -// Experimental EmbedPDF Extension API. -// Set the value (/V) of a form field associated with a widget annotation. -// -// handle - handle to the form fill module (FPDFDOC_InitFormFillEnvironment). -// annot - handle to a widget annotation. -// value - the new value as a UTF-16LE string. -// -// Returns true on success, false if the annotation is not a form field -// or the value could not be set. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldValue(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - FPDF_WIDESTRING value); - -// Experimental EmbedPDF Extension API. -// Set the partial field name (/T) of a form field associated with a widget -// annotation. -// -// handle - handle to the form fill module (FPDFDOC_InitFormFillEnvironment). -// annot - handle to a widget annotation. -// name - the new partial field name as a UTF-16LE string. -// -// Returns true on success, false if the annotation is not a form field. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldName(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - FPDF_WIDESTRING name); - -// Experimental EmbedPDF Extension API. -// Returns the object number of the logical form field dictionary associated -// with a widget annotation. -// -// handle - handle to the form fill module (FPDFDOC_InitFormFillEnvironment). -// annot - handle to a widget annotation. -// -// Returns the field dictionary object number on success, or 0 if the -// annotation is not a form field or has no indirect field dictionary. -FPDF_EXPORT int FPDF_CALLCONV -EPDFAnnot_GetFormFieldObjectNumber(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot); - -// Experimental EmbedPDF Extension API. -// Re-parent the source widget field into the target widget field so both -// widgets share the same logical AcroForm field. -// -// handle - handle to the form fill module -// (FPDFDOC_InitFormFillEnvironment). source_annot - handle to the widget -// annotation whose field should be merged. target_annot - handle to the -// widget annotation whose field should be reused. -// -// Returns true on success, false if the annotations are not compatible form -// fields or the share operation could not be completed. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ShareFormField(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION source_annot, - FPDF_ANNOTATION target_annot); - -// Experimental EmbedPDF Extension API. -// Set the options (/Opt array) for a Choice form field (ComboBox or ListBox). -// Replaces any existing options with the provided labels. -// -// handle - handle to the form fill environment. -// annot - handle to a widget annotation backed by a Choice field. -// labels - array of |count| UTF-16LE option label strings. -// count - number of entries in |labels|. Pass 0 to clear all options. -// -// Returns true on success, false if the annotation is not a form field -// or if |labels| is NULL when |count| > 0. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_SetFormFieldOptions(FPDF_FORMHANDLE handle, - FPDF_ANNOTATION annot, - const FPDF_WIDESTRING* labels, - int count); - // Experimental EmbedPDF Extension API. // Generate the appearance stream for a form field widget annotation. // The standard EPDFAnnot_GenerateAppearance does NOT handle Widget subtypes. @@ -2175,42 +2078,6 @@ EPDFAnnot_SetFormFieldOptions(FPDF_FORMHANDLE handle, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GenerateFormFieldAP(FPDF_ANNOTATION annot); -// Experimental EmbedPDF Extension API. -// Get the "export value" of a checkbox or radio button widget — the -// non-"Off" key in its /AP/N (Normal Appearance) dictionary. -// -// annot - handle to a widget annotation. -// buffer - buffer for holding the value string, encoded in UTF-16LE. -// buflen - length of the buffer in bytes. -// -// Returns the length of the string value in bytes (including the trailing -// NUL pair), or 0 when the annotation has no /AP/N dictionary or contains -// only an "Off" entry. -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFAnnot_GetButtonExportValue(FPDF_ANNOTATION annot, - FPDF_WCHAR* buffer, - unsigned long buflen); - -// Experimental EmbedPDF Extension API. -// Get the raw /V value of a form field without Opt-array translation. -// For checkbox/radio fields, FPDFAnnot_GetFormFieldValue translates /V -// through the Opt array; this function returns the raw Name/String instead. -// For other field types, behaves identically to FPDFAnnot_GetFormFieldValue. -// -// hHandle - handle to the form fill module, returned by -// FPDFDOC_InitFormFillEnvironment(). -// annot - handle to a widget annotation. -// buffer - buffer for holding the value string, encoded in UTF-16LE. -// buflen - length of the buffer in bytes. -// -// Returns the length of the string value in bytes (including the trailing -// NUL pair), or 0 on error. -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFAnnot_GetFormFieldRawValue(FPDF_FORMHANDLE hHandle, - FPDF_ANNOTATION annot, - FPDF_WCHAR* buffer, - unsigned long buflen); - // Experimental EmbedPDF Extension API. // Get the number of callout line points (/CL array) on a FreeText annotation. // diff --git a/testing/resources/orphan_widgets.in b/testing/resources/orphan_widgets.in new file mode 100644 index 0000000000..b256c9fcb2 --- /dev/null +++ b/testing/resources/orphan_widgets.in @@ -0,0 +1,107 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R + /AcroForm << + /Fields [4 0 R] + /DR << /Font << /F1 7 0 R >> >> + /DA (0 g /F1 12 Tf) + >> +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 300 300] + /Annots [4 0 R 5 0 R 8 0 R 9 0 R] +>> +endobj +% A merged text field that is properly linked into /AcroForm /Fields. +{{object 4 0}} << + /Type /Annot + /Subtype /Widget + /FT /Tx + /T (linked_text) + /V (hello) + /DA (0 g /F1 12 Tf) + /Rect [20 250 280 280] +>> +endobj +% A merged checkbox that only exists in the page's /Annots array. It is not +% referenced from /AcroForm /Fields: recovered by the reconciliation sweep. +{{object 5 0}} << + /Type /Annot + /Subtype /Widget + /FT /Btn + /T (orphan_check) + /V /Yes + /AS /Yes + /Rect [20 200 40 220] + /AP << /N << /Yes 10 0 R /Off 11 0 R >> >> +>> +endobj +% A radio group whose parent field dictionary is not in /AcroForm /Fields. +% Only its widget kids appear in /Annots; the sweep must climb /Parent and +% reconcile both widgets onto one logical field. +{{object 6 0}} << + /FT /Btn + /T (orphan_radio) + /Ff 32768 + /V /a + /Kids [8 0 R 9 0 R] +>> +endobj +{{object 7 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{object 8 0}} << + /Type /Annot + /Subtype /Widget + /Parent 6 0 R + /AS /a + /Rect [20 150 40 170] + /AP << /N << /a 10 0 R /Off 11 0 R >> >> +>> +endobj +{{object 9 0}} << + /Type /Annot + /Subtype /Widget + /Parent 6 0 R + /AS /Off + /Rect [60 150 80 170] + /AP << /N << /b 10 0 R /Off 11 0 R >> >> +>> +endobj +{{object 10 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{object 11 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/orphan_widgets.pdf b/testing/resources/orphan_widgets.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21aa272e4d7fa172cf95de0462638749956c1cc0 GIT binary patch literal 2079 zcmcgt+iu!G5PkPo%nNGzQ0z6~k~WG2Nl~j_pak`zD2mqh8a6RrcfBOgujxa-u<8eN zX6=~7kSbNBB5ds0+1)c|&m0=#li@Sg>^hC_KY#pk7|eAd&Sxpv^~-3 zeuTZbND^gVPIfWwPDE(n%=f@=|K{eTW3aS}nE-c#bKdy2hjkg0)?h0%<4{$&FMgevYCK8ieq5Z zP`6Uw$dS~cc_bCgv|46xGgmn=W`$TtC6Xak$n}~8gM<;Un~tj_(tr_hFOm2gs{^>A z7T{SXxGv^c)xNOwS-xPg%ngKzTm+T+c^cUhDcBVdC^Ih?%mG_h;Y|SAfDCz3sJZEM z?$J)-+alFgX-OT%(DJ*TULi%7({ItO53~@uMEy|7MQCEBeX=Oq_ye8`>oM*tkz5Od zIPbJ0ZBbwAPmNT10u@*|9qPa$u2jIVLr?{*yF&&1F&ZGt_*Y0MF=C?t)j>1}3cGeE zsNgZ6taj_DK97P+G=_V;lkHPrP#Gn;M#05fk_8Gc$E!HJI@5h+e+uDP% zE~=rH=eM`>_C5TUs^zuYTUb~JwNT|5&1E7q`jgd)LMySZWY1H66U2!% LPNVU1G<1Fg>8~ro literal 0 HcmV?d00001 diff --git a/testing/resources/toggle_fields.in b/testing/resources/toggle_fields.in new file mode 100644 index 0000000000..85a2d84e36 --- /dev/null +++ b/testing/resources/toggle_fields.in @@ -0,0 +1,162 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R + /AcroForm << + /Fields [4 0 R 5 0 R 8 0 R 12 0 R 16 0 R] + /DR << /Font << /F1 15 0 R >> >> + /DA (0 g /F1 12 Tf) + >> +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 300 300] + /Annots [4 0 R 6 0 R 7 0 R 9 0 R 10 0 R 11 0 R 12 0 R 17 0 R] +>> +endobj +% Text field with a length limit. +{{object 4 0}} << + /Type /Annot + /Subtype /Widget + /FT /Tx + /T (maxlen_text) + /V (abc) + /MaxLen 5 + /DA (0 g /F1 12 Tf) + /Rect [20 250 280 280] +>> +endobj +% Radio group with NoToggleToOff (Ff = radio 32768 + no-toggle-to-off 16384). +{{object 5 0}} << + /FT /Btn + /T (ntto_radio) + /Ff 49152 + /V /x + /DV /x + /Kids [6 0 R 7 0 R] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Widget + /Parent 5 0 R + /AS /x + /Rect [20 200 40 220] + /AP << /N << /x 13 0 R /Off 14 0 R >> >> +>> +endobj +{{object 7 0}} << + /Type /Annot + /Subtype /Widget + /Parent 5 0 R + /AS /Off + /Rect [60 200 80 220] + /AP << /N << /y 13 0 R /Off 14 0 R >> >> +>> +endobj +% Radio group in unison (Ff = radio 32768 + radios-in-unison 33554432). +% Two widgets share the on-state /u1 and must check together. +{{object 8 0}} << + /FT /Btn + /T (unison_radio) + /Ff 33587200 + /V /Off + /Kids [9 0 R 10 0 R 11 0 R] +>> +endobj +{{object 9 0}} << + /Type /Annot + /Subtype /Widget + /Parent 8 0 R + /AS /Off + /Rect [20 150 40 170] + /AP << /N << /u1 13 0 R /Off 14 0 R >> >> +>> +endobj +{{object 10 0}} << + /Type /Annot + /Subtype /Widget + /Parent 8 0 R + /AS /Off + /Rect [60 150 80 170] + /AP << /N << /u1 13 0 R /Off 14 0 R >> >> +>> +endobj +{{object 11 0}} << + /Type /Annot + /Subtype /Widget + /Parent 8 0 R + /AS /Off + /Rect [100 150 120 170] + /AP << /N << /u2 13 0 R /Off 14 0 R >> >> +>> +endobj +% Merged checkbox carrying /Opt: checking it must set /V to the control +% index name ("0"), while its export value reads as "Alpha". +{{object 12 0}} << + /Type /Annot + /Subtype /Widget + /FT /Btn + /T (opt_check) + /Opt [(Alpha)] + /V /Off + /AS /Off + /Rect [20 100 40 120] + /AP << /N << /On 13 0 R /Off 14 0 R >> >> +>> +endobj +{{object 13 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{object 14 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{object 15 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +% Hierarchical field: non-terminal parent "billing" with a merged +% field/widget kid "name" - fully qualified name "billing.name". +{{object 16 0}} << + /FT /Tx + /T (billing) + /Kids [17 0 R] +>> +endobj +{{object 17 0}} << + /Type /Annot + /Subtype /Widget + /T (name) + /Parent 16 0 R + /DA (0 g /F1 12 Tf) + /Rect [20 40 280 70] +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/toggle_fields.pdf b/testing/resources/toggle_fields.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c7c103bd11d68fcd6bdf70d68aae2f38a7863b8a GIT binary patch literal 3130 zcmcguZI9YU5dQ98F+xJ()B;``^Ae>e-Q|iRwU@hcD6MpgP75rsiPYo@*%&l z>JRA5tPe2Ilqyvb7<)XsJ1@`7Gu7LxeqA&=LG|+=U;YdPgkVSS;pNK!pgDY6Drmlv zPNsH7f?GLLIYg*5pvQ}GX8SfTfFvhx#=j-5wmCL1ApZg_<0V`Sx0_e^v$(5?>vQd2^t~4(_86q6B|k{*`SX$ceTv z%j|0Djelc@b~a1Z(B4d^Q0q_O2gq0{jymlwdRUJxB)-)o+@7rSMzzrzG>Y)O-{r8rKKRx6G$sR-{!i_jo&=8(^^yui&BSX0lPbl7ZG0;HM1 zVwF1>&(-(?AUqW6WQ~A2$u=})NcgkLpumH>9rV4xMG+Mbh$B_G3k-U_J?dm&aIbp? zMkxzeHUi5Ap&>d)pn-0mfDLXU|EXCB4l)bD@hxT@V~rEa=jLekT6k)5)M6JQdg@Rfo ztekxhk8_!bUBxmM!>!P-z2RJY`b(1TnOCi&}z7^ z@z!VDV6e>m?+b<~VvI?@>6;^b&=aT--YQUs z=_*a1;NwcB8kHs zw-48L+8E0{y&hFUStdm9Ku^TspK*ut zbJ~G@QPSDj&t($3SccOH^b> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 300 300] + /Annots [4 0 R 6 0 R 7 0 R] +>> +endobj +{{object 4 0}} << + /Type /Annot + /Subtype /Widget + /FT /Tx + /T (orphan_text) + /V (hi) + /Rect [20 250 280 280] +>> +endobj +% Radio parent: /Kids lists only widget 6; widget 7 references it via +% /Parent but is only reachable through the page's /Annots. +{{object 5 0}} << + /FT /Btn + /T (gap_radio) + /Ff 32768 + /V /Off + /Kids [6 0 R] +>> +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Widget + /Parent 5 0 R + /AS /Off + /Rect [20 200 40 220] + /AP << /N << /a 8 0 R /Off 9 0 R >> >> +>> +endobj +{{object 7 0}} << + /Type /Annot + /Subtype /Widget + /Parent 5 0 R + /AS /Off + /Rect [60 200 80 220] + /AP << /N << /b 8 0 R /Off 9 0 R >> >> +>> +endobj +{{object 8 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{object 9 0}} << + /Type /XObject + /Subtype /Form + /BBox [0 0 20 20] + {{streamlen}} +>> +stream +q Q +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/widgets_no_acroform.pdf b/testing/resources/widgets_no_acroform.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a120897c452d004def2bdd774ee15389cad1c42 GIT binary patch literal 1594 zcmcgs+iuf95PkPo%u7U(N_ z(a7ROjEgP$ZU>o_6mlllh{z?AFu>BM=9>=E)UG~5YN z5b|&6Alac>OsL{4%2=3l&>2cA&G5}pI4LLD)U0%^{%^nu)~PNUTq!GWj5ZCHNdmqX z42CsAdzvI<)uS`4?gJyo-|*S=PuB4&Tub4fTcV!ZEq$7Xx2PH-VW&IV$K*KO37jNV({RCy z6i*+Ykm8Q!Y-N3c_p}3>uVyb2DgUe11~qCq;5wGGyI|1o`+Z1Y>+||JZMvY?`FsZ{ zY5M{^ds@C;@N`|^;e=c3hAwXGmhWirB%kX(t?PO&ig+7~N2SQQYL34do}NG_qS5MH XeC34I41g(Z(7V3ZvpSvg>BRa4)}^oS literal 0 HcmV?d00001 From 81e071e21d1a86189d98dc6924f1d271d73300cb Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Tue, 14 Jul 2026 19:47:55 +0300 Subject: [PATCH 46/56] Add EPDF PieceInfo APIs and tests Introduce EmbedPDF PieceInfo support: add public header and full implementation for namespace-scoped document/page PieceInfo metadata (typed values, last-modified timestamps, arrays, clear operations, and page/document variants). Add embedder tests covering save/reload and layer/delta flows. Update BUILD.gn and fpdfsdk/BUILD.gn to expose the new header and include the new sources, and switch component("pdfium") to shared_library("pdfium") while adding resources.rc to its sources. --- fpdfsdk/BUILD.gn | 4 + fpdfsdk/epdf_pieceinfo.cpp | 1106 +++++++++++++++++++++++ fpdfsdk/epdf_pieceinfo_embeddertest.cpp | 555 ++++++++++++ public/epdf_pieceinfo.h | 352 ++++++++ 4 files changed, 2017 insertions(+) create mode 100644 fpdfsdk/epdf_pieceinfo.cpp create mode 100644 fpdfsdk/epdf_pieceinfo_embeddertest.cpp create mode 100644 public/epdf_pieceinfo.h diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 9e7a92fb62..03261d121d 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -14,6 +14,8 @@ source_set("fpdfsdk") { "epdf_form.cpp", "epdf_layer.cpp", "epdf_outline.cpp", + # EmbedPDF: generic namespace-scoped document/page /PieceInfo metadata. + "epdf_pieceinfo.cpp", "epdf_page_content_helpers.cpp", "epdf_page_content_helpers.h", "epdf_png_shim.cpp", @@ -143,6 +145,8 @@ pdfium_embeddertest_source_set("embeddertests") { "cpdfsdk_baannot_embeddertest.cpp", # EmbedPDF: covers the EPDFForm_* session-free form APIs. "epdf_form_embeddertest.cpp", + # EmbedPDF: covers generic document/page /PieceInfo metadata APIs. + "epdf_pieceinfo_embeddertest.cpp", "fpdf_annot_embeddertest.cpp", "fpdf_attachment_embeddertest.cpp", "fpdf_catalog_embeddertest.cpp", diff --git a/fpdfsdk/epdf_pieceinfo.cpp b/fpdfsdk/epdf_pieceinfo.cpp new file mode 100644 index 0000000000..ad44d32950 --- /dev/null +++ b/fpdfsdk/epdf_pieceinfo.cpp @@ -0,0 +1,1106 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_pieceinfo.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/fx_string_wrappers.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace { + +constexpr char kPieceInfoKey[] = "PieceInfo"; +constexpr char kPrivateKey[] = "Private"; +constexpr char kLastModifiedKey[] = "LastModified"; +constexpr char kModDateKey[] = "ModDate"; + +const CPDF_Dictionary* GetDocumentCatalog(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? doc->GetRoot() : nullptr; +} + +RetainPtr GetMutableDocumentCatalog(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? doc->GetMutableRoot() : nullptr; +} + +RetainPtr GetDocumentInfo(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? doc->GetInfo() : nullptr; +} + +RetainPtr GetPageDictionaryByObjectNumber( + FPDF_DOCUMENT document, + unsigned int page_object_number) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || page_object_number == 0) { + return nullptr; + } + +#ifdef PDF_ENABLE_XFA + if (doc->GetExtension()) { + return nullptr; + } +#endif // PDF_ENABLE_XFA + + const int page_index = doc->GetPageIndex(page_object_number); + return page_index >= 0 ? doc->GetPageDictionary(page_index) : nullptr; +} + +RetainPtr GetMutablePageDictionaryByObjectNumber( + FPDF_DOCUMENT document, + unsigned int page_object_number) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || page_object_number == 0) { + return nullptr; + } + +#ifdef PDF_ENABLE_XFA + if (doc->GetExtension()) { + return nullptr; + } +#endif // PDF_ENABLE_XFA + + const int page_index = doc->GetPageIndex(page_object_number); + return page_index >= 0 ? doc->GetMutablePageDictionary(page_index) : nullptr; +} + +RetainPtr GetApplicationDictionary( + const CPDF_Dictionary* page, + FPDF_BYTESTRING application) { + if (!page || !application || !*application) { + return nullptr; + } + RetainPtr piece_info = page->GetDictFor(kPieceInfoKey); + return piece_info ? piece_info->GetDictFor(application) : nullptr; +} + +RetainPtr GetPrivateDictionary( + const CPDF_Dictionary* page, + FPDF_BYTESTRING application) { + RetainPtr app = + GetApplicationDictionary(page, application); + return app ? app->GetDictFor(kPrivateKey) : nullptr; +} + +RetainPtr GetPrivateObject(const CPDF_Dictionary* page, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key) { + if (!key || !*key) { + return nullptr; + } + RetainPtr private_dict = + GetPrivateDictionary(page, application); + return private_dict ? private_dict->GetDirectObjectFor(key) : nullptr; +} + +RetainPtr GetOrCreateDictionary(CPDF_Dictionary* parent, + ByteStringView key) { + if (!parent) { + return nullptr; + } + if (parent->KeyExist(key)) { + return parent->GetMutableDictFor(key); + } + return parent->SetNewFor(ByteString(key)); +} + +struct MutablePieceInfo { + RetainPtr holder; + RetainPtr application; + RetainPtr private_dict; +}; + +std::optional GetTimestamp(FPDF_WIDESTRING content_last_modified) { + if (!content_last_modified) { + return std::nullopt; + } + WideString timestamp = + UNSAFE_BUFFERS(WideStringFromFPDFWideString(content_last_modified)); + return timestamp.IsEmpty() ? std::nullopt + : std::optional(std::move(timestamp)); +} + +MutablePieceInfo GetOrCreateMutablePieceInfo( + FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_WIDESTRING content_last_modified) { + if (!application || !*application) { + return {}; + } + std::optional timestamp = GetTimestamp(content_last_modified); + if (!timestamp.has_value()) { + return {}; + } + + RetainPtr page = + GetMutablePageDictionaryByObjectNumber(document, page_object_number); + if (!page) { + return {}; + } + RetainPtr piece_info = + GetOrCreateDictionary(page.Get(), kPieceInfoKey); + if (!piece_info) { + return {}; + } + RetainPtr app = + GetOrCreateDictionary(piece_info.Get(), application); + if (!app) { + return {}; + } + RetainPtr private_dict = + GetOrCreateDictionary(app.Get(), kPrivateKey); + if (!private_dict) { + return {}; + } + + page->SetNewFor(kLastModifiedKey, timestamp->AsStringView()); + app->SetNewFor(kLastModifiedKey, timestamp->AsStringView()); + return {std::move(page), std::move(app), std::move(private_dict)}; +} + +MutablePieceInfo GetOrCreateMutableDocumentPieceInfo( + FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_WIDESTRING document_last_modified) { + if (!application || !*application) { + return {}; + } + std::optional timestamp = GetTimestamp(document_last_modified); + if (!timestamp.has_value()) { + return {}; + } + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return {}; + } + RetainPtr catalog = doc->GetMutableRoot(); + RetainPtr info = doc->GetOrCreateInfo(); + if (!catalog || !info) { + return {}; + } + RetainPtr piece_info = + GetOrCreateDictionary(catalog.Get(), kPieceInfoKey); + if (!piece_info) { + return {}; + } + RetainPtr app = + GetOrCreateDictionary(piece_info.Get(), application); + if (!app) { + return {}; + } + RetainPtr private_dict = + GetOrCreateDictionary(app.Get(), kPrivateKey); + if (!private_dict) { + return {}; + } + + info->SetNewFor(kModDateKey, timestamp->AsStringView()); + app->SetNewFor(kLastModifiedKey, timestamp->AsStringView()); + return {std::move(catalog), std::move(app), std::move(private_dict)}; +} + +unsigned long CopyWideString(const WideString& value, + FPDF_WCHAR* buffer, + unsigned long buflen) { + // SAFETY: required from caller. + return Utf16EncodeMaybeCopyAndReturnLength( + value, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +unsigned long CopyByteString(ByteStringView value, + char* buffer, + unsigned long buflen) { + // SAFETY: required from caller. + return NulTerminateMaybeCopyAndReturnLength( + ByteString(value), UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +} // namespace + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_HasPieceInfoEntry(FPDF_DOCUMENT document, FPDF_BYTESTRING application) { + return !!GetApplicationDictionary(GetDocumentCatalog(document), application); +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoEntryCount(FPDF_DOCUMENT document) { + const CPDF_Dictionary* catalog = GetDocumentCatalog(document); + RetainPtr piece_info = + catalog ? catalog->GetDictFor(kPieceInfoKey) : nullptr; + return piece_info ? static_cast(piece_info->size()) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoEntryAt(FPDF_DOCUMENT document, + int index, + char* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + const CPDF_Dictionary* catalog = GetDocumentCatalog(document); + RetainPtr piece_info = + catalog ? catalog->GetDictFor(kPieceInfoKey) : nullptr; + if (!piece_info || index >= static_cast(piece_info->size())) { + return 0; + } + + int current = 0; + CPDF_DictionaryLocker locker(piece_info); + for (const auto& item : locker) { + if (current++ == index) { + return CopyByteString(item.first.AsStringView(), buffer, buflen); + } + } + return 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetLastModified(FPDF_DOCUMENT document, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr info = GetDocumentInfo(document); + if (!info) { + return 0; + } + RetainPtr value = info->GetDirectObjectFor(kModDateKey); + return value && value->GetType() == CPDF_Object::Type::kString + ? CopyWideString(value->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoLastModified(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr app = + GetApplicationDictionary(GetDocumentCatalog(document), application); + if (!app) { + return 0; + } + RetainPtr value = + app->GetDirectObjectFor(kLastModifiedKey); + return value && value->GetType() == CPDF_Object::Type::kString + ? CopyWideString(value->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoKeyCount(FPDF_DOCUMENT document, + FPDF_BYTESTRING application) { + RetainPtr private_dict = + GetPrivateDictionary(GetDocumentCatalog(document), application); + return private_dict ? static_cast(private_dict->size()) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoKeyAt(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + int index, + char* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + RetainPtr private_dict = + GetPrivateDictionary(GetDocumentCatalog(document), application); + if (!private_dict || index >= static_cast(private_dict->size())) { + return 0; + } + + int current = 0; + CPDF_DictionaryLocker locker(private_dict); + for (const auto& item : locker) { + if (current++ == index) { + return CopyByteString(item.first.AsStringView(), buffer, buflen); + } + } + return 0; +} + +FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV +EPDFDoc_GetPieceInfoValueType(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key) { + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + return object ? static_cast(object->GetType()) + : FPDF_OBJECT_UNKNOWN; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoString(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key || !value) { + return false; + } + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor( + key, UNSAFE_BUFFERS(WideStringFromFPDFWideString(value).AsStringView())); + return true; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoString(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + return object && object->GetType() == CPDF_Object::Type::kString + ? CopyWideString(object->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoNumber(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float value, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key) { + return false; + } + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPieceInfoNumber(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float* value) { + if (!value) { + return false; + } + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + if (!object || object->GetType() != CPDF_Object::Type::kNumber) { + return false; + } + *value = object->GetNumber(); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoBoolean(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL value, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key) { + return false; + } + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, !!value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPieceInfoBoolean(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL* value) { + if (!value) { + return false; + } + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + if (!object || object->GetType() != CPDF_Object::Type::kBoolean) { + return false; + } + *value = object->GetInteger() != 0; + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoName(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BYTESTRING value, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key || !value || !*value) { + return false; + } + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, value); + return true; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoName(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + char* buffer, + unsigned long buflen) { + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + return object && object->GetType() == CPDF_Object::Type::kName + ? CopyByteString(object->GetString().AsStringView(), buffer, + buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoStringArray(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + const FPDF_WIDESTRING* values, + unsigned long value_count, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key || (value_count > 0 && !values)) { + return false; + } + for (unsigned long i = 0; i < value_count; ++i) { + if (!UNSAFE_BUFFERS(values[i])) { + return false; + } + } + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + + auto array = pdfium::MakeRetain(); + for (unsigned long i = 0; i < value_count; ++i) { + FPDF_WIDESTRING value = UNSAFE_BUFFERS(values[i]); + array->AppendNew( + UNSAFE_BUFFERS(WideStringFromFPDFWideString(value).AsStringView())); + } + target.private_dict->SetFor(key, std::move(array)); + return true; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoStringArrayCount(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key) { + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + RetainPtr array = ToArray(std::move(object)); + if (!array) { + return -1; + } + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr item = array->GetDirectObjectAt(i); + if (!item || item->GetType() != CPDF_Object::Type::kString) { + return -1; + } + } + return static_cast(array->size()); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoStringArrayAt(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + RetainPtr object = + GetPrivateObject(GetDocumentCatalog(document), application, key); + RetainPtr array = ToArray(std::move(object)); + if (!array || index >= static_cast(array->size())) { + return 0; + } + RetainPtr item = array->GetDirectObjectAt(index); + return item && item->GetType() == CPDF_Object::Type::kString + ? CopyWideString(item->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPieceInfoKey(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING document_last_modified) { + if (!key || !*key || !application || !*application) { + return false; + } + + const CPDF_Dictionary* catalog = GetDocumentCatalog(document); + if (!catalog) { + return false; + } + RetainPtr piece_info_object = + catalog->GetDirectObjectFor(kPieceInfoKey); + if (!piece_info_object) { + return true; + } + const CPDF_Dictionary* piece_info = piece_info_object->AsDictionary(); + if (!piece_info) { + return false; + } + RetainPtr app_object = + piece_info->GetDirectObjectFor(application); + if (!app_object) { + return true; + } + const CPDF_Dictionary* app = app_object->AsDictionary(); + if (!app) { + return false; + } + RetainPtr private_object = + app->GetDirectObjectFor(kPrivateKey); + if (!private_object) { + return true; + } + const CPDF_Dictionary* private_dict = private_object->AsDictionary(); + if (!private_dict) { + return false; + } + if (!private_dict->KeyExist(key)) { + return true; + } + + MutablePieceInfo target = GetOrCreateMutableDocumentPieceInfo( + document, application, document_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->RemoveFor(key); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPieceInfoEntry(FPDF_DOCUMENT document, + FPDF_BYTESTRING application) { + if (!application || !*application) { + return false; + } + const CPDF_Dictionary* const_catalog = GetDocumentCatalog(document); + if (!const_catalog) { + return false; + } + RetainPtr piece_info_object = + const_catalog->GetDirectObjectFor(kPieceInfoKey); + if (!piece_info_object) { + return true; + } + const CPDF_Dictionary* const_piece_info = piece_info_object->AsDictionary(); + if (!const_piece_info) { + return false; + } + if (!const_piece_info->KeyExist(application)) { + return true; + } + + RetainPtr catalog = GetMutableDocumentCatalog(document); + if (!catalog) { + return false; + } + RetainPtr piece_info = + catalog->GetMutableDictFor(kPieceInfoKey); + if (!piece_info) { + return !catalog->KeyExist(kPieceInfoKey); + } + piece_info->RemoveFor(application); + if (piece_info->size() == 0) { + catalog->RemoveFor(kPieceInfoKey); + } + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_HasPagePieceInfoEntry(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + return !!GetApplicationDictionary(page.Get(), application); +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoEntryCount(FPDF_DOCUMENT document, + unsigned int page_object_number) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr piece_info = + page ? page->GetDictFor(kPieceInfoKey) : nullptr; + return piece_info ? static_cast(piece_info->size()) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoEntryAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + int index, + char* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr piece_info = + page ? page->GetDictFor(kPieceInfoKey) : nullptr; + if (!piece_info || index >= static_cast(piece_info->size())) { + return 0; + } + + int current = 0; + CPDF_DictionaryLocker locker(piece_info); + for (const auto& item : locker) { + if (current++ == index) { + return CopyByteString(item.first.AsStringView(), buffer, buflen); + } + } + return 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPageLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + if (!page) { + return 0; + } + RetainPtr value = + page->GetDirectObjectFor(kLastModifiedKey); + return value && value->GetType() == CPDF_Object::Type::kString + ? CopyWideString(value->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr app = + GetApplicationDictionary(page.Get(), application); + if (!app) { + return 0; + } + RetainPtr value = + app->GetDirectObjectFor(kLastModifiedKey); + return value && value->GetType() == CPDF_Object::Type::kString + ? CopyWideString(value->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoKeyCount(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr private_dict = + GetPrivateDictionary(page.Get(), application); + return private_dict ? static_cast(private_dict->size()) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoKeyAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + int index, + char* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr private_dict = + GetPrivateDictionary(page.Get(), application); + if (!private_dict || index >= static_cast(private_dict->size())) { + return 0; + } + + int current = 0; + CPDF_DictionaryLocker locker(private_dict); + for (const auto& item : locker) { + if (current++ == index) { + return CopyByteString(item.first.AsStringView(), buffer, buflen); + } + } + return 0; +} + +FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoValueType(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + return object ? static_cast(object->GetType()) + : FPDF_OBJECT_UNKNOWN; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoString(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key || !value) { + return false; + } + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor( + key, UNSAFE_BUFFERS(WideStringFromFPDFWideString(value).AsStringView())); + return true; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoString(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + return object && object->GetType() == CPDF_Object::Type::kString + ? CopyWideString(object->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoNumber(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float value, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key) { + return false; + } + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoNumber(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float* value) { + if (!value) { + return false; + } + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + if (!object || object->GetType() != CPDF_Object::Type::kNumber) { + return false; + } + *value = object->GetNumber(); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoBoolean(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL value, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key) { + return false; + } + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, !!value); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoBoolean(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL* value) { + if (!value) { + return false; + } + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + if (!object || object->GetType() != CPDF_Object::Type::kBoolean) { + return false; + } + *value = object->GetInteger() != 0; + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoName(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BYTESTRING value, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key || !value || !*value) { + return false; + } + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->SetNewFor(key, value); + return true; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoName(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + char* buffer, + unsigned long buflen) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + return object && object->GetType() == CPDF_Object::Type::kName + ? CopyByteString(object->GetString().AsStringView(), buffer, + buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoStringArray(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + const FPDF_WIDESTRING* values, + unsigned long value_count, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key || (value_count > 0 && !values)) { + return false; + } + for (unsigned long i = 0; i < value_count; ++i) { + if (!UNSAFE_BUFFERS(values[i])) { + return false; + } + } + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + + auto array = pdfium::MakeRetain(); + for (unsigned long i = 0; i < value_count; ++i) { + FPDF_WIDESTRING value = UNSAFE_BUFFERS(values[i]); + array->AppendNew( + UNSAFE_BUFFERS(WideStringFromFPDFWideString(value).AsStringView())); + } + target.private_dict->SetFor(key, std::move(array)); + return true; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoStringArrayCount(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key) { + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + RetainPtr array = ToArray(std::move(object)); + if (!array) { + return -1; + } + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr item = array->GetDirectObjectAt(i); + if (!item || item->GetType() != CPDF_Object::Type::kString) { + return -1; + } + } + return static_cast(array->size()); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoStringArrayAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + if (index < 0) { + return 0; + } + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr object = + GetPrivateObject(page.Get(), application, key); + RetainPtr array = ToArray(std::move(object)); + if (!array || index >= static_cast(array->size())) { + return 0; + } + RetainPtr item = array->GetDirectObjectAt(index); + return item && item->GetType() == CPDF_Object::Type::kString + ? CopyWideString(item->GetUnicodeText(), buffer, buflen) + : 0; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPagePieceInfoKey(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING content_last_modified) { + if (!key || !*key) { + return false; + } + + RetainPtr page = + GetPageDictionaryByObjectNumber(document, page_object_number); + if (!page || !application || !*application) { + return false; + } + RetainPtr piece_info_object = + page->GetDirectObjectFor(kPieceInfoKey); + if (!piece_info_object) { + return true; + } + const CPDF_Dictionary* piece_info = piece_info_object->AsDictionary(); + if (!piece_info) { + return false; + } + RetainPtr app_object = + piece_info->GetDirectObjectFor(application); + if (!app_object) { + return true; + } + const CPDF_Dictionary* app = app_object->AsDictionary(); + if (!app) { + return false; + } + RetainPtr private_object = + app->GetDirectObjectFor(kPrivateKey); + if (!private_object) { + return true; + } + const CPDF_Dictionary* private_dict = private_object->AsDictionary(); + if (!private_dict) { + return false; + } + if (!private_dict->KeyExist(key)) { + return true; + } + + MutablePieceInfo target = GetOrCreateMutablePieceInfo( + document, page_object_number, application, content_last_modified); + if (!target.private_dict) { + return false; + } + target.private_dict->RemoveFor(key); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPagePieceInfoEntry(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application) { + if (!application || !*application) { + return false; + } + RetainPtr const_page = + GetPageDictionaryByObjectNumber(document, page_object_number); + if (!const_page) { + return false; + } + RetainPtr piece_info_object = + const_page->GetDirectObjectFor(kPieceInfoKey); + if (!piece_info_object) { + return true; + } + const CPDF_Dictionary* const_piece_info = piece_info_object->AsDictionary(); + if (!const_piece_info) { + return false; + } + if (!const_piece_info->KeyExist(application)) { + return true; + } + + RetainPtr page = + GetMutablePageDictionaryByObjectNumber(document, page_object_number); + if (!page) { + return false; + } + RetainPtr piece_info = + page->GetMutableDictFor(kPieceInfoKey); + if (!piece_info) { + return !page->KeyExist(kPieceInfoKey); + } + piece_info->RemoveFor(application); + if (piece_info->size() == 0) { + page->RemoveFor(kPieceInfoKey); + } + return true; +} diff --git a/fpdfsdk/epdf_pieceinfo_embeddertest.cpp b/fpdfsdk/epdf_pieceinfo_embeddertest.cpp new file mode 100644 index 0000000000..4c89387393 --- /dev/null +++ b/fpdfsdk/epdf_pieceinfo_embeddertest.cpp @@ -0,0 +1,555 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_pieceinfo.h" + +#include +#include +#include + +#include "public/cpp/fpdf_scopers.h" +#include "public/fpdf_edit.h" +#include "public/fpdf_ppo.h" +#include "public/fpdf_save.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +std::wstring GetDocumentLastModified(FPDF_DOCUMENT document) { + const unsigned long length = EPDFDoc_GetLastModified(document, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetLastModified(document, buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetDocumentPieceInfoLastModified(FPDF_DOCUMENT document, + const char* application) { + const unsigned long length = + EPDFDoc_GetPieceInfoLastModified(document, application, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPieceInfoLastModified(document, application, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetDocumentPieceInfoString(FPDF_DOCUMENT document, + const char* application, + const char* key) { + const unsigned long length = + EPDFDoc_GetPieceInfoString(document, application, key, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPieceInfoString(document, application, key, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetDocumentPieceInfoStringArrayAt(FPDF_DOCUMENT document, + const char* application, + const char* key, + int index) { + const unsigned long length = EPDFDoc_GetPieceInfoStringArrayAt( + document, application, key, index, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, + EPDFDoc_GetPieceInfoStringArrayAt(document, application, key, index, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::string GetDocumentPieceInfoName(FPDF_DOCUMENT document, + const char* application, + const char* key) { + const unsigned long length = + EPDFDoc_GetPieceInfoName(document, application, key, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, EPDFDoc_GetPieceInfoName(document, application, key, + buffer.data(), length)); + return std::string(buffer.data()); +} + +std::string GetDocumentPieceInfoEntryAt(FPDF_DOCUMENT document, int index) { + const unsigned long length = + EPDFDoc_GetPieceInfoEntryAt(document, index, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, EPDFDoc_GetPieceInfoEntryAt(document, index, buffer.data(), + length)); + return std::string(buffer.data()); +} + +std::wstring GetPageLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number) { + const unsigned long length = + EPDFDoc_GetPageLastModified(document, page_object_number, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPageLastModified(document, page_object_number, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetPieceInfoLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number, + const char* application) { + const unsigned long length = EPDFDoc_GetPagePieceInfoLastModified( + document, page_object_number, application, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPagePieceInfoLastModified( + document, page_object_number, application, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetPieceInfoString(FPDF_DOCUMENT document, + unsigned int page_object_number, + const char* application, + const char* key) { + const unsigned long length = EPDFDoc_GetPagePieceInfoString( + document, page_object_number, application, key, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPagePieceInfoString(document, page_object_number, + application, key, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetPieceInfoStringArrayAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + const char* application, + const char* key, + int index) { + const unsigned long length = EPDFDoc_GetPagePieceInfoStringArrayAt( + document, page_object_number, application, key, index, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFDoc_GetPagePieceInfoStringArrayAt( + document, page_object_number, application, key, index, + buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::string GetPieceInfoName(FPDF_DOCUMENT document, + unsigned int page_object_number, + const char* application, + const char* key) { + const unsigned long length = EPDFDoc_GetPagePieceInfoName( + document, page_object_number, application, key, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, EPDFDoc_GetPagePieceInfoName(document, page_object_number, + application, key, + buffer.data(), length)); + return std::string(buffer.data()); +} + +std::string GetPieceInfoEntryAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + int index) { + const unsigned long length = EPDFDoc_GetPagePieceInfoEntryAt( + document, page_object_number, index, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, + EPDFDoc_GetPagePieceInfoEntryAt(document, page_object_number, index, + buffer.data(), length)); + return std::string(buffer.data()); +} + +} // namespace + +class EPDFPieceInfoEmbedderTest : public EmbedderTest {}; + +TEST_F(EPDFPieceInfoEmbedderTest, CatalogTypedValuesSaveReloadAndLayerRead) { + CreateEmptyDocument(); + ScopedFPDFPage page(FPDFPage_New(document(), 0, 240, 100)); + ASSERT_TRUE(page); + + ScopedFPDFWideString timestamp = + GetFPDFWideString(L"D:20260713153000+03'00'"); + ScopedFPDFWideString name = GetFPDFWideString(L"Company Stamps \u2713"); + ScopedFPDFWideString review = GetFPDFWideString(L"Review"); + ScopedFPDFWideString internal = GetFPDFWideString(L"Internal"); + const FPDF_WIDESTRING categories[] = {review.get(), internal.get()}; + + EXPECT_TRUE(EPDFDoc_SetPieceInfoString(document(), "EMBD_StampLibrary", + "Name", name.get(), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoNumber(document(), "EMBD_StampLibrary", + "Version", 1.0f, timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoBoolean(document(), "EMBD_StampLibrary", + "Archived", true, timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoName(document(), "EMBD_StampLibrary", "Kind", + "StampLibrary", timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoStringArray( + document(), "EMBD_StampLibrary", "Categories", categories, + std::size(categories), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoBoolean(document(), "EMBD_Other", "Pinned", + true, timestamp.get())); + + EXPECT_TRUE(EPDFDoc_HasPieceInfoEntry(document(), "EMBD_StampLibrary")); + EXPECT_EQ(2, EPDFDoc_GetPieceInfoEntryCount(document())); + std::set applications; + applications.insert(GetDocumentPieceInfoEntryAt(document(), 0)); + applications.insert(GetDocumentPieceInfoEntryAt(document(), 1)); + EXPECT_EQ((std::set{"EMBD_Other", "EMBD_StampLibrary"}), + applications); + EXPECT_EQ(5, EPDFDoc_GetPieceInfoKeyCount(document(), "EMBD_StampLibrary")); + + EXPECT_EQ(FPDF_OBJECT_STRING, EPDFDoc_GetPieceInfoValueType( + document(), "EMBD_StampLibrary", "Name")); + EXPECT_EQ(FPDF_OBJECT_NUMBER, + EPDFDoc_GetPieceInfoValueType(document(), "EMBD_StampLibrary", + "Version")); + EXPECT_EQ(FPDF_OBJECT_BOOLEAN, + EPDFDoc_GetPieceInfoValueType(document(), "EMBD_StampLibrary", + "Archived")); + EXPECT_EQ(FPDF_OBJECT_NAME, EPDFDoc_GetPieceInfoValueType( + document(), "EMBD_StampLibrary", "Kind")); + EXPECT_EQ(FPDF_OBJECT_ARRAY, + EPDFDoc_GetPieceInfoValueType(document(), "EMBD_StampLibrary", + "Categories")); + EXPECT_EQ( + L"Company Stamps \u2713", + GetDocumentPieceInfoString(document(), "EMBD_StampLibrary", "Name")); + float number = 0.0f; + EXPECT_TRUE(EPDFDoc_GetPieceInfoNumber(document(), "EMBD_StampLibrary", + "Version", &number)); + EXPECT_FLOAT_EQ(1.0f, number); + FPDF_BOOL boolean = false; + EXPECT_TRUE(EPDFDoc_GetPieceInfoBoolean(document(), "EMBD_StampLibrary", + "Archived", &boolean)); + EXPECT_TRUE(boolean); + EXPECT_EQ("StampLibrary", + GetDocumentPieceInfoName(document(), "EMBD_StampLibrary", "Kind")); + EXPECT_EQ(2, EPDFDoc_GetPieceInfoStringArrayCount( + document(), "EMBD_StampLibrary", "Categories")); + EXPECT_EQ(L"Review", GetDocumentPieceInfoStringArrayAt( + document(), "EMBD_StampLibrary", "Categories", 0)); + EXPECT_EQ(L"Internal", GetDocumentPieceInfoStringArrayAt( + document(), "EMBD_StampLibrary", "Categories", 1)); + EXPECT_EQ(L"D:20260713153000+03'00'", GetDocumentLastModified(document())); + EXPECT_EQ(L"D:20260713153000+03'00'", + GetDocumentPieceInfoLastModified(document(), "EMBD_StampLibrary")); + + ClearString(); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + const std::string saved_pdf = GetString(); + ASSERT_FALSE(saved_pdf.empty()); + + ScopedSavedDoc saved_document = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_document); + EXPECT_EQ(L"Company Stamps \u2713", + GetDocumentPieceInfoString(saved_document.get(), + "EMBD_StampLibrary", "Name")); + EXPECT_EQ(L"D:20260713153000+03'00'", + GetDocumentLastModified(saved_document.get())); + + EPDF_BASE_DOCUMENT base = + EPDF_LoadMemBaseDocument64(saved_pdf.data(), saved_pdf.size(), nullptr); + ASSERT_TRUE(base); + { + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + EXPECT_EQ(2, EPDFDoc_GetPieceInfoEntryCount(layer.get())); + EXPECT_EQ( + L"Company Stamps \u2713", + GetDocumentPieceInfoString(layer.get(), "EMBD_StampLibrary", "Name")); + EXPECT_EQ(L"D:20260713153000+03'00'", GetDocumentLastModified(layer.get())); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + } + + std::string delta; + { + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + ScopedFPDFWideString updated_timestamp = + GetFPDFWideString(L"D:20260713160000+03'00'"); + ScopedFPDFWideString updated_name = + GetFPDFWideString(L"Updated Company Stamps"); + ASSERT_TRUE(EPDFDoc_SetPieceInfoString(layer.get(), "EMBD_StampLibrary", + "Name", updated_name.get(), + updated_timestamp.get())); + EXPECT_GT(EPDFLayer_GetPromotedObjectCount(layer.get()), 0u); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer.get(), this, &save_status)); + EXPECT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + delta = GetString(); + ASSERT_FALSE(delta.empty()); + } + { + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &status)); + ASSERT_TRUE(replayed); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(L"Updated Company Stamps", + GetDocumentPieceInfoString(replayed.get(), "EMBD_StampLibrary", + "Name")); + EXPECT_EQ(L"D:20260713160000+03'00'", + GetDocumentLastModified(replayed.get())); + } + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(EPDFPieceInfoEmbedderTest, CatalogGranularClearPreservesOtherData) { + CreateEmptyDocument(); + ScopedFPDFPage page(FPDFPage_New(document(), 0, 240, 100)); + ASSERT_TRUE(page); + + ScopedFPDFWideString timestamp = + GetFPDFWideString(L"D:20260713154500+03'00'"); + ScopedFPDFWideString value = GetFPDFWideString(L"value"); + + EXPECT_TRUE(EPDFDoc_ClearPieceInfoKey(document(), "EMBD_Missing", "Missing", + nullptr)); + EXPECT_EQ(0, EPDFDoc_GetPieceInfoEntryCount(document())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoString(document(), "EMBD_First", "Remove", + value.get(), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoString(document(), "EMBD_First", "Keep", + value.get(), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPieceInfoString(document(), "EMBD_Second", "Keep", + value.get(), timestamp.get())); + + EXPECT_TRUE(EPDFDoc_ClearPieceInfoKey(document(), "EMBD_First", "Remove", + timestamp.get())); + EXPECT_EQ(FPDF_OBJECT_UNKNOWN, + EPDFDoc_GetPieceInfoValueType(document(), "EMBD_First", "Remove")); + EXPECT_EQ(L"value", + GetDocumentPieceInfoString(document(), "EMBD_First", "Keep")); + EXPECT_TRUE(EPDFDoc_ClearPieceInfoEntry(document(), "EMBD_First")); + EXPECT_FALSE(EPDFDoc_HasPieceInfoEntry(document(), "EMBD_First")); + EXPECT_TRUE(EPDFDoc_HasPieceInfoEntry(document(), "EMBD_Second")); + EXPECT_EQ(1, EPDFDoc_GetPieceInfoEntryCount(document())); + EXPECT_TRUE(EPDFDoc_ClearPieceInfoEntry(document(), "EMBD_Second")); + EXPECT_EQ(0, EPDFDoc_GetPieceInfoEntryCount(document())); + EXPECT_EQ(L"D:20260713154500+03'00'", GetDocumentLastModified(document())); +} + +TEST_F(EPDFPieceInfoEmbedderTest, TypedValuesSaveReloadAndImport) { + CreateEmptyDocument(); + ScopedFPDFPage page(FPDFPage_New(document(), 0, 240, 100)); + ASSERT_TRUE(page); + const unsigned int page_object_number = EPDFPage_GetObjectNumber(page.get()); + ASSERT_NE(0u, page_object_number); + + ScopedFPDFWideString timestamp = + GetFPDFWideString(L"D:20260713093703+03'00'"); + ScopedFPDFWideString name = GetFPDFWideString(L"Approved \u2713"); + ScopedFPDFWideString review = GetFPDFWideString(L"Review"); + ScopedFPDFWideString internal = GetFPDFWideString(L"Internal"); + const FPDF_WIDESTRING categories[] = {review.get(), internal.get()}; + + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoString(document(), page_object_number, + "EMBD_Stamp", "Name", name.get(), + timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoNumber(document(), page_object_number, + "EMBD_Stamp", "Version", 1.0f, + timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoBoolean(document(), page_object_number, + "EMBD_Stamp", "Archived", true, + timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoName(document(), page_object_number, + "EMBD_Stamp", "Kind", "Stamp", + timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoStringArray( + document(), page_object_number, "EMBD_Stamp", "Categories", categories, + std::size(categories), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoBoolean(document(), page_object_number, + "EMBD_PageState", "Pinned", true, + timestamp.get())); + + EXPECT_TRUE(EPDFDoc_HasPagePieceInfoEntry(document(), page_object_number, + "EMBD_Stamp")); + EXPECT_EQ(2, + EPDFDoc_GetPagePieceInfoEntryCount(document(), page_object_number)); + std::set applications; + applications.insert(GetPieceInfoEntryAt(document(), page_object_number, 0)); + applications.insert(GetPieceInfoEntryAt(document(), page_object_number, 1)); + EXPECT_EQ((std::set{"EMBD_PageState", "EMBD_Stamp"}), + applications); + + EXPECT_EQ(FPDF_OBJECT_STRING, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_Stamp", "Name")); + EXPECT_EQ(FPDF_OBJECT_NUMBER, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_Stamp", "Version")); + EXPECT_EQ(FPDF_OBJECT_BOOLEAN, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_Stamp", "Archived")); + EXPECT_EQ(FPDF_OBJECT_NAME, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_Stamp", "Kind")); + EXPECT_EQ(FPDF_OBJECT_ARRAY, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_Stamp", "Categories")); + EXPECT_EQ( + L"Approved \u2713", + GetPieceInfoString(document(), page_object_number, "EMBD_Stamp", "Name")); + float number = 0.0f; + EXPECT_TRUE(EPDFDoc_GetPagePieceInfoNumber(document(), page_object_number, + "EMBD_Stamp", "Version", &number)); + EXPECT_FLOAT_EQ(1.0f, number); + FPDF_BOOL boolean = false; + EXPECT_TRUE(EPDFDoc_GetPagePieceInfoBoolean( + document(), page_object_number, "EMBD_Stamp", "Archived", &boolean)); + EXPECT_TRUE(boolean); + EXPECT_EQ("Stamp", GetPieceInfoName(document(), page_object_number, + "EMBD_Stamp", "Kind")); + EXPECT_EQ(2, EPDFDoc_GetPagePieceInfoStringArrayCount( + document(), page_object_number, "EMBD_Stamp", "Categories")); + EXPECT_EQ(L"Review", + GetPieceInfoStringArrayAt(document(), page_object_number, + "EMBD_Stamp", "Categories", 0)); + EXPECT_EQ(L"Internal", + GetPieceInfoStringArrayAt(document(), page_object_number, + "EMBD_Stamp", "Categories", 1)); + EXPECT_EQ(L"D:20260713093703+03'00'", + GetPageLastModified(document(), page_object_number)); + EXPECT_EQ( + L"D:20260713093703+03'00'", + GetPieceInfoLastModified(document(), page_object_number, "EMBD_Stamp")); + + ScopedFPDFDocument imported(FPDF_CreateNewDocument()); + ASSERT_TRUE(imported); + static constexpr int kPageIndices[] = {0}; + ASSERT_TRUE(FPDF_ImportPagesByIndex(imported.get(), document(), kPageIndices, + std::size(kPageIndices), 0)); + const unsigned int imported_page_object_number = + EPDFDoc_GetPageObjectNumberByIndex(imported.get(), 0); + ASSERT_NE(0u, imported_page_object_number); + EXPECT_EQ(L"Approved \u2713", + GetPieceInfoString(imported.get(), imported_page_object_number, + "EMBD_Stamp", "Name")); + + ClearString(); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + const std::string saved_pdf = GetString(); + ASSERT_FALSE(saved_pdf.empty()); + + ScopedSavedDoc saved_document = OpenScopedSavedDocument(); + ASSERT_TRUE(saved_document); + const unsigned int saved_page_object_number = + EPDFDoc_GetPageObjectNumberByIndex(saved_document.get(), 0); + ASSERT_NE(0u, saved_page_object_number); + EXPECT_EQ(L"Approved \u2713", + GetPieceInfoString(saved_document.get(), saved_page_object_number, + "EMBD_Stamp", "Name")); + EXPECT_EQ(L"D:20260713093703+03'00'", + GetPieceInfoLastModified(saved_document.get(), + saved_page_object_number, "EMBD_Stamp")); + + EPDF_BASE_DOCUMENT base = + EPDF_LoadMemBaseDocument64(saved_pdf.data(), saved_pdf.size(), nullptr); + ASSERT_TRUE(base); + { + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + const unsigned int layer_page_object_number = + EPDFDoc_GetPageObjectNumberByIndex(layer.get(), 0); + EXPECT_EQ(2, EPDFDoc_GetPagePieceInfoEntryCount(layer.get(), + layer_page_object_number)); + EXPECT_EQ(L"Approved \u2713", + GetPieceInfoString(layer.get(), layer_page_object_number, + "EMBD_Stamp", "Name")); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + } + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(EPDFPieceInfoEmbedderTest, GranularClearPreservesOtherData) { + CreateEmptyDocument(); + ScopedFPDFPage page(FPDFPage_New(document(), 0, 240, 100)); + ASSERT_TRUE(page); + const unsigned int page_object_number = EPDFPage_GetObjectNumber(page.get()); + ASSERT_NE(0u, page_object_number); + + ScopedFPDFWideString timestamp = + GetFPDFWideString(L"D:20260713103000+03'00'"); + ScopedFPDFWideString value = GetFPDFWideString(L"value"); + + EXPECT_TRUE(EPDFDoc_ClearPagePieceInfoKey( + document(), page_object_number, "EMBD_Missing", "Missing", nullptr)); + EXPECT_EQ(0, + EPDFDoc_GetPagePieceInfoEntryCount(document(), page_object_number)); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoString(document(), page_object_number, + "EMBD_First", "Remove", + value.get(), timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoString(document(), page_object_number, + "EMBD_First", "Keep", value.get(), + timestamp.get())); + EXPECT_TRUE(EPDFDoc_SetPagePieceInfoString(document(), page_object_number, + "EMBD_Second", "Keep", value.get(), + timestamp.get())); + + EXPECT_TRUE(EPDFDoc_ClearPagePieceInfoKey( + document(), page_object_number, "EMBD_First", "Remove", timestamp.get())); + EXPECT_EQ(FPDF_OBJECT_UNKNOWN, + EPDFDoc_GetPagePieceInfoValueType(document(), page_object_number, + "EMBD_First", "Remove")); + EXPECT_EQ(L"value", GetPieceInfoString(document(), page_object_number, + "EMBD_First", "Keep")); + EXPECT_TRUE(EPDFDoc_ClearPagePieceInfoEntry(document(), page_object_number, + "EMBD_First")); + EXPECT_FALSE(EPDFDoc_HasPagePieceInfoEntry(document(), page_object_number, + "EMBD_First")); + EXPECT_TRUE(EPDFDoc_HasPagePieceInfoEntry(document(), page_object_number, + "EMBD_Second")); + EXPECT_EQ(1, + EPDFDoc_GetPagePieceInfoEntryCount(document(), page_object_number)); + EXPECT_TRUE(EPDFDoc_ClearPagePieceInfoEntry(document(), page_object_number, + "EMBD_Second")); + EXPECT_EQ(0, + EPDFDoc_GetPagePieceInfoEntryCount(document(), page_object_number)); +} diff --git a/public/epdf_pieceinfo.h b/public/epdf_pieceinfo.h new file mode 100644 index 0000000000..fbf18d9bc5 --- /dev/null +++ b/public/epdf_pieceinfo.h @@ -0,0 +1,352 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PUBLIC_EPDF_PIECEINFO_H_ +#define PUBLIC_EPDF_PIECEINFO_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Experimental EmbedPDF Extension API. +// +// Generic document- and page-piece metadata access (ISO 32000-2, 14.5). +// Every entry is addressed by an application name and maps to: +// +// /PieceInfo << +// / << +// /LastModified (D:...) +// /Private << / >> +// >> +// >> +// +// This API intentionally supports a constrained set of safe /Private value +// types. It is not a general-purpose PDF object editor. Unknown values are +// preserved by writes to other keys and reported through +// EPDFDoc_GetPieceInfoValueType() or +// EPDFDoc_GetPagePieceInfoValueType(). + +// Document-level /PieceInfo -------------------------------------------------- +// +// These functions operate on /PieceInfo in the document catalog. The +// document revision marker is /ModDate in the document information +// dictionary; setters store |document_last_modified| in both /Info /ModDate +// and the application data dictionary's /LastModified entry. + +// Return whether the catalog has a well-formed data dictionary for +// |application| under /PieceInfo. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_HasPieceInfoEntry(FPDF_DOCUMENT document, FPDF_BYTESTRING application); + +// Enumerate application names under the catalog's /PieceInfo dictionary. +// Returns 0 when /PieceInfo is absent or malformed. Entry ordering is +// unspecified. +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoEntryCount(FPDF_DOCUMENT document); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoEntryAt(FPDF_DOCUMENT document, + int index, + char* buffer, + unsigned long buflen); + +// Copy /Info /ModDate into |buffer| as UTF-16LE. Returns the required byte +// length including the trailing NUL, or 0 if absent or malformed. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetLastModified(FPDF_DOCUMENT document, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Copy the application data dictionary's /LastModified date string using the +// same two-call convention as EPDFDoc_GetLastModified(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoLastModified(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_WCHAR* buffer, + unsigned long buflen); + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoKeyCount(FPDF_DOCUMENT document, + FPDF_BYTESTRING application); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoKeyAt(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + int index, + char* buffer, + unsigned long buflen); +FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV +EPDFDoc_GetPieceInfoValueType(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoString(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoString(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoNumber(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float value, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPieceInfoNumber(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float* value); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoBoolean(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL value, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPieceInfoBoolean(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL* value); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoName(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BYTESTRING value, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoName(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + char* buffer, + unsigned long buflen); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPieceInfoStringArray(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + const FPDF_WIDESTRING* values, + unsigned long value_count, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPieceInfoStringArrayCount(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPieceInfoStringArrayAt(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Missing keys and entries are successful no-ops. Clearing the final entry +// removes /PieceInfo from the catalog but leaves /Info /ModDate intact. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPieceInfoKey(FPDF_DOCUMENT document, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING document_last_modified); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPieceInfoEntry(FPDF_DOCUMENT document, + FPDF_BYTESTRING application); + +// Page-level /PieceInfo ------------------------------------------------------ + +// Return whether the page has a well-formed data dictionary for +// |application| under /PieceInfo. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_HasPagePieceInfoEntry(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application); + +// Enumerate application names under the page's /PieceInfo dictionary. Returns +// 0 when /PieceInfo is absent or malformed. Entry ordering is unspecified. +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoEntryCount(FPDF_DOCUMENT document, + unsigned int page_object_number); + +// Copy the UTF-8 PDF name of the /PieceInfo entry at |index| into |buffer|, +// including a trailing NUL. Returns the required byte length, or 0 on error. +// |buffer| may be NULL to query the length. Malformed entries are enumerated +// so callers can distinguish them with EPDFDoc_HasPagePieceInfoEntry(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoEntryAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + int index, + char* buffer, + unsigned long buflen); + +// Copy the page dictionary's /LastModified date string into |buffer| as +// UTF-16LE. Returns the required byte length including the trailing NUL, or 0 +// if the page/date is absent or malformed. |buffer| may be NULL to query the +// length. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPageLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Copy the application data dictionary's /LastModified date string into +// |buffer| as UTF-16LE. Uses the same two-call convention as +// EPDFDoc_GetPageLastModified(). +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoLastModified(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Return the number of keys in the application's /Private dictionary, or 0 +// when the entry/private dictionary is absent or malformed. +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoKeyCount(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application); + +// Copy the UTF-8 PDF name of the /Private key at |index| into |buffer|, +// including a trailing NUL. Returns the required byte length, or 0 on error. +// |buffer| may be NULL to query the length. Key ordering is unspecified. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoKeyAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + int index, + char* buffer, + unsigned long buflen); + +// Return the resolved FPDF_OBJECT_* type of |key| in the application's +// /Private dictionary, or FPDF_OBJECT_UNKNOWN when absent/malformed. +FPDF_EXPORT FPDF_OBJECT_TYPE FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoValueType(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key); + +// Set/get a PDF text string. |content_last_modified| is a PDF date string +// identifying the page-content revision represented by this application data; +// the setter stores it in both the page and application data dictionaries. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoString(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING value, + FPDF_WIDESTRING content_last_modified); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoString(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Set/get a PDF number. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoNumber(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float value, + FPDF_WIDESTRING content_last_modified); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoNumber(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + float* value); + +// Set/get a PDF boolean. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoBoolean(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL value, + FPDF_WIDESTRING content_last_modified); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoBoolean(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BOOL* value); + +// Set/get a PDF name. Names are passed and returned as UTF-8 byte strings. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoName(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_BYTESTRING value, + FPDF_WIDESTRING content_last_modified); +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoName(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + char* buffer, + unsigned long buflen); + +// Replace |key| with an array of PDF text strings. |values| may be NULL only +// when |value_count| is 0, which writes an empty array. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_SetPagePieceInfoStringArray(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + const FPDF_WIDESTRING* values, + unsigned long value_count, + FPDF_WIDESTRING content_last_modified); + +// Return the number of text strings in the array at |key|, or -1 when the key +// is absent, is not an array, or contains a non-string value. +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoStringArrayCount(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key); + +// Copy the text string at |index| using the standard UTF-16LE two-call +// convention. Returns 0 on error. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetPagePieceInfoStringArrayAt(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Remove |key| from the application's /Private dictionary. Missing keys are a +// successful no-op. When the entry exists, both /LastModified values are set +// to |content_last_modified|. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPagePieceInfoKey(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application, + FPDF_BYTESTRING key, + FPDF_WIDESTRING content_last_modified); + +// Remove the complete application entry. Other /PieceInfo applications are +// preserved; an empty /PieceInfo dictionary is removed from the page. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFDoc_ClearPagePieceInfoEntry(FPDF_DOCUMENT document, + unsigned int page_object_number, + FPDF_BYTESTRING application); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_EPDF_PIECEINFO_H_ From 5abb1ac73f3552dbd3d69d905e2d253b7b3a9176 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 15 Jul 2026 15:15:51 +0300 Subject: [PATCH 47/56] Add EmbedPDF action model and selective flattening Introduce EmbedPDF APIs and implementations: adds detached, read-only action model (epdf_action.* + helpers + public/epdf_action.h) with embedder tests; implements layer-safe selective annotation/page flattening (epdf_flatten.cpp) and test resources. Plumbing and API changes: expose CPDF_AnnotContext::GetAnnotIndex(), add CPDF_GenerateAP::GenerateFormAPWithValueOverride and thread value_override through AP generation to allow regenerating widget appearances without changing /V, and adjust CPDF_GenerateAP::GenerateFormAP calls. Fix CPDF_InteractiveForm export logic for skip_empty_required to correctly treat missing/null/array values. Update BUILD.gn entries and public headers to export new APIs and add fpdfsdk build sources and tests. Adds test PDFs/resources for flattening. --- BUILD.gn | 4 + core/fpdfapi/page/cpdf_annotcontext.h | 4 + core/fpdfdoc/cpdf_generateap.cpp | 49 +- core/fpdfdoc/cpdf_generateap.h | 8 + core/fpdfdoc/cpdf_interactiveform.cpp | 14 +- fpdfsdk/BUILD.gn | 7 + fpdfsdk/epdf_action.cpp | 391 +++++++ fpdfsdk/epdf_action_embeddertest.cpp | 390 +++++++ fpdfsdk/epdf_action_helpers.h | 24 + fpdfsdk/epdf_flatten.cpp | 813 ++++++++++++++ fpdfsdk/epdf_form.cpp | 1290 ++++++++++++++++++----- fpdfsdk/epdf_form_embeddertest.cpp | 773 ++++++++++++-- fpdfsdk/fpdf_annot.cpp | 67 -- fpdfsdk/fpdf_flatten_embeddertest.cpp | 257 ++++- fpdfsdk/fpdf_javascript.cpp | 64 +- fpdfsdk/fpdf_view.cpp | 5 +- fpdfsdk/fpdf_view_c_api_test.c | 2 + public/epdf_action.h | 174 +++ public/epdf_form.h | 170 ++- public/fpdf_annot.h | 16 - public/fpdf_flatten.h | 41 + testing/resources/flatten_selective.in | 120 +++ testing/resources/flatten_selective.pdf | Bin 0 -> 2278 bytes 23 files changed, 4165 insertions(+), 518 deletions(-) create mode 100644 fpdfsdk/epdf_action.cpp create mode 100644 fpdfsdk/epdf_action_embeddertest.cpp create mode 100644 fpdfsdk/epdf_action_helpers.h create mode 100644 fpdfsdk/epdf_flatten.cpp create mode 100644 public/epdf_action.h create mode 100644 testing/resources/flatten_selective.in create mode 100644 testing/resources/flatten_selective.pdf diff --git a/BUILD.gn b/BUILD.gn index b5866bf395..3b58698a15 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -198,11 +198,15 @@ source_set("pdfium_public_headers_impl") { sources = [ "public/cpp/fpdf_deleters.h", "public/cpp/fpdf_scopers.h", + # EmbedPDF: detached, read-only PDF action models. + "public/epdf_action.h", # EmbedPDF: public runtime font registration API used by page fallback # rendering and annotation authoring. "public/epdf_font.h", # EmbedPDF: session-free AcroForm model, write transactions, FDF/XFDF. "public/epdf_form.h", + # EmbedPDF: generic namespace-scoped document/page /PieceInfo metadata. + "public/epdf_pieceinfo.h", "public/epdf_redact.h", "public/fpdf_annot.h", "public/fpdf_attachment.h", diff --git a/core/fpdfapi/page/cpdf_annotcontext.h b/core/fpdfapi/page/cpdf_annotcontext.h index ebc16c97a1..b28c9948c7 100644 --- a/core/fpdfapi/page/cpdf_annotcontext.h +++ b/core/fpdfapi/page/cpdf_annotcontext.h @@ -35,6 +35,10 @@ class CPDF_AnnotContext { // Never nullptr. IPDF_Page* GetPage() const { return page_; } + // Index at the time the annotation handle was created, or -1 when the + // handle was not created from a page annotation lookup. + int GetAnnotIndex() const { return annot_index_; } + private: void EnsureMutableBackingForAnnotDict(); diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index b60948a594..aafbc34ecd 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -1389,10 +1389,13 @@ void GenerateLineEndings(fxcrt::ostringstream& ap, ByteString GenerateTextFieldAP(const CPDF_Dictionary* annot_dict, const CFX_FloatRect& body_rect, float font_size, - CPVT_VariableText& vt) { + CPVT_VariableText& vt, + const WideString* value_override) { RetainPtr v_field = CPDF_FormField::GetFieldAttrForDict(annot_dict, pdfium::form_fields::kV); - WideString value = v_field ? v_field->GetUnicodeText() : WideString(); + WideString value = value_override + ? *value_override + : (v_field ? v_field->GetUnicodeText() : WideString()); RetainPtr q_field = CPDF_FormField::GetFieldAttrForDict(annot_dict, "Q"); const int32_t align = q_field ? q_field->GetInteger() : 0; @@ -1439,12 +1442,15 @@ ByteString GenerateComboBoxAP(const CPDF_Dictionary* annot_dict, const CFX_FloatRect& body_rect, const CFX_Color& text_color, float font_size, - CPVT_VariableText::Provider& provider) { + CPVT_VariableText::Provider& provider, + const WideString* value_override) { fxcrt::ostringstream body_stream; RetainPtr v_field = CPDF_FormField::GetFieldAttrForDict(annot_dict, pdfium::form_fields::kV); - WideString value = v_field ? v_field->GetUnicodeText() : WideString(); + WideString value = value_override + ? *value_override + : (v_field ? v_field->GetUnicodeText() : WideString()); CPVT_VariableText vt(&provider); CFX_FloatRect button_rect = body_rect; button_rect.left = button_rect.right - 13; @@ -2712,7 +2718,8 @@ void GenerateTextFieldFormAP(fxcrt::ostringstream& app_stream, const CPDF_Dictionary* annot_dict, const CFX_FloatRect& bbox, const DefaultAppearanceInfo& da_info, - CPVT_VariableText::Provider& provider) { + CPVT_VariableText::Provider& provider, + const WideString* value_override) { const AppearanceCharacteristics mk = GetAppearanceCharacteristics(annot_dict->GetDictFor("MK")); const bool has_bg = @@ -2753,8 +2760,8 @@ void GenerateTextFieldFormAP(fxcrt::ostringstream& app_stream, WriteRect(app_stream, clip_rect) << " re W n\n"; CPVT_VariableText vt(&provider); - ByteString body = - GenerateTextFieldAP(annot_dict, body_rect, da_info.font_size, vt); + ByteString body = GenerateTextFieldAP(annot_dict, body_rect, + da_info.font_size, vt, value_override); app_stream << "BT\n"; app_stream << GenerateColorAP(da_info.text_color, PaintOperation::kStroke); @@ -2773,7 +2780,8 @@ void GenerateComboBoxFormAP(fxcrt::ostringstream& app_stream, const CPDF_Dictionary* annot_dict, const CFX_FloatRect& bbox, const DefaultAppearanceInfo& da_info, - CPVT_VariableText::Provider& provider) { + CPVT_VariableText::Provider& provider, + const WideString* value_override) { const AnnotationDimensionsAndColor dims = GetAnnotationDimensionsAndColor(annot_dict); const BorderStyleInfo border_info = @@ -2796,7 +2804,7 @@ void GenerateComboBoxFormAP(fxcrt::ostringstream& app_stream, body_rect.Deflate(border_info.width, border_info.width); app_stream << GenerateComboBoxAP(annot_dict, body_rect, da_info.text_color, - da_info.font_size, provider); + da_info.font_size, provider, value_override); } void GenerateListBoxFormAP(fxcrt::ostringstream& app_stream, @@ -2953,7 +2961,8 @@ std::optional GetWidgetFormType( bool GenerateFormAPToTarget(APGenerationTarget* target, CPDF_Dictionary* annot_dict, - CPDF_GenerateAP::FormType type) { + CPDF_GenerateAP::FormType type, + const WideString* value_override) { CPDF_Document* const doc = target->doc; const CPDF_Dictionary* root_dict = doc->GetRoot(); if (!root_dict) { @@ -3043,11 +3052,13 @@ bool GenerateFormAPToTarget(APGenerationTarget* target, switch (type) { case CPDF_GenerateAP::kTextField: GenerateTextFieldFormAP(app_stream, annot_dict, dims.bbox, - default_appearance_info.value(), provider); + default_appearance_info.value(), provider, + value_override); break; case CPDF_GenerateAP::kComboBox: GenerateComboBoxFormAP(app_stream, annot_dict, dims.bbox, - default_appearance_info.value(), provider); + default_appearance_info.value(), provider, + value_override); break; case CPDF_GenerateAP::kListBox: GenerateListBoxFormAP(app_stream, annot_dict, dims.bbox, @@ -3114,7 +3125,17 @@ void CPDF_GenerateAP::GenerateFormAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict, FormType type) { APGenerationTarget target{doc, annot_dict}; - GenerateFormAPToTarget(&target, annot_dict, type); + GenerateFormAPToTarget(&target, annot_dict, type, nullptr); +} + +// static +bool CPDF_GenerateAP::GenerateFormAPWithValueOverride( + CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + FormType type, + const WideString& value_override) { + APGenerationTarget target{doc, annot_dict}; + return GenerateFormAPToTarget(&target, annot_dict, type, &value_override); } // static @@ -3124,7 +3145,7 @@ CPDF_GenerateAP::GenerateEphemeralFormAP(CPDF_Document* doc, FormType type) { APGenerationTarget target{doc, nullptr}; if (!GenerateFormAPToTarget(&target, const_cast(annot_dict), - type)) { + type, nullptr)) { return std::nullopt; } return GeneratedAP{std::move(target.normal_stream)}; diff --git a/core/fpdfdoc/cpdf_generateap.h b/core/fpdfdoc/cpdf_generateap.h index 0b31f2d25f..0372e6f5c6 100644 --- a/core/fpdfdoc/cpdf_generateap.h +++ b/core/fpdfdoc/cpdf_generateap.h @@ -10,6 +10,7 @@ #include #include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxcrt/widestring.h" #include "core/fxge/cfx_fontregistry.h" class CPDF_Dictionary; @@ -25,6 +26,13 @@ class CPDF_GenerateAP { CPDF_Dictionary* pAnnotDict, FormType type); + // EmbedPDF: regenerate a text/combo widget appearance from display text + // without changing the field's semantic /V value. + static bool GenerateFormAPWithValueOverride(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + FormType type, + const WideString& value_override); + static void GenerateCheckboxFormAP(CPDF_Document* doc, CPDF_Dictionary* annot_dict); diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp index c740a1bc05..22078d81d3 100644 --- a/core/fpdfdoc/cpdf_interactiveform.cpp +++ b/core/fpdfdoc/cpdf_interactiveform.cpp @@ -1138,12 +1138,14 @@ std::unique_ptr CPDF_InteractiveForm::ExportToFDF( // EmbedPDF: |skip_empty_required| makes the historic omit-empty-required // submission behavior optional so interchange exports stay faithful. - if (skip_empty_required && - (dwFlags & pdfium::form_flags::kRequired) != 0 && - field->GetFieldDict() - ->GetByteStringFor(pdfium::form_fields::kV) - .IsEmpty()) { - continue; + if (skip_empty_required && (dwFlags & pdfium::form_flags::kRequired) != 0) { + RetainPtr value = + field->GetFieldAttr(pdfium::form_fields::kV); + if (!value || value->IsNull() || + (value->IsArray() ? value->AsArray()->IsEmpty() + : value->GetString().IsEmpty())) { + continue; + } } WideString fullname = diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn index 03261d121d..d387a009ef 100644 --- a/fpdfsdk/BUILD.gn +++ b/fpdfsdk/BUILD.gn @@ -7,11 +7,16 @@ import("../testing/test.gni") source_set("fpdfsdk") { sources = [ + # EmbedPDF: detached, read-only PDF action models. + "epdf_action.cpp", + "epdf_action_helpers.h", "epdf_base_document.cpp", # EmbedPDF: implements EPDFFont_* runtime font registration APIs. "epdf_font.cpp", # EmbedPDF: session-free AcroForm model snapshot (EPDFForm_* APIs). "epdf_form.cpp", + # EmbedPDF: layer-safe selective page and annotation flattening. + "epdf_flatten.cpp", "epdf_layer.cpp", "epdf_outline.cpp", # EmbedPDF: generic namespace-scoped document/page /PieceInfo metadata. @@ -143,6 +148,8 @@ pdfium_embeddertest_source_set("embeddertests") { sources = [ "cpdfsdk_annotiterator_embeddertest.cpp", "cpdfsdk_baannot_embeddertest.cpp", + # EmbedPDF: covers detached action models and owner-specific readers. + "epdf_action_embeddertest.cpp", # EmbedPDF: covers the EPDFForm_* session-free form APIs. "epdf_form_embeddertest.cpp", # EmbedPDF: covers generic document/page /PieceInfo metadata APIs. diff --git a/fpdfsdk/epdf_action.cpp b/fpdfsdk/epdf_action.cpp new file mode 100644 index 0000000000..78f415d8da --- /dev/null +++ b/fpdfsdk/epdf_action.cpp @@ -0,0 +1,391 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_action.h" + +#include +#include +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_annotcontext.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/fx_string_wrappers.h" +#include "core/fxcrt/numerics/safe_conversions.h" +#include "core/fxcrt/retain_ptr.h" +#include "core/fxcrt/span.h" +#include "fpdfsdk/cpdfsdk_helpers.h" +#include "fpdfsdk/epdf_action_helpers.h" + +namespace epdf { + +namespace { + +constexpr size_t kMaxActionDepth = 64; +constexpr size_t kMaxActionNodes = 1024; +constexpr size_t kMaxJavaScriptCodeUnits = 8 * 1024 * 1024; + +struct ActionNodeRecord { + ByteString subtype; + int type = EPDF_ACTION_TYPE_UNKNOWN; + std::optional javascript; + std::vector next; +}; + +int NormalizeActionType(CPDF_Action::Type type) { + switch (type) { + case CPDF_Action::Type::kUnknown: + return EPDF_ACTION_TYPE_UNKNOWN; + case CPDF_Action::Type::kGoTo: + return EPDF_ACTION_TYPE_GOTO; + case CPDF_Action::Type::kGoToR: + return EPDF_ACTION_TYPE_GOTO_REMOTE; + case CPDF_Action::Type::kGoToE: + return EPDF_ACTION_TYPE_GOTO_EMBEDDED; + case CPDF_Action::Type::kLaunch: + return EPDF_ACTION_TYPE_LAUNCH; + case CPDF_Action::Type::kThread: + return EPDF_ACTION_TYPE_THREAD; + case CPDF_Action::Type::kURI: + return EPDF_ACTION_TYPE_URI; + case CPDF_Action::Type::kSound: + return EPDF_ACTION_TYPE_SOUND; + case CPDF_Action::Type::kMovie: + return EPDF_ACTION_TYPE_MOVIE; + case CPDF_Action::Type::kHide: + return EPDF_ACTION_TYPE_HIDE; + case CPDF_Action::Type::kNamed: + return EPDF_ACTION_TYPE_NAMED; + case CPDF_Action::Type::kSubmitForm: + return EPDF_ACTION_TYPE_SUBMIT_FORM; + case CPDF_Action::Type::kResetForm: + return EPDF_ACTION_TYPE_RESET_FORM; + case CPDF_Action::Type::kImportData: + return EPDF_ACTION_TYPE_IMPORT_DATA; + case CPDF_Action::Type::kJavaScript: + return EPDF_ACTION_TYPE_JAVASCRIPT; + case CPDF_Action::Type::kSetOCGState: + return EPDF_ACTION_TYPE_SET_OCG_STATE; + case CPDF_Action::Type::kRendition: + return EPDF_ACTION_TYPE_RENDITION; + case CPDF_Action::Type::kTrans: + return EPDF_ACTION_TYPE_TRANSITION; + case CPDF_Action::Type::kGoTo3DView: + return EPDF_ACTION_TYPE_GOTO_3D_VIEW; + } + return EPDF_ACTION_TYPE_UNKNOWN; +} + +} // namespace + +struct ActionModelData { + std::vector nodes; + uint32_t warning_flags = 0; +}; + +namespace { + +std::optional AppendAction( + const CPDF_Action& action, + size_t depth, + size_t* javascript_code_units, + std::set* active_path, + ActionModelData* model) { + const CPDF_Dictionary* dict = action.GetDict(); + if (!dict) { + model->warning_flags |= EPDF_ACTION_WARNING_MALFORMED_NEXT; + return std::nullopt; + } + if (depth >= kMaxActionDepth || model->nodes.size() >= kMaxActionNodes) { + model->warning_flags |= EPDF_ACTION_WARNING_INCOMPLETE; + return std::nullopt; + } + + ActionNodeRecord node; + node.subtype = dict->GetNameFor("S"); + node.type = NormalizeActionType(action.GetType()); + if (node.type == EPDF_ACTION_TYPE_JAVASCRIPT || + node.type == EPDF_ACTION_TYPE_RENDITION) { + node.javascript = action.MaybeGetJavaScript(); + if (node.javascript.has_value()) { + const size_t length = node.javascript->GetLength(); + if (length > kMaxJavaScriptCodeUnits - *javascript_code_units) { + model->warning_flags |= EPDF_ACTION_WARNING_INCOMPLETE; + return std::nullopt; + } + *javascript_code_units += length; + } + } + + const EPDF_ACTION_NODE_ID node_id = + pdfium::checked_cast(model->nodes.size()); + model->nodes.push_back(std::move(node)); + active_path->insert(dict); + + if (dict->KeyExist("Next")) { + RetainPtr next = dict->GetDirectObjectFor("Next"); + if (!next || (!next->IsDictionary() && !next->IsArray())) { + model->warning_flags |= EPDF_ACTION_WARNING_MALFORMED_NEXT; + } + } + const size_t child_count = action.GetSubActionsCount(); + for (size_t i = 0; i < child_count; ++i) { + CPDF_Action child = action.GetSubAction(i); + const CPDF_Dictionary* child_dict = child.GetDict(); + if (!child_dict) { + model->warning_flags |= EPDF_ACTION_WARNING_MALFORMED_NEXT; + continue; + } + if (active_path->contains(child_dict)) { + model->warning_flags |= EPDF_ACTION_WARNING_CYCLE_DROPPED; + continue; + } + std::optional child_id = AppendAction( + child, depth + 1, javascript_code_units, active_path, model); + if (child_id.has_value()) { + model->nodes[node_id].next.push_back(child_id.value()); + } + } + + active_path->erase(dict); + return node_id; +} + +const ActionModelData* DataFromHandle(EPDF_ACTION_MODEL model); + +} // namespace + +ActionModelDataPtr BuildActionModel(const CPDF_Action& action) { + if (!action.HasDict()) { + return nullptr; + } + auto model = std::make_shared(); + size_t javascript_code_units = 0; + std::set active_path; + AppendAction(action, 0, &javascript_code_units, &active_path, model.get()); + return model; +} + +} // namespace epdf + +struct epdf_action_model_t__ { + explicit epdf_action_model_t__(epdf::ActionModelDataPtr data) + : data(std::move(data)) {} + + epdf::ActionModelDataPtr data; +}; + +namespace epdf { + +namespace { + +const ActionModelData* DataFromHandle(EPDF_ACTION_MODEL model) { + return model && model->data ? model->data.get() : nullptr; +} + +const ActionNodeRecord* GetNode(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + const ActionModelData* data = DataFromHandle(model); + return data && node < data->nodes.size() ? &data->nodes[node] : nullptr; +} + +EPDF_ACTION_MODEL MakeModelFromDictionary( + RetainPtr dictionary) { + return dictionary ? MakeActionModelHandle( + BuildActionModel(CPDF_Action(std::move(dictionary)))) + : nullptr; +} + +const CPDF_Dictionary* GetDocumentRoot(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? doc->GetRoot() : nullptr; +} + +RetainPtr GetPageDictionaryByObjectNumber( + FPDF_DOCUMENT document, + uint32_t page_object_number) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || page_object_number == 0) { + return nullptr; + } +#ifdef PDF_ENABLE_XFA + if (doc->GetExtension()) { + return nullptr; + } +#endif // PDF_ENABLE_XFA + const int page_index = doc->GetPageIndex(page_object_number); + return page_index >= 0 ? doc->GetPageDictionary(page_index) : nullptr; +} + +} // namespace + +EPDF_ACTION_MODEL MakeActionModelHandle(ActionModelDataPtr data) { + return data ? new epdf_action_model_t__(std::move(data)) : nullptr; +} + +} // namespace epdf + +FPDF_EXPORT void FPDF_CALLCONV EPDFAction_CloseModel(EPDF_ACTION_MODEL model) { + delete model; +} + +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFAction_LoadModel(FPDF_ACTION action) { + CPDF_Dictionary* dictionary = CPDFDictionaryFromFPDFAction(action); + return dictionary ? epdf::MakeActionModelHandle(epdf::BuildActionModel( + CPDF_Action(pdfium::WrapRetain(dictionary)))) + : nullptr; +} + +FPDF_EXPORT EPDF_ACTION_NODE_ID FPDF_CALLCONV +EPDFAction_GetRootNode(EPDF_ACTION_MODEL model) { + const epdf::ActionModelData* data = epdf::DataFromHandle(model); + return data && !data->nodes.empty() ? 0 : EPDF_ACTION_NODE_INVALID; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNodeCount(EPDF_ACTION_MODEL model) { + const epdf::ActionModelData* data = epdf::DataFromHandle(model); + return data ? pdfium::checked_cast(data->nodes.size()) : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNodeType(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + return record ? record->type : EPDF_ACTION_TYPE_UNKNOWN; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeSubtype(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + char* buffer, + unsigned long buflen) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!record) { + return 0; + } + return NulTerminateMaybeCopyAndReturnLength( + record->subtype, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAction_NodeHasJavaScript(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + return record && record->javascript.has_value(); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeJavaScript(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!record || !record->javascript.has_value()) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + record->javascript.value(), + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFAction_GetNextCount(EPDF_ACTION_MODEL model, EPDF_ACTION_NODE_ID node) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + return record ? pdfium::checked_cast(record->next.size()) : 0; +} + +FPDF_EXPORT EPDF_ACTION_NODE_ID FPDF_CALLCONV +EPDFAction_GetNextAt(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + int index) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!record || index < 0 || + static_cast(index) >= record->next.size()) { + return EPDF_ACTION_NODE_INVALID; + } + return record->next[static_cast(index)]; +} + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFAction_GetWarningFlags(EPDF_ACTION_MODEL model) { + const epdf::ActionModelData* data = epdf::DataFromHandle(model); + return data ? data->warning_flags : EPDF_ACTION_WARNING_INCOMPLETE; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAction_IsComplete(EPDF_ACTION_MODEL model) { + const epdf::ActionModelData* data = epdf::DataFromHandle(model); + return data && !data->nodes.empty() && + !(data->warning_flags & EPDF_ACTION_WARNING_INCOMPLETE); +} + +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetOpenActionModel(FPDF_DOCUMENT document) { + const CPDF_Dictionary* root = epdf::GetDocumentRoot(document); + return root ? epdf::MakeModelFromDictionary(root->GetDictFor("OpenAction")) + : nullptr; +} + +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetAdditionalActionModel(FPDF_DOCUMENT document, int event) { + static constexpr std::array kKeys = {"WC", "WS", "DS", "WP", + "DP"}; + if (event < 0 || event >= static_cast(kKeys.size())) { + return nullptr; + } + const CPDF_Dictionary* root = epdf::GetDocumentRoot(document); + RetainPtr additional = + root ? root->GetDictFor("AA") : nullptr; + return additional ? epdf::MakeModelFromDictionary( + additional->GetDictFor(kKeys[event])) + : nullptr; +} + +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetPageActionModel(FPDF_DOCUMENT document, + uint32_t page_object_number, + int event) { + if (event != EPDF_PAGE_ACTION_OPEN && event != EPDF_PAGE_ACTION_CLOSE) { + return nullptr; + } + RetainPtr page = + epdf::GetPageDictionaryByObjectNumber(document, page_object_number); + RetainPtr additional = + page ? page->GetDictFor("AA") : nullptr; + const char* key = event == EPDF_PAGE_ACTION_OPEN ? "O" : "C"; + return additional ? epdf::MakeModelFromDictionary(additional->GetDictFor(key)) + : nullptr; +} + +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFAnnot_GetActionModel(FPDF_ANNOTATION annotation, int event) { + static constexpr std::array kAdditionalKeys = { + "E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV", "PI"}; + if (event < EPDF_ANNOT_ACTION_ACTIVATE || + event > EPDF_ANNOT_ACTION_PAGE_INVISIBLE) { + return nullptr; + } + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annotation); + const CPDF_Dictionary* annotation_dict = + context ? context->GetAnnotDict() : nullptr; + if (!annotation_dict) { + return nullptr; + } + if (event == EPDF_ANNOT_ACTION_ACTIVATE) { + return epdf::MakeModelFromDictionary(annotation_dict->GetDictFor("A")); + } + RetainPtr additional = + annotation_dict->GetDictFor("AA"); + const int additional_index = event - EPDF_ANNOT_ACTION_CURSOR_ENTER; + return additional ? epdf::MakeModelFromDictionary(additional->GetDictFor( + kAdditionalKeys[additional_index])) + : nullptr; +} diff --git a/fpdfsdk/epdf_action_embeddertest.cpp b/fpdfsdk/epdf_action_embeddertest.cpp new file mode 100644 index 0000000000..b55a0b7f45 --- /dev/null +++ b/fpdfsdk/epdf_action_embeddertest.cpp @@ -0,0 +1,390 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/epdf_action.h" + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/bytestring.h" +#include "core/fxcrt/retain_ptr.h" +#include "fpdfsdk/cpdfsdk_helpers.h" +#include "public/epdf_form.h" +#include "public/fpdf_annot.h" +#include "public/fpdf_edit.h" +#include "public/fpdf_javascript.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/utils/file_util.h" +#include "testing/utils/path_service.h" + +namespace { + +struct ActionModelDeleter { + void operator()(EPDF_ACTION_MODEL model) const { + EPDFAction_CloseModel(model); + } +}; + +using ScopedEPDFActionModel = + std::unique_ptr; + +std::wstring GetActionJavaScript(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + const unsigned long length = + EPDFAction_GetNodeJavaScript(model, node, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, + EPDFAction_GetNodeJavaScript(model, node, buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetLegacyJavaScript(FPDF_JAVASCRIPT_ACTION action) { + const unsigned long length = + FPDFJavaScriptAction_GetScript(action, nullptr, 0); + if (length == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, + FPDFJavaScriptAction_GetScript(action, buffer.data(), length)); + return GetPlatformWString(buffer.data()); +} + +std::string GetActionSubtype(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + const unsigned long length = + EPDFAction_GetNodeSubtype(model, node, nullptr, 0); + if (length == 0) { + return std::string(); + } + std::vector buffer(length); + EXPECT_EQ(length, + EPDFAction_GetNodeSubtype(model, node, buffer.data(), length)); + return std::string(buffer.data()); +} + +RetainPtr MakeJavaScriptAction(const wchar_t* script) { + auto action = pdfium::MakeRetain(); + action->SetNewFor("S", "JavaScript"); + action->SetNewFor("JS", script); + return action; +} + +} // namespace + +class EPDFActionEmbedderTest : public EmbedderTest {}; + +TEST_F(EPDFActionEmbedderTest, InvalidArguments) { + EXPECT_EQ(EPDF_ACTION_NODE_INVALID, EPDFAction_GetRootNode(nullptr)); + EXPECT_EQ(0, EPDFAction_GetNodeCount(nullptr)); + EXPECT_FALSE(EPDFAction_IsComplete(nullptr)); + EXPECT_FALSE(EPDFDoc_GetOpenActionModel(nullptr)); + EXPECT_FALSE(EPDFDoc_GetAdditionalActionModel( + nullptr, EPDF_DOCUMENT_ACTION_WILL_CLOSE)); + EXPECT_FALSE(EPDFDoc_GetPageActionModel(nullptr, 1, EPDF_PAGE_ACTION_OPEN)); + EXPECT_FALSE(EPDFAnnot_GetActionModel(nullptr, EPDF_ANNOT_ACTION_ACTIVATE)); +} + +TEST_F(EPDFActionEmbedderTest, NamedJavaScriptIndexPairing) { + ASSERT_TRUE(OpenDocument("js.pdf")); + ASSERT_EQ(5, FPDFDoc_GetJavaScriptActionCount(document())); + + for (int index = 0; index < 5; ++index) { + ScopedFPDFJavaScriptAction legacy( + FPDFDoc_GetJavaScriptAction(document(), index)); + ScopedEPDFActionModel model( + EPDFDoc_GetNamedJavaScriptActionModel(document(), index)); + ASSERT_EQ(!!legacy, !!model) << "index " << index; + if (!legacy) { + continue; + } + const EPDF_ACTION_NODE_ID root = EPDFAction_GetRootNode(model.get()); + ASSERT_NE(EPDF_ACTION_NODE_INVALID, root); + EXPECT_EQ(EPDF_ACTION_TYPE_JAVASCRIPT, + EPDFAction_GetNodeType(model.get(), root)); + EXPECT_TRUE(EPDFAction_NodeHasJavaScript(model.get(), root)); + EXPECT_EQ(GetLegacyJavaScript(legacy.get()), + GetActionJavaScript(model.get(), root)); + } + + EXPECT_FALSE(EPDFDoc_GetNamedJavaScriptActionModel(document(), -1)); + EXPECT_FALSE(EPDFDoc_GetNamedJavaScriptActionModel(document(), 5)); +} + +TEST_F(EPDFActionEmbedderTest, NextRenditionCycleAndMalformedEntry) { + ScopedFPDFDocument document(FPDF_CreateNewDocument()); + ASSERT_TRUE(document); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document.get()); + ASSERT_TRUE(doc); + + RetainPtr root = doc->NewIndirect(); + root->SetNewFor("S", "JavaScript"); + root->SetNewFor("JS", L"root();"); + + RetainPtr rendition = doc->NewIndirect(); + rendition->SetNewFor("S", "Rendition"); + const ByteString rendition_script = "rendition();"; + RetainPtr stream = + doc->NewIndirect(rendition_script.unsigned_span()); + rendition->SetNewFor("JS", doc, stream->GetObjNum()); + rendition->SetNewFor("Next", doc, root->GetObjNum()); + + RetainPtr future = doc->NewIndirect(); + future->SetNewFor("S", "FutureAction"); + RetainPtr malformed_next = future->SetNewFor("Next"); + malformed_next->AppendNew(7); + + RetainPtr next = root->SetNewFor("Next"); + next->AppendNew(doc, rendition->GetObjNum()); + next->AppendNew(doc, future->GetObjNum()); + + ScopedEPDFActionModel model( + EPDFAction_LoadModel(FPDFActionFromCPDFDictionary(root.Get()))); + ASSERT_TRUE(model); + ASSERT_EQ(3, EPDFAction_GetNodeCount(model.get())); + const EPDF_ACTION_NODE_ID model_root = EPDFAction_GetRootNode(model.get()); + ASSERT_EQ(0u, model_root); + ASSERT_EQ(2, EPDFAction_GetNextCount(model.get(), model_root)); + + const EPDF_ACTION_NODE_ID rendition_node = + EPDFAction_GetNextAt(model.get(), model_root, 0); + ASSERT_NE(EPDF_ACTION_NODE_INVALID, rendition_node); + EXPECT_EQ(EPDF_ACTION_TYPE_RENDITION, + EPDFAction_GetNodeType(model.get(), rendition_node)); + EXPECT_TRUE(EPDFAction_NodeHasJavaScript(model.get(), rendition_node)); + EXPECT_EQ(L"rendition();", GetActionJavaScript(model.get(), rendition_node)); + EXPECT_EQ(0, EPDFAction_GetNextCount(model.get(), rendition_node)); + + const EPDF_ACTION_NODE_ID future_node = + EPDFAction_GetNextAt(model.get(), model_root, 1); + ASSERT_NE(EPDF_ACTION_NODE_INVALID, future_node); + EXPECT_EQ(EPDF_ACTION_TYPE_UNKNOWN, + EPDFAction_GetNodeType(model.get(), future_node)); + EXPECT_EQ("FutureAction", GetActionSubtype(model.get(), future_node)); + EXPECT_FALSE(EPDFAction_NodeHasJavaScript(model.get(), future_node)); + + const uint32_t warnings = EPDFAction_GetWarningFlags(model.get()); + EXPECT_TRUE(warnings & EPDF_ACTION_WARNING_CYCLE_DROPPED); + EXPECT_TRUE(warnings & EPDF_ACTION_WARNING_MALFORMED_NEXT); + EXPECT_FALSE(warnings & EPDF_ACTION_WARNING_INCOMPLETE); + EXPECT_TRUE(EPDFAction_IsComplete(model.get())); +} + +TEST_F(EPDFActionEmbedderTest, DepthLimitMarksModelIncomplete) { + RetainPtr root = MakeJavaScriptAction(L"root();"); + RetainPtr current = root; + for (int i = 0; i < 64; ++i) { + RetainPtr child = MakeJavaScriptAction(L"next();"); + current->SetFor("Next", child); + current = std::move(child); + } + + ScopedEPDFActionModel model( + EPDFAction_LoadModel(FPDFActionFromCPDFDictionary(root.Get()))); + ASSERT_TRUE(model); + EXPECT_EQ(64, EPDFAction_GetNodeCount(model.get())); + EXPECT_TRUE(EPDFAction_GetWarningFlags(model.get()) & + EPDF_ACTION_WARNING_INCOMPLETE); + EXPECT_FALSE(EPDFAction_IsComplete(model.get())); +} + +TEST_F(EPDFActionEmbedderTest, DocumentAndPageModelsAreDetached) { + ScopedFPDFDocument document(FPDF_CreateNewDocument()); + ASSERT_TRUE(document); + ScopedFPDFPage page(FPDFPage_New(document.get(), 0, 300, 300)); + ASSERT_TRUE(page); + + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document.get()); + ASSERT_TRUE(doc); + RetainPtr root = doc->GetMutableRoot(); + ASSERT_TRUE(root); + root->SetFor("OpenAction", MakeJavaScriptAction(L"open();")); + RetainPtr document_aa = + root->SetNewFor("AA"); + document_aa->SetFor("WS", MakeJavaScriptAction(L"willSave();")); + + CPDF_Page* cpdf_page = CPDFPageFromFPDFPage(page.get()); + ASSERT_TRUE(cpdf_page); + RetainPtr page_dict = cpdf_page->GetMutableDict(); + ASSERT_TRUE(page_dict); + RetainPtr page_aa = + page_dict->SetNewFor("AA"); + page_aa->SetFor("O", MakeJavaScriptAction(L"pageOpen();")); + const uint32_t page_objnum = EPDFPage_GetObjectNumber(page.get()); + ASSERT_GT(page_objnum, 0u); + + ScopedEPDFActionModel open(EPDFDoc_GetOpenActionModel(document.get())); + ScopedEPDFActionModel will_save(EPDFDoc_GetAdditionalActionModel( + document.get(), EPDF_DOCUMENT_ACTION_WILL_SAVE)); + ScopedEPDFActionModel page_open(EPDFDoc_GetPageActionModel( + document.get(), page_objnum, EPDF_PAGE_ACTION_OPEN)); + ASSERT_TRUE(open); + ASSERT_TRUE(will_save); + ASSERT_TRUE(page_open); + EXPECT_FALSE(EPDFDoc_GetAdditionalActionModel(document.get(), -1)); + EXPECT_FALSE(EPDFDoc_GetPageActionModel(document.get(), page_objnum, 9)); + + page.reset(); + document.reset(); + + EXPECT_EQ(L"open();", GetActionJavaScript(open.get(), 0)); + EXPECT_EQ(L"willSave();", GetActionJavaScript(will_save.get(), 0)); + EXPECT_EQ(L"pageOpen();", GetActionJavaScript(page_open.get(), 0)); +} + +TEST_F(EPDFActionEmbedderTest, LayerActionReadsDoNotPromote) { + const std::string path = + PathService::GetTestFilePath("annots_action_handling.pdf"); + ASSERT_FALSE(path.empty()); + const std::vector bytes = GetFileContents(path.c_str()); + ASSERT_FALSE(bytes.empty()); + EPDF_BASE_DOCUMENT base = EPDF_LoadMemBaseDocument( + bytes.data(), static_cast(bytes.size()), nullptr); + ASSERT_TRUE(base); + EPDFLayerOpenStatus status; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status); + ASSERT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(layer.get())); + + bool found_action = false; + const int script_count = FPDFDoc_GetJavaScriptActionCount(layer.get()); + ASSERT_GE(script_count, 0); + for (int index = 0; index < script_count; ++index) { + ScopedEPDFActionModel action( + EPDFDoc_GetNamedJavaScriptActionModel(layer.get(), index)); + found_action = found_action || !!action; + } + for (int event = EPDF_DOCUMENT_ACTION_WILL_CLOSE; + event <= EPDF_DOCUMENT_ACTION_DID_PRINT; ++event) { + ScopedEPDFActionModel action( + EPDFDoc_GetAdditionalActionModel(layer.get(), event)); + found_action = found_action || !!action; + } + ScopedEPDFActionModel open(EPDFDoc_GetOpenActionModel(layer.get())); + found_action = found_action || !!open; + + const int page_count = FPDF_GetPageCount(layer.get()); + for (int page_index = 0; page_index < page_count; ++page_index) { + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), page_index)); + ASSERT_TRUE(page); + const uint32_t page_objnum = EPDFPage_GetObjectNumber(page.get()); + for (int event = EPDF_PAGE_ACTION_OPEN; event <= EPDF_PAGE_ACTION_CLOSE; + ++event) { + ScopedEPDFActionModel action( + EPDFDoc_GetPageActionModel(layer.get(), page_objnum, event)); + found_action = found_action || !!action; + } + const int annotation_count = FPDFPage_GetAnnotCount(page.get()); + for (int annotation_index = 0; annotation_index < annotation_count; + ++annotation_index) { + ScopedFPDFAnnotation annotation( + FPDFPage_GetAnnot(page.get(), annotation_index)); + ASSERT_TRUE(annotation); + for (int event = EPDF_ANNOT_ACTION_ACTIVATE; + event <= EPDF_ANNOT_ACTION_PAGE_INVISIBLE; ++event) { + ScopedEPDFActionModel action( + EPDFAnnot_GetActionModel(annotation.get(), event)); + found_action = found_action || !!action; + } + } + } + EXPECT_TRUE(found_action); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(layer.get())); + + layer.reset(); + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(EPDFActionEmbedderTest, + MergedFieldAndWidgetAdditionalActionsStaySeparate) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + RetainPtr merged = + ToDictionary(doc->GetMutableIndirectObject(4)); + ASSERT_TRUE(merged); + merged->SetNewFor("DV", L"default text"); + RetainPtr aa = merged->SetNewFor("AA"); + aa->SetFor("V", MakeJavaScriptAction(L"validate();")); + aa->SetFor("C", MakeJavaScriptAction(L"calculate();")); + aa->SetFor("Fo", MakeJavaScriptAction(L"focus();")); + aa->SetFor("E", MakeJavaScriptAction(L"enter();")); + + RetainPtr acro_form = + doc->GetMutableRoot()->GetMutableDictFor("AcroForm"); + ASSERT_TRUE(acro_form); + RetainPtr calculation_order = + acro_form->SetNewFor("CO"); + calculation_order->AppendNew(doc, merged->GetObjNum()); + + EPDF_FORM_MODEL form = EPDFForm_LoadModel(document()); + ASSERT_TRUE(form); + ASSERT_EQ(1, EPDFForm_CountFields(form)); + EXPECT_EQ(L"default text", [&]() { + const unsigned long length = + EPDFForm_GetFieldDefaultValueAt(form, 0, 0, nullptr, 0); + std::vector buffer = GetFPDFWideStringBuffer(length); + EXPECT_EQ(length, EPDFForm_GetFieldDefaultValueAt(form, 0, 0, buffer.data(), + length)); + return GetPlatformWString(buffer.data()); + }()); + ASSERT_EQ(1, EPDFForm_CountCalculationOrder(form)); + EXPECT_EQ(0, EPDFForm_GetCalculationOrderFieldIndex(form, 0)); + + ScopedEPDFActionModel validate( + EPDFForm_GetFieldActionModel(form, 0, EPDF_FORM_ACTION_VALIDATE)); + ScopedEPDFActionModel calculate( + EPDFForm_GetFieldActionModel(form, 0, EPDF_FORM_ACTION_CALCULATE)); + EXPECT_FALSE( + EPDFForm_GetFieldActionModel(form, 0, EPDF_FORM_ACTION_KEYSTROKE)); + EXPECT_FALSE(EPDFForm_GetFieldActionModel(form, 0, EPDF_FORM_ACTION_FORMAT)); + ASSERT_TRUE(validate); + ASSERT_TRUE(calculate); + EPDFForm_CloseModel(form); + + ScopedEPDFActionModel focus; + ScopedEPDFActionModel enter; + { + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + { + ScopedFPDFAnnotation widget(FPDFPage_GetAnnot(page, 0)); + ASSERT_TRUE(widget); + focus.reset( + EPDFAnnot_GetActionModel(widget.get(), EPDF_ANNOT_ACTION_FOCUS)); + enter.reset(EPDFAnnot_GetActionModel(widget.get(), + EPDF_ANNOT_ACTION_CURSOR_ENTER)); + // /X is absent. The field /V at the same numeric event position must + // never leak through the annotation event mapping. + EXPECT_FALSE(EPDFAnnot_GetActionModel(widget.get(), + EPDF_ANNOT_ACTION_CURSOR_EXIT)); + } + UnloadPage(page); + } + ASSERT_TRUE(focus); + ASSERT_TRUE(enter); + + CloseDocument(); + EXPECT_EQ(L"validate();", GetActionJavaScript(validate.get(), 0)); + EXPECT_EQ(L"calculate();", GetActionJavaScript(calculate.get(), 0)); + EXPECT_EQ(L"focus();", GetActionJavaScript(focus.get(), 0)); + EXPECT_EQ(L"enter();", GetActionJavaScript(enter.get(), 0)); +} diff --git a/fpdfsdk/epdf_action_helpers.h b/fpdfsdk/epdf_action_helpers.h new file mode 100644 index 0000000000..19b12487cb --- /dev/null +++ b/fpdfsdk/epdf_action_helpers.h @@ -0,0 +1,24 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FPDFSDK_EPDF_ACTION_HELPERS_H_ +#define FPDFSDK_EPDF_ACTION_HELPERS_H_ + +#include + +#include "public/epdf_action.h" + +class CPDF_Action; + +namespace epdf { + +struct ActionModelData; +using ActionModelDataPtr = std::shared_ptr; + +ActionModelDataPtr BuildActionModel(const CPDF_Action& action); +EPDF_ACTION_MODEL MakeActionModelHandle(ActionModelDataPtr data); + +} // namespace epdf + +#endif // FPDFSDK_EPDF_ACTION_HELPERS_H_ diff --git a/fpdfsdk/epdf_flatten.cpp b/fpdfsdk/epdf_flatten.cpp new file mode 100644 index 0000000000..d06714026b --- /dev/null +++ b/fpdfsdk/epdf_flatten.cpp @@ -0,0 +1,813 @@ +// Copyright 2014 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_flatten.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "constants/annotation_common.h" +#include "constants/annotation_flags.h" +#include "constants/font_encodings.h" +#include "constants/page_object.h" +#include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" +#include "core/fpdfapi/page/cpdf_annotcontext.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxcrt/fx_string_wrappers.h" +#include "fpdfsdk/cpdfsdk_helpers.h" + +namespace { + +struct FlattenCandidate { + size_t annotation_index = 0; + uint32_t annotation_object_number = 0; + RetainPtr annotation; + RetainPtr appearance; + CFX_FloatRect annotation_rect; + CFX_FloatRect appearance_rect; + CFX_Matrix appearance_matrix; +}; + +struct FlattenPlan { + bool target_found = false; + std::vector candidates; +}; + +struct FlattenTarget { + uint32_t annotation_object_number = 0; + int annotation_index = -1; + const CPDF_Dictionary* annotation = nullptr; +}; + +bool IsValidUsage(int usage) { + return usage == FLAT_NORMALDISPLAY || usage == FLAT_PRINT; +} + +uint32_t GetObjectNumber(const CPDF_Object* entry, + const CPDF_Dictionary* dictionary) { + const CPDF_Reference* reference = ToReference(entry); + return reference ? reference->GetRefObjNum() + : (dictionary ? dictionary->GetObjNum() : 0); +} + +bool IsEligibleForUsage(const CPDF_Dictionary* annotation, int usage) { + if (!annotation || + annotation->GetByteStringFor(pdfium::annotation::kSubtype) == "Popup") { + return false; + } + + const int flags = annotation->GetIntegerFor("F"); + if (flags & pdfium::annotation_flags::kHidden) { + return false; + } + return usage == FLAT_NORMALDISPLAY + ? !(flags & pdfium::annotation_flags::kInvisible) + : !!(flags & pdfium::annotation_flags::kPrint); +} + +RetainPtr GetEffectiveObject(CPDF_Document* document, + const CPDF_Object* entry) { + if (!entry) { + return nullptr; + } + const CPDF_Reference* reference = ToReference(entry); + return reference && document + ? document->GetOrParseIndirectObject(reference->GetRefObjNum()) + : pdfium::WrapRetain(entry); +} + +RetainPtr GetNormalAppearance( + CPDF_Document* document, + const CPDF_Dictionary* annotation) { + RetainPtr appearance_entry = + annotation ? annotation->GetObjectFor(pdfium::annotation::kAP) : nullptr; + RetainPtr appearance = + ToDictionary(GetEffectiveObject(document, appearance_entry.Get())); + if (!appearance) { + return nullptr; + } + + RetainPtr normal_entry = appearance->GetObjectFor("N"); + RetainPtr normal = + GetEffectiveObject(document, normal_entry.Get()); + if (!normal) { + return nullptr; + } + if (const CPDF_Stream* stream = normal->AsStream()) { + return pdfium::WrapRetain(stream); + } + + const CPDF_Dictionary* states = normal->AsDictionary(); + if (!states) { + return nullptr; + } + + const ByteString state = annotation->GetByteStringFor("AS"); + if (!state.IsEmpty()) { + RetainPtr state_entry = + states->GetObjectFor(state.AsStringView()); + return ToStream(GetEffectiveObject(document, state_entry.Get())); + } + + CPDF_DictionaryLocker locker(states); + for (const auto& item : locker) { + RetainPtr direct = + GetEffectiveObject(document, item.second.Get()); + if (direct && direct->IsStream()) { + return pdfium::WrapRetain(direct->AsStream()); + } + } + return nullptr; +} + +std::optional MakeCandidate( + CPDF_Document* document, + size_t annotation_index, + const CPDF_Object* entry, + RetainPtr annotation, + int usage) { + if (!IsEligibleForUsage(annotation.Get(), usage)) { + return std::nullopt; + } + + RetainPtr appearance = + GetNormalAppearance(document, annotation.Get()); + if (!appearance) { + return std::nullopt; + } + + CFX_FloatRect annotation_rect = + annotation->GetRectFor(pdfium::annotation::kRect); + annotation_rect.Normalize(); + if (annotation_rect.IsEmpty()) { + return std::nullopt; + } + + RetainPtr appearance_dict = appearance->GetDict(); + CFX_FloatRect appearance_rect; + if (appearance_dict->KeyExist("Rect")) { + appearance_rect = appearance_dict->GetRectFor("Rect"); + } else { + appearance_rect = appearance_dict->GetRectFor("BBox"); + } + appearance_rect.Normalize(); + if (appearance_rect.IsEmpty()) { + return std::nullopt; + } + const CFX_Matrix appearance_matrix = appearance_dict->GetMatrixFor("Matrix"); + CFX_FloatRect transformed_appearance_rect = + appearance_matrix.TransformRect(appearance_rect); + transformed_appearance_rect.Normalize(); + if (transformed_appearance_rect.IsEmpty()) { + return std::nullopt; + } + + FlattenCandidate candidate; + candidate.annotation_index = annotation_index; + candidate.annotation_object_number = GetObjectNumber(entry, annotation.Get()); + candidate.annotation = std::move(annotation); + candidate.appearance = std::move(appearance); + candidate.annotation_rect = annotation_rect; + candidate.appearance_rect = appearance_rect; + candidate.appearance_matrix = appearance_matrix; + return candidate; +} + +FlattenPlan BuildFlattenPlan(CPDF_Document* document, + const CPDF_Dictionary* page, + const FlattenTarget* target, + int usage) { + FlattenPlan plan; + RetainPtr annotations_entry = + page ? page->GetObjectFor("Annots") : nullptr; + RetainPtr annotations = + ToArray(GetEffectiveObject(document, annotations_entry.Get())); + if (!annotations) { + return plan; + } + + for (size_t i = 0; i < annotations->size(); ++i) { + RetainPtr entry = annotations->GetObjectAt(i); + RetainPtr annotation = + ToDictionary(GetEffectiveObject(document, entry.Get())); + if (!annotation) { + continue; + } + + const uint32_t object_number = + GetObjectNumber(entry.Get(), annotation.Get()); + if (target) { + const bool matches = + target->annotation_object_number != 0 + ? object_number == target->annotation_object_number + : annotation.Get() == target->annotation || + (target->annotation_index >= 0 && + i == static_cast(target->annotation_index)); + if (!matches) { + continue; + } + plan.target_found = true; + } + + std::optional candidate = + MakeCandidate(document, i, entry.Get(), std::move(annotation), usage); + if (candidate) { + plan.candidates.push_back(std::move(*candidate)); + } + if (target) { + break; + } + } + return plan; +} + +bool IsSamePage(CPDF_Page* page, CPDF_AnnotContext* annotation) { + CPDF_Page* annotation_page = annotation && annotation->GetPage() + ? annotation->GetPage()->AsPDFPage() + : nullptr; + if (!page || !annotation_page || + page->GetDocument() != annotation_page->GetDocument()) { + return false; + } + + RetainPtr page_dictionary = page->GetDict(); + RetainPtr annotation_page_dictionary = + annotation_page->GetDict(); + if (!page_dictionary || !annotation_page_dictionary) { + return false; + } + + const uint32_t page_object_number = page_dictionary->GetObjNum(); + const uint32_t annotation_page_object_number = + annotation_page_dictionary->GetObjNum(); + return page_object_number != 0 && annotation_page_object_number != 0 + ? page_object_number == annotation_page_object_number + : page_dictionary.Get() == annotation_page_dictionary.Get(); +} + +ByteString GenerateFlattenedContent(const ByteString& key) { + return "q 1 0 0 1 0 0 cm /" + key + " Do Q"; +} + +RetainPtr NewIndirectContentsStreamReference( + CPDF_Document* document, + const ByteString& contents) { + auto pNewContents = + document->NewIndirect(document->New()); + pNewContents->SetData(contents.unsigned_span()); + return pNewContents->MakeReference(document); +} + +void AppendExistingContentStream(CPDF_Document* document, + const CPDF_Object* entry, + CPDF_Array* destination) { + if (!document || !entry || !destination) { + return; + } + + RetainPtr direct = entry->GetDirect(); + const CPDF_Stream* stream = ToStream(direct.Get()); + if (!stream) { + return; + } + + const CPDF_Reference* reference = ToReference(entry); + const uint32_t object_number = + reference ? reference->GetRefObjNum() : stream->GetObjNum(); + if (object_number != 0) { + destination->AppendNew(document, object_number); + return; + } + + RetainPtr clone = ToStream(stream->CloneForHolder(document)); + if (!clone) { + return; + } + const uint32_t clone_object_number = document->AddIndirectObject(clone); + destination->AppendNew(document, clone_object_number); +} + +void AppendExistingContents(CPDF_Document* document, + const CPDF_Object* contents, + CPDF_Array* destination) { + if (!contents) { + return; + } + + RetainPtr direct = contents->GetDirect(); + const CPDF_Array* array = ToArray(direct.Get()); + if (!array) { + AppendExistingContentStream(document, contents, destination); + return; + } + + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr entry = array->GetObjectAt(i); + AppendExistingContentStream(document, entry.Get(), destination); + } +} + +void SetPageContents(const ByteString& key, + CPDF_Dictionary* page, + CPDF_Document* document) { + RetainPtr existing = + page->GetObjectFor(pdfium::page_object::kContents); + if (!existing) { + page->SetFor(pdfium::page_object::kContents, + NewIndirectContentsStreamReference( + document, GenerateFlattenedContent(key))); + return; + } + + auto contents = document->NewIndirect(); + contents->Append(NewIndirectContentsStreamReference(document, "q")); + AppendExistingContents(document, existing.Get(), contents.Get()); + contents->Append(NewIndirectContentsStreamReference(document, "Q")); + contents->Append(NewIndirectContentsStreamReference( + document, GenerateFlattenedContent(key))); + page->SetNewFor(pdfium::page_object::kContents, document, + contents->GetObjNum()); +} + +CFX_Matrix GetMatrix(const CFX_FloatRect& rcAnnot, + const CFX_FloatRect& rcStream, + const CFX_Matrix& matrix) { + if (rcStream.IsEmpty()) { + return CFX_Matrix(); + } + + CFX_FloatRect rcTransformed = matrix.TransformRect(rcStream); + rcTransformed.Normalize(); + + float a = rcAnnot.Width() / rcTransformed.Width(); + float d = rcAnnot.Height() / rcTransformed.Height(); + + float e = rcAnnot.left - rcTransformed.left * a; + float f = rcAnnot.bottom - rcTransformed.bottom * d; + return CFX_Matrix(a, 0.0f, 0.0f, d, e, f); +} + +bool IsValidBaseEncoding(ByteString base_encoding) { + // ISO 32000-1:2008 spec, table 114. + // ISO 32000-2:2020 spec, table 112. + // + // Since /BaseEncoding is optional, `base_encoding` can be empty. + return base_encoding.IsEmpty() || + base_encoding == pdfium::font_encodings::kWinAnsiEncoding || + base_encoding == pdfium::font_encodings::kMacRomanEncoding || + base_encoding == pdfium::font_encodings::kMacExpertEncoding; +} + +void SanitizeFont(RetainPtr font_dict) { + if (!font_dict) { + return; + } + + RetainPtr encoding_dict = + font_dict->GetMutableDictFor("Encoding"); + if (encoding_dict) { + if (!IsValidBaseEncoding(encoding_dict->GetNameFor("BaseEncoding"))) { + font_dict->RemoveFor("Encoding"); + } + } +} + +void SanitizeFontResources(RetainPtr font_resource_dict) { + if (!font_resource_dict) { + return; + } + + CPDF_DictionaryLocker locker(font_resource_dict); + for (auto it : locker) { + SanitizeFont(ToDictionary(it.second->GetMutableDirect())); + } +} + +void SanitizeResources(RetainPtr resources_dict) { + if (!resources_dict) { + return; + } + + SanitizeFontResources(resources_dict->GetMutableDictFor("Font")); +} + +RetainPtr GetInheritedDictionary( + const CPDF_Dictionary* page, + ByteStringView key) { + std::set visited; + const CPDF_Dictionary* current = page; + while (current && !visited.contains(current)) { + RetainPtr value = current->GetDictFor(key); + if (value) { + return value; + } + visited.insert(current); + current = current->GetDictFor(pdfium::page_object::kParent).Get(); + } + return nullptr; +} + +CFX_FloatRect GetInheritedRect(const CPDF_Dictionary* page, + ByteStringView key) { + std::set visited; + const CPDF_Dictionary* current = page; + while (current && !visited.contains(current)) { + if (current->KeyExist(key)) { + CFX_FloatRect rect = current->GetRectFor(key); + rect.Normalize(); + return rect; + } + visited.insert(current); + current = current->GetDictFor(pdfium::page_object::kParent).Get(); + } + return CFX_FloatRect(); +} + +// Give the page a private resource dictionary and a private /XObject child. +// This both preserves inherited resources and avoids mutating a resource +// dictionary shared by the base document or another page. +RetainPtr CreateLocalPageXObjects(CPDF_Document* document, + CPDF_Dictionary* page) { + if (!document || !page) { + return nullptr; + } + + RetainPtr effective_resources = + GetInheritedDictionary(page, pdfium::page_object::kResources); + RetainPtr local_resources = + effective_resources + ? ToDictionary(effective_resources->CloneForHolder(document)) + : document->New(); + if (!local_resources) { + return nullptr; + } + + RetainPtr existing_xobjects = + local_resources->GetDictFor("XObject"); + RetainPtr local_xobjects = + existing_xobjects + ? ToDictionary(existing_xobjects->CloneForHolder(document)) + : document->New(); + if (!local_xobjects) { + return nullptr; + } + + local_resources->SetFor("XObject", local_xobjects); + page->SetFor(pdfium::page_object::kResources, local_resources); + return local_xobjects; +} + +RetainPtr GetMutableArrayMember(CPDF_Document* document, + CPDF_Dictionary* dictionary, + ByteStringView key) { + if (!document || !dictionary) { + return nullptr; + } + RetainPtr entry = dictionary->GetObjectFor(key); + if (const CPDF_Reference* reference = ToReference(entry.Get())) { + return ToArray( + document->GetMutableIndirectObject(reference->GetRefObjNum())); + } + return dictionary->GetMutableArrayFor(key); +} + +bool RemoveObjectFromArray(CPDF_Array* array, + uint32_t object_number, + const CPDF_Dictionary* dictionary) { + if (!array) { + return false; + } + + bool removed = false; + for (size_t i = array->size(); i > 0; --i) { + RetainPtr entry = array->GetObjectAt(i - 1); + const CPDF_Reference* reference = ToReference(entry.Get()); + if ((reference && object_number != 0 && + reference->GetRefObjNum() == object_number) || + (!reference && entry.Get() == dictionary)) { + array->RemoveAt(i - 1); + removed = true; + } + } + return removed; +} + +RetainPtr GetMutableAcroForm(CPDF_Document* document) { + const CPDF_Dictionary* root = document ? document->GetRoot() : nullptr; + RetainPtr entry = + root ? root->GetObjectFor("AcroForm") : nullptr; + if (const CPDF_Reference* reference = ToReference(entry.Get())) { + return ToDictionary( + document->GetMutableIndirectObject(reference->GetRefObjNum())); + } + if (!entry) { + return nullptr; + } + RetainPtr mutable_root = document->GetMutableRoot(); + return mutable_root ? mutable_root->GetMutableDictFor("AcroForm") : nullptr; +} + +void UnlinkMergedFieldAndPruneAncestors(CPDF_Document* document, + uint32_t field_object_number) { + uint32_t current = field_object_number; + for (int depth = 0; current != 0 && depth < 32; ++depth) { + RetainPtr node = + ToDictionary(document->GetOrParseIndirectObject(current)); + if (!node) { + return; + } + + RetainPtr parent = node->GetDictFor("Parent"); + if (parent && parent->GetObjNum() != 0) { + RetainPtr mutable_parent = + ToDictionary(document->GetMutableIndirectObject(parent->GetObjNum())); + RetainPtr parent_kids = + GetMutableArrayMember(document, mutable_parent.Get(), "Kids"); + if (!mutable_parent || + !RemoveObjectFromArray(parent_kids.Get(), current, node.Get())) { + return; + } + if (!parent_kids->IsEmpty() || mutable_parent->KeyExist("FT")) { + return; + } + mutable_parent->RemoveFor("Kids"); + current = parent->GetObjNum(); + continue; + } + + RetainPtr acro_form = GetMutableAcroForm(document); + RetainPtr fields = + GetMutableArrayMember(document, acro_form.Get(), "Fields"); + RemoveObjectFromArray(fields.Get(), current, node.Get()); + return; + } +} + +// A flattened widget must no longer remain reachable through the AcroForm +// field tree. Separate widgets leave their logical field behind as an +// unplaced field. A merged field/widget is removed from its parent field array. +void DetachFlattenedWidget(CPDF_Document* document, + const FlattenCandidate& candidate, + CPDF_Dictionary* mutable_annotation) { + if (!document || !mutable_annotation || + candidate.annotation->GetNameFor(pdfium::annotation::kSubtype) != + "Widget") { + return; + } + + RetainPtr original_parent = + candidate.annotation->GetDictFor("Parent"); + RetainPtr mutable_parent; + if (original_parent && original_parent->GetObjNum() != 0) { + mutable_parent = ToDictionary( + document->GetMutableIndirectObject(original_parent->GetObjNum())); + } else if (original_parent) { + mutable_parent = mutable_annotation->GetMutableDictFor("Parent"); + } + + const bool is_merged_field = candidate.annotation->KeyExist("FT"); + if (is_merged_field && candidate.annotation_object_number != 0) { + UnlinkMergedFieldAndPruneAncestors(document, + candidate.annotation_object_number); + mutable_annotation->RemoveFor("Parent"); + return; + } + + if (mutable_parent) { + RetainPtr kids = + GetMutableArrayMember(document, mutable_parent.Get(), "Kids"); + RemoveObjectFromArray(kids.Get(), candidate.annotation_object_number, + mutable_annotation); + + if (kids && kids->IsEmpty()) { + // A separate widget's terminal field remains visible as an unplaced + // field. + mutable_parent->RemoveFor("Kids"); + } + mutable_annotation->RemoveFor("Parent"); + return; + } + + if (!is_merged_field) { + return; // An orphan widget was never part of the AcroForm field tree. + } + + RetainPtr acro_form = GetMutableAcroForm(document); + RetainPtr fields = + GetMutableArrayMember(document, acro_form.Get(), "Fields"); + RemoveObjectFromArray(fields.Get(), candidate.annotation_object_number, + mutable_annotation); +} + +int ApplyFlattenPlan(CPDF_Document* document, + RetainPtr page, + std::vector candidates) { + if (!document || !page || candidates.empty()) { + return FLATTEN_FAIL; + } + + struct PreparedAppearance { + FlattenCandidate candidate; + RetainPtr stream; + }; + std::vector prepared; + prepared.reserve(candidates.size()); + for (FlattenCandidate& candidate : candidates) { + RetainPtr stream = + ToStream(candidate.appearance->CloneForHolder(document)); + if (!stream) { + continue; + } + prepared.push_back({std::move(candidate), std::move(stream)}); + } + if (prepared.empty()) { + return FLATTEN_FAIL; + } + + CFX_FloatRect media_box = + GetInheritedRect(page.Get(), pdfium::page_object::kMediaBox); + if (media_box.IsEmpty()) { + media_box = CFX_FloatRect(0.0f, 0.0f, 612.0f, 792.0f); + } + + CFX_FloatRect crop_box = + GetInheritedRect(page.Get(), pdfium::page_object::kCropBox); + if (crop_box.IsEmpty()) { + crop_box = media_box; + } + + page->SetRectFor(pdfium::page_object::kMediaBox, media_box); + page->SetRectFor(pdfium::page_object::kCropBox, crop_box); + + RetainPtr page_xobjects = + CreateLocalPageXObjects(document, page.Get()); + if (!page_xobjects) { + return FLATTEN_FAIL; + } + + ByteString page_form_name; + for (int i = 0; i < INT_MAX; ++i) { + ByteString candidate_name = ByteString::Format("FFT%d", i); + if (!page_xobjects->KeyExist(candidate_name.AsStringView())) { + page_form_name = std::move(candidate_name); + break; + } + } + if (page_form_name.IsEmpty()) { + return FLATTEN_FAIL; + } + + auto page_form = + document->NewIndirect(document->New()); + RetainPtr page_form_dict = page_form->GetMutableDict(); + RetainPtr page_form_resources = + page_form_dict->SetNewFor("Resources"); + RetainPtr form_xobjects = + page_form_resources->SetNewFor("XObject"); + page_form_dict->SetNewFor("Type", "XObject"); + page_form_dict->SetNewFor("Subtype", "Form"); + page_form_dict->SetNewFor("FormType", 1); + page_form_dict->SetRectFor("BBox", crop_box); + + ByteString form_content; + for (size_t i = 0; i < prepared.size(); ++i) { + PreparedAppearance& item = prepared[i]; + RetainPtr appearance_dict = item.stream->GetMutableDict(); + appearance_dict->SetNewFor("Type", "XObject"); + appearance_dict->SetNewFor("Subtype", "Form"); + SanitizeResources(appearance_dict->GetMutableDictFor("Resources")); + + const uint32_t appearance_object_number = + document->AddIndirectObject(item.stream); + const ByteString form_name = ByteString::Format("F%zu", i); + form_xobjects->SetNewFor(form_name, document, + appearance_object_number); + + CFX_Matrix matrix = GetMatrix(item.candidate.annotation_rect, + item.candidate.appearance_rect, + item.candidate.appearance_matrix); + matrix.b = 0; + matrix.c = 0; + fxcrt::ostringstream buffer; + WriteMatrix(buffer, matrix); + form_content += ByteString::Format( + "q %s cm /%s Do Q\n", ByteString(buffer).c_str(), form_name.c_str()); + } + page_form->SetDataAndRemoveFilter(form_content.unsigned_span()); + page_xobjects->SetNewFor(page_form_name, document, + page_form->GetObjNum()); + SetPageContents(page_form_name, page.Get(), document); + + RetainPtr annotations = + GetMutableArrayMember(document, page.Get(), "Annots"); + if (!annotations) { + return FLATTEN_FAIL; + } + + // Resolve widget dictionaries while their page-array entries still exist. + for (PreparedAppearance& item : prepared) { + if (item.candidate.annotation->GetNameFor(pdfium::annotation::kSubtype) != + "Widget") { + continue; + } + RetainPtr mutable_annotation; + if (item.candidate.annotation_object_number != 0) { + mutable_annotation = ToDictionary(document->GetMutableIndirectObject( + item.candidate.annotation_object_number)); + } else if (item.candidate.annotation_index < annotations->size()) { + mutable_annotation = + annotations->GetMutableDictAt(item.candidate.annotation_index); + } + if (mutable_annotation) { + DetachFlattenedWidget(document, item.candidate, mutable_annotation.Get()); + } + } + + std::sort(prepared.begin(), prepared.end(), + [](const PreparedAppearance& lhs, const PreparedAppearance& rhs) { + return lhs.candidate.annotation_index > + rhs.candidate.annotation_index; + }); + for (const PreparedAppearance& item : prepared) { + if (item.candidate.annotation_index < annotations->size()) { + annotations->RemoveAt(item.candidate.annotation_index); + } + } + if (annotations->IsEmpty()) { + page->RemoveFor("Annots"); + } + return FLATTEN_SUCCESS; +} + +int FlattenPage(CPDF_Page* page, const FlattenTarget* target, int usage) { + CPDF_Document* document = page ? page->GetDocument() : nullptr; + RetainPtr const_page = + page ? page->GetDict() : nullptr; + if (!document || !const_page || !IsValidUsage(usage)) { + return FLATTEN_FAIL; + } + + FlattenPlan plan = + BuildFlattenPlan(document, const_page.Get(), target, usage); + if (target && !plan.target_found) { + return FLATTEN_FAIL; + } + if (plan.candidates.empty()) { + return FLATTEN_NOTHINGTODO; + } + RetainPtr mutable_page = page->GetMutableDict(); + if (!mutable_page) { + return FLATTEN_FAIL; + } + return ApplyFlattenPlan(document, std::move(mutable_page), + std::move(plan.candidates)); +} + +} // namespace + +FPDF_EXPORT int FPDF_CALLCONV EPDFPage_Flatten(FPDF_PAGE page, int usage) { + CPDF_Page* pdf_page = CPDFPageFromFPDFPage(page); + if (!pdf_page || !IsValidUsage(usage)) { + return FLATTEN_FAIL; + } + return FlattenPage(pdf_page, nullptr, usage); +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, + FPDF_ANNOTATION annot, + int usage) { + CPDF_Page* pdf_page = CPDFPageFromFPDFPage(page); + CPDF_AnnotContext* annotation = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!pdf_page || !annotation || !IsValidUsage(usage) || + !IsSamePage(pdf_page, annotation)) { + return FLATTEN_FAIL; + } + + const CPDF_Dictionary* annotation_dictionary = annotation->GetAnnotDict(); + if (!annotation_dictionary) { + return FLATTEN_FAIL; + } + + const FlattenTarget target = {annotation_dictionary->GetObjNum(), + annotation->GetAnnotIndex(), + annotation_dictionary}; + return FlattenPage(pdf_page, &target, usage); +} diff --git a/fpdfsdk/epdf_form.cpp b/fpdfsdk/epdf_form.cpp index 050740e799..9bce5c7a58 100644 --- a/fpdfsdk/epdf_form.cpp +++ b/fpdfsdk/epdf_form.cpp @@ -5,6 +5,7 @@ #include "public/epdf_form.h" #include +#include #include #include #include @@ -12,6 +13,7 @@ #include #include +#include "constants/annotation_flags.h" #include "constants/form_fields.h" #include "constants/form_flags.h" #include "core/fpdfapi/parser/cfdf_document.h" @@ -23,6 +25,8 @@ #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_action.h" #include "core/fpdfdoc/cpdf_formcontrol.h" #include "core/fpdfdoc/cpdf_formfield.h" #include "core/fpdfdoc/cpdf_generateap.h" @@ -43,6 +47,7 @@ #include "core/fxcrt/xml/cfx_xmlparser.h" #include "core/fxcrt/xml/cfx_xmltext.h" #include "fpdfsdk/cpdfsdk_helpers.h" +#include "fpdfsdk/epdf_action_helpers.h" namespace { @@ -60,6 +65,11 @@ struct OptionRecord { bool selected = false; }; +struct FieldValueRecord { + int kind = EPDF_FORM_VALUE_NONE; + std::vector values; +}; + struct FieldRecord { uint32_t objnum = 0; int family = EPDF_FORMFIELD_FAMILY_UNKNOWN; @@ -69,10 +79,11 @@ struct FieldRecord { WideString fqn; WideString alternate_name; WideString mapping_name; - WideString value; - WideString default_value; + FieldValueRecord value; + FieldValueRecord default_value; std::vector options; std::vector widgets; + std::array actions; }; // A detached, immutable snapshot. Holds no pointers into the document, so @@ -84,6 +95,7 @@ struct FormModel { std::vector fields; std::map field_index_by_objnum; std::map field_index_by_widget_objnum; + std::vector calculation_order; }; FormModel* FormModelFromHandle(EPDF_FORM_MODEL model) { @@ -159,6 +171,36 @@ bool IsChoiceFamily(int family) { family == EPDF_FORMFIELD_FAMILY_LISTBOX; } +FieldValueRecord SnapshotFieldValue(RetainPtr object) { + FieldValueRecord record; + if (!object || object->IsNull()) { + return record; + } + if (object->IsString() || object->IsName()) { + record.kind = EPDF_FORM_VALUE_SCALAR; + record.values.push_back(object->GetUnicodeText()); + return record; + } + const CPDF_Array* array = object->AsArray(); + if (!array) { + record.kind = EPDF_FORM_VALUE_UNSUPPORTED; + return record; + } + + record.kind = EPDF_FORM_VALUE_ARRAY; + record.values.reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr element = array->GetDirectObjectAt(i); + if (!element || !element->IsString()) { + record.kind = EPDF_FORM_VALUE_UNSUPPORTED; + record.values.clear(); + return record; + } + record.values.push_back(element->GetUnicodeText()); + } + return record; +} + size_t CountFormFields(const CPDF_InteractiveForm& form) { return form.CountFields(WideString()); } @@ -207,7 +249,8 @@ std::map SweepPageWidgets( } RetainPtr annot; if (const CPDF_Reference* ref = element->AsReference()) { - annot = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + annot = + ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); } else { annot = ToDictionary(std::move(element)); } @@ -251,8 +294,21 @@ FieldRecord SnapshotField( record.fqn = field->GetFullName(); record.alternate_name = field->GetAlternateName(); record.mapping_name = field->GetMappingName(); - record.value = field->GetValue(); - record.default_value = field->GetDefaultValue(); + record.value = SnapshotFieldValue( + CPDF_FormField::GetFieldAttrForDict(field_dict, pdfium::form_fields::kV)); + record.default_value = SnapshotFieldValue(CPDF_FormField::GetFieldAttrForDict( + field_dict, pdfium::form_fields::kDV)); + + static constexpr std::array kActionTypes = { + CPDF_AAction::kKeyStroke, CPDF_AAction::kFormat, CPDF_AAction::kValidate, + CPDF_AAction::kCalculate}; + CPDF_AAction additional_actions = field->GetAdditionalAction(); + for (size_t i = 0; i < kActionTypes.size(); ++i) { + if (additional_actions.ActionExist(kActionTypes[i])) { + record.actions[i] = + epdf::BuildActionModel(additional_actions.GetAction(kActionTypes[i])); + } + } if (record.family == EPDF_FORMFIELD_FAMILY_TEXT) { record.max_len = field->GetMaxLen(); } @@ -313,9 +369,9 @@ constexpr char kOffState[] = "Off"; // One widget of a terminal field, resolved for a transaction. struct TxnControl { - uint32_t objnum = 0; // 0 for direct (spec-violating) kid dictionaries. + uint32_t objnum = 0; // 0 for direct (spec-violating) kid dictionaries. size_t kids_index = 0; - bool merged = false; // The control IS the field dictionary. + bool merged = false; // The control IS the field dictionary. RetainPtr dict; // Planning-phase resolution. ByteString on_state; WideString export_value; @@ -333,15 +389,43 @@ RetainPtr ResolveFieldDict(CPDF_Document* doc, return ToDictionary(doc->GetOrParseIndirectObject(field_objnum)); } +RetainPtr ResolveParentFieldDict( + CPDF_Document* doc, + const CPDF_Dictionary* field) { + RetainPtr parent_object = + field ? field->GetObjectFor(pdfium::form_fields::kParent) : nullptr; + if (!parent_object) { + return nullptr; + } + if (const CPDF_Reference* reference = parent_object->AsReference()) { + return ToDictionary( + doc->GetOrParseIndirectObject(reference->GetRefObjNum())); + } + return ToDictionary(parent_object->GetDirect()); +} + +bool HasInheritedFieldAttribute(CPDF_Document* doc, + const CPDF_Dictionary* field, + ByteStringView key) { + RetainPtr current = ResolveParentFieldDict(doc, field); + for (int depth = 0; current && depth < 32; ++depth) { + if (current->KeyExist(key)) { + return true; + } + current = ResolveParentFieldDict(doc, current.Get()); + } + return false; +} + ByteString InheritedFieldType(const CPDF_Dictionary* field_dict) { - RetainPtr ft = CPDF_FormField::GetFieldAttrForDict( - field_dict, pdfium::form_fields::kFT); + RetainPtr ft = + CPDF_FormField::GetFieldAttrForDict(field_dict, pdfium::form_fields::kFT); return ft ? ft->GetString() : ByteString(); } uint32_t InheritedFieldFlags(const CPDF_Dictionary* field_dict) { - RetainPtr ff = CPDF_FormField::GetFieldAttrForDict( - field_dict, pdfium::form_fields::kFf); + RetainPtr ff = + CPDF_FormField::GetFieldAttrForDict(field_dict, pdfium::form_fields::kFf); return ff ? static_cast(ff->GetInteger()) : 0; } @@ -382,8 +466,7 @@ bool CollectTxnControls(CPDF_Document* doc, std::vector* out) { RetainPtr opt_array; if (want_toggle_info) { - opt_array = ToArray( - CPDF_FormField::GetFieldAttrForDict(field_dict, "Opt")); + opt_array = ToArray(CPDF_FormField::GetFieldAttrForDict(field_dict, "Opt")); } auto finish_control = [&](TxnControl control) { @@ -476,9 +559,116 @@ void ReportChangedWidgets(const std::vector& changed_objnums, } CPDF_GenerateAP::FormType ChoiceFormType(uint32_t flags) { - return (flags & pdfium::form_flags::kChoiceCombo) - ? CPDF_GenerateAP::kComboBox - : CPDF_GenerateAP::kListBox; + return (flags & pdfium::form_flags::kChoiceCombo) ? CPDF_GenerateAP::kComboBox + : CPDF_GenerateAP::kListBox; +} + +struct NormalizedChoiceValues { + bool free_text = false; + std::vector> matched; +}; + +std::optional> ReadChoiceValues( + const CPDF_Object* object) { + std::vector values; + if (!object || object->IsNull()) { + return values; + } + if (object->IsString()) { + values.push_back(object->GetUnicodeText()); + return values; + } + const CPDF_Array* array = object->AsArray(); + if (!array) { + return std::nullopt; + } + values.reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr element = array->GetDirectObjectAt(i); + if (!element || !element->IsString()) { + return std::nullopt; + } + values.push_back(element->GetUnicodeText()); + } + return values; +} + +std::vector FilterChoiceValues( + const std::vector& values, + const std::vector& available_exports, + bool preserve_free_text) { + std::vector kept; + for (const WideString& value : values) { + if (pdfium::Contains(available_exports, value)) { + kept.push_back(value); + } + } + if (kept.empty() && preserve_free_text && !values.empty()) { + kept = values; + } + return kept; +} + +std::optional NormalizeChoiceValues( + const CPDF_Dictionary* field, + uint32_t flags, + const std::vector& values) { + const bool is_combo = flags & pdfium::form_flags::kChoiceCombo; + const bool is_edit = flags & pdfium::form_flags::kChoiceEdit; + const bool is_multi = flags & pdfium::form_flags::kChoiceMultiSelect; + if (values.size() > 1 && (is_combo || !is_multi)) { + return std::nullopt; + } + + RetainPtr opt_array = + ToArray(CPDF_FormField::GetFieldAttrForDict(field, "Opt")); + NormalizedChoiceValues normalized; + bool all_matched = true; + for (const WideString& value : values) { + bool found = false; + if (opt_array) { + for (size_t i = 0; i < opt_array->size(); ++i) { + if (OptExportAt(opt_array.Get(), i) == value) { + normalized.matched.emplace_back(i, value); + found = true; + break; + } + } + } + all_matched = all_matched && found; + } + normalized.free_text = !all_matched; + if (normalized.free_text && !(is_combo && is_edit && values.size() == 1)) { + return std::nullopt; + } + + std::sort(normalized.matched.begin(), normalized.matched.end(), + [](const auto& a, const auto& b) { return a.first < b.first; }); + normalized.matched.erase( + std::unique( + normalized.matched.begin(), normalized.matched.end(), + [](const auto& a, const auto& b) { return a.first == b.first; }), + normalized.matched.end()); + return normalized; +} + +void WriteChoiceDefaultValues(CPDF_Dictionary* field, + const std::vector& requested_values, + const NormalizedChoiceValues& normalized) { + if (normalized.free_text) { + field->SetNewFor(pdfium::form_fields::kDV, + requested_values[0].AsStringView()); + return; + } + if (normalized.matched.size() == 1) { + field->SetNewFor(pdfium::form_fields::kDV, + normalized.matched[0].second.AsStringView()); + return; + } + auto defaults = field->SetNewFor(pdfium::form_fields::kDV); + for (const auto& entry : normalized.matched) { + defaults->AppendNew(entry.second.AsStringView()); + } } // Toggle transactions mirror CPDF_FormField::CheckControl semantics: @@ -510,8 +700,7 @@ bool PrepareToggle(CPDF_Document* doc, } bool RejectClearForNoToggleToOff(const ToggleContext& ctx) { - return ctx.is_radio && - (ctx.flags & pdfium::form_flags::kButtonNoToggleToOff); + return ctx.is_radio && (ctx.flags & pdfium::form_flags::kButtonNoToggleToOff); } bool ExecuteToggle(CPDF_Document* doc, @@ -549,14 +738,12 @@ bool ExecuteToggle(CPDF_Document* doc, ToArray(CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), "Opt")); ByteString new_v = kOffState; if (target) { - new_v = opt_array - ? ByteString::FormatInteger( - pdfium::checked_cast(target_ordinal)) - : PDF_EncodeText(target->export_value.AsStringView()); + new_v = opt_array ? ByteString::FormatInteger( + pdfium::checked_cast(target_ordinal)) + : PDF_EncodeText(target->export_value.AsStringView()); } - RetainPtr current_v = - CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), - pdfium::form_fields::kV); + RetainPtr current_v = CPDF_FormField::GetFieldAttrForDict( + ctx.field.Get(), pdfium::form_fields::kV); const bool v_changes = !current_v || current_v->GetString() != new_v; if (steps.empty() && !v_changes) { @@ -567,8 +754,7 @@ bool ExecuteToggle(CPDF_Document* doc, // Apply. First mutable access happens here; promotion is now safe. const bool need_promoted_field = - v_changes || - std::any_of(steps.begin(), steps.end(), [&](const Step& s) { + v_changes || std::any_of(steps.begin(), steps.end(), [&](const Step& s) { const TxnControl& c = ctx.controls[s.control_index]; return c.merged || c.objnum == 0; }); @@ -635,8 +821,7 @@ bool ApplyToggle(CPDF_Document* doc, } } return ExecuteToggle(doc, field_objnum, ctx, target, target_ordinal, - changed_widget_objnums, buffer_size, - out_changed_count); + changed_widget_objnums, buffer_size, out_changed_count); } // Select the target widget by export value - the identity FDF/XFDF carry. @@ -669,18 +854,71 @@ bool ApplyToggleByExport(CPDF_Document* doc, } } return ExecuteToggle(doc, field_objnum, ctx, target, target_ordinal, - changed_widget_objnums, buffer_size, - out_changed_count); + changed_widget_objnums, buffer_size, out_changed_count); +} + +bool ResolveToggleDefault(const ToggleContext& ctx, + const CPDF_Object* default_value, + const TxnControl** out_target, + size_t* out_target_ordinal) { + *out_target = nullptr; + *out_target_ordinal = 0; + if (!default_value || default_value->IsNull()) { + return true; + } + if (!default_value->IsName()) { + return false; + } + + const ByteString raw_default = default_value->GetString(); + if (raw_default == kOffState) { + return true; + } + RetainPtr opt_array = + ToArray(CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), "Opt")); + for (size_t i = 0; i < ctx.controls.size(); ++i) { + const ByteString checked_value = + opt_array ? ByteString::FormatInteger(pdfium::checked_cast(i)) + : ctx.controls[i].on_state; + if (checked_value == raw_default) { + *out_target = &ctx.controls[i]; + *out_target_ordinal = i; + return true; + } + } + return false; +} + +bool ApplyToggleDefault(CPDF_Document* doc, + uint32_t field_objnum, + const CPDF_Object* default_value, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + ToggleContext ctx; + if (!PrepareToggle(doc, field_objnum, &ctx)) { + return false; + } + const TxnControl* target = nullptr; + size_t target_ordinal = 0; + if (!ResolveToggleDefault(ctx, default_value, &target, &target_ordinal)) { + return false; + } + // NoToggleToOff governs interactive changes, not restoring the declared + // default. A missing or explicit /Off default must still reset to Off. + return ExecuteToggle(doc, field_objnum, ctx, target, target_ordinal, + changed_widget_objnums, buffer_size, out_changed_count); } // Regenerate the /AP of every control and report them all as changed. -bool RegenerateControlAppearances(CPDF_Document* doc, - const std::vector& controls, - const RetainPtr& promoted_field, - CPDF_GenerateAP::FormType type, - uint32_t* changed_widget_objnums, - unsigned long buffer_size, - unsigned long* out_changed_count) { +bool RegenerateControlAppearances( + CPDF_Document* doc, + const std::vector& controls, + const RetainPtr& promoted_field, + CPDF_GenerateAP::FormType type, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { std::vector changed; unsigned long total_changed = 0; for (const TxnControl& control : controls) { @@ -715,9 +953,10 @@ bool ApplyTextValue(CPDF_Document* doc, RetainPtr max_len_obj = CPDF_FormField::GetFieldAttrForDict(field.Get(), "MaxLen"); const int max_len = max_len_obj ? max_len_obj->GetInteger() : 0; - if (max_len > 0 && new_value.GetLength() > static_cast(max_len)) { - return false; - } + const WideString normalized_value = + max_len > 0 && new_value.GetLength() > static_cast(max_len) + ? new_value.First(static_cast(max_len)) + : new_value; std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, @@ -726,11 +965,10 @@ bool ApplyTextValue(CPDF_Document* doc, } RetainPtr current_v = - CPDF_FormField::GetFieldAttrForDict(field.Get(), - pdfium::form_fields::kV); + CPDF_FormField::GetFieldAttrForDict(field.Get(), pdfium::form_fields::kV); const WideString current_value = current_v ? current_v->GetUnicodeText() : WideString(); - if (current_value == new_value && !field->KeyExist("RV")) { + if (current_value == normalized_value && !field->KeyExist("RV")) { ReportChangedWidgets({}, 0, changed_widget_objnums, buffer_size, out_changed_count); return true; @@ -742,7 +980,7 @@ bool ApplyTextValue(CPDF_Document* doc, return false; } promoted_field->SetNewFor(pdfium::form_fields::kV, - new_value.AsStringView()); + normalized_value.AsStringView()); // A rich text value would now contradict /V; drop it rather than lie. promoted_field->RemoveFor("RV"); @@ -763,34 +1001,9 @@ bool ApplyChoiceValues(CPDF_Document* doc, return false; } const uint32_t flags = InheritedFieldFlags(field.Get()); - const bool is_combo = flags & pdfium::form_flags::kChoiceCombo; - const bool is_edit = flags & pdfium::form_flags::kChoiceEdit; - const bool is_multi = flags & pdfium::form_flags::kChoiceMultiSelect; - if (new_values.size() > 1 && (is_combo || !is_multi)) { - return false; - } - - // Match every value against the option export values. `matched` pairs are - // (option index, value), used for option-ordered /V and a sorted /I. - RetainPtr opt_array = - ToArray(CPDF_FormField::GetFieldAttrForDict(field.Get(), "Opt")); - std::vector> matched; - bool all_matched = true; - for (const WideString& new_value : new_values) { - bool found = false; - if (opt_array) { - for (size_t i = 0; i < opt_array->size(); ++i) { - if (OptExportAt(opt_array.Get(), i) == new_value) { - matched.emplace_back(i, new_value); - found = true; - break; - } - } - } - all_matched = all_matched && found; - } - const bool free_text = !all_matched; - if (free_text && !(is_combo && is_edit && new_values.size() == 1)) { + std::optional normalized = + NormalizeChoiceValues(field.Get(), flags, new_values); + if (!normalized.has_value()) { return false; } @@ -807,32 +1020,44 @@ bool ApplyChoiceValues(CPDF_Document* doc, } if (new_values.empty()) { - promoted_field->RemoveFor(pdfium::form_fields::kV); - promoted_field->RemoveFor("I"); - } else if (free_text) { + if (HasInheritedFieldAttribute(doc, field.Get(), pdfium::form_fields::kV)) { + if (!(flags & pdfium::form_flags::kChoiceCombo) && + (flags & pdfium::form_flags::kChoiceMultiSelect)) { + promoted_field->SetNewFor(pdfium::form_fields::kV); + } else { + promoted_field->SetNewFor(pdfium::form_fields::kV, + WideStringView()); + } + } else { + promoted_field->RemoveFor(pdfium::form_fields::kV); + } + if (HasInheritedFieldAttribute(doc, field.Get(), "I")) { + promoted_field->SetNewFor("I"); + } else { + promoted_field->RemoveFor("I"); + } + } else if (normalized->free_text) { promoted_field->SetNewFor(pdfium::form_fields::kV, new_values[0].AsStringView()); - promoted_field->RemoveFor("I"); + if (HasInheritedFieldAttribute(doc, field.Get(), "I")) { + promoted_field->SetNewFor("I"); + } else { + promoted_field->RemoveFor("I"); + } } else { - std::sort(matched.begin(), matched.end(), - [](const auto& a, const auto& b) { return a.first < b.first; }); - matched.erase(std::unique(matched.begin(), matched.end(), - [](const auto& a, const auto& b) { - return a.first == b.first; - }), - matched.end()); - if (matched.size() == 1) { - promoted_field->SetNewFor(pdfium::form_fields::kV, - matched[0].second.AsStringView()); + if (normalized->matched.size() == 1) { + promoted_field->SetNewFor( + pdfium::form_fields::kV, + normalized->matched[0].second.AsStringView()); } else { auto value_array = promoted_field->SetNewFor(pdfium::form_fields::kV); - for (const auto& entry : matched) { + for (const auto& entry : normalized->matched) { value_array->AppendNew(entry.second.AsStringView()); } } auto index_array = promoted_field->SetNewFor("I"); - for (const auto& entry : matched) { + for (const auto& entry : normalized->matched) { index_array->AppendNew( pdfium::checked_cast(entry.first)); } @@ -844,6 +1069,162 @@ bool ApplyChoiceValues(CPDF_Document* doc, changed_widget_objnums, buffer_size, out_changed_count); } +uint32_t DisplayFlags(uint32_t current_flags, int display) { + switch (display) { + case EPDF_FORM_DISPLAY_VISIBLE: + return (current_flags & ~(pdfium::annotation_flags::kInvisible | + pdfium::annotation_flags::kHidden | + pdfium::annotation_flags::kNoView)) | + pdfium::annotation_flags::kPrint; + case EPDF_FORM_DISPLAY_HIDDEN: + return (current_flags & ~(pdfium::annotation_flags::kInvisible | + pdfium::annotation_flags::kNoView)) | + pdfium::annotation_flags::kHidden | + pdfium::annotation_flags::kPrint; + case EPDF_FORM_DISPLAY_NO_PRINT: + return current_flags & ~(pdfium::annotation_flags::kInvisible | + pdfium::annotation_flags::kHidden | + pdfium::annotation_flags::kPrint | + pdfium::annotation_flags::kNoView); + case EPDF_FORM_DISPLAY_NO_VIEW: + return (current_flags & ~pdfium::annotation_flags::kHidden) | + pdfium::annotation_flags::kNoView | + pdfium::annotation_flags::kPrint; + default: + return current_flags; + } +} + +bool ApplyFieldDisplay(CPDF_Document* doc, + uint32_t field_objnum, + int display, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + if (display < EPDF_FORM_DISPLAY_VISIBLE || + display > EPDF_FORM_DISPLAY_NO_VIEW) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field) { + return false; + } + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return false; + } + + struct Step { + size_t control_index; + uint32_t flags; + }; + std::vector steps; + for (size_t i = 0; i < controls.size(); ++i) { + const uint32_t current_flags = + static_cast(controls[i].dict->GetIntegerFor("F")); + const uint32_t new_flags = DisplayFlags(current_flags, display); + if (new_flags != current_flags) { + steps.push_back({i, new_flags}); + } + } + if (steps.empty()) { + ReportChangedWidgets({}, 0, changed_widget_objnums, buffer_size, + out_changed_count); + return true; + } + + const bool needs_promoted_field = + std::any_of(steps.begin(), steps.end(), [&](const Step& step) { + const TxnControl& control = controls[step.control_index]; + return control.merged || control.objnum == 0; + }); + RetainPtr promoted_field; + if (needs_promoted_field) { + promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + } + + std::vector changed; + unsigned long total_changed = 0; + for (const Step& step : steps) { + const TxnControl& control = controls[step.control_index]; + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (!widget) { + return false; + } + widget->SetNewFor("F", static_cast(step.flags)); + ++total_changed; + if (control.objnum != 0) { + changed.push_back(control.objnum); + } + } + ReportChangedWidgets(changed, total_changed, changed_widget_objnums, + buffer_size, out_changed_count); + return true; +} + +bool ApplyFieldAppearanceText(CPDF_Document* doc, + uint32_t field_objnum, + const WideString& appearance_text, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field) { + return false; + } + const ByteString field_type = InheritedFieldType(field.Get()); + CPDF_GenerateAP::FormType appearance_type; + if (field_type == pdfium::form_fields::kTx) { + appearance_type = CPDF_GenerateAP::kTextField; + } else if (field_type == pdfium::form_fields::kCh && + (InheritedFieldFlags(field.Get()) & + pdfium::form_flags::kChoiceCombo)) { + appearance_type = CPDF_GenerateAP::kComboBox; + } else { + return false; + } + + std::vector controls; + if (!CollectTxnControls(doc, field.Get(), field_objnum, + /*want_toggle_info=*/false, &controls)) { + return false; + } + const bool needs_promoted_field = std::any_of( + controls.begin(), controls.end(), [](const TxnControl& control) { + return control.merged || control.objnum == 0; + }); + RetainPtr promoted_field; + if (needs_promoted_field) { + promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return false; + } + } + + std::vector changed; + unsigned long total_changed = 0; + for (const TxnControl& control : controls) { + RetainPtr widget = + MutableControlDict(doc, control, promoted_field); + if (!widget || !CPDF_GenerateAP::GenerateFormAPWithValueOverride( + doc, widget.Get(), appearance_type, appearance_text)) { + return false; + } + ++total_changed; + if (control.objnum != 0) { + changed.push_back(control.objnum); + } + } + ReportChangedWidgets(changed, total_changed, changed_widget_objnums, + buffer_size, out_changed_count); + return true; +} + // --------------------------------------------------------------------------- // FDF / XFDF interchange helpers. // --------------------------------------------------------------------------- @@ -923,8 +1304,8 @@ void ApplyImportedValues(CPDF_Document* doc, break; case CPDF_FormField::kComboBox: case CPDF_FormField::kListBox: - applied = ApplyChoiceValues(doc, field_objnum, values, nullptr, 0, - &changed); + applied = + ApplyChoiceValues(doc, field_objnum, values, nullptr, 0, &changed); break; default: break; // Push buttons, signatures, unknown: never written. @@ -983,6 +1364,14 @@ struct XfdfNode { std::vector values; }; +bool IsFieldValueEmpty(const CPDF_Object* value) { + if (!value || value->IsNull()) { + return true; + } + const CPDF_Array* array = value->AsArray(); + return array ? array->IsEmpty() : value->GetString().IsEmpty(); +} + // Assemble / elements into the document-owned DOM. void EmitXfdfFieldNodes(const std::map& nodes, CFX_XMLDocument* xml, @@ -992,8 +1381,7 @@ void EmitXfdfFieldNodes(const std::map& nodes, field->SetAttribute(L"name", it.first); parent->AppendLastChild(field); for (const WideString& value : it.second.values) { - CFX_XMLElement* value_element = - xml->CreateNode(L"value"); + CFX_XMLElement* value_element = xml->CreateNode(L"value"); value_element->AppendLastChild(xml->CreateNode(value)); field->AppendLastChild(value_element); } @@ -1012,8 +1400,7 @@ ByteString BuildXfdf(CPDF_InteractiveForm* form, continue; } const CPDF_FormField::Type type = field->GetType(); - if (type == CPDF_FormField::kPushButton || - type == CPDF_FormField::kSign) { + if (type == CPDF_FormField::kPushButton || type == CPDF_FormField::kSign) { continue; } const uint32_t flags = field->GetFieldFlags(); @@ -1023,7 +1410,7 @@ ByteString BuildXfdf(CPDF_InteractiveForm* form, RetainPtr value_object = field->GetFieldAttr(pdfium::form_fields::kV); if (skip_empty_required && (flags & pdfium::form_flags::kRequired) && - (!value_object || value_object->GetString().IsEmpty())) { + IsFieldValueEmpty(value_object.Get())) { continue; } const WideString fqn = field->GetFullName(); @@ -1239,8 +1626,8 @@ EPDFForm_LoadModel(FPDF_DOCUMENT document) { RetainPtr acro_form = root ? root->GetDictFor("AcroForm") : nullptr; if (acro_form) { - model->kind = acro_form->KeyExist("XFA") ? EPDF_FORMKIND_XFA - : EPDF_FORMKIND_ACROFORM; + model->kind = + acro_form->KeyExist("XFA") ? EPDF_FORMKIND_XFA : EPDF_FORMKIND_ACROFORM; model->need_appearances = acro_form->GetBooleanFor("NeedAppearances", false); } @@ -1257,6 +1644,7 @@ EPDFForm_LoadModel(FPDF_DOCUMENT document) { // Phase 3: detach into a plain snapshot. const size_t field_count = CountFormFields(*form); model->fields.reserve(field_count); + std::map field_index_by_dict; for (size_t i = 0; i < field_count; ++i) { CPDF_FormField* field = form->GetField(i, WideString()); if (!field) { @@ -1264,6 +1652,7 @@ EPDFForm_LoadModel(FPDF_DOCUMENT document) { } FieldRecord record = SnapshotField(field, initial_fields, widget_pages); const int index = fxcrt::CollectionSize(model->fields); + field_index_by_dict.try_emplace(field->GetFieldDict().Get(), index); if (record.objnum != 0) { model->field_index_by_objnum.try_emplace(record.objnum, index); } @@ -1275,6 +1664,17 @@ EPDFForm_LoadModel(FPDF_DOCUMENT document) { model->fields.push_back(std::move(record)); } + const int calculation_count = form->CountFieldsInCalculationOrder(); + model->calculation_order.reserve(calculation_count); + for (int i = 0; i < calculation_count; ++i) { + CPDF_FormField* field = form->GetFieldInCalculationOrder(i); + const auto it = field + ? field_index_by_dict.find(field->GetFieldDict().Get()) + : field_index_by_dict.end(); + model->calculation_order.push_back( + it != field_index_by_dict.end() ? it->second : -1); + } + return HandleFromFormModel(model.release()); } @@ -1298,6 +1698,35 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFields(EPDF_FORM_MODEL model) { return form ? fxcrt::CollectionSize(form->fields) : 0; } +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFForm_GetFieldActionModel(EPDF_FORM_MODEL model, + int field_index, + int event) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field || event < EPDF_FORM_ACTION_KEYSTROKE || + event > EPDF_FORM_ACTION_CALCULATE) { + return nullptr; + } + return epdf::MakeActionModelHandle( + field->actions[static_cast(event)]); +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountCalculationOrder(EPDF_FORM_MODEL model) { + FormModel* form = FormModelFromHandle(model); + return form ? fxcrt::CollectionSize(form->calculation_order) : 0; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetCalculationOrderFieldIndex(EPDF_FORM_MODEL model, int order_index) { + FormModel* form = FormModelFromHandle(model); + if (!form || order_index < 0 || + order_index >= fxcrt::CollectionSize(form->calculation_order)) { + return -1; + } + return form->calculation_order[order_index]; +} + FPDF_EXPORT uint32_t FPDF_CALLCONV EPDFForm_GetFieldObjNum(EPDF_FORM_MODEL model, int field_index) { const FieldRecord* field = GetFieldRecord(model, field_index); @@ -1310,8 +1739,8 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldFamily(EPDF_FORM_MODEL model, return field ? field->family : EPDF_FORMFIELD_FAMILY_UNKNOWN; } -FPDF_EXPORT uint32_t FPDF_CALLCONV -EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, int field_index) { +FPDF_EXPORT uint32_t FPDF_CALLCONV EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, + int field_index) { const FieldRecord* field = GetFieldRecord(model, field_index); return field ? field->flags : 0; } @@ -1359,34 +1788,62 @@ EPDFForm_GetFieldMappingName(EPDF_FORM_MODEL model, return 0; } return Utf16EncodeMaybeCopyAndReturnLength( - field->mapping_name, + field->mapping_name, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldValueKind(EPDF_FORM_MODEL model, + int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->value.kind : EPDF_FORM_VALUE_NONE; +} + +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldValues(EPDF_FORM_MODEL model, + int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? fxcrt::CollectionSize(field->value.values) : 0; +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFForm_GetFieldValueAt(EPDF_FORM_MODEL model, + int field_index, + int value_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + const FieldRecord* field = GetFieldRecord(model, field_index); + if (!field || value_index < 0 || + value_index >= fxcrt::CollectionSize(field->value.values)) { + return 0; + } + return Utf16EncodeMaybeCopyAndReturnLength( + field->value.values[value_index], UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFForm_GetFieldValue(EPDF_FORM_MODEL model, - int field_index, - FPDF_WCHAR* buffer, - unsigned long buflen) { +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldDefaultValueKind(EPDF_FORM_MODEL model, int field_index) { + const FieldRecord* field = GetFieldRecord(model, field_index); + return field ? field->default_value.kind : EPDF_FORM_VALUE_NONE; +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldDefaultValues(EPDF_FORM_MODEL model, int field_index) { const FieldRecord* field = GetFieldRecord(model, field_index); - if (!field) { - return 0; - } - return Utf16EncodeMaybeCopyAndReturnLength( - field->value, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + return field ? fxcrt::CollectionSize(field->default_value.values) : 0; } FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFForm_GetFieldDefaultValue(EPDF_FORM_MODEL model, - int field_index, - FPDF_WCHAR* buffer, - unsigned long buflen) { +EPDFForm_GetFieldDefaultValueAt(EPDF_FORM_MODEL model, + int field_index, + int value_index, + FPDF_WCHAR* buffer, + unsigned long buflen) { const FieldRecord* field = GetFieldRecord(model, field_index); - if (!field) { + if (!field || value_index < 0 || + value_index >= fxcrt::CollectionSize(field->default_value.values)) { return 0; } return Utf16EncodeMaybeCopyAndReturnLength( - field->default_value, + field->default_value.values[value_index], UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } @@ -1396,8 +1853,8 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldMaxLen(EPDF_FORM_MODEL model, return field ? field->max_len : 0; } -FPDF_EXPORT int FPDF_CALLCONV -EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, int field_index) { +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, + int field_index) { const FieldRecord* field = GetFieldRecord(model, field_index); return field ? fxcrt::CollectionSize(field->options) : 0; } @@ -1441,8 +1898,8 @@ EPDFForm_IsFieldOptionSelected(EPDF_FORM_MODEL model, return option && option->selected; } -FPDF_EXPORT int FPDF_CALLCONV -EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, int field_index) { +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, + int field_index) { const FieldRecord* field = GetFieldRecord(model, field_index); return field ? fxcrt::CollectionSize(field->widgets) : 0; } @@ -1516,8 +1973,7 @@ EPDFForm_GetFieldIndexByObjNum(EPDF_FORM_MODEL model, uint32_t field_objnum) { } FPDF_EXPORT int FPDF_CALLCONV -EPDFForm_GetFieldIndexForWidget(EPDF_FORM_MODEL model, - uint32_t widget_objnum) { +EPDFForm_GetFieldIndexForWidget(EPDF_FORM_MODEL model, uint32_t widget_objnum) { FormModel* form = FormModelFromHandle(model); if (!form || widget_objnum == 0) { return -1; @@ -1537,8 +1993,7 @@ EPDFForm_SetToggle(FPDF_DOCUMENT document, if (!doc) { return false; } - return ApplyToggle(doc, field_objnum, - ByteString(on_state ? on_state : ""), + return ApplyToggle(doc, field_objnum, ByteString(on_state ? on_state : ""), /*lenient_unknown_state=*/false, changed_widget_objnums, buffer_size, out_changed_count); } @@ -1554,11 +2009,10 @@ EPDFForm_SetTextValue(FPDF_DOCUMENT document, if (!doc) { return false; } - return ApplyTextValue(doc, field_objnum, - value ? WideStringFromFPDFWideString(value) - : WideString(), - changed_widget_objnums, buffer_size, - out_changed_count); + return ApplyTextValue( + doc, field_objnum, + value ? WideStringFromFPDFWideString(value) : WideString(), + changed_widget_objnums, buffer_size, out_changed_count); } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV @@ -1611,12 +2065,9 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, if (flags & pdfium::form_flags::kButtonPushbutton) { return false; } - // Lenient: a /DV naming no widget state simply clears the group. - const ByteString default_state = - default_value ? default_value->GetString() : ByteString(kOffState); - return ApplyToggle(doc, field_objnum, default_state, - /*lenient_unknown_state=*/true, changed_widget_objnums, - buffer_size, out_changed_count); + return ApplyToggleDefault(doc, field_objnum, default_value.Get(), + changed_widget_objnums, buffer_size, + out_changed_count); } if (field_type != pdfium::form_fields::kTx && @@ -1624,34 +2075,98 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, return false; // Push buttons handled above; signatures are never reset. } + if (field_type == pdfium::form_fields::kCh) { + std::vector defaults; + if (default_value && !default_value->IsNull()) { + if (default_value->IsString()) { + WideString value = default_value->GetUnicodeText(); + // An empty choice default represents no selected option unless an + // option actually uses the empty export value (normalization below + // will retain it in that case). + defaults.push_back(std::move(value)); + } else if (const CPDF_Array* array = default_value->AsArray()) { + defaults.reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + RetainPtr element = array->GetDirectObjectAt(i); + if (!element || !element->IsString()) { + return false; + } + defaults.push_back(element->GetUnicodeText()); + } + } else { + return false; + } + } + if (defaults.size() == 1 && defaults[0].IsEmpty()) { + std::optional normalized = + NormalizeChoiceValues(field.Get(), flags, defaults); + if (!normalized.has_value()) { + defaults.clear(); + } + } + return ApplyChoiceValues(doc, field_objnum, defaults, + changed_widget_objnums, buffer_size, + out_changed_count); + } + + if (default_value && !default_value->IsNull() && !default_value->IsString()) { + return false; + } std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, /*want_toggle_info=*/false, &controls)) { return false; } - RetainPtr promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); if (!promoted_field) { return false; } - if (default_value) { - promoted_field->SetFor(pdfium::form_fields::kV, - default_value->CloneDirectObject()); + if (default_value && !default_value->IsNull()) { + promoted_field->SetNewFor( + pdfium::form_fields::kV, + default_value->GetUnicodeText().AsStringView()); } else { - promoted_field->RemoveFor(pdfium::form_fields::kV); + if (HasInheritedFieldAttribute(doc, field.Get(), pdfium::form_fields::kV)) { + promoted_field->SetNewFor(pdfium::form_fields::kV, + WideStringView()); + } else { + promoted_field->RemoveFor(pdfium::form_fields::kV); + } } promoted_field->RemoveFor("RV"); - if (field_type == pdfium::form_fields::kCh) { - promoted_field->RemoveFor("I"); - } + return RegenerateControlAppearances( + doc, controls, promoted_field, CPDF_GenerateAP::kTextField, + changed_widget_objnums, buffer_size, out_changed_count); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDisplay(FPDF_DOCUMENT document, + uint32_t field_objnum, + int display, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc && + ApplyFieldDisplay(doc, field_objnum, display, changed_widget_objnums, + buffer_size, out_changed_count); +} - const CPDF_GenerateAP::FormType type = - field_type == pdfium::form_fields::kTx ? CPDF_GenerateAP::kTextField - : ChoiceFormType(flags); - return RegenerateControlAppearances(doc, controls, promoted_field, type, - changed_widget_objnums, buffer_size, - out_changed_count); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldAppearanceText(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING appearance_text, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !appearance_text) { + return false; + } + return ApplyFieldAppearanceText( + doc, field_objnum, WideStringFromFPDFWideString(appearance_text), + changed_widget_objnums, buffer_size, out_changed_count); } FPDF_EXPORT unsigned long FPDF_CALLCONV @@ -1688,9 +2203,9 @@ EPDFForm_ExportXFDF(FPDF_DOCUMENT document, std::unique_ptr form = BuildReconciledForm(doc); const WideString path = pdf_path ? WideStringFromFPDFWideString(pdf_path) : WideString(); - const ByteString payload = BuildXfdf( - form.get(), path, - !!(export_flags & EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED)); + const ByteString payload = + BuildXfdf(form.get(), path, + !!(export_flags & EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED)); return CopyPayloadToBuffer(payload, buffer, buflen); } @@ -1974,9 +2489,9 @@ EPDFForm_Repair(FPDF_DOCUMENT document, namespace { // Family-defining /Ff bits are immutable through EPDFForm_SetFieldFlags. -constexpr uint32_t kFamilyDefiningFlags = pdfium::form_flags::kButtonRadio | - pdfium::form_flags::kButtonPushbutton | - pdfium::form_flags::kChoiceCombo; +constexpr uint32_t kFamilyDefiningFlags = + pdfium::form_flags::kButtonRadio | pdfium::form_flags::kButtonPushbutton | + pdfium::form_flags::kChoiceCombo; // Widget-plane keys that move to the new kid when a legacy merged field is // split by EPDFForm_AttachWidget. Field-plane keys (/FT /T /Ff /V /DV /Opt @@ -2001,10 +2516,12 @@ bool AuthorFamilyFromCode(int family, AuthorFamily* out) { *out = {pdfium::form_fields::kBtn, 0, true}; return true; case 3 /* RADIO */: - *out = {pdfium::form_fields::kBtn, pdfium::form_flags::kButtonRadio, true}; + *out = {pdfium::form_fields::kBtn, pdfium::form_flags::kButtonRadio, + true}; return true; case 5 /* COMBOBOX */: - *out = {pdfium::form_fields::kCh, pdfium::form_flags::kChoiceCombo, false}; + *out = {pdfium::form_fields::kCh, pdfium::form_flags::kChoiceCombo, + false}; return true; case 6 /* LISTBOX */: *out = {pdfium::form_fields::kCh, 0, false}; @@ -2018,15 +2535,23 @@ int FamilyOfFieldDict(const CPDF_Dictionary* field_dict) { const ByteString field_type = InheritedFieldType(field_dict); const uint32_t flags = InheritedFieldFlags(field_dict); if (field_type == pdfium::form_fields::kBtn) { - if (flags & pdfium::form_flags::kButtonPushbutton) return 1; - if (flags & pdfium::form_flags::kButtonRadio) return 3; + if (flags & pdfium::form_flags::kButtonPushbutton) { + return 1; + } + if (flags & pdfium::form_flags::kButtonRadio) { + return 3; + } return 2; } - if (field_type == pdfium::form_fields::kTx) return 4; + if (field_type == pdfium::form_fields::kTx) { + return 4; + } if (field_type == pdfium::form_fields::kCh) { return (flags & pdfium::form_flags::kChoiceCombo) ? 5 : 6; } - if (field_type == pdfium::form_fields::kSig) return 7; + if (field_type == pdfium::form_fields::kSig) { + return 7; + } return 0; } @@ -2036,9 +2561,13 @@ std::vector SplitFqnSegments(const WideString& full_name) { while (start <= full_name.GetLength()) { std::optional dot = full_name.Find(L'.', start); const size_t end = dot.value_or(full_name.GetLength()); - if (end == start) return {}; // empty segment -> invalid + if (end == start) { + return {}; // empty segment -> invalid + } segments.push_back(full_name.Substr(start, end - start)); - if (!dot.has_value()) break; + if (!dot.has_value()) { + break; + } start = dot.value() + 1; } return segments; @@ -2046,13 +2575,18 @@ std::vector SplitFqnSegments(const WideString& full_name) { // Find a direct child (of /Fields or a /Kids array) whose own /T equals // |segment|, resolving every entry through the document. -RetainPtr FindChildFieldByName(CPDF_Document* doc, - const CPDF_Array* entries, - const WideString& segment) { - if (!entries) return nullptr; +RetainPtr FindChildFieldByName( + CPDF_Document* doc, + const CPDF_Array* entries, + const WideString& segment) { + if (!entries) { + return nullptr; + } for (size_t i = 0; i < entries->size(); ++i) { RetainPtr element = entries->GetObjectAt(i); - if (!element) continue; + if (!element) { + continue; + } RetainPtr child; if (const CPDF_Reference* ref = element->AsReference()) { child = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); @@ -2067,7 +2601,9 @@ RetainPtr FindChildFieldByName(CPDF_Document* doc, } bool RemoveObjNumFromMutableArray(CPDF_Array* array, uint32_t objnum) { - if (!array) return false; + if (!array) { + return false; + } for (size_t i = 0; i < array->size(); ++i) { RetainPtr element = array->GetObjectAt(i); const CPDF_Reference* ref = element ? element->AsReference() : nullptr; @@ -2085,9 +2621,13 @@ uint32_t FindPageContainingAnnot(CPDF_Document* doc, uint32_t annot_objnum) { const int page_count = doc->GetPageCount(); for (int i = 0; i < page_count; ++i) { RetainPtr page = doc->GetPageDictionary(i); - if (!page) continue; + if (!page) { + continue; + } RetainPtr annots = page->GetArrayFor("Annots"); - if (!annots) continue; + if (!annots) { + continue; + } for (size_t j = 0; j < annots->size(); ++j) { RetainPtr element = annots->GetObjectAt(j); const CPDF_Reference* ref = element ? element->AsReference() : nullptr; @@ -2101,11 +2641,16 @@ uint32_t FindPageContainingAnnot(CPDF_Document* doc, uint32_t annot_objnum) { // After toggle AP generation, make sure the /AP /N "on" state carries the // requested name so EPDFForm_SetToggle can address it. -void NormalizeToggleOnState(CPDF_Dictionary* widget, const ByteString& on_state) { +void NormalizeToggleOnState(CPDF_Dictionary* widget, + const ByteString& on_state) { RetainPtr ap = widget->GetMutableDictFor("AP"); - if (!ap) return; + if (!ap) { + return; + } RetainPtr normal = ap->GetMutableDictFor("N"); - if (!normal) return; + if (!normal) { + return; + } ByteString current_on; { CPDF_DictionaryLocker locker(normal); @@ -2116,9 +2661,14 @@ void NormalizeToggleOnState(CPDF_Dictionary* widget, const ByteString& on_state) } } } - if (current_on.IsEmpty() || current_on == on_state) return; - RetainPtr stream = normal->GetMutableObjectFor(current_on.AsStringView()); - if (!stream) return; + if (current_on.IsEmpty() || current_on == on_state) { + return; + } + RetainPtr stream = + normal->GetMutableObjectFor(current_on.AsStringView()); + if (!stream) { + return; + } normal->SetFor(on_state, stream->Clone()); normal->RemoveFor(current_on.AsStringView()); } @@ -2154,7 +2704,9 @@ void BakeWidgetAppearance(CPDF_Document* doc, } // namespace FPDF_EXPORT uint32_t FPDF_CALLCONV -EPDFForm_CreateField(FPDF_DOCUMENT document, int family, FPDF_WIDESTRING full_name) { +EPDFForm_CreateField(FPDF_DOCUMENT document, + int family, + FPDF_WIDESTRING full_name) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); AuthorFamily author; if (!doc || !doc->GetRoot() || !AuthorFamilyFromCode(family, &author)) { @@ -2215,8 +2767,8 @@ EPDFForm_CreateField(FPDF_DOCUMENT document, int family, FPDF_WIDESTRING full_na if (!parent_field) { return 0; } - parent_array = - GetMutableArrayMember(doc, parent_field.Get(), pdfium::form_fields::kKids); + parent_array = GetMutableArrayMember(doc, parent_field.Get(), + pdfium::form_fields::kKids); } if (!parent_array) { return 0; @@ -2243,8 +2795,8 @@ EPDFForm_CreateField(FPDF_DOCUMENT document, int family, FPDF_WIDESTRING full_na return node->GetObjNum(); } parent_field = node; - parent_array = - GetMutableArrayMember(doc, parent_field.Get(), pdfium::form_fields::kKids); + parent_array = GetMutableArrayMember(doc, parent_field.Get(), + pdfium::form_fields::kKids); if (!parent_array) { return 0; } @@ -2263,7 +2815,7 @@ EPDFForm_AttachWidget(FPDF_DOCUMENT document, return false; } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field || !field->KeyExist(pdfium::form_fields::kFT)) { + if (!field || InheritedFieldType(field.Get()).IsEmpty()) { return false; // must address the terminal field dictionary itself } const int family = FamilyOfFieldDict(field.Get()); @@ -2298,7 +2850,9 @@ EPDFForm_AttachWidget(FPDF_DOCUMENT document, auto split_widget = doc->NewIndirect(); for (const char* key : kWidgetPlaneKeys) { RetainPtr value = mutable_field->GetMutableObjectFor(key); - if (!value) continue; + if (!value) { + continue; + } split_widget->SetFor(key, value->Clone()); mutable_field->RemoveFor(key); } @@ -2410,7 +2964,7 @@ EPDFForm_DeleteField(FPDF_DOCUMENT document, return false; } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field || !field->KeyExist(pdfium::form_fields::kFT)) { + if (!field || InheritedFieldType(field.Get()).IsEmpty()) { return false; } @@ -2522,9 +3076,13 @@ RetainPtr SiblingArrayOf(CPDF_Document* doc, // (options, flags, MaxLen). No-op for families without generated text APs. void RegenerateFieldAppearances(CPDF_Document* doc, uint32_t field_objnum) { RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field) return; + if (!field) { + return; + } const int family = FamilyOfFieldDict(field.Get()); - if (family != 4 && family != 5 && family != 6) return; + if (family != 4 && family != 5 && family != 6) { + return; + } std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, /*want_toggle_info=*/false, &controls)) { @@ -2533,8 +3091,11 @@ void RegenerateFieldAppearances(CPDF_Document* doc, uint32_t field_objnum) { RetainPtr promoted_field; for (const TxnControl& control : controls) { if (!promoted_field && (control.merged || control.objnum == 0)) { - promoted_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!promoted_field) return; + promoted_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!promoted_field) { + return; + } } RetainPtr widget = MutableControlDict(doc, control, promoted_field); @@ -2551,26 +3112,39 @@ EPDFForm_SetFieldName(FPDF_DOCUMENT document, uint32_t field_objnum, FPDF_WIDESTRING partial_name) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc || field_objnum == 0) return false; + if (!doc || field_objnum == 0) { + return false; + } const WideString name = partial_name ? WideStringFromFPDFWideString(partial_name) : WideString(); - if (name.IsEmpty() || name.Find(L'.', 0).has_value()) return false; + if (name.IsEmpty() || name.Find(L'.', 0).has_value()) { + return false; + } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field || !field->KeyExist(pdfium::form_fields::kT)) return false; + if (!field || !field->KeyExist(pdfium::form_fields::kT)) { + return false; + } RetainPtr siblings = SiblingArrayOf(doc, field.Get()); if (siblings) { for (size_t i = 0; i < siblings->size(); ++i) { RetainPtr element = siblings->GetObjectAt(i); - if (!element) continue; + if (!element) { + continue; + } RetainPtr sibling; if (const CPDF_Reference* ref = element->AsReference()) { - if (ref->GetRefObjNum() == field_objnum) continue; - sibling = ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); + if (ref->GetRefObjNum() == field_objnum) { + continue; + } + sibling = + ToDictionary(doc->GetOrParseIndirectObject(ref->GetRefObjNum())); } else { sibling = ToDictionary(std::move(element)); - if (sibling.Get() == field.Get()) continue; + if (sibling.Get() == field.Get()) { + continue; + } } if (sibling && sibling->GetUnicodeTextFor(pdfium::form_fields::kT) == name) { @@ -2581,7 +3155,9 @@ EPDFForm_SetFieldName(FPDF_DOCUMENT document, RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; + if (!mutable_field) { + return false; + } mutable_field->SetNewFor(pdfium::form_fields::kT, name.AsStringView()); return true; @@ -2593,19 +3169,71 @@ EPDFForm_SetFieldFlags(FPDF_DOCUMENT document, uint32_t set_bits, uint32_t clear_bits) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc || field_objnum == 0) return false; - if ((set_bits | clear_bits) & kFamilyDefiningFlags) return false; + if (!doc || field_objnum == 0) { + return false; + } + if ((set_bits | clear_bits) & kFamilyDefiningFlags) { + return false; + } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field || !field->KeyExist(pdfium::form_fields::kFT)) return false; + if (!field || InheritedFieldType(field.Get()).IsEmpty()) { + return false; + } const uint32_t current = InheritedFieldFlags(field.Get()); const uint32_t next = (current & ~clear_bits) | set_bits; - if (next == current) return true; + if (next == current) { + return true; + } + if (InheritedFieldType(field.Get()) == pdfium::form_fields::kCh && + ((current ^ next) & (pdfium::form_flags::kChoiceEdit | + pdfium::form_flags::kChoiceMultiSelect))) { + const bool is_combo = next & pdfium::form_flags::kChoiceCombo; + const bool is_edit = next & pdfium::form_flags::kChoiceEdit; + const bool is_multi = next & pdfium::form_flags::kChoiceMultiSelect; + if ((is_combo && is_multi) || (!is_combo && is_edit)) { + return false; + } + RetainPtr options = + ToArray(CPDF_FormField::GetFieldAttrForDict(field.Get(), "Opt")); + auto value_is_compatible = [&](ByteStringView key) { + RetainPtr value = + CPDF_FormField::GetFieldAttrForDict(field.Get(), key); + if (!value || value->IsNull()) { + return true; + } + if (value->IsArray()) { + return is_multi && !is_combo; + } + if (!value->IsString()) { + return false; + } + const WideString text = value->GetUnicodeText(); + if (text.IsEmpty() || !is_combo || is_edit) { + return true; + } + if (!options) { + return false; + } + for (size_t i = 0; i < options->size(); ++i) { + if (OptExportAt(options.Get(), i) == text) { + return true; + } + } + return false; + }; + if (!value_is_compatible(pdfium::form_fields::kV) || + !value_is_compatible(pdfium::form_fields::kDV)) { + return false; + } + } RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; + if (!mutable_field) { + return false; + } mutable_field->SetNewFor(pdfium::form_fields::kFf, static_cast(next)); // Rendering-relevant text/choice bits (multiline, comb, ...) changed. @@ -2618,7 +3246,9 @@ EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, uint32_t field_objnum, int max_len) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc || field_objnum == 0 || max_len < 0) return false; + if (!doc || field_objnum == 0 || max_len < 0) { + return false; + } RetainPtr field = ResolveFieldDict(doc, field_objnum); if (!field || InheritedFieldType(field.Get()) != pdfium::form_fields::kTx) { return false; @@ -2631,42 +3261,152 @@ EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, return false; // never truncate an existing value implicitly } } + RetainPtr current_max_len = + CPDF_FormField::GetFieldAttrForDict(field.Get(), "MaxLen"); + if ((!current_max_len && max_len == 0) || + (current_max_len && current_max_len->IsNumber() && + current_max_len->GetInteger() == max_len)) { + return true; + } RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; - if (max_len == 0) { - mutable_field->RemoveFor("MaxLen"); - } else { - mutable_field->SetNewFor("MaxLen", max_len); + if (!mutable_field) { + return false; } + // Keep a local zero so clearing an inherited limit has an effective result + // without mutating the ancestor (and therefore its sibling fields). + mutable_field->SetNewFor("MaxLen", max_len); RegenerateFieldAppearances(doc, field_objnum); // comb cells follow MaxLen return true; } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFForm_SetFieldDefaultValue(FPDF_DOCUMENT document, - uint32_t field_objnum, - FPDF_WIDESTRING value) { +EPDFForm_SetFieldDefaultValues(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* values, + unsigned long value_count) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc || field_objnum == 0) return false; + if (!doc || field_objnum == 0 || value_count == 0 || !values) { + return false; + } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field) return false; + if (!field) { + return false; + } const ByteString field_type = InheritedFieldType(field.Get()); if (field_type != pdfium::form_fields::kTx && field_type != pdfium::form_fields::kCh) { return false; } - const WideString text = - value ? WideStringFromFPDFWideString(value) : WideString(); + std::vector defaults; + pdfium::span values_span = + UNSAFE_BUFFERS(pdfium::span(values, static_cast(value_count))); + defaults.reserve(values_span.size()); + for (FPDF_WIDESTRING value : values_span) { + defaults.push_back(value ? WideStringFromFPDFWideString(value) + : WideString()); + } + + std::optional normalized; + if (field_type == pdfium::form_fields::kTx) { + if (defaults.size() != 1) { + return false; + } + RetainPtr current = CPDF_FormField::GetFieldAttrForDict( + field.Get(), pdfium::form_fields::kDV); + if (current && current->IsString() && + current->GetUnicodeText() == defaults[0]) { + return true; + } + } else { + normalized = NormalizeChoiceValues( + field.Get(), InheritedFieldFlags(field.Get()), defaults); + if (!normalized.has_value()) { + return false; + } + } + RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; - if (text.IsEmpty()) { - mutable_field->RemoveFor(pdfium::form_fields::kDV); - } else { + if (!mutable_field) { + return false; + } + if (field_type == pdfium::form_fields::kTx) { mutable_field->SetNewFor(pdfium::form_fields::kDV, - text.AsStringView()); + defaults[0].AsStringView()); + } else { + WriteChoiceDefaultValues(mutable_field.Get(), defaults, normalized.value()); + } + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDefaultToggle(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_BYTESTRING on_state) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0 || !on_state || on_state[0] == '\0') { + return false; + } + ToggleContext ctx; + if (!PrepareToggle(doc, field_objnum, &ctx)) { + return false; + } + + const ByteString requested(on_state); + ByteString stored_default; + if (requested == kOffState) { + stored_default = kOffState; + } else { + RetainPtr opt_array = + ToArray(CPDF_FormField::GetFieldAttrForDict(ctx.field.Get(), "Opt")); + for (size_t i = 0; i < ctx.controls.size(); ++i) { + if (ctx.controls[i].on_state == requested) { + stored_default = + opt_array ? ByteString::FormatInteger(pdfium::checked_cast(i)) + : requested; + break; + } + } + if (stored_default.IsEmpty()) { + return false; + } + } + + RetainPtr current = CPDF_FormField::GetFieldAttrForDict( + ctx.field.Get(), pdfium::form_fields::kDV); + if (current && current->IsName() && current->GetString() == stored_default) { + return true; + } + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) { + return false; + } + mutable_field->SetNewFor(pdfium::form_fields::kDV, stored_default); + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_RemoveFieldDefaultValue(FPDF_DOCUMENT document, + uint32_t field_objnum) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || field_objnum == 0) { + return false; + } + RetainPtr field = ResolveFieldDict(doc, field_objnum); + if (!field || InheritedFieldType(field.Get()).IsEmpty()) { + return false; + } + if (!field->KeyExist(pdfium::form_fields::kDV)) { + return true; + } + RetainPtr mutable_field = + ToDictionary(doc->GetMutableIndirectObject(field_objnum)); + if (!mutable_field) { + return false; } + mutable_field->RemoveFor(pdfium::form_fields::kDV); return true; } @@ -2677,19 +3417,30 @@ FPDF_BOOL SetOptionalFieldText(FPDF_DOCUMENT document, FPDF_WIDESTRING value, const char* key) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc || field_objnum == 0) return false; + if (!doc || field_objnum == 0) { + return false; + } RetainPtr field = ResolveFieldDict(doc, field_objnum); - if (!field || !field->KeyExist(pdfium::form_fields::kFT)) return false; + if (!field || InheritedFieldType(field.Get()).IsEmpty()) { + return false; + } const WideString text = value ? WideStringFromFPDFWideString(value) : WideString(); + RetainPtr current = + CPDF_FormField::GetFieldAttrForDict(field.Get(), key); + if ((!current && text.IsEmpty()) || + (current && current->IsString() && current->GetUnicodeText() == text)) { + return true; + } RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; - if (text.IsEmpty()) { - mutable_field->RemoveFor(key); - } else { - mutable_field->SetNewFor(key, text.AsStringView()); + if (!mutable_field) { + return false; } + // An empty local string shadows an inherited value. Removing the key would + // make the ancestor's value effective again and would not actually clear + // what EPDFForm_LoadModel reports. + mutable_field->SetNewFor(key, text.AsStringView()); return true; } @@ -2744,38 +3495,38 @@ EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, } } - // Current selection, filtered against the new export values. - std::vector kept; - { - RetainPtr value = CPDF_FormField::GetFieldAttrForDict( - field.Get(), pdfium::form_fields::kV); - std::vector selected; - if (value) { - if (const CPDF_Array* array = value->AsArray()) { - for (size_t i = 0; i < array->size(); ++i) { - selected.push_back(array->GetUnicodeTextAt(i)); - } - } else { - selected.push_back(value->GetUnicodeText()); - } - } - for (const WideString& v : selected) { - if (pdfium::Contains(new_exports, v)) { - kept.push_back(v); - } - } - // An edit combo's free text is not an option; it survives verbatim. - if (kept.empty() && free_text_combo && !selected.empty()) { - kept = std::move(selected); - } + RetainPtr current_value = + CPDF_FormField::GetFieldAttrForDict(field.Get(), pdfium::form_fields::kV); + std::optional> selected = + ReadChoiceValues(current_value.Get()); + RetainPtr current_default = + CPDF_FormField::GetFieldAttrForDict(field.Get(), + pdfium::form_fields::kDV); + std::optional> defaults = + ReadChoiceValues(current_default.Get()); + if (!selected.has_value() || !defaults.has_value()) { + return false; + } + std::vector kept = + FilterChoiceValues(selected.value(), new_exports, free_text_combo); + std::vector kept_defaults = + FilterChoiceValues(defaults.value(), new_exports, free_text_combo); + if (kept_defaults.size() > 1 && + ((flags & pdfium::form_flags::kChoiceCombo) || + !(flags & pdfium::form_flags::kChoiceMultiSelect))) { + return false; } // ---- Apply: rewrite /Opt, then re-sync selection + appearances. ---- RetainPtr mutable_field = ToDictionary(doc->GetMutableIndirectObject(field_objnum)); - if (!mutable_field) return false; + if (!mutable_field) { + return false; + } if (count == 0) { - mutable_field->RemoveFor("Opt"); + // An empty local array also shadows an inherited /Opt, so count=0 has the + // same effective meaning for hierarchical and non-hierarchical fields. + mutable_field->SetNewFor("Opt"); } else { auto opt = mutable_field->SetNewFor("Opt"); for (unsigned long i = 0; i < count; ++i) { @@ -2792,9 +3543,34 @@ EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, if (free_text_combo && !kept.empty() && !pdfium::Contains(new_exports, kept.front())) { // Free text survives; only the index hint is stale now. - mutable_field->RemoveFor("I"); + if (HasInheritedFieldAttribute(doc, field.Get(), "I")) { + mutable_field->SetNewFor("I"); + } else { + mutable_field->RemoveFor("I"); + } RegenerateFieldAppearances(doc, field_objnum); - return true; + } else if (!ApplyChoiceValues(doc, field_objnum, kept, nullptr, 0, nullptr)) { + return false; } - return ApplyChoiceValues(doc, field_objnum, kept, nullptr, 0, nullptr); + + if (current_default && !current_default->IsNull()) { + if (kept_defaults.empty()) { + if (!(flags & pdfium::form_flags::kChoiceCombo) && + (flags & pdfium::form_flags::kChoiceMultiSelect)) { + mutable_field->SetNewFor(pdfium::form_fields::kDV); + } else { + mutable_field->SetNewFor(pdfium::form_fields::kDV, + WideStringView()); + } + } else { + std::optional normalized_defaults = + NormalizeChoiceValues(mutable_field.Get(), flags, kept_defaults); + if (!normalized_defaults.has_value()) { + return false; + } + WriteChoiceDefaultValues(mutable_field.Get(), kept_defaults, + normalized_defaults.value()); + } + } + return true; } diff --git a/fpdfsdk/epdf_form_embeddertest.cpp b/fpdfsdk/epdf_form_embeddertest.cpp index 0e739aab4d..a6b37bdfbb 100644 --- a/fpdfsdk/epdf_form_embeddertest.cpp +++ b/fpdfsdk/epdf_form_embeddertest.cpp @@ -7,13 +7,24 @@ #include #include +#include "constants/form_fields.h" +#include "constants/form_flags.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "fpdfsdk/cpdfsdk_helpers.h" #include "public/fpdf_annot.h" #include "public/fpdf_save.h" #include "public/fpdfview.h" -#include "testing/test_loader.h" #include "testing/embedder_test.h" #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_loader.h" #include "testing/utils/file_util.h" #include "testing/utils/path_service.h" @@ -37,6 +48,38 @@ std::wstring GetWideString(WideStringGetter getter, return GetPlatformWString(buffer.data()); } +using FieldValueGetter = + unsigned long (*)(EPDF_FORM_MODEL, int, int, FPDF_WCHAR*, unsigned long); + +std::wstring GetFieldValue(FieldValueGetter getter, + EPDF_FORM_MODEL model, + int field_index, + int value_index = 0) { + unsigned long length_bytes = + getter(model, field_index, value_index, nullptr, 0); + if (length_bytes == 0) { + return std::wstring(); + } + std::vector buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, getter(model, field_index, value_index, buffer.data(), + length_bytes)); + return GetPlatformWString(buffer.data()); +} + +std::wstring GetCurrentFieldValue(EPDF_FORM_MODEL model, + int field_index, + int value_index = 0) { + return GetFieldValue(EPDFForm_GetFieldValueAt, model, field_index, + value_index); +} + +std::wstring GetDefaultFieldValue(EPDF_FORM_MODEL model, + int field_index, + int value_index = 0) { + return GetFieldValue(EPDFForm_GetFieldDefaultValueAt, model, field_index, + value_index); +} + std::wstring GetWidgetExportValue(EPDF_FORM_MODEL model, int field_index, int widget_index) { @@ -68,6 +111,37 @@ std::string GetWidgetOnState(EPDF_FORM_MODEL model, return std::string(buffer.data()); } +RetainPtr GetEffectiveIndirectDictionary( + FPDF_DOCUMENT document, + uint32_t object_number) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? ToDictionary(doc->GetOrParseIndirectObject(object_number)) + : nullptr; +} + +RetainPtr GetMutableIndirectDictionary( + FPDF_DOCUMENT document, + uint32_t object_number) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + return doc ? ToDictionary(doc->GetMutableIndirectObject(object_number)) + : nullptr; +} + +std::wstring GetEffectiveWidgetAppearance(FPDF_DOCUMENT document, + uint32_t widget_object_number) { + RetainPtr widget = + GetEffectiveIndirectDictionary(document, widget_object_number); + RetainPtr appearance = + widget ? widget->GetDictFor("AP") : nullptr; + RetainPtr normal = + appearance ? appearance->GetStreamFor("N") : nullptr; + if (!normal) { + return std::wstring(); + } + const WideString text = normal->GetUnicodeText(); + return std::wstring(text.c_str(), text.GetLength()); +} + int FieldIndexByName(EPDF_FORM_MODEL model, const wchar_t* name) { for (int i = 0; i < EPDFForm_CountFields(model); ++i) { if (GetWideString(EPDFForm_GetFieldName, model, i) == name) { @@ -149,6 +223,66 @@ TEST_F(EPDFFormEmbedderTest, TextFormModel) { EPDFForm_CloseModel(model); } +TEST_F(EPDFFormEmbedderTest, TypedValueSnapshotPreservesPdfShapes) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + + RetainPtr multi = + GetMutableIndirectDictionary(document(), 12u); + ASSERT_TRUE(multi); + RetainPtr defaults = + multi->SetNewFor(pdfium::form_fields::kDV); + defaults->AppendNew(L"Alpha"); + defaults->AppendNew(L"Gamma"); + + RetainPtr empty_array = + GetMutableIndirectDictionary(document(), 9u); + ASSERT_TRUE(empty_array); + empty_array->SetNewFor(pdfium::form_fields::kDV); + + RetainPtr malformed = + GetMutableIndirectDictionary(document(), 10u); + ASSERT_TRUE(malformed); + malformed->SetNewFor(pdfium::form_fields::kV, 7); + malformed->SetNewFor(pdfium::form_fields::kDV); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + + int field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, EPDFForm_GetFieldValueKind(model, field)); + ASSERT_EQ(2, EPDFForm_CountFieldValues(model, field)); + EXPECT_EQ(L"Epsilon", GetCurrentFieldValue(model, field, 0)); + EXPECT_EQ(L"Gamma", GetCurrentFieldValue(model, field, 1)); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, + EPDFForm_GetFieldDefaultValueKind(model, field)); + ASSERT_EQ(2, EPDFForm_CountFieldDefaultValues(model, field)); + EXPECT_EQ(L"Alpha", GetDefaultFieldValue(model, field, 0)); + EXPECT_EQ(L"Gamma", GetDefaultFieldValue(model, field, 1)); + EXPECT_EQ(0u, EPDFForm_GetFieldValueAt(model, field, 2, nullptr, 0)); + + field = EPDFForm_GetFieldIndexByObjNum(model, 9u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, EPDFForm_GetFieldValueKind(model, field)); + EXPECT_EQ(L"Banana", GetCurrentFieldValue(model, field)); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EXPECT_EQ(0, EPDFForm_CountFieldDefaultValues(model, field)); + + field = EPDFForm_GetFieldIndexByObjNum(model, 10u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_UNSUPPORTED, + EPDFForm_GetFieldValueKind(model, field)); + EXPECT_EQ(0, EPDFForm_CountFieldValues(model, field)); + EXPECT_EQ(EPDF_FORM_VALUE_UNSUPPORTED, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EXPECT_EQ(0, EPDFForm_CountFieldDefaultValues(model, field)); + + EXPECT_EQ(EPDF_FORM_VALUE_NONE, EPDFForm_GetFieldValueKind(nullptr, 0)); + EXPECT_EQ(0, EPDFForm_CountFieldValues(nullptr, 0)); + EPDFForm_CloseModel(model); +} + TEST_F(EPDFFormEmbedderTest, ClickFormModel) { ASSERT_TRUE(OpenDocument("click_form.pdf")); EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); @@ -157,10 +291,11 @@ TEST_F(EPDFFormEmbedderTest, ClickFormModel) { ASSERT_EQ(4, EPDFForm_CountFields(model)); // Field 0: merged read-only checkbox, checked via /AS /Yes. - EXPECT_EQ(L"readOnlyCheckbox", GetWideString(EPDFForm_GetFieldName, model, 0)); + EXPECT_EQ(L"readOnlyCheckbox", + GetWideString(EPDFForm_GetFieldName, model, 0)); EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 0)); EXPECT_TRUE(EPDFForm_GetFieldFlags(model, 0) & 1); // ReadOnly. - EXPECT_EQ(L"Yes", GetWideString(EPDFForm_GetFieldValue, model, 0)); + EXPECT_EQ(L"Yes", GetCurrentFieldValue(model, 0)); ASSERT_EQ(1, EPDFForm_CountFieldWidgets(model, 0)); EXPECT_EQ("Yes", GetWidgetOnState(model, 0, 0)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 0, 0)); @@ -168,7 +303,7 @@ TEST_F(EPDFFormEmbedderTest, ClickFormModel) { // Field 1: merged checkbox, unchecked. EXPECT_EQ(L"checkbox", GetWideString(EPDFForm_GetFieldName, model, 1)); EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 1)); - EXPECT_EQ(L"Off", GetWideString(EPDFForm_GetFieldValue, model, 1)); + EXPECT_EQ(L"Off", GetCurrentFieldValue(model, 1)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 1, 0)); // Field 2: read-only radio group with three separate widget kids. @@ -181,7 +316,7 @@ TEST_F(EPDFFormEmbedderTest, ClickFormModel) { EXPECT_EQ("value3", GetWidgetOnState(model, 2, 2)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 2, 0)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 2, 2)); - EXPECT_EQ(L"value3", GetWideString(EPDFForm_GetFieldValue, model, 2)); + EXPECT_EQ(L"value3", GetCurrentFieldValue(model, 2)); EXPECT_EQ(L"value3", GetWidgetExportValue(model, 2, 2)); // Field 3: radio group; widgets 13/14/15 all map back to it. @@ -214,25 +349,23 @@ TEST_F(EPDFFormEmbedderTest, OrphanWidgetsRecovered) { EXPECT_EQ(L"linked_text", GetWideString(EPDFForm_GetFieldName, model, 0)); EXPECT_EQ(EPDF_FORMFIELD_FAMILY_TEXT, EPDFForm_GetFieldFamily(model, 0)); EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_ACROFORM, EPDFForm_GetFieldOrigin(model, 0)); - EXPECT_EQ(L"hello", GetWideString(EPDFForm_GetFieldValue, model, 0)); + EXPECT_EQ(L"hello", GetCurrentFieldValue(model, 0)); EXPECT_EQ(L"orphan_check", GetWideString(EPDFForm_GetFieldName, model, 1)); EXPECT_EQ(EPDF_FORMFIELD_FAMILY_CHECKBOX, EPDFForm_GetFieldFamily(model, 1)); - EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, - EPDFForm_GetFieldOrigin(model, 1)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, EPDFForm_GetFieldOrigin(model, 1)); EXPECT_EQ(5u, EPDFForm_GetFieldObjNum(model, 1)); ASSERT_EQ(1, EPDFForm_CountFieldWidgets(model, 1)); EXPECT_EQ("Yes", GetWidgetOnState(model, 1, 0)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 1, 0)); - EXPECT_EQ(L"Yes", GetWideString(EPDFForm_GetFieldValue, model, 1)); + EXPECT_EQ(L"Yes", GetCurrentFieldValue(model, 1)); // The radio group's parent field dictionary is not referenced anywhere in // /AcroForm /Fields. The sweep climbs /Parent from the first widget it // sees, so BOTH widgets must land on ONE logical field. EXPECT_EQ(L"orphan_radio", GetWideString(EPDFForm_GetFieldName, model, 2)); EXPECT_EQ(EPDF_FORMFIELD_FAMILY_RADIO, EPDFForm_GetFieldFamily(model, 2)); - EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, - EPDFForm_GetFieldOrigin(model, 2)); + EXPECT_EQ(EPDF_FORMFIELD_ORIGIN_RECOVERED, EPDFForm_GetFieldOrigin(model, 2)); EXPECT_EQ(6u, EPDFForm_GetFieldObjNum(model, 2)); EXPECT_TRUE(EPDFForm_GetFieldFlags(model, 2) & 0x8000); // Radio. ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, 2)); @@ -243,7 +376,7 @@ TEST_F(EPDFFormEmbedderTest, OrphanWidgetsRecovered) { EXPECT_EQ("b", GetWidgetOnState(model, 2, 1)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, 2, 0)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, 2, 1)); - EXPECT_EQ(L"a", GetWideString(EPDFForm_GetFieldValue, model, 2)); + EXPECT_EQ(L"a", GetCurrentFieldValue(model, 2)); EXPECT_EQ(2, EPDFForm_GetFieldIndexForWidget(model, 8u)); EXPECT_EQ(2, EPDFForm_GetFieldIndexForWidget(model, 9u)); @@ -288,8 +421,8 @@ TEST_F(EPDFFormEmbedderTest, SetToggleRadioOnLayer) { uint32_t changed[4] = {}; unsigned long changed_count = 0; - ASSERT_TRUE(EPDFForm_SetToggle(doc.layer, 6u, "b", changed, 4, - &changed_count)); + ASSERT_TRUE( + EPDFForm_SetToggle(doc.layer, 6u, "b", changed, 4, &changed_count)); EXPECT_EQ(2ul, changed_count); EXPECT_EQ(8u, changed[0]); // /AS a -> Off EXPECT_EQ(9u, changed[1]); // /AS Off -> b @@ -302,15 +435,15 @@ TEST_F(EPDFFormEmbedderTest, SetToggleRadioOnLayer) { ASSERT_TRUE(model); const int field = EPDFForm_GetFieldIndexByObjNum(model, 6u); ASSERT_GE(field, 0); - EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"b", GetCurrentFieldValue(model, field)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); EPDFForm_CloseModel(model); // Idempotence: re-setting the same state changes nothing and promotes // nothing further. - ASSERT_TRUE(EPDFForm_SetToggle(doc.layer, 6u, "b", nullptr, 0, - &changed_count)); + ASSERT_TRUE( + EPDFForm_SetToggle(doc.layer, 6u, "b", nullptr, 0, &changed_count)); EXPECT_EQ(0ul, changed_count); EXPECT_EQ(3ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); } @@ -333,15 +466,15 @@ TEST_F(EPDFFormEmbedderTest, SetToggleClearRadioGroup) { ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); // orphan_radio has no NoToggleToOff flag, so clearing is legal. unsigned long changed_count = 0; - ASSERT_TRUE(EPDFForm_SetToggle(document(), 6u, nullptr, nullptr, 0, - &changed_count)); + ASSERT_TRUE( + EPDFForm_SetToggle(document(), 6u, nullptr, nullptr, 0, &changed_count)); EXPECT_EQ(1ul, changed_count); // Only widget 8 was checked. EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); const int field = EPDFForm_GetFieldIndexByObjNum(model, 6u); ASSERT_GE(field, 0); - EXPECT_EQ(L"Off", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"Off", GetCurrentFieldValue(model, field)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); EPDFForm_CloseModel(model); @@ -351,44 +484,45 @@ TEST_F(EPDFFormEmbedderTest, ToggleSemantics) { ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); // NoToggleToOff: clearing the group is rejected; switching is fine. - EXPECT_FALSE(EPDFForm_SetToggle(document(), 5u, nullptr, nullptr, 0, - nullptr)); + EXPECT_FALSE( + EPDFForm_SetToggle(document(), 5u, nullptr, nullptr, 0, nullptr)); ASSERT_TRUE(EPDFForm_SetToggle(document(), 5u, "y", nullptr, 0, nullptr)); // Radios in unison: both /u1 widgets check together. unsigned long changed_count = 0; - ASSERT_TRUE(EPDFForm_SetToggle(document(), 8u, "u1", nullptr, 0, - &changed_count)); + ASSERT_TRUE( + EPDFForm_SetToggle(document(), 8u, "u1", nullptr, 0, &changed_count)); EXPECT_EQ(2ul, changed_count); EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); int field = EPDFForm_GetFieldIndexByObjNum(model, 5u); ASSERT_GE(field, 0); - EXPECT_EQ(L"y", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"y", GetCurrentFieldValue(model, field)); field = EPDFForm_GetFieldIndexByObjNum(model, 8u); ASSERT_GE(field, 0); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 2)); - EXPECT_EQ(L"u1", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"u1", GetCurrentFieldValue(model, field)); EPDFForm_CloseModel(model); // Switching to /u2 unchecks both unison widgets: three /AS flips. - ASSERT_TRUE(EPDFForm_SetToggle(document(), 8u, "u2", nullptr, 0, - &changed_count)); + ASSERT_TRUE( + EPDFForm_SetToggle(document(), 8u, "u2", nullptr, 0, &changed_count)); EXPECT_EQ(3ul, changed_count); - // Checkbox with /Opt: /V becomes the control index name, and the field - // value reads back as the /Opt export value (Acrobat convention). + // Checkbox with /Opt: raw /V is the control index name. The semantic + // export value remains available on the widget. ASSERT_TRUE(EPDFForm_SetToggle(document(), 12u, "On", nullptr, 0, nullptr)); model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); field = EPDFForm_GetFieldIndexByObjNum(model, 12u); ASSERT_GE(field, 0); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); - EXPECT_EQ(L"Alpha", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"0", GetCurrentFieldValue(model, field)); + EXPECT_EQ(L"Alpha", GetWidgetExportValue(model, field, 0)); EPDFForm_CloseModel(model); } @@ -405,8 +539,7 @@ TEST_F(EPDFFormEmbedderTest, SetTextValue) { EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); - EXPECT_EQ(L"Hello EmbedPDF", - GetWideString(EPDFForm_GetFieldValue, model, 0)); + EXPECT_EQ(L"Hello EmbedPDF", GetCurrentFieldValue(model, 0)); EPDFForm_CloseModel(model); // The widget's normal appearance stream was regenerated. @@ -431,15 +564,10 @@ TEST_F(EPDFFormEmbedderTest, SetTextValueMaxLenAndLayerDelta) { LayerDoc doc; ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &doc)); - // Six characters against /MaxLen 5: rejected, side-effect free. + // Six characters against /MaxLen 5: Acrobat-compatible writes truncate. ScopedFPDFWideString too_long = GetFPDFWideString(L"abcdef"); - EXPECT_FALSE(EPDFForm_SetTextValue(doc.layer, 4u, too_long.get(), nullptr, - 0, nullptr)); - EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); - - ScopedFPDFWideString fits = GetFPDFWideString(L"abcde"); unsigned long changed_count = 0; - ASSERT_TRUE(EPDFForm_SetTextValue(doc.layer, 4u, fits.get(), nullptr, 0, + ASSERT_TRUE(EPDFForm_SetTextValue(doc.layer, 4u, too_long.get(), nullptr, 0, &changed_count)); EXPECT_EQ(1ul, changed_count); EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 4u)); @@ -451,8 +579,126 @@ TEST_F(EPDFFormEmbedderTest, SetTextValueMaxLenAndLayerDelta) { ASSERT_TRUE(model); const int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); ASSERT_GE(field, 0); - EXPECT_EQ(L"abcde", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"abcde", GetCurrentFieldValue(model, field)); EPDFForm_CloseModel(model); + + // Reassigning a value that normalizes to the stored value is a no-op. + ScopedFPDFWideString fits = GetFPDFWideString(L"abcde"); + ASSERT_TRUE(EPDFForm_SetTextValue(doc.layer, 4u, fits.get(), nullptr, 0, + &changed_count)); + EXPECT_EQ(0ul, changed_count); +} + +TEST_F(EPDFFormEmbedderTest, SetFieldDisplayOnLayerIsDurable) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("text_form.pdf", &doc)); + + EXPECT_FALSE( + EPDFForm_SetFieldDisplay(doc.layer, 4u, 99, nullptr, 0, nullptr)); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + + uint32_t changed[1] = {}; + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetFieldDisplay(doc.layer, 4u, EPDF_FORM_DISPLAY_HIDDEN, + changed, 1, &changed_count)); + ASSERT_EQ(1ul, changed_count); + EXPECT_EQ(4u, changed[0]); + EXPECT_EQ(1ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 4u)); + + RetainPtr widget = + GetEffectiveIndirectDictionary(doc.layer, 4u); + ASSERT_TRUE(widget); + int flags = widget->GetIntegerFor("F"); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_HIDDEN); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_PRINT); + EXPECT_FALSE(flags & FPDF_ANNOT_FLAG_NOVIEW); + + ClearString(); + EPDFLayerSaveStatus save_status; + ASSERT_TRUE(EPDFLayer_SaveDelta(doc.layer, this, &save_status)); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS file_access = {}; + file_access.m_FileLen = static_cast(delta.size()); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + EPDFLayerOpenStatus status; + FPDF_DOCUMENT second = + EPDFLayer_OpenLayer(doc.base, &file_access, nullptr, &status); + ASSERT_TRUE(second); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + widget = GetEffectiveIndirectDictionary(second, 4u); + ASSERT_TRUE(widget); + flags = widget->GetIntegerFor("F"); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_HIDDEN); + EXPECT_TRUE(flags & FPDF_ANNOT_FLAG_PRINT); + FPDF_CloseDocument(second); +} + +TEST_F(EPDFFormEmbedderTest, SetFieldAppearanceTextOnLayerIsDurable) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("text_form.pdf", &doc)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(doc.layer); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + ASSERT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); + + ScopedFPDFWideString formatted = GetFPDFWideString(L"FormattedValue"); + uint32_t changed[1] = {}; + unsigned long changed_count = 0; + ASSERT_TRUE(EPDFForm_SetFieldAppearanceText(doc.layer, 4u, formatted.get(), + changed, 1, &changed_count)); + ASSERT_EQ(1ul, changed_count); + EXPECT_EQ(4u, changed[0]); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 4u)); + + model = EPDFForm_LoadModel(doc.layer); + ASSERT_TRUE(model); + field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); + + const std::wstring first_appearance = + GetEffectiveWidgetAppearance(doc.layer, 4u); + EXPECT_NE(std::wstring::npos, first_appearance.find(L"FormattedValue")) + << first_appearance; + + ClearString(); + EPDFLayerSaveStatus save_status; + ASSERT_TRUE(EPDFLayer_SaveDelta(doc.layer, this, &save_status)); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS file_access = {}; + file_access.m_FileLen = static_cast(delta.size()); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + EPDFLayerOpenStatus status; + FPDF_DOCUMENT second = + EPDFLayer_OpenLayer(doc.base, &file_access, nullptr, &status); + ASSERT_TRUE(second); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + model = EPDFForm_LoadModel(second); + ASSERT_TRUE(model); + field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); + const std::wstring second_appearance = + GetEffectiveWidgetAppearance(second, 4u); + EXPECT_NE(std::wstring::npos, second_appearance.find(L"FormattedValue")) + << second_appearance; + FPDF_CloseDocument(second); } TEST_F(EPDFFormEmbedderTest, SetChoiceValuesCombo) { @@ -471,8 +717,8 @@ TEST_F(EPDFFormEmbedderTest, SetChoiceValuesCombo) { // Non-edit combo: option values only. ScopedFPDFWideString cherry = GetFPDFWideString(L"Cherry"); FPDF_WIDESTRING one_value[] = {cherry.get()}; - ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), combo1_objnum, one_value, - 1, nullptr, 0, nullptr)); + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), combo1_objnum, one_value, 1, + nullptr, 0, nullptr)); ScopedFPDFWideString bogus = GetFPDFWideString(L"NotAnOption"); FPDF_WIDESTRING bogus_value[] = {bogus.get()}; EXPECT_FALSE(EPDFForm_SetChoiceValues(document(), combo1_objnum, bogus_value, @@ -480,8 +726,8 @@ TEST_F(EPDFFormEmbedderTest, SetChoiceValuesCombo) { // Edit combo: free text is accepted and clears /I; an option export value // selects that option. - ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), editable_objnum, - bogus_value, 1, nullptr, 0, nullptr)); + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), editable_objnum, bogus_value, + 1, nullptr, 0, nullptr)); ScopedFPDFWideString bar = GetFPDFWideString(L"bar"); FPDF_WIDESTRING bar_value[] = {bar.get()}; ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), editable_objnum, bar_value, @@ -489,9 +735,9 @@ TEST_F(EPDFFormEmbedderTest, SetChoiceValuesCombo) { model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); - EXPECT_EQ(L"Cherry", GetWideString(EPDFForm_GetFieldValue, model, combo1)); + EXPECT_EQ(L"Cherry", GetCurrentFieldValue(model, combo1)); EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, combo1, 2)); - EXPECT_EQ(L"bar", GetWideString(EPDFForm_GetFieldValue, model, editable)); + EXPECT_EQ(L"bar", GetCurrentFieldValue(model, editable)); EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, editable, 1)); EPDFForm_CloseModel(model); } @@ -513,8 +759,8 @@ TEST_F(EPDFFormEmbedderTest, SetChoiceValuesListbox) { ScopedFPDFWideString cherry = GetFPDFWideString(L"Cherry"); ScopedFPDFWideString apple = GetFPDFWideString(L"Apple"); FPDF_WIDESTRING two_values[] = {cherry.get(), apple.get()}; - ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), multi_objnum, two_values, - 2, nullptr, 0, nullptr)); + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), multi_objnum, two_values, 2, + nullptr, 0, nullptr)); // Single-select rejects multiple values. EXPECT_FALSE(EPDFForm_SetChoiceValues(document(), single_objnum, two_values, 2, nullptr, 0, nullptr)); @@ -545,45 +791,227 @@ TEST_F(EPDFFormEmbedderTest, ResetField) { // Text reset with no /DV removes the value. ScopedFPDFWideString text = GetFPDFWideString(L"xyz"); - ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, text.get(), nullptr, 0, - nullptr)); + ASSERT_TRUE( + EPDFForm_SetTextValue(document(), 4u, text.get(), nullptr, 0, nullptr)); ASSERT_TRUE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); int field = EPDFForm_GetFieldIndexByObjNum(model, 5u); ASSERT_GE(field, 0); - EXPECT_EQ(L"x", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"x", GetCurrentFieldValue(model, field)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); field = EPDFForm_GetFieldIndexByObjNum(model, 4u); ASSERT_GE(field, 0); - EXPECT_EQ(L"", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, MultiSelectDefaultsResetValueAndIndices) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + + ScopedFPDFWideString epsilon = GetFPDFWideString(L"Epsilon"); + ScopedFPDFWideString gamma = GetFPDFWideString(L"Gamma"); + FPDF_WIDESTRING defaults[] = {epsilon.get(), gamma.get()}; + ASSERT_TRUE(EPDFForm_SetFieldDefaultValues(document(), 12u, defaults, 2)); + + // Defaults are stored in option order, matching current-value writes. + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, + EPDFForm_GetFieldDefaultValueKind(model, field)); + ASSERT_EQ(2, EPDFForm_CountFieldDefaultValues(model, field)); + EXPECT_EQ(L"Gamma", GetDefaultFieldValue(model, field, 0)); + EXPECT_EQ(L"Epsilon", GetDefaultFieldValue(model, field, 1)); + EPDFForm_CloseModel(model); + + ScopedFPDFWideString alpha = GetFPDFWideString(L"Alpha"); + FPDF_WIDESTRING current[] = {alpha.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), 12u, current, 1, nullptr, 0, + nullptr)); + ASSERT_TRUE(EPDFForm_ResetField(document(), 12u, nullptr, 0, nullptr)); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, EPDFForm_GetFieldValueKind(model, field)); + ASSERT_EQ(2, EPDFForm_CountFieldValues(model, field)); + EXPECT_EQ(L"Gamma", GetCurrentFieldValue(model, field, 0)); + EXPECT_EQ(L"Epsilon", GetCurrentFieldValue(model, field, 1)); + EPDFForm_CloseModel(model); + + RetainPtr dictionary = + GetEffectiveIndirectDictionary(document(), 12u); + ASSERT_TRUE(dictionary); + RetainPtr indices = dictionary->GetArrayFor("I"); + ASSERT_TRUE(indices); + ASSERT_EQ(2u, indices->size()); + EXPECT_EQ(2, indices->GetIntegerAt(0)); // Gamma. + EXPECT_EQ(4, indices->GetIntegerAt(1)); // Epsilon. +} + +TEST_F(EPDFFormEmbedderTest, MultiSelectDefaultsAreLayerDurable) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("listbox_form.pdf", &doc)); + + ScopedFPDFWideString gamma = GetFPDFWideString(L"Gamma"); + ScopedFPDFWideString epsilon = GetFPDFWideString(L"Epsilon"); + FPDF_WIDESTRING defaults[] = {gamma.get(), epsilon.get()}; + ASSERT_TRUE(EPDFForm_SetFieldDefaultValues(doc.layer, 12u, defaults, 2)); + EXPECT_EQ(1ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + ASSERT_TRUE(EPDFForm_ResetField(doc.layer, 12u, nullptr, 0, nullptr)); + // Reset also regenerates the appearance and therefore promotes its shared + // resource object in addition to the field/widget dictionary. + EXPECT_EQ(2ul, EPDFLayer_GetPromotedObjectCount(doc.layer)); + + ClearString(); + EPDFLayerSaveStatus save_status; + ASSERT_TRUE(EPDFLayer_SaveDelta(doc.layer, this, &save_status)); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS file_access = {}; + file_access.m_FileLen = static_cast(delta.size()); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + EPDFLayerOpenStatus status; + FPDF_DOCUMENT reopened = + EPDFLayer_OpenLayer(doc.base, &file_access, nullptr, &status); + ASSERT_TRUE(reopened); + EXPECT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(reopened); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, EPDFForm_GetFieldValueKind(model, field)); + ASSERT_EQ(2, EPDFForm_CountFieldDefaultValues(model, field)); + EXPECT_EQ(L"Gamma", GetDefaultFieldValue(model, field, 0)); + EXPECT_EQ(L"Epsilon", GetDefaultFieldValue(model, field, 1)); + EPDFForm_CloseModel(model); + FPDF_CloseDocument(reopened); +} + +TEST_F(EPDFFormEmbedderTest, EmptyTextDefaultIsScalarAndCanBeRemoved) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + + ScopedFPDFWideString empty = GetFPDFWideString(L""); + FPDF_WIDESTRING defaults[] = {empty.get()}; + ASSERT_TRUE(EPDFForm_SetFieldDefaultValues(document(), 4u, defaults, 1)); + EXPECT_FALSE(EPDFForm_SetFieldDefaultValues(document(), 4u, nullptr, 0)); + FPDF_WIDESTRING too_many[] = {empty.get(), empty.get()}; + EXPECT_FALSE(EPDFForm_SetFieldDefaultValues(document(), 4u, too_many, 2)); + + ScopedFPDFWideString current = GetFPDFWideString(L"not empty"); + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, current.get(), nullptr, 0, + nullptr)); + ASSERT_TRUE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EXPECT_EQ(1, EPDFForm_CountFieldDefaultValues(model, field)); + EXPECT_EQ(L"", GetDefaultFieldValue(model, field)); + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, EPDFForm_GetFieldValueKind(model, field)); + EXPECT_EQ(1, EPDFForm_CountFieldValues(model, field)); + EXPECT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); + + ASSERT_TRUE(EPDFForm_RemoveFieldDefaultValue(document(), 4u)); + model = EPDFForm_LoadModel(document()); + field = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_EQ(EPDF_FORM_VALUE_NONE, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ToggleDefaultWithOptUsesControlIndex) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + + ASSERT_TRUE(EPDFForm_SetFieldDefaultToggle(document(), 12u, "On")); + EXPECT_FALSE(EPDFForm_SetFieldDefaultToggle(document(), 12u, "Missing")); + EXPECT_FALSE(EPDFForm_SetFieldDefaultToggle(document(), 12u, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, + EPDFForm_GetFieldDefaultValueKind(model, field)); + EXPECT_EQ(L"0", GetDefaultFieldValue(model, field)); + EPDFForm_CloseModel(model); + + ASSERT_TRUE(EPDFForm_SetToggle(document(), 12u, "On", nullptr, 0, nullptr)); + ASSERT_TRUE( + EPDFForm_SetToggle(document(), 12u, nullptr, nullptr, 0, nullptr)); + ASSERT_TRUE(EPDFForm_ResetField(document(), 12u, nullptr, 0, nullptr)); + + model = EPDFForm_LoadModel(document()); + field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + EXPECT_EQ(L"0", GetCurrentFieldValue(model, field)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EPDFForm_CloseModel(model); + + // /Off is distinct from a missing default and resets the widget off. + ASSERT_TRUE(EPDFForm_SetFieldDefaultToggle(document(), 12u, "Off")); + ASSERT_TRUE(EPDFForm_ResetField(document(), 12u, nullptr, 0, nullptr)); + model = EPDFForm_LoadModel(document()); + field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + EXPECT_EQ(L"Off", GetDefaultFieldValue(model, field)); + EXPECT_FALSE(EPDFForm_IsFieldWidgetChecked(model, field, 0)); + EPDFForm_CloseModel(model); +} + +TEST_F(EPDFFormEmbedderTest, ResetRejectsMalformedDefaultWithoutMutation) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + RetainPtr field = + GetMutableIndirectDictionary(document(), 4u); + ASSERT_TRUE(field); + field->SetNewFor(pdfium::form_fields::kDV, 42); + const WideString original = field->GetUnicodeTextFor(pdfium::form_fields::kV); + + EXPECT_FALSE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); + EXPECT_EQ(original, field->GetUnicodeTextFor(pdfium::form_fields::kV)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int index = EPDFForm_GetFieldIndexByObjNum(model, 4u); + EXPECT_EQ(EPDF_FORM_VALUE_UNSUPPORTED, + EPDFForm_GetFieldDefaultValueKind(model, index)); EPDFForm_CloseModel(model); } namespace { -std::string ExportFdf(FPDF_DOCUMENT doc) { - unsigned long length = EPDFForm_ExportFDF(doc, nullptr, 0, nullptr, 0); +std::string ExportFdf(FPDF_DOCUMENT doc, uint32_t flags = 0) { + unsigned long length = EPDFForm_ExportFDF(doc, nullptr, flags, nullptr, 0); if (length == 0) { return std::string(); } std::vector buffer(length); EXPECT_EQ(length, - EPDFForm_ExportFDF(doc, nullptr, 0, buffer.data(), length)); + EPDFForm_ExportFDF(doc, nullptr, flags, buffer.data(), length)); return std::string(buffer.data(), length); } -std::string ExportXfdf(FPDF_DOCUMENT doc) { - unsigned long length = EPDFForm_ExportXFDF(doc, nullptr, 0, nullptr, 0); +std::string ExportXfdf(FPDF_DOCUMENT doc, uint32_t flags = 0) { + unsigned long length = EPDFForm_ExportXFDF(doc, nullptr, flags, nullptr, 0); if (length == 0) { return std::string(); } std::vector buffer(length); EXPECT_EQ(length, - EPDFForm_ExportXFDF(doc, nullptr, 0, buffer.data(), length)); + EPDFForm_ExportXFDF(doc, nullptr, flags, buffer.data(), length)); return std::string(buffer.data(), length); } @@ -612,6 +1040,27 @@ TEST_F(EPDFFormEmbedderTest, ExportFDFIncludesRecoveredFields) { EXPECT_NE(std::string::npos, fdf.find("(orphan_radio)")); } +TEST_F(EPDFFormEmbedderTest, RequiredMultiSelectArrayIsNotSkippedOnExport) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + ASSERT_TRUE(EPDFForm_SetFieldFlags(document(), 12u, + pdfium::form_flags::kRequired, 0)); + + const std::string fdf = + ExportFdf(document(), EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED); + ASSERT_FALSE(fdf.empty()); + EXPECT_NE(std::string::npos, fdf.find("(Listbox_MultiSelectMultipleValues)")); + EXPECT_NE(std::string::npos, fdf.find("(Epsilon)")); + EXPECT_NE(std::string::npos, fdf.find("(Gamma)")); + + const std::string xfdf = + ExportXfdf(document(), EPDF_FORM_EXPORT_SKIP_EMPTY_REQUIRED); + ASSERT_FALSE(xfdf.empty()); + EXPECT_NE(std::string::npos, + xfdf.find("")); + EXPECT_NE(std::string::npos, xfdf.find("Epsilon")); + EXPECT_NE(std::string::npos, xfdf.find("Gamma")); +} + TEST_F(EPDFFormEmbedderTest, ImportFDF) { ASSERT_TRUE(OpenDocument("orphan_widgets.pdf")); static const char kFdf[] = @@ -637,9 +1086,9 @@ TEST_F(EPDFFormEmbedderTest, ImportFDF) { EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); - EXPECT_EQ(L"imported", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"imported", GetCurrentFieldValue(model, field)); field = EPDFForm_GetFieldIndexByObjNum(model, 6u); - EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"b", GetCurrentFieldValue(model, field)); EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, field, 1)); EPDFForm_CloseModel(model); @@ -653,8 +1102,8 @@ TEST_F(EPDFFormEmbedderTest, FdfRoundTripAcrossLayers) { LayerDoc first; ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &first)); ScopedFPDFWideString bob = GetFPDFWideString(L"Bob"); - ASSERT_TRUE(EPDFForm_SetTextValue(first.layer, 4u, bob.get(), nullptr, 0, - nullptr)); + ASSERT_TRUE( + EPDFForm_SetTextValue(first.layer, 4u, bob.get(), nullptr, 0, nullptr)); ASSERT_TRUE(EPDFForm_SetToggle(first.layer, 6u, "b", nullptr, 0, nullptr)); unsigned long length = @@ -667,18 +1116,18 @@ TEST_F(EPDFFormEmbedderTest, FdfRoundTripAcrossLayers) { LayerDoc second; ASSERT_TRUE(OpenLayer("orphan_widgets.pdf", &second)); EPDF_FORM_IMPORT_RESULT result; - ASSERT_TRUE( - EPDFForm_ImportFDF(second.layer, fdf.data(), length, &result)); - EXPECT_EQ(3u, result.fields_total); // linked_text, orphan_check, orphan_radio + ASSERT_TRUE(EPDFForm_ImportFDF(second.layer, fdf.data(), length, &result)); + EXPECT_EQ(3u, + result.fields_total); // linked_text, orphan_check, orphan_radio EXPECT_EQ(3u, result.fields_applied); EXPECT_EQ(0u, result.fields_skipped); EPDF_FORM_MODEL model = EPDFForm_LoadModel(second.layer); ASSERT_TRUE(model); int field = EPDFForm_GetFieldIndexByObjNum(model, 4u); - EXPECT_EQ(L"Bob", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"Bob", GetCurrentFieldValue(model, field)); field = EPDFForm_GetFieldIndexByObjNum(model, 6u); - EXPECT_EQ(L"b", GetWideString(EPDFForm_GetFieldValue, model, field)); + EXPECT_EQ(L"b", GetCurrentFieldValue(model, field)); EPDFForm_CloseModel(model); } @@ -690,7 +1139,8 @@ TEST_F(EPDFFormEmbedderTest, ExportXFDF) { // Attributes serialize in map order (xml:space before xmlns); assert them // individually rather than positionally. EXPECT_NE(std::string::npos, xfdf.find(". EXPECT_NE(std::string::npos, xfdf.find("abc")); @@ -723,10 +1173,9 @@ TEST_F(EPDFFormEmbedderTest, ImportXFDF) { const int billing_name = FieldIndexByName(model, L"billing.name"); ASSERT_GE(billing_name, 0); // Entity decoding round-trips. - EXPECT_EQ(L"Bob & Co", - GetWideString(EPDFForm_GetFieldValue, model, billing_name)); + EXPECT_EQ(L"Bob & Co", GetCurrentFieldValue(model, billing_name)); const int radio = EPDFForm_GetFieldIndexByObjNum(model, 5u); - EXPECT_EQ(L"y", GetWideString(EPDFForm_GetFieldValue, model, radio)); + EXPECT_EQ(L"y", GetCurrentFieldValue(model, radio)); EPDFForm_CloseModel(model); } @@ -762,29 +1211,27 @@ TEST_F(EPDFFormEmbedderTest, XfdfRoundTripPreservesValues) { LayerDoc first; ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &first)); ScopedFPDFWideString tricky = GetFPDFWideString(L"a&\"c\" 'd'"); - ASSERT_TRUE(EPDFForm_SetTextValue(first.layer, 17u, tricky.get(), nullptr, - 0, nullptr)); + ASSERT_TRUE(EPDFForm_SetTextValue(first.layer, 17u, tricky.get(), nullptr, 0, + nullptr)); unsigned long length = EPDFForm_ExportXFDF(first.layer, nullptr, 0, nullptr, 0); ASSERT_GT(length, 0u); std::vector xfdf(length); - ASSERT_EQ(length, EPDFForm_ExportXFDF(first.layer, nullptr, 0, xfdf.data(), - length)); + ASSERT_EQ(length, + EPDFForm_ExportXFDF(first.layer, nullptr, 0, xfdf.data(), length)); LayerDoc second; ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &second)); EPDF_FORM_IMPORT_RESULT result; - ASSERT_TRUE( - EPDFForm_ImportXFDF(second.layer, xfdf.data(), length, &result)); + ASSERT_TRUE(EPDFForm_ImportXFDF(second.layer, xfdf.data(), length, &result)); EXPECT_EQ(0u, result.fields_skipped); EPDF_FORM_MODEL model = EPDFForm_LoadModel(second.layer); ASSERT_TRUE(model); const int billing_name = FieldIndexByName(model, L"billing.name"); ASSERT_GE(billing_name, 0); - EXPECT_EQ(L"a&\"c\" 'd'", - GetWideString(EPDFForm_GetFieldValue, model, billing_name)); + EXPECT_EQ(L"a&\"c\" 'd'", GetCurrentFieldValue(model, billing_name)); EPDFForm_CloseModel(model); } @@ -890,8 +1337,8 @@ TEST_F(EPDFFormEmbedderTest, RepairBakesMissingAppearances) { ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); EPDF_FORM_REPAIR_REPORT report; - ASSERT_TRUE(EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, - &report)); + ASSERT_TRUE( + EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, &report)); // maxlen_text (4) and billing.name (17) ship without /AP. EXPECT_GE(report.appearances_baked, 2u); EXPECT_EQ(0u, report.need_appearances_cleared); // flag was never set @@ -909,17 +1356,47 @@ TEST_F(EPDFFormEmbedderTest, RepairBakesMissingAppearances) { UnloadPage(page); // Idempotent: everything has an appearance now. - ASSERT_TRUE(EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, - &report)); + ASSERT_TRUE( + EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, &report)); EXPECT_EQ(0u, report.appearances_baked); } +TEST_F(EPDFFormEmbedderTest, RepairBakeClearsNeedAppearances) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(doc); + RetainPtr acro_form = + doc->GetMutableRoot()->GetMutableDictFor("AcroForm"); + ASSERT_TRUE(acro_form); + acro_form->SetNewFor("NeedAppearances", true); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_TRUE(EPDFForm_GetNeedAppearances(model)); + EPDFForm_CloseModel(model); + + EPDF_FORM_REPAIR_REPORT report; + ASSERT_TRUE( + EPDFForm_Repair(document(), EPDF_FORM_REPAIR_BAKE_APPEARANCES, &report)); + EXPECT_GT(report.appearances_baked, 0u); + EXPECT_EQ(1u, report.need_appearances_cleared); + EXPECT_FALSE(acro_form->KeyExist("NeedAppearances")); + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_FALSE(EPDFForm_GetNeedAppearances(model)); + EPDFForm_CloseModel(model); +} + namespace { // Create an unattached widget annotation through the ANNOTATION API - the // authoring model's first step (widgets are born as annotations). -uint32_t CreateWidgetAnnot(FPDF_PAGE page, float left, float bottom, - float right, float top) { +uint32_t CreateWidgetAnnot(FPDF_PAGE page, + float left, + float bottom, + float right, + float top) { // EPDFPage_CreateAnnot creates an INDIRECT annotation (durable object // number), unlike upstream FPDFPage_CreateAnnot. ScopedFPDFAnnotation annot(EPDFPage_CreateAnnot(page, FPDF_ANNOT_WIDGET)); @@ -995,11 +1472,12 @@ TEST_F(EPDFFormEmbedderTest, AttachWidgetsFormsARadioGroup) { // The newborn group is immediately fillable through the P1 transaction. unsigned long changed = 0; - ASSERT_TRUE(EPDFForm_SetToggle(document(), field, "male", nullptr, 0, &changed)); + ASSERT_TRUE( + EPDFForm_SetToggle(document(), field, "male", nullptr, 0, &changed)); EXPECT_EQ(1ul, changed); model = EPDFForm_LoadModel(document()); - EXPECT_EQ(L"male", GetWideString(EPDFForm_GetFieldValue, model, - EPDFForm_GetFieldIndexByObjNum(model, field))); + EXPECT_EQ(L"male", GetCurrentFieldValue( + model, EPDFForm_GetFieldIndexByObjNum(model, field))); EPDFForm_CloseModel(model); UnloadPage(page); } @@ -1030,7 +1508,8 @@ TEST_F(EPDFFormEmbedderTest, AttachToLegacyMergedFieldKeepsFieldId) { // Both widgets still fill together. ScopedFPDFWideString value = GetFPDFWideString(L"ab"); - ASSERT_TRUE(EPDFForm_SetTextValue(document(), 4u, value.get(), nullptr, 0, nullptr)); + ASSERT_TRUE( + EPDFForm_SetTextValue(document(), 4u, value.get(), nullptr, 0, nullptr)); UnloadPage(page); } @@ -1039,8 +1518,8 @@ TEST_F(EPDFFormEmbedderTest, DetachWidgetKeepsFieldVisible) { FPDF_PAGE page = LoadPage(0); ASSERT_TRUE(page); - const uint32_t field = EPDFForm_CreateField( - document(), 4, GetFPDFWideString(L"note").get()); + const uint32_t field = + EPDFForm_CreateField(document(), 4, GetFPDFWideString(L"note").get()); const uint32_t widget = CreateWidgetAnnot(page, 20, 200, 200, 220); ASSERT_TRUE(EPDFForm_AttachWidget(document(), field, widget, nullptr)); ASSERT_TRUE(EPDFForm_DetachWidget(document(), field, widget)); @@ -1070,7 +1549,8 @@ TEST_F(EPDFFormEmbedderTest, DeleteFieldDetachesAndPrunesAncestors) { uint32_t detached[4] = {}; unsigned long detached_count = 0; - ASSERT_TRUE(EPDFForm_DeleteField(document(), field, detached, 4, &detached_count)); + ASSERT_TRUE( + EPDFForm_DeleteField(document(), field, detached, 4, &detached_count)); EXPECT_EQ(1ul, detached_count); EXPECT_EQ(widget, detached[0]); @@ -1090,8 +1570,8 @@ TEST_F(EPDFFormEmbedderTest, FieldSettersValidateAndApply) { GetFPDFWideString(L"fullName").get())); EXPECT_FALSE(EPDFForm_SetFieldName(document(), 4u, GetFPDFWideString(L"unison_radio").get())); - EXPECT_FALSE(EPDFForm_SetFieldName(document(), 4u, - GetFPDFWideString(L"a.b").get())); + EXPECT_FALSE( + EPDFForm_SetFieldName(document(), 4u, GetFPDFWideString(L"a.b").get())); // Flags: masked update works; family-defining bits are immutable. ASSERT_TRUE(EPDFForm_SetFieldFlags(document(), 4u, 1u << 1, 0)); // +Required @@ -1101,8 +1581,10 @@ TEST_F(EPDFFormEmbedderTest, FieldSettersValidateAndApply) { EXPECT_FALSE(EPDFForm_SetFieldMaxLen(document(), 4u, 2)); ASSERT_TRUE(EPDFForm_SetFieldMaxLen(document(), 4u, 10)); - ASSERT_TRUE(EPDFForm_SetFieldDefaultValue(document(), 4u, - GetFPDFWideString(L"dflt").get())); + ScopedFPDFWideString default_value = GetFPDFWideString(L"dflt"); + FPDF_WIDESTRING default_values[] = {default_value.get()}; + ASSERT_TRUE( + EPDFForm_SetFieldDefaultValues(document(), 4u, default_values, 1)); ASSERT_TRUE(EPDFForm_SetFieldAlternateName( document(), 4u, GetFPDFWideString(L"Your name").get())); ASSERT_TRUE(EPDFForm_SetFieldMappingName(document(), 4u, @@ -1111,24 +1593,72 @@ TEST_F(EPDFFormEmbedderTest, FieldSettersValidateAndApply) { EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); ASSERT_TRUE(model); int index = EPDFForm_GetFieldIndexByObjNum(model, 17u); - EXPECT_EQ(L"billing.fullName", GetWideString(EPDFForm_GetFieldName, model, index)); + EXPECT_EQ(L"billing.fullName", + GetWideString(EPDFForm_GetFieldName, model, index)); index = EPDFForm_GetFieldIndexByObjNum(model, 4u); EXPECT_TRUE(EPDFForm_GetFieldFlags(model, index) & (1u << 1)); EXPECT_EQ(10, EPDFForm_GetFieldMaxLen(model, index)); - EXPECT_EQ(L"dflt", GetWideString(EPDFForm_GetFieldDefaultValue, model, index)); + EXPECT_EQ(L"dflt", GetDefaultFieldValue(model, index)); EXPECT_EQ(L"Your name", GetWideString(EPDFForm_GetFieldAlternateName, model, index)); - EXPECT_EQ(L"name_x", GetWideString(EPDFForm_GetFieldMappingName, model, index)); + EXPECT_EQ(L"name_x", + GetWideString(EPDFForm_GetFieldMappingName, model, index)); EPDFForm_CloseModel(model); // Reset now restores the fresh /DV through the P1 transaction. ASSERT_TRUE(EPDFForm_ResetField(document(), 4u, nullptr, 0, nullptr)); model = EPDFForm_LoadModel(document()); index = EPDFForm_GetFieldIndexByObjNum(model, 4u); - EXPECT_EQ(L"dflt", GetWideString(EPDFForm_GetFieldValue, model, index)); + EXPECT_EQ(L"dflt", GetCurrentFieldValue(model, index)); EPDFForm_CloseModel(model); } +TEST_F(EPDFFormEmbedderTest, EmptySettersShadowInheritedProperties) { + ASSERT_TRUE(OpenDocument("toggle_fields.pdf")); + RetainPtr parent = + GetMutableIndirectDictionary(document(), 16u); + ASSERT_TRUE(parent); + parent->SetNewFor("MaxLen", 8); + parent->SetNewFor(pdfium::form_fields::kTU, L"Parent tooltip"); + parent->SetNewFor(pdfium::form_fields::kTM, L"parent_mapping"); + parent->SetNewFor(pdfium::form_fields::kV, L"Parent value"); + + // Object 17 inherits /FT and these properties from object 16. Clearing the + // effective child properties must not mutate the shared parent. + ASSERT_TRUE(EPDFForm_SetFieldMaxLen(document(), 17u, 0)); + ASSERT_TRUE(EPDFForm_SetFieldAlternateName(document(), 17u, + GetFPDFWideString(L"").get())); + ASSERT_TRUE(EPDFForm_SetFieldMappingName(document(), 17u, + GetFPDFWideString(L"").get())); + ASSERT_TRUE(EPDFForm_ResetField(document(), 17u, nullptr, 0, nullptr)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 17u); + ASSERT_GE(field, 0); + EXPECT_EQ(0, EPDFForm_GetFieldMaxLen(model, field)); + EXPECT_EQ(L"", GetWideString(EPDFForm_GetFieldAlternateName, model, field)); + EXPECT_EQ(L"", GetWideString(EPDFForm_GetFieldMappingName, model, field)); + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, EPDFForm_GetFieldValueKind(model, field)); + EXPECT_EQ(L"", GetCurrentFieldValue(model, field)); + EPDFForm_CloseModel(model); + + EXPECT_EQ(8, parent->GetIntegerFor("MaxLen")); + EXPECT_EQ(L"Parent tooltip", + parent->GetUnicodeTextFor(pdfium::form_fields::kTU)); + EXPECT_EQ(L"parent_mapping", + parent->GetUnicodeTextFor(pdfium::form_fields::kTM)); + EXPECT_EQ(L"Parent value", + parent->GetUnicodeTextFor(pdfium::form_fields::kV)); + RetainPtr child = + GetEffectiveIndirectDictionary(document(), 17u); + ASSERT_TRUE(child); + EXPECT_EQ(0, child->GetIntegerFor("MaxLen")); + EXPECT_TRUE(child->KeyExist(pdfium::form_fields::kTU)); + EXPECT_TRUE(child->KeyExist(pdfium::form_fields::kTM)); + EXPECT_TRUE(child->KeyExist(pdfium::form_fields::kV)); +} + TEST_F(EPDFFormEmbedderTest, SetFieldOptionsResyncsSelection) { ASSERT_TRUE(OpenDocument("listbox_form.pdf")); @@ -1143,6 +1673,9 @@ TEST_F(EPDFFormEmbedderTest, SetFieldOptionsResyncsSelection) { ScopedFPDFWideString alpha = GetFPDFWideString(L"Alpha"); ScopedFPDFWideString gamma = GetFPDFWideString(L"Gamma"); ScopedFPDFWideString zeta = GetFPDFWideString(L"Zeta"); + ScopedFPDFWideString epsilon = GetFPDFWideString(L"Epsilon"); + FPDF_WIDESTRING defaults[] = {epsilon.get(), gamma.get()}; + ASSERT_TRUE(EPDFForm_SetFieldDefaultValues(document(), field, defaults, 2)); FPDF_WIDESTRING labels[] = {alpha.get(), gamma.get(), zeta.get()}; ASSERT_TRUE(EPDFForm_SetFieldOptions(document(), field, labels, labels, 3)); @@ -1153,7 +1686,45 @@ TEST_F(EPDFFormEmbedderTest, SetFieldOptionsResyncsSelection) { EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, index, 0)); // Alpha EXPECT_TRUE(EPDFForm_IsFieldOptionSelected(model, index, 1)); // Gamma kept EXPECT_FALSE(EPDFForm_IsFieldOptionSelected(model, index, 2)); // Zeta + EXPECT_EQ(EPDF_FORM_VALUE_SCALAR, + EPDFForm_GetFieldDefaultValueKind(model, index)); + EXPECT_EQ(L"Gamma", GetDefaultFieldValue(model, index)); EPDFForm_CloseModel(model); + + ASSERT_TRUE(EPDFForm_ResetField(document(), field, nullptr, 0, nullptr)); + model = EPDFForm_LoadModel(document()); + index = EPDFForm_GetFieldIndexByObjNum(model, field); + EXPECT_EQ(L"Gamma", GetCurrentFieldValue(model, index)); + EPDFForm_CloseModel(model); + + RetainPtr field_dictionary = + GetEffectiveIndirectDictionary(document(), field); + ASSERT_TRUE(field_dictionary); + RetainPtr indices = field_dictionary->GetArrayFor("I"); + ASSERT_TRUE(indices); + ASSERT_EQ(1u, indices->size()); + EXPECT_EQ(1, indices->GetIntegerAt(0)); +} + +TEST_F(EPDFFormEmbedderTest, FieldFlagsRejectInvalidChoiceShapeTransitions) { + ASSERT_TRUE(OpenDocument("listbox_form.pdf")); + + // Object 12 has array /V and MultiSelect. Clearing MultiSelect would make + // the existing /V invalid, so the transaction is rejected unchanged. + EXPECT_FALSE(EPDFForm_SetFieldFlags(document(), 12u, 0, + pdfium::form_flags::kChoiceMultiSelect)); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + int field = EPDFForm_GetFieldIndexByObjNum(model, 12u); + ASSERT_GE(field, 0); + EXPECT_TRUE(EPDFForm_GetFieldFlags(model, field) & + pdfium::form_flags::kChoiceMultiSelect); + EXPECT_EQ(EPDF_FORM_VALUE_ARRAY, EPDFForm_GetFieldValueKind(model, field)); + EPDFForm_CloseModel(model); + + // Edit is a combo-only flag; setting it on a list box is invalid. + EXPECT_FALSE(EPDFForm_SetFieldFlags(document(), 8u, + pdfium::form_flags::kChoiceEdit, 0)); } // Authoring on a layer produces a minimal, durable delta. diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 45b781c5a7..c81b1b90c1 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -54,7 +54,6 @@ #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_interactiveform.h" -#include "fpdfsdk/epdf_page_content_helpers.h" namespace { @@ -4385,72 +4384,6 @@ EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot) { return dict->GetBooleanFor("Repeat", false); } -namespace { - -// Find the index of an annotation in the page's annotation array. -// Returns -1 if not found. -int GetAnnotIndexOnPage(const CPDF_Page* page, - const CPDF_Dictionary* annot_dict) { - if (!page || !annot_dict) { - return -1; - } - - RetainPtr annots = page->GetAnnotsArray(); - if (!annots) { - return -1; - } - - for (size_t i = 0; i < annots->size(); ++i) { - if (annots->GetDictAt(i) == annot_dict) { - return static_cast(i); - } - } - return -1; -} - -} // namespace - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, - FPDF_ANNOTATION annot) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { - return false; - } - - const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); - if (!annot_dict) { - return false; - } - - // Get the annotation's Normal appearance stream (AP/N) - RetainPtr ap_dict = - annot_dict->GetDictFor(pdfium::annotation::kAP); - if (!ap_dict) { - return false; - } - - RetainPtr ap_stream = ap_dict->GetStreamFor("N"); - if (!ap_stream) { - return false; - } - - CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); - annot_rect.Normalize(); - - EpdfAppendFormXObjectToPage(pPage, ap_stream, annot_rect); - - // Remove the annotation from the page - int annot_index = GetAnnotIndexOnPage(pPage, annot_dict); - if (annot_index >= 0) { - RetainPtr annots = pPage->GetMutableAnnotsArray(); - if (annots) { - annots->RemoveAt(annot_index); - } - } - - return true; -} - FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAppearanceFromPage(FPDF_ANNOTATION annot, FPDF_DOCUMENT src_doc_handle, diff --git a/fpdfsdk/fpdf_flatten_embeddertest.cpp b/fpdfsdk/fpdf_flatten_embeddertest.cpp index e8c69ccd03..c42b0b0a2f 100644 --- a/fpdfsdk/fpdf_flatten_embeddertest.cpp +++ b/fpdfsdk/fpdf_flatten_embeddertest.cpp @@ -3,20 +3,70 @@ // found in the LICENSE file. #include "build/build_config.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" #include "core/fxge/cfx_defaultrenderdevice.h" +#include "fpdfsdk/cpdfsdk_helpers.h" +#include "public/epdf_form.h" +#include "public/fpdf_annot.h" #include "public/fpdf_flatten.h" +#include "public/fpdf_save.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/embedder_test_constants.h" +#include "testing/fx_string_testhelpers.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_loader.h" +#include "testing/utils/file_util.h" +#include "testing/utils/path_service.h" + +#include +#include using testing::HasSubstr; using testing::Not; namespace { -class FPDFFlattenEmbedderTest : public EmbedderTest {}; +class FPDFFlattenEmbedderTest : public EmbedderTest { + protected: + struct LayerDocument { + std::vector bytes; + EPDF_BASE_DOCUMENT base = nullptr; + FPDF_DOCUMENT layer = nullptr; + + ~LayerDocument() { + if (layer) { + FPDF_CloseDocument(layer); + } + if (base) { + EPDF_ReleaseBaseDocument(base); + } + } + }; + + bool OpenLayer(const char* file_name, LayerDocument* out) { + const std::string path = PathService::GetTestFilePath(file_name); + if (path.empty()) { + return false; + } + out->bytes = GetFileContents(path.c_str()); + if (out->bytes.empty()) { + return false; + } + out->base = EPDF_LoadMemBaseDocument( + out->bytes.data(), static_cast(out->bytes.size()), nullptr); + if (!out->base) { + return false; + } + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + out->layer = EPDFLayer_OpenLayer(out->base, nullptr, nullptr, &status); + return out->layer && status == EPDFLayerOpenStatus_kSuccess; + } +}; } // namespace @@ -42,6 +92,211 @@ TEST_F(FPDFFlattenEmbedderTest, FlatPrint) { EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page.get(), FLAT_PRINT)); } +TEST_F(FPDFFlattenEmbedderTest, FlattenSpecificAnnotationByHandle) { + ASSERT_TRUE(OpenDocument("flatten_selective.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(6, FPDFPage_GetAnnotCount(page.get())); + + ScopedFPDFAnnotation target(EPDFPage_GetAnnotByObjectNumber(page.get(), 4u)); + ASSERT_TRUE(target); + EXPECT_EQ(FLATTEN_FAIL, EPDFAnnot_Flatten(page.get(), target.get(), 99)); + EXPECT_EQ(FLATTEN_FAIL, + EPDFAnnot_Flatten(page.get(), nullptr, FLAT_NORMALDISPLAY)); + + ScopedFPDFAnnotation hidden(EPDFPage_GetAnnotByObjectNumber(page.get(), 5u)); + ASSERT_TRUE(hidden); + EXPECT_EQ(FLATTEN_NOTHINGTODO, + EPDFAnnot_Flatten(page.get(), hidden.get(), FLAT_NORMALDISPLAY)); + EXPECT_EQ(6, FPDFPage_GetAnnotCount(page.get())); + + ASSERT_EQ(FLATTEN_SUCCESS, + EPDFAnnot_Flatten(page.get(), target.get(), FLAT_NORMALDISPLAY)); + EXPECT_EQ(5, FPDFPage_GetAnnotCount(page.get())); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 4u)); + ScopedFPDFAnnotation preserved( + EPDFPage_GetAnnotByObjectNumber(page.get(), 5u)); + EXPECT_TRUE(preserved); + + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ASSERT_TRUE(OpenSavedDocument()); + FPDF_PAGE saved_page = LoadSavedPage(0); + ASSERT_TRUE(saved_page); + EXPECT_EQ(5, FPDFPage_GetAnnotCount(saved_page)); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(saved_page, 4u)); + CloseSavedPage(saved_page); +} + +TEST_F(FPDFFlattenEmbedderTest, + FlattenPagePreservesUnpaintedAnnotationsAndDetachesWidget) { + ASSERT_TRUE(OpenDocument("flatten_selective.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + ASSERT_EQ(FLATTEN_SUCCESS, EPDFPage_Flatten(page.get(), FLAT_NORMALDISPLAY)); + // Loading a regular PDFium page synthesizes a default appearance for the + // Text annotation (object 6), so it is paintable here as well. + EXPECT_EQ(2, FPDFPage_GetAnnotCount(page.get())); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 4u)); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 13u)); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 16u)); + for (unsigned int object_number : {5u, 9u}) { + ScopedFPDFAnnotation annotation( + EPDFPage_GetAnnotByObjectNumber(page.get(), object_number)); + EXPECT_TRUE(annotation) << object_number; + } + + CPDF_Document* pdf = CPDFDocumentFromFPDFDocument(document()); + ASSERT_TRUE(pdf); + RetainPtr page_dictionary = pdf->GetPageDictionary(0); + ASSERT_TRUE(page_dictionary); + EXPECT_TRUE(page_dictionary->KeyExist("MediaBox")); + EXPECT_TRUE(page_dictionary->KeyExist("CropBox")); + RetainPtr resources = + page_dictionary->GetDictFor("Resources"); + ASSERT_TRUE(resources); + EXPECT_TRUE(resources->KeyExist("ExtGState")); + EXPECT_TRUE(resources->KeyExist("XObject")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + ASSERT_EQ(1, EPDFForm_CountFields(model)); + EXPECT_EQ(0, EPDFForm_CountFieldWidgets(model, 0)); + EPDFForm_CloseModel(model); +} + +TEST_F(FPDFFlattenEmbedderTest, FlattenPageHonorsPrintUsage) { + ASSERT_TRUE(OpenDocument("flatten_selective.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ASSERT_EQ(FLATTEN_SUCCESS, EPDFPage_Flatten(page.get(), FLAT_PRINT)); + EXPECT_EQ(4, FPDFPage_GetAnnotCount(page.get())); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 4u)); + EXPECT_FALSE(EPDFPage_GetAnnotByObjectNumber(page.get(), 13u)); + ScopedFPDFAnnotation normal_only( + EPDFPage_GetAnnotByObjectNumber(page.get(), 16u)); + EXPECT_TRUE(normal_only); +} + +TEST_F(FPDFFlattenEmbedderTest, FlattenMergedWidgetRemovesFieldTreeEntry) { + ASSERT_TRUE(OpenDocument("text_form.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + ScopedFPDFAnnotation widget(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(widget); + ASSERT_EQ(4u, EPDFAnnot_GetObjectNumber(widget.get())); + ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(widget.get())); + + ASSERT_EQ(FLATTEN_SUCCESS, + EPDFAnnot_Flatten(page.get(), widget.get(), FLAT_NORMALDISPLAY)); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + EXPECT_EQ(0, EPDFForm_CountFields(model)); + EPDFForm_CloseModel(model); +} + +TEST_F(FPDFFlattenEmbedderTest, FlattenPageIsLayerSafeAndDeltaDurable) { + LayerDocument document; + ASSERT_TRUE(OpenLayer("flatten_selective.pdf", &document)); + ASSERT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(document.layer)); + + ScopedFPDFPage page(FPDF_LoadPage(document.layer, 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation hidden(EPDFPage_GetAnnotByObjectNumber(page.get(), 5u)); + ASSERT_TRUE(hidden); + EXPECT_EQ(FLATTEN_NOTHINGTODO, + EPDFAnnot_Flatten(page.get(), hidden.get(), FLAT_NORMALDISPLAY)); + EXPECT_EQ(0ul, EPDFLayer_GetPromotedObjectCount(document.layer)); + + ASSERT_EQ(FLATTEN_SUCCESS, EPDFPage_Flatten(page.get(), FLAT_NORMALDISPLAY)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(document.layer, 3u)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(document.layer, 12u)); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(document.layer, 13u)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 4u)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 7u)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 14u)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 15u)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 17u)); + + EXPECT_EQ(3, FPDFPage_GetAnnotCount(page.get())); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(document.layer, this, &save_status)); + ASSERT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + const std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + TestLoader loader(pdfium::as_bytes(pdfium::span(delta.data(), delta.size()))); + FPDF_FILEACCESS access = {}; + access.m_FileLen = static_cast(delta.size()); + access.m_GetBlock = TestLoader::GetBlock; + access.m_Param = &loader; + EPDFLayerOpenStatus open_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replay( + EPDFLayer_OpenLayer(document.base, &access, nullptr, &open_status)); + ASSERT_TRUE(replay); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, open_status); + + ScopedFPDFPage replay_page(FPDF_LoadPage(replay.get(), 0)); + ASSERT_TRUE(replay_page); + EXPECT_EQ(3, FPDFPage_GetAnnotCount(replay_page.get())); + EPDF_FORM_MODEL model = EPDFForm_LoadModel(replay.get()); + ASSERT_TRUE(model); + ASSERT_EQ(1, EPDFForm_CountFields(model)); + EXPECT_EQ(0, EPDFForm_CountFieldWidgets(model, 0)); + EPDFForm_CloseModel(model); +} + +TEST_F(FPDFFlattenEmbedderTest, FlattenReadsAlreadyPromotedAnnotationState) { + LayerDocument document; + ASSERT_TRUE(OpenLayer("flatten_selective.pdf", &document)); + ScopedFPDFPage page(FPDF_LoadPage(document.layer, 0)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation target(EPDFPage_GetAnnotByObjectNumber(page.get(), 4u)); + ASSERT_TRUE(target); + CPDF_Document* pdf = CPDFDocumentFromFPDFDocument(document.layer); + ASSERT_TRUE(pdf); + RetainPtr annotation = + ToDictionary(pdf->GetMutableIndirectObject(4u)); + ASSERT_TRUE(annotation); + annotation->SetNewFor("F", FPDF_ANNOT_FLAG_HIDDEN); + ASSERT_TRUE(EPDFLayer_IsObjectPromoted(document.layer, 4u)); + ASSERT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 3u)); + + EXPECT_EQ(FLATTEN_NOTHINGTODO, + EPDFAnnot_Flatten(page.get(), target.get(), FLAT_NORMALDISPLAY)); + EXPECT_EQ(1ul, EPDFLayer_GetPromotedObjectCount(document.layer)); + EXPECT_FALSE(EPDFLayer_IsObjectPromoted(document.layer, 3u)); +} + +TEST_F(FPDFFlattenEmbedderTest, FlattenDirectAnnotationByHandle) { + ScopedFPDFDocument document(FPDF_CreateNewDocument()); + ASSERT_TRUE(document); + ScopedFPDFPage page(FPDFPage_New(document.get(), 0, 100, 100)); + ASSERT_TRUE(page); + ScopedFPDFPage other_page(FPDFPage_New(document.get(), 1, 100, 100)); + ASSERT_TRUE(other_page); + + ScopedFPDFAnnotation annotation( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_INK)); + ASSERT_TRUE(annotation); + ASSERT_EQ(0u, EPDFAnnot_GetObjectNumber(annotation.get())); + const FS_RECTF rectangle = {10.0f, 40.0f, 40.0f, 10.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annotation.get(), &rectangle)); + ScopedFPDFWideString appearance = GetFPDFWideString(L"0 0 10 10 re f"); + ASSERT_TRUE(FPDFAnnot_SetAP( + annotation.get(), FPDF_ANNOT_APPEARANCEMODE_NORMAL, appearance.get())); + + EXPECT_EQ(FLATTEN_FAIL, EPDFAnnot_Flatten(other_page.get(), annotation.get(), + FLAT_NORMALDISPLAY)); + ASSERT_EQ(FLATTEN_SUCCESS, EPDFAnnot_Flatten(page.get(), annotation.get(), + FLAT_NORMALDISPLAY)); + EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); +} + TEST_F(FPDFFlattenEmbedderTest, FlatWithBadFont) { ASSERT_TRUE(OpenDocument("344775293.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/fpdfsdk/fpdf_javascript.cpp b/fpdfsdk/fpdf_javascript.cpp index 9ee17d61c5..d4e6266016 100644 --- a/fpdfsdk/fpdf_javascript.cpp +++ b/fpdfsdk/fpdf_javascript.cpp @@ -14,25 +14,21 @@ #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/numerics/safe_conversions.h" #include "fpdfsdk/cpdfsdk_helpers.h" +#include "fpdfsdk/epdf_action_helpers.h" +#include "public/epdf_action.h" struct CPDF_JavaScript { WideString name; WideString script; }; -FPDF_EXPORT int FPDF_CALLCONV -FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc) { - return -1; - } - - auto name_tree = CPDF_NameTree::CreateForReading(doc, "JavaScript"); - return name_tree ? pdfium::checked_cast(name_tree->GetCount()) : 0; -} +namespace { -FPDF_EXPORT FPDF_JAVASCRIPT_ACTION FPDF_CALLCONV -FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { +RetainPtr GetNamedJavaScriptActionDictionary( + FPDF_DOCUMENT document, + int index, + WideString* name, + std::optional* script) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); if (!doc || index < 0) { return nullptr; @@ -43,21 +39,38 @@ FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { return nullptr; } - WideString name; - RetainPtr obj = - ToDictionary(name_tree->LookupValueAndName(index, &name)); - if (!obj) { + RetainPtr dictionary = + ToDictionary(name_tree->LookupValueAndName(index, name)); + if (!dictionary) { return nullptr; } - // Validate |obj|. Type is optional, but must be valid if present. - CPDF_Action action(std::move(obj)); + CPDF_Action action(pdfium::WrapRetain(dictionary.Get())); if (action.GetType() != CPDF_Action::Type::kJavaScript) { return nullptr; } + *script = action.MaybeGetJavaScript(); + return script->has_value() ? std::move(dictionary) : nullptr; +} + +} // namespace + +FPDF_EXPORT int FPDF_CALLCONV +FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc) { + return -1; + } + + auto name_tree = CPDF_NameTree::CreateForReading(doc, "JavaScript"); + return name_tree ? pdfium::checked_cast(name_tree->GetCount()) : 0; +} - std::optional script = action.MaybeGetJavaScript(); - if (!script.has_value()) { +FPDF_EXPORT FPDF_JAVASCRIPT_ACTION FPDF_CALLCONV +FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { + WideString name; + std::optional script; + if (!GetNamedJavaScriptActionDictionary(document, index, &name, &script)) { return nullptr; } @@ -67,6 +80,17 @@ FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { return FPDFJavaScriptActionFromCPDFJavaScriptAction(js.release()); } +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetNamedJavaScriptActionModel(FPDF_DOCUMENT document, int index) { + WideString name; + std::optional script; + RetainPtr dictionary = + GetNamedJavaScriptActionDictionary(document, index, &name, &script); + return dictionary ? epdf::MakeActionModelHandle(epdf::BuildActionModel( + CPDF_Action(std::move(dictionary)))) + : nullptr; +} + FPDF_EXPORT void FPDF_CALLCONV FPDFDoc_CloseJavaScriptAction(FPDF_JAVASCRIPT_ACTION javascript) { // Take object back across API and destroy it. diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 1fbdf16242..8f60478de6 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -1691,7 +1691,10 @@ FPDF_GetPageSizeByIndexF(FPDF_DOCUMENT document, } #endif // PDF_ENABLE_XFA - RetainPtr dict = doc->GetMutablePageDictionary(page_index); + RetainPtr const_dict = + doc->GetPageDictionary(page_index); + RetainPtr dict = + pdfium::WrapRetain(const_cast(const_dict.Get())); if (!dict) { return false; } diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 2b37d4e687..b2a0c70e2e 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -300,6 +300,8 @@ int CheckPDFiumCApi() { CHK(FSDK_SetUnSpObjProcessHandler); // fpdf_flatten.h + CHK(EPDFAnnot_Flatten); + CHK(EPDFPage_Flatten); CHK(FPDFPage_Flatten); // fpdf_fwlevent.h - no exports. diff --git a/public/epdf_action.h b/public/epdf_action.h new file mode 100644 index 0000000000..269242ff9d --- /dev/null +++ b/public/epdf_action.h @@ -0,0 +1,174 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PUBLIC_EPDF_ACTION_H_ +#define PUBLIC_EPDF_ACTION_H_ + +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Experimental EmbedPDF Extension API. +// +// Detached, immutable PDF action model. A model contains one root action and +// its normalized /Next descendants. It owns all copied strings and holds no +// pointers into the PDF document, so it remains valid after the document or +// originating owner is closed or mutated. +// +// The API extracts action data only. It never executes JavaScript. +typedef struct epdf_action_model_t__* EPDF_ACTION_MODEL; +typedef uint32_t EPDF_ACTION_NODE_ID; + +#define EPDF_ACTION_NODE_INVALID UINT32_MAX + +// Normalized values of an action dictionary's /S name. The raw /S name is +// also available so unknown future action types are preserved. +#define EPDF_ACTION_TYPE_UNKNOWN 0 +#define EPDF_ACTION_TYPE_GOTO 1 +#define EPDF_ACTION_TYPE_GOTO_REMOTE 2 +#define EPDF_ACTION_TYPE_GOTO_EMBEDDED 3 +#define EPDF_ACTION_TYPE_LAUNCH 4 +#define EPDF_ACTION_TYPE_THREAD 5 +#define EPDF_ACTION_TYPE_URI 6 +#define EPDF_ACTION_TYPE_SOUND 7 +#define EPDF_ACTION_TYPE_MOVIE 8 +#define EPDF_ACTION_TYPE_HIDE 9 +#define EPDF_ACTION_TYPE_NAMED 10 +#define EPDF_ACTION_TYPE_SUBMIT_FORM 11 +#define EPDF_ACTION_TYPE_RESET_FORM 12 +#define EPDF_ACTION_TYPE_IMPORT_DATA 13 +#define EPDF_ACTION_TYPE_JAVASCRIPT 14 +#define EPDF_ACTION_TYPE_SET_OCG_STATE 15 +#define EPDF_ACTION_TYPE_RENDITION 16 +#define EPDF_ACTION_TYPE_TRANSITION 17 +#define EPDF_ACTION_TYPE_GOTO_3D_VIEW 18 + +// Non-fatal normalization warnings. Models marked INCOMPLETE must not be +// executed: a safety bound prevented the complete action sequence from being +// represented. Cyclic back-edges and malformed /Next entries are dropped; +// their other well-formed siblings remain available. +#define EPDF_ACTION_WARNING_CYCLE_DROPPED 0x1 +#define EPDF_ACTION_WARNING_MALFORMED_NEXT 0x2 +#define EPDF_ACTION_WARNING_INCOMPLETE 0x4 + +// Release a model returned by any EPDF*ActionModel() function below. +FPDF_EXPORT void FPDF_CALLCONV EPDFAction_CloseModel(EPDF_ACTION_MODEL model); + +// Build a detached model from an existing borrowed FPDF_ACTION. This lets +// callers normalize actions returned by APIs such as FPDFBookmark_GetAction(). +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFAction_LoadModel(FPDF_ACTION action); + +// Return the root node id, or EPDF_ACTION_NODE_INVALID for an invalid model. +FPDF_EXPORT EPDF_ACTION_NODE_ID FPDF_CALLCONV +EPDFAction_GetRootNode(EPDF_ACTION_MODEL model); + +FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNodeCount(EPDF_ACTION_MODEL model); + +// Return an EPDF_ACTION_TYPE_* value for |node|. +FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNodeType(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node); + +// Copy the raw PDF /S name as UTF-8, including the trailing NUL. Returns the +// required byte length, or 0 on error. |buffer| may be NULL to query length. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeSubtype(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + char* buffer, + unsigned long buflen); + +// Return whether |node| contains a string or stream /JS entry that belongs to +// either a /JavaScript or /Rendition action. This distinguishes an empty +// script from a missing or malformed /JS entry. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAction_NodeHasJavaScript(EPDF_ACTION_MODEL model, EPDF_ACTION_NODE_ID node); + +// Copy decoded /JS source as UTF-16LE, including the trailing NUL. Returns the +// required byte length, or 0 when absent/malformed. Rendition /JS is exposed +// through this same getter. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeJavaScript(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + FPDF_WCHAR* buffer, + unsigned long buflen); + +FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNextCount(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node); + +// Return the normalized child node at |index| in PDF /Next order. +FPDF_EXPORT EPDF_ACTION_NODE_ID FPDF_CALLCONV +EPDFAction_GetNextAt(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + int index); + +FPDF_EXPORT uint32_t FPDF_CALLCONV +EPDFAction_GetWarningFlags(EPDF_ACTION_MODEL model); + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAction_IsComplete(EPDF_ACTION_MODEL model); + +// Document-owned actions ---------------------------------------------------- + +#define EPDF_DOCUMENT_ACTION_WILL_CLOSE 0 +#define EPDF_DOCUMENT_ACTION_WILL_SAVE 1 +#define EPDF_DOCUMENT_ACTION_DID_SAVE 2 +#define EPDF_DOCUMENT_ACTION_WILL_PRINT 3 +#define EPDF_DOCUMENT_ACTION_DID_PRINT 4 + +// Return the action model for /Names /JavaScript entry |index|. Index pairing +// is guaranteed with FPDFDoc_GetJavaScriptAction(document, index): both calls +// resolve the same name-tree entry and therefore preserve boot order. +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetNamedJavaScriptActionModel(FPDF_DOCUMENT document, int index); + +// Return the action form of catalog /OpenAction. Returns NULL when absent, +// malformed, or when /OpenAction is a destination rather than an action. +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetOpenActionModel(FPDF_DOCUMENT document); + +// Return one catalog /AA action selected by EPDF_DOCUMENT_ACTION_*. +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetAdditionalActionModel(FPDF_DOCUMENT document, int event); + +// Page-owned actions -------------------------------------------------------- + +#define EPDF_PAGE_ACTION_OPEN 0 +#define EPDF_PAGE_ACTION_CLOSE 1 + +// Read page /AA without loading or rendering the page. +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFDoc_GetPageActionModel(FPDF_DOCUMENT document, + uint32_t page_object_number, + int event); + +// Annotation-owned actions -------------------------------------------------- + +#define EPDF_ANNOT_ACTION_ACTIVATE 0 +#define EPDF_ANNOT_ACTION_CURSOR_ENTER 1 +#define EPDF_ANNOT_ACTION_CURSOR_EXIT 2 +#define EPDF_ANNOT_ACTION_MOUSE_DOWN 3 +#define EPDF_ANNOT_ACTION_MOUSE_UP 4 +#define EPDF_ANNOT_ACTION_FOCUS 5 +#define EPDF_ANNOT_ACTION_BLUR 6 +#define EPDF_ANNOT_ACTION_PAGE_OPEN 7 +#define EPDF_ANNOT_ACTION_PAGE_CLOSE 8 +#define EPDF_ANNOT_ACTION_PAGE_VISIBLE 9 +#define EPDF_ANNOT_ACTION_PAGE_INVISIBLE 10 + +// Return annotation /A (ACTIVATE) or an annotation /AA action. Field events +// K/F/V/C are deliberately not accepted here, including for merged +// field/widget dictionaries. +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFAnnot_GetActionModel(FPDF_ANNOTATION annotation, int event); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_EPDF_ACTION_H_ diff --git a/public/epdf_form.h b/public/epdf_form.h index 5beca4af93..1d7aabd934 100644 --- a/public/epdf_form.h +++ b/public/epdf_form.h @@ -10,6 +10,8 @@ // NOLINTNEXTLINE(build/include) #include "fpdfview.h" +#include "epdf_action.h" + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -88,6 +90,28 @@ EPDFForm_GetNeedAppearances(EPDF_FORM_MODEL model); // Return the number of terminal fields in the model. FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFields(EPDF_FORM_MODEL model); +// Field additional-action events. EPDFForm_GetFieldActionModel() reads the +// effective field /AA through the field hierarchy. These are distinct from +// annotation/widget /AA events even when a field and widget share one merged +// PDF dictionary. +#define EPDF_FORM_ACTION_KEYSTROKE 0 +#define EPDF_FORM_ACTION_FORMAT 1 +#define EPDF_FORM_ACTION_VALIDATE 2 +#define EPDF_FORM_ACTION_CALCULATE 3 + +// Return a caller-owned detached action model for one effective field action, +// or NULL when absent/malformed. Close with EPDFAction_CloseModel(). +FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV +EPDFForm_GetFieldActionModel(EPDF_FORM_MODEL model, int field_index, int event); + +// Return the raw number of entries in /AcroForm /CO. Each entry resolves to a +// field index in this same snapshot, or -1 when malformed/unresolved. Keeping +// malformed slots preserves the declared calculation order. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountCalculationOrder(EPDF_FORM_MODEL model); +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetCalculationOrderFieldIndex(EPDF_FORM_MODEL model, int order_index); + // Experimental EmbedPDF Extension API. // Return the indirect object number of the field dictionary, or 0 when the // field dictionary is a direct object (spec-violating; identity is weak). @@ -102,8 +126,8 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldFamily(EPDF_FORM_MODEL model, // Experimental EmbedPDF Extension API. // Return the effective /Ff flags (inheritance resolved), or 0 on error. -FPDF_EXPORT uint32_t FPDF_CALLCONV -EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, int field_index); +FPDF_EXPORT uint32_t FPDF_CALLCONV EPDFForm_GetFieldFlags(EPDF_FORM_MODEL model, + int field_index); // Experimental EmbedPDF Extension API. // Return the field provenance (EPDF_FORMFIELD_ORIGIN_*), or -1 on error. @@ -138,24 +162,50 @@ EPDFForm_GetFieldMappingName(EPDF_FORM_MODEL model, FPDF_WCHAR* buffer, unsigned long buflen); -// Experimental EmbedPDF Extension API. -// Copy the field's current value into |buffer| as UTF-16LE. For checkbox -// and radio fields this is the checked export/state value ("Off" when -// nothing is checked). Same conventions as EPDFForm_GetFieldName(). +// String-oriented PDF field value shapes. Text strings and button name +// objects are exposed as SCALAR. A multi-select choice array is ARRAY, +// including an empty array. NONE means the inherited entry is absent or +// explicitly null. UNSUPPORTED means an entry exists with another shape +// (for example a signature dictionary or a malformed choice array). +#define EPDF_FORM_VALUE_NONE 0 +#define EPDF_FORM_VALUE_SCALAR 1 +#define EPDF_FORM_VALUE_ARRAY 2 +#define EPDF_FORM_VALUE_UNSUPPORTED 3 + +// Experimental EmbedPDF Extension API. +// Return the shape of the field's raw, inheritance-resolved /V entry. +// Unlike the former scalar getter, this does not fall back to /DV and does +// not derive a button value from widget /AS. Widget state remains available +// through EPDFForm_IsFieldWidgetChecked() and the widget state/value getters. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldValueKind(EPDF_FORM_MODEL model, + int field_index); + +// Return the number of string/name values in /V. SCALAR has one value; +// ARRAY has its exact element count; NONE and UNSUPPORTED have zero. +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldValues(EPDF_FORM_MODEL model, + int field_index); + +// Copy /V value |value_index| into |buffer| as UTF-16LE. Same buffer +// conventions as EPDFForm_GetFieldName(). Returns 0 when out of range or +// when the value shape is NONE/UNSUPPORTED. FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFForm_GetFieldValue(EPDF_FORM_MODEL model, - int field_index, - FPDF_WCHAR* buffer, - unsigned long buflen); +EPDFForm_GetFieldValueAt(EPDF_FORM_MODEL model, + int field_index, + int value_index, + FPDF_WCHAR* buffer, + unsigned long buflen); -// Experimental EmbedPDF Extension API. -// Copy the field's default value (/DV, inheritance resolved) into |buffer| -// as UTF-16LE. Same conventions as EPDFForm_GetFieldName(). +// Equivalent typed accessors for the raw, inheritance-resolved /DV entry. +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_GetFieldDefaultValueKind(EPDF_FORM_MODEL model, int field_index); +FPDF_EXPORT int FPDF_CALLCONV +EPDFForm_CountFieldDefaultValues(EPDF_FORM_MODEL model, int field_index); FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFForm_GetFieldDefaultValue(EPDF_FORM_MODEL model, - int field_index, - FPDF_WCHAR* buffer, - unsigned long buflen); +EPDFForm_GetFieldDefaultValueAt(EPDF_FORM_MODEL model, + int field_index, + int value_index, + FPDF_WCHAR* buffer, + unsigned long buflen); // Experimental EmbedPDF Extension API. // Return /MaxLen for text fields, or 0 when absent or not applicable. @@ -164,8 +214,8 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFForm_GetFieldMaxLen(EPDF_FORM_MODEL model, // Experimental EmbedPDF Extension API. // Return the number of /Opt options for choice fields, 0 otherwise. -FPDF_EXPORT int FPDF_CALLCONV -EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, int field_index); +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldOptions(EPDF_FORM_MODEL model, + int field_index); // Experimental EmbedPDF Extension API. // Copy a choice option's display label into |buffer| as UTF-16LE. @@ -198,8 +248,8 @@ EPDFForm_IsFieldOptionSelected(EPDF_FORM_MODEL model, // Return the number of widget annotations bound to the field. A merged // field/widget dictionary counts as one widget whose object number equals // the field's. Zero widgets means the field is unplaced. -FPDF_EXPORT int FPDF_CALLCONV -EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, int field_index); +FPDF_EXPORT int FPDF_CALLCONV EPDFForm_CountFieldWidgets(EPDF_FORM_MODEL model, + int field_index); // Experimental EmbedPDF Extension API. // Return the widget annotation's indirect object number, or 0 for direct @@ -318,7 +368,9 @@ EPDFForm_SetToggle(FPDF_DOCUMENT document, // // Writes /V, drops any stale rich-text /RV, and regenerates the /AP stream // of every widget of the field. Fails when |field_objnum| is not a text -// terminal field, or when the value exceeds the field's effective /MaxLen. +// terminal field. When the value exceeds the field's effective /MaxLen, only +// the first /MaxLen characters are written, matching Acrobat assignment +// semantics. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_SetTextValue(FPDF_DOCUMENT document, uint32_t field_objnum, @@ -331,7 +383,8 @@ EPDFForm_SetTextValue(FPDF_DOCUMENT document, // Set the selection of a combo box or list box field. // // |values| holds |value_count| option export values. Zero values clears the -// selection. Multiple values require a multi-select list box. For combo +// effective selection, using a local empty value when needed to shadow an +// inherited /V. Multiple values require a multi-select list box. For combo // boxes with the Edit flag a single non-option value is accepted as free // text; otherwise every value must match an option's export value. // @@ -350,9 +403,9 @@ EPDFForm_SetChoiceValues(FPDF_DOCUMENT document, // Experimental EmbedPDF Extension API. // Reset a field to its default value. // -// Restores /V from the effective /DV (removing /V when no default exists), -// clears stale /RV and /I, updates toggle widget /AS states, and -// regenerates /AP streams for text and choice widgets. Fails for push +// Restores /V from the effective /DV (clearing the effective value when no +// default exists), clears stale /RV and /I, updates toggle widget /AS states, +// and regenerates /AP streams for text and choice widgets. Fails for push // buttons and signature fields. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_ResetField(FPDF_DOCUMENT document, @@ -361,6 +414,34 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, unsigned long buffer_size, unsigned long* out_changed_count); +// Acrobat-compatible Field.display values. Only the Invisible, Hidden, Print, +// and NoView annotation flag bits are changed; all unrelated flags survive. +#define EPDF_FORM_DISPLAY_VISIBLE 0 +#define EPDF_FORM_DISPLAY_HIDDEN 1 +#define EPDF_FORM_DISPLAY_NO_PRINT 2 +#define EPDF_FORM_DISPLAY_NO_VIEW 3 + +// Set Field.display for every widget of a terminal field. The write follows +// the same validate-then-promote transaction path as value writes. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDisplay(FPDF_DOCUMENT document, + uint32_t field_objnum, + int display, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + +// Regenerate every text/combo widget /AP using |appearance_text| without +// changing the field's semantic /V. This is the native sink for /AA /F +// formatting results. List boxes, buttons, and signatures are rejected. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldAppearanceText(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_WIDESTRING appearance_text, + uint32_t* changed_widget_objnums, + unsigned long buffer_size, + unsigned long* out_changed_count); + // --------------------------------------------------------------------------- // Form data interchange (FDF / XFDF). // @@ -586,12 +667,29 @@ EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, int max_len); // Experimental EmbedPDF Extension API. -// Set /DV (restored by EPDFForm_ResetField) on a text or choice field. -// An empty string clears it. +// Set /DV on a text or choice field. Text fields require exactly one value. +// Choice fields accept one value, or multiple values for a multi-select list +// box; option validation and ordering match EPDFForm_SetChoiceValues(). A +// single empty string is a real scalar default, not a request to remove /DV. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDefaultValues(FPDF_DOCUMENT document, + uint32_t field_objnum, + const FPDF_WIDESTRING* values, + unsigned long value_count); + +// Set a checkbox/radio /DV from the opaque widget appearance-state token +// returned by EPDFForm_GetFieldWidgetOnState(). "Off" is an explicit default; +// NULL and the empty string are rejected. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFForm_SetFieldDefaultToggle(FPDF_DOCUMENT document, + uint32_t field_objnum, + FPDF_BYTESTRING on_state); + +// Remove /DV from the addressed field dictionary. If an ancestor provides an +// inherited /DV, that inherited default becomes effective; this API removes a +// local override rather than mutating a shared ancestor. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFForm_SetFieldDefaultValue(FPDF_DOCUMENT document, - uint32_t field_objnum, - FPDF_WIDESTRING value); +EPDFForm_RemoveFieldDefaultValue(FPDF_DOCUMENT document, uint32_t field_objnum); // Experimental EmbedPDF Extension API. // Set /TU (the accessible tooltip). An empty string clears it. @@ -608,12 +706,14 @@ EPDFForm_SetFieldMappingName(FPDF_DOCUMENT document, FPDF_WIDESTRING value); // Experimental EmbedPDF Extension API. -// Replace a choice field's /Opt with |count| options. Entries where label -// equals export are written as plain strings, otherwise as [export label] +// Replace a choice field's effective /Opt with |count| options. Entries where +// label equals export are written as plain strings, otherwise as [export label] // pairs. The current selection is re-synced: selected exports that vanish // are dropped, /V and /I are rewritten consistently, and widget appearance -// streams are regenerated. |count| of 0 removes /Opt (an edit combo's free -// text value survives; other selections clear). +// streams are regenerated. /DV is filtered through the same new option set. +// |count| of 0 writes an empty local /Opt array (shadowing inherited options); +// an edit combo's current/default free text survives and other selections +// clear. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, uint32_t field_objnum, diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 1d3cfa57f4..605f1a74c2 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -1880,22 +1880,6 @@ EPDFAnnot_SetOverlayTextRepeat(FPDF_ANNOTATION annot, FPDF_BOOL repeat); FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_GetOverlayTextRepeat(FPDF_ANNOTATION annot); -// Experimental EmbedPDF Extension API. -// Flatten an annotation's normal appearance (AP/N) to page content. -// The annotation's appearance becomes part of the page itself. -// The annotation is automatically removed from the page after flattening. -// -// The caller is responsible for: -// 1. Closing the annotation handle with FPDFPage_CloseAnnot after this call -// 2. Calling FPDFPage_GenerateContent to persist changes -// -// page - handle to the page containing the annotation -// annot - handle to an annotation with an appearance stream -// -// Returns TRUE on success, FALSE if no appearance stream or error. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, - FPDF_ANNOTATION annot); - // Experimental EmbedPDF Extension API. // Set an annotation's normal appearance (AP/N) from a page of another document. // The page's content stream and resources are deep-cloned into the annotation's diff --git a/public/fpdf_flatten.h b/public/fpdf_flatten.h index aba5186baf..ab8c3038f1 100644 --- a/public/fpdf_flatten.h +++ b/public/fpdf_flatten.h @@ -37,6 +37,47 @@ extern "C" { // cause. FPDF_EXPORT int FPDF_CALLCONV FPDFPage_Flatten(FPDF_PAGE page, int nFlag); +// Experimental EmbedPDF Extension API. +// Flatten every eligible annotation appearance on a page. This is the +// layer-safe counterpart to FPDFPage_Flatten(): the page dictionary is +// promoted before any mutation. +// +// Only annotations whose normal appearance was successfully added to page +// content are removed. Hidden, usage-ineligible, popup, malformed, and +// appearance-less annotations remain in /Annots. Flattened widgets are also +// detached from the AcroForm field tree; a separate logical field remains as +// an unplaced field. +// +// page - handle to the page. +// usage - exactly one of the |FLAT_*| values. +// +// Returns FLATTEN_SUCCESS if at least one annotation was flattened, +// FLATTEN_NOTHINGTODO if the page has no eligible usable appearances, or +// FLATTEN_FAIL for invalid arguments. +FPDF_EXPORT int FPDF_CALLCONV EPDFPage_Flatten(FPDF_PAGE page, int usage); + +// Experimental EmbedPDF Extension API. +// Flatten one annotation from a page. The annotation may have been loaded by +// index, /NM, object number, or any other API returning an FPDF_ANNOTATION +// handle. Eligibility, appearance resolution, widget cleanup, and layer +// promotion are identical to EPDFPage_Flatten(). +// +// The caller must close |annot| with FPDFPage_CloseAnnot() after this call. +// A successful call removes the annotation from the page, so the handle must +// not be used again before it is closed. +// +// page - handle to the page containing |annot|. +// annot - handle to the annotation to flatten. +// usage - exactly one of the |FLAT_*| values. +// +// Returns FLATTEN_SUCCESS if the annotation was flattened, +// FLATTEN_NOTHINGTODO if it belongs to the page but is ineligible or has no +// usable normal appearance, or FLATTEN_FAIL for invalid arguments or when +// |annot| does not belong to |page|. +FPDF_EXPORT int FPDF_CALLCONV EPDFAnnot_Flatten(FPDF_PAGE page, + FPDF_ANNOTATION annot, + int usage); + #ifdef __cplusplus } // extern "C" #endif // __cplusplus diff --git a/testing/resources/flatten_selective.in b/testing/resources/flatten_selective.in new file mode 100644 index 0000000000..7787372371 --- /dev/null +++ b/testing/resources/flatten_selective.in @@ -0,0 +1,120 @@ +{{header}} +{{object 1 0}} +<< /Type /Catalog /Pages 2 0 R /AcroForm 11 0 R >> +endobj +{{object 2 0}} +<< + /Type /Pages + /Count 1 + /Kids [3 0 R] + /MediaBox [0 0 200 200] + /Resources << /ExtGState << /GS0 << /Type /ExtGState /CA 1 >> >> >> +>> +endobj +{{object 3 0}} +<< + /Type /Page + /Parent 2 0 R + /Contents 15 0 R + /Annots [4 0 R 5 0 R 6 0 R 9 0 R 13 0 R 16 0 R] +>> +endobj +{{object 4 0}} +<< + /Type /Annot + /Subtype /Square + /Rect [10 10 40 40] + /F 4 + /AP << /N 7 0 R >> +>> +endobj +{{object 5 0}} +<< + /Type /Annot + /Subtype /Square + /Rect [50 10 80 40] + /F 2 + /AP << /N 8 0 R >> +>> +endobj +{{object 6 0}} +<< + /Type /Annot + /Subtype /Text + /Rect [90 10 120 40] +>> +endobj +{{object 7 0}} +<< /Type /XObject /Subtype /Form /BBox [0 0 10 10] /Resources <<>> {{streamlen}} >> +stream +0 0 1 rg 0 0 10 10 re f +endstream +endobj +{{object 8 0}} +<< /Type /XObject /Subtype /Form /BBox [0 0 10 10] /Resources <<>> {{streamlen}} >> +stream +1 0 0 rg 0 0 10 10 re f +endstream +endobj +{{object 9 0}} +<< + /Type /Annot + /Subtype /Square + /Rect [130 10 160 40] + /F 1 + /AP << /N 10 0 R >> +>> +endobj +{{object 10 0}} +<< /Type /XObject /Subtype /Form /BBox [0 0 10 10] /Resources <<>> {{streamlen}} >> +stream +0 1 0 rg 0 0 10 10 re f +endstream +endobj +{{object 11 0}} +<< /Fields [12 0 R] >> +endobj +{{object 12 0}} +<< /FT /Tx /T (Separate field) /Kids [13 0 R] >> +endobj +{{object 13 0}} +<< + /Type /Annot + /Subtype /Widget + /Parent 12 0 R + /Rect [10 60 80 85] + /F 4 + /AP << /N 14 0 R >> +>> +endobj +{{object 14 0}} +<< /Type /XObject /Subtype /Form /BBox [0 0 70 25] /Resources <<>> {{streamlen}} >> +stream +0.8 0.8 0.8 rg 0 0 70 25 re f +endstream +endobj +{{object 15 0}} +<< {{streamlen}} >> +stream +0 0 m 1 1 l S +endstream +endobj +{{object 16 0}} +<< + /Type /Annot + /Subtype /Square + /Rect [90 60 120 90] + /F 0 + /AP << /N 17 0 R >> +>> +endobj +{{object 17 0}} +<< /Type /XObject /Subtype /Form /BBox [0 0 10 10] /Resources <<>> {{streamlen}} >> +stream +0 1 1 rg 0 0 10 10 re f +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/flatten_selective.pdf b/testing/resources/flatten_selective.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f53d181b1be2650c1c54c1f14fa1e56662f6ed80 GIT binary patch literal 2278 zcmcIm+iu!G5PkPo%nMTc(Aeu6Mv5X48uHLf5JqYx#Djr_IwE$uEE4V46hDwdG0grcg&YV4Spfh?qd?PNpR_E#Gk6)Gm2lDy7b$JQ)>wFJW2V<_o7e5)xZN5_rOirk7_WCx~iI#kK8$0}IuvX9PK_3L7GN)C+qlBm6 z5rk2qB*Nno4cbg&U<)E3m=x+~S&o6JPXXXCg#5k7?}7^g!LeB_FHLCX<;7^#csJKf zcKmgR7$`KB3k_4@0G>XbOvMmM(1SlKFf$zb6VRZdh*i^+6)c&5W3;Dz4&jTSjJE+VMSA4mnLJH@@Rom zHqdUzPw8?kS-yoe7$}vVkvXIq+a?N5_NOpDfmGMnuB_mEv3Jo9gTIKqR~P#Qs<^lc zrSbGXNS@8DB(rE9WbC+k(CG2Cfw~&^75o4UV&1F-nXaz_eSwXM#Hs{E4#0hib zSc%nS`rk%Db)M0mdnH$BD8sfUJr|*b9xAiw@t6dB{#P=7;U| z0^Hl?xX?#)rlXd(8=>YKu^zJDhzZ9<^&F2AB5bXP8`r`j+%^{B^-%AP^#ZS*BXqFM w8{@j Date: Thu, 16 Jul 2026 18:06:05 +0300 Subject: [PATCH 48/56] Track ink-painted bounds and avoid rect inflation Compute the true painted bounds of /InkList by accumulating all ink points into an ink_bounds rectangle and inflating it by half the border width. Only expand the annotation /Rect when the painted bounds would otherwise be clipped, and only then persist the change for persistent targets. This prevents unconditional inflation of /Rect on every regeneration (which could cause unbounded growth) and makes appearance updates idempotent. --- core/fpdfdoc/cpdf_generateap.cpp | 50 +++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index aafbc34ecd..c179096c21 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -2218,13 +2218,13 @@ bool GenerateInkAP(APGenerationTarget* target, app_stream << GetDashPatternString(annot_dict); - // Set inflated rect as a new rect because paths near the border with large - // width should not be clipped to the original rect. - CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); - rect.Inflate(border_width / 2, border_width / 2); - if (target->IsPersistent()) { - annot_dict->SetRectFor(pdfium::annotation::kRect, rect); - } + // Track the stroked ink's true bounds while writing the path: the union of + // every /InkList point, inflated by half the border width below (the round + // caps/joins set above — `1 J 1 j` — extend exactly border_width / 2 past a + // point). This is what the appearance actually PAINTS, independent of what + // /Rect currently claims. + CFX_FloatRect ink_bounds; + bool has_ink_point = false; for (size_t i = 0; i < ink_list->size(); i++) { RetainPtr coordinates_array = ink_list->GetArrayAt(i); @@ -2233,19 +2233,47 @@ bool GenerateInkAP(APGenerationTarget* target, continue; } - app_stream << coordinates_array->GetFloatAt(0) << " " - << coordinates_array->GetFloatAt(1) << " m "; + const float x0 = coordinates_array->GetFloatAt(0); + const float y0 = coordinates_array->GetFloatAt(1); + app_stream << x0 << " " << y0 << " m "; + if (has_ink_point) { + ink_bounds.UpdateRect(CFX_PointF(x0, y0)); + } else { + ink_bounds = CFX_FloatRect(x0, y0, x0, y0); + has_ink_point = true; + } // Start loop at the second point (index 2) --- // The 'm' command already moves to the first point. for (size_t j = 2; j < coordinates_array->size(); j += 2) { - app_stream << coordinates_array->GetFloatAt(j) << " " - << coordinates_array->GetFloatAt(j + 1) << " l "; + const float x = coordinates_array->GetFloatAt(j); + const float y = coordinates_array->GetFloatAt(j + 1); + app_stream << x << " " << y << " l "; + ink_bounds.UpdateRect(CFX_PointF(x, y)); } app_stream << "S\n"; } + // ENSURE-FIT, never blind-inflate. The caller owns /Rect (EmbedPDF's + // writers author it as the stroked visual bounds already); grow it only + // when the painted ink would actually be clipped, by the minimal union — + // so regeneration is IDEMPOTENT. Upstream PDFium instead inflated /Rect by + // border_width / 2 unconditionally on every call: harmless on its one-shot + // "synthesize a missing /AP at load" path, but unbounded growth once the + // appearance is re-baked after each edit. + CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + rect.Normalize(); + if (has_ink_point) { + ink_bounds.Inflate(border_width / 2, border_width / 2); + if (!rect.Contains(ink_bounds)) { + rect.Union(ink_bounds); + if (target->IsPersistent()) { + annot_dict->SetRectFor(pdfium::annotation::kRect, rect); + } + } + } + auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); auto resources_dict = GenerateResourcesDict(target->doc, std::move(gs_dict), nullptr); From ab47d3c62cec7f46827696bcb25a32ca2eaa0fa9 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Thu, 16 Jul 2026 23:50:07 +0300 Subject: [PATCH 49/56] Add file attachment extraction and AP support Add EmbedPDF attachment extraction APIs and file-attachment appearance generation. Implement EPDFDoc_GetAttachmentKey and EPDFDoc_GetAttachmentIndexByKey, the EPDFAttachmentExtractStatus enum, EPDFAttachment_ExtractFile and EPDFAttachment_ExtractFileToOwnedBuffer, and wire them into the public header. Introduce a streaming inflate helper FlateModule::FlateDecodeToSink (and its SinkDecodeStatus) to decode large/Flate-compressed embedded files without materializing the full output; add corresponding unit tests. Implement ExtractAttachmentFileToSink and supporting logic in fpdfsdk/fpdf_attachment.cpp (filter classification, sink-based and in-memory paths, size capping and error mapping). Add GenerateFileAttachmentSymbolAP/GenerateFileAttachmentAP and rotation/float-handling fixes in cpdf_generateap.cpp so file-attachment icons render correctly. Update API test checks and add extensive embedder tests for the new extraction APIs. Misc: include and build fixes and small helper utilities. --- core/fpdfdoc/cpdf_generateap.cpp | 224 +++++++++++++- core/fxcodec/flate/flatemodule.cpp | 42 +++ core/fxcodec/flate/flatemodule.h | 23 ++ core/fxcodec/flate/flatemodule_unittest.cpp | 114 +++++++ fpdfsdk/fpdf_attachment.cpp | 240 +++++++++++++++ fpdfsdk/fpdf_attachment_embeddertest.cpp | 322 ++++++++++++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 8 + public/fpdf_attachment.h | 105 +++++++ 8 files changed, 1074 insertions(+), 4 deletions(-) diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index c179096c21..9ee43b22cb 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -114,8 +114,12 @@ void EmitEndingWithAngle(fxcrt::ostringstream& out, const float cos_a = cos(final_angle_rad); const float sin_a = sin(final_angle_rad); - out << "q " << cos_a << " " << sin_a << " " << -sin_a << " " << cos_a << " " - << pos.x << " " << pos.y << " cm\n"; + // WriteMatrix, never raw `<<`: an axis-aligned segment has cos ≈ ±4.4e-8 + // and default ostream float formatting would emit it in scientific + // notation — not legal PDF number syntax (Acrobat rejects the file). + out << "q "; + WriteMatrix(out, CFX_Matrix(cos_a, sin_a, -sin_a, cos_a, pos.x, pos.y)) + << " cm\n"; emitter(); out << "Q\n"; } @@ -502,8 +506,23 @@ ShapeRotationInfo GetShapeRotationInfo(const CPDF_Dictionary* annot_dict) { info.bbox = unrotated; const float theta = rotate_deg * 3.14159265358979323846f / 180.0f; - const float cos_t = cosf(theta); - const float sin_t = sinf(theta); + // Snap the trig to exact 0/±1 near quarter turns (the values `upright` + // authoring produces): float cos(90°) is ~-4.4e-8, which would otherwise + // leak near-zero noise into the emitted matrix numbers. + auto snap = [](float v) { + if (fabsf(v) < 1e-6f) { + return 0.0f; + } + if (fabsf(v - 1.0f) < 1e-6f) { + return 1.0f; + } + if (fabsf(v + 1.0f) < 1e-6f) { + return -1.0f; + } + return v; + }; + const float cos_t = snap(cosf(theta)); + const float sin_t = snap(sinf(theta)); const float cx = (unrotated.left + unrotated.right) / 2.0f; const float cy = (unrotated.bottom + unrotated.top) / 2.0f; @@ -1146,6 +1165,153 @@ ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect, return ByteString(app_stream); } +// Appends a closed ellipse path inscribed in |bounds| (same four-bezier +// construction as GenerateCircleAP). +void AppendEllipsePath(fxcrt::ostringstream& app_stream, + const CFX_FloatRect& bounds) { + const float middle_x = (bounds.left + bounds.right) / 2; + const float middle_y = (bounds.top + bounds.bottom) / 2; + + static constexpr float kL = 0.5523f; + const float delta_x = kL * bounds.Width() / 2.0f; + const float delta_y = kL * bounds.Height() / 2.0f; + + app_stream << middle_x << " " << bounds.top << " m\n"; + app_stream << middle_x + delta_x << " " << bounds.top << " " << bounds.right + << " " << middle_y + delta_y << " " << bounds.right << " " + << middle_y << " c\n"; + app_stream << bounds.right << " " << middle_y - delta_y << " " + << middle_x + delta_x << " " << bounds.bottom << " " << middle_x + << " " << bounds.bottom << " c\n"; + app_stream << middle_x - delta_x << " " << bounds.bottom << " " + << bounds.left << " " << middle_y - delta_y << " " << bounds.left + << " " << middle_y << " c\n"; + app_stream << bounds.left << " " << middle_y + delta_y << " " + << middle_x - delta_x << " " << bounds.top << " " << middle_x + << " " << bounds.top << " c\nh\n"; +} + +ByteString GenerateFileAttachmentSymbolAP(const CFX_FloatRect& rect, + const CPDF_Dictionary& annot_dict) { + fxcrt::ostringstream app_stream; + + // Read fill color from /C array; default to yellow (the note-icon + // default in GenerateTextSymbolAP). + CFX_Color fill_color(CFX_Color::Type::kRGB, 1, 1, 0); + RetainPtr color_array = + annot_dict.GetArrayFor(pdfium::annotation::kC); + if (color_array) { + fill_color = fpdfdoc::CFXColorFromArray(*color_array); + } + + // Same luminance-based contrast stroke as GenerateTextSymbolAP. + float luminance = 0.299f * fill_color.fColor1 + 0.587f * fill_color.fColor2 + + 0.114f * fill_color.fColor3; + CFX_Color stroke_color = luminance < 0.45f + ? CFX_Color(CFX_Color::Type::kRGB, 1, 1, 1) + : CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0); + + // /Name picks the glyph. Absent or foreign names mean PushPin, the + // ISO 32000 default icon for file attachment annotations. + CPDF_Annot::Icon icon = + CPDF_Annot::StringToIcon(annot_dict.GetNameFor("Name")); + if (icon != CPDF_Annot::Icon::kFile_Graph && + icon != CPDF_Annot::Icon::kFile_Paperclip && + icon != CPDF_Annot::Icon::kFile_Tag) { + icon = CPDF_Annot::Icon::kFile_PushPin; + } + + static constexpr int kBorderWidth = 1; + static constexpr float kHalfWidth = kBorderWidth / 2.0f; + CFX_FloatRect box = rect; + box.Deflate(kHalfWidth, kHalfWidth); + const float w = box.Width(); + const float h = box.Height(); + // Glyph coordinates below are fractions of the icon box. + auto px = [&](float fx) { return box.left + fx * w; }; + auto py = [&](float fy) { return box.bottom + fy * h; }; + + if (icon == CPDF_Annot::Icon::kFile_Paperclip) { + // A paperclip is a wire, not a closed region, so /C colours the + // stroked wire itself; a wider contrast pass underneath is the wire + // counterpart of the note icon's contrast border. + fxcrt::ostringstream path; + WritePoint(path, {px(0.32f), py(0.28f)}) << " m\n"; + WritePoint(path, {px(0.32f), py(0.72f)}) << " l\n"; + path << px(0.32f) << " " << py(0.85f) << " " << px(0.68f) << " " + << py(0.85f) << " " << px(0.68f) << " " << py(0.72f) << " c\n"; + WritePoint(path, {px(0.68f), py(0.20f)}) << " l\n"; + path << px(0.68f) << " " << py(0.10f) << " " << px(0.50f) << " " + << py(0.10f) << " " << px(0.50f) << " " << py(0.20f) << " c\n"; + WritePoint(path, {px(0.50f), py(0.65f)}) << " l\n"; + path << px(0.50f) << " " << py(0.72f) << " " << px(0.41f) << " " + << py(0.72f) << " " << px(0.41f) << " " << py(0.65f) << " c\n"; + WritePoint(path, {px(0.41f), py(0.30f)}) << " l\n"; + const ByteString wire(path); + + app_stream << "1 J\n1 j\n"; + app_stream << GenerateColorAP(stroke_color, PaintOperation::kStroke); + WriteFloat(app_stream, 2.6f) << " w\n" << wire << "S\n"; + app_stream << GenerateColorAP(fill_color, PaintOperation::kStroke); + WriteFloat(app_stream, 1.4f) << " w\n" << wire << "S\n"; + return ByteString(app_stream); + } + + app_stream << GenerateColorAP(fill_color, PaintOperation::kFill); + app_stream << GenerateColorAP(stroke_color, PaintOperation::kStroke); + app_stream << kBorderWidth << " w\n"; + + switch (icon) { + case CPDF_Annot::Icon::kFile_PushPin: { + // Round head, collar, and a tapering needle. Painted with the + // nonzero rule (`B`) so touching subpaths merge instead of + // punching even-odd holes. + AppendEllipsePath(app_stream, CFX_FloatRect(px(0.33f), py(0.53f), + px(0.67f), py(0.87f))); + app_stream << px(0.37f) << " " << py(0.46f) << " " << px(0.63f) - px(0.37f) + << " " << py(0.525f) - py(0.46f) << " re\n"; + WritePoint(app_stream, {px(0.47f), py(0.455f)}) << " m\n"; + WritePoint(app_stream, {px(0.53f), py(0.455f)}) << " l\n"; + WritePoint(app_stream, {px(0.50f), py(0.10f)}) << " l\nh\n"; + app_stream << "B\n"; + break; + } + case CPDF_Annot::Icon::kFile_Graph: { + // Even-odd turns the outer+inner rectangles into a frame ring; the + // three bars sit inside the ring on its bottom edge. + app_stream << px(0.10f) << " " << py(0.10f) << " " << px(0.90f) - px(0.10f) + << " " << py(0.90f) - py(0.10f) << " re\n"; + app_stream << px(0.16f) << " " << py(0.16f) << " " << px(0.84f) - px(0.16f) + << " " << py(0.84f) - py(0.16f) << " re\n"; + app_stream << px(0.22f) << " " << py(0.16f) << " " << px(0.36f) - px(0.22f) + << " " << py(0.40f) - py(0.16f) << " re\n"; + app_stream << px(0.43f) << " " << py(0.16f) << " " << px(0.57f) - px(0.43f) + << " " << py(0.56f) - py(0.16f) << " re\n"; + app_stream << px(0.64f) << " " << py(0.16f) << " " << px(0.78f) - px(0.64f) + << " " << py(0.76f) - py(0.16f) << " re\n"; + app_stream << "B*\n"; + break; + } + case CPDF_Annot::Icon::kFile_Tag: { + // Label pentagon pointing left; even-odd punches the eyelet hole. + WritePoint(app_stream, {px(0.10f), py(0.50f)}) << " m\n"; + WritePoint(app_stream, {px(0.34f), py(0.80f)}) << " l\n"; + WritePoint(app_stream, {px(0.90f), py(0.80f)}) << " l\n"; + WritePoint(app_stream, {px(0.90f), py(0.20f)}) << " l\n"; + WritePoint(app_stream, {px(0.34f), py(0.20f)}) << " l\nh\n"; + AppendEllipsePath(app_stream, CFX_FloatRect(px(0.305f), py(0.445f), + px(0.415f), py(0.555f))); + app_stream << "B*\n"; + break; + } + default: { + NOTREACHED(); + } + } + + return ByteString(app_stream); +} + RetainPtr GenerateExtGStateDict( const CPDF_Dictionary& annot_dict, const ByteString& blend_mode) { @@ -1740,6 +1906,18 @@ bool GenerateFreeTextAP(APGenerationTarget* target, CFX_FloatRect text_box(rect.left + rd.left, rect.bottom + rd.bottom, rect.right - rd.right, rect.top - rd.top); + // (b') EmbedPDF upright tilt: for a callout the /EMBD_Metadata pair means + // the TEXT BOX only — `UnrotatedRect` is the logical text box, `Rotation` + // its tilt about the box centre. The /CL leader stays page-space, so the + // rotation is baked INLINE (a `q cm … Q` around the box + text below), + // never as the form /Matrix — /Rect keeps placing the whole appearance + // (RD then recovers the rotated box's AABB, the best axis-aligned box a + // viewer regenerating this AP can draw). + const ShapeRotationInfo box_rot = GetShapeRotationInfo(annot_dict); + if (box_rot.is_rotated) { + text_box = box_rot.bbox; + } + // (c) Border width and colors. const float border_w = GetBorderWidth(annot_dict); @@ -1831,6 +2009,16 @@ bool GenerateFreeTextAP(APGenerationTarget* target, // (g) Draw text box rectangle. Pick the paint operator dynamically so a // missing /C means "no fill" (stroke-only) rather than falling back to // PDF's default black fill. Mirrors GenerateCircleAP / GenerateSquareAP. + // An upright-tilted box (see (b')) authors in the logical box frame and + // spins it about its centre via an inline `cm` — box + text only; the + // leader/arrow above already drew in page space. WriteMatrix, never raw + // `<<`: default ostream float formatting uses scientific notation for tiny + // magnitudes (cos of a right angle ≈ -4.4e-8), which is not legal PDF + // number syntax — Acrobat rejects the whole file as corrupt. + if (box_rot.is_rotated) { + appearance_stream << "q "; + WriteMatrix(appearance_stream, box_rot.matrix) << " cm\n"; + } const bool is_fill_rect = color_array != nullptr; const bool is_stroke_rect = border_w > 0; CFX_FloatRect text_box_stroke = text_box; @@ -1895,6 +2083,9 @@ bool GenerateFreeTextAP(APGenerationTarget* target, PaintOperation::kFill) << body << "ET\nQ\n"; } + if (box_rot.is_rotated) { + appearance_stream << "Q\n"; // close the (g) inline box rotation + } // Finalize AP dict. auto graphics_state_dict = GenerateExtGStateDict(*annot_dict, blend_name); @@ -2309,6 +2500,29 @@ bool GenerateTextAP(CPDF_Document* doc, return true; } +bool GenerateFileAttachmentAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { + fxcrt::ostringstream app_stream; + app_stream << "/" << kGSDictName << " gs "; + + // Like the note icon, a file attachment renders at a fixed icon size + // anchored at the /Rect's bottom-left corner. + CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + const float icon_length = 20; + CFX_FloatRect icon_rect(rect.left, rect.bottom, rect.left + icon_length, + rect.bottom + icon_length); + annot_dict->SetRectFor(pdfium::annotation::kRect, icon_rect); + + app_stream << GenerateFileAttachmentSymbolAP(icon_rect, *annot_dict); + + auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); + auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); + GenerateAndSetAPDict(doc, annot_dict, &app_stream, std::move(resources_dict), + false /*IsTextMarkupAnnotation*/); + return true; +} + bool GenerateUnderlineAP(APGenerationTarget* target, CPDF_Dictionary* annot_dict, const ByteString& blend_name) { @@ -3522,6 +3736,8 @@ bool CPDF_GenerateAP::GenerateAnnotAP(CPDF_Document* doc, return GeneratePopupAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::TEXT: return GenerateTextAP(doc, annot_dict, blend_name); + case CPDF_Annot::Subtype::FILEATTACHMENT: + return GenerateFileAttachmentAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::LINK: return GenerateLinkAP(doc, annot_dict, blend_name); case CPDF_Annot::Subtype::REDACT: diff --git a/core/fxcodec/flate/flatemodule.cpp b/core/fxcodec/flate/flatemodule.cpp index 8ceb2dd72c..737fd54d83 100644 --- a/core/fxcodec/flate/flatemodule.cpp +++ b/core/fxcodec/flate/flatemodule.cpp @@ -842,6 +842,48 @@ DataAndBytesConsumed FlateModule::FlateOrLZWDecode( } } +// static +FlateModule::SinkDecodeStatus FlateModule::FlateDecodeToSink( + pdfium::span src_span, + uint64_t max_decoded_bytes, + const std::function)>& sink, + uint64_t* total_out) { + *total_out = 0; + std::unique_ptr context(FlateInit()); + if (!context) { + return SinkDecodeStatus::kSinkError; + } + + FlateInput(context.get(), src_span); + + // One reusable chunk keeps peak memory bounded no matter how large the + // decoded output is. + static constexpr uint32_t kChunkSize = 1 << 20; // 1 MiB + DataVector chunk(kChunkSize); + uint64_t total = 0; + while (true) { + const bool ret = FlateOutput(context.get(), chunk); + const uint32_t avail_buf_size = FlateGetAvailOut(context.get()); + const uint32_t produced = kChunkSize - avail_buf_size; + if (produced > 0) { + total += produced; + if (max_decoded_bytes && total > max_decoded_bytes) { + *total_out = total - produced; + return SinkDecodeStatus::kLimitExceeded; + } + if (!sink(pdfium::span(chunk).first(produced))) { + *total_out = total - produced; + return SinkDecodeStatus::kSinkError; + } + } + if (!ret || avail_buf_size != 0) { + break; + } + } + *total_out = total; + return SinkDecodeStatus::kSuccess; +} + // static DataVector FlateModule::Encode(pdfium::span src_span) { FX_SAFE_SIZE_T safe_dest_size = src_span.size(); diff --git a/core/fxcodec/flate/flatemodule.h b/core/fxcodec/flate/flatemodule.h index cf56ed5fc9..3e85480c03 100644 --- a/core/fxcodec/flate/flatemodule.h +++ b/core/fxcodec/flate/flatemodule.h @@ -9,6 +9,7 @@ #include +#include #include #include "core/fxcodec/data_and_bytes_consumed.h" @@ -42,6 +43,28 @@ class FlateModule { int Columns, uint32_t estimated_size); + // EmbedPDF: outcome of FlateDecodeToSink(). + enum class SinkDecodeStatus : uint8_t { + kSuccess, + kLimitExceeded, + kSinkError, + }; + + // EmbedPDF: inflates |src_span| into |sink| one bounded chunk at a time, + // without materializing the full decoded output. Peak memory is one chunk + // regardless of the decoded size. |sink| returns false to abort. + // |max_decoded_bytes| of 0 means unlimited; when the decoded output would + // exceed it, decoding stops with kLimitExceeded (|sink| may already have + // received earlier chunks). On return, |*total_out| holds the number of + // bytes handed to |sink|. Termination semantics match FlateUncompress(): + // corrupt trailing data yields the successfully inflated prefix rather + // than an error, and an empty decoded stream is a valid kSuccess result. + static SinkDecodeStatus FlateDecodeToSink( + pdfium::span src_span, + uint64_t max_decoded_bytes, + const std::function)>& sink, + uint64_t* total_out); + static DataVector Encode(pdfium::span src_span); FlateModule() = delete; diff --git a/core/fxcodec/flate/flatemodule_unittest.cpp b/core/fxcodec/flate/flatemodule_unittest.cpp index 480b8ba9a5..fa6161ad0f 100644 --- a/core/fxcodec/flate/flatemodule_unittest.cpp +++ b/core/fxcodec/flate/flatemodule_unittest.cpp @@ -72,3 +72,117 @@ TEST(FlateModule, Encode) { ++i; } } + +namespace { + +DataVector MakePatternedData(size_t size) { + DataVector data(size); + for (size_t i = 0; i < size; ++i) { + data[i] = static_cast((i * 31 + i / 997) & 0xff); + } + return data; +} + +} // namespace + +TEST(FlateModule, DecodeToSinkRoundTrip) { + // Larger than the sink chunk size (1 MiB) so multiple chunks are emitted. + const DataVector original = + MakePatternedData(3 * 1024 * 1024 + 123); + const DataVector compressed = FlateModule::Encode(original); + ASSERT_FALSE(compressed.empty()); + + DataVector decoded; + size_t sink_calls = 0; + uint64_t total = 0; + FlateModule::SinkDecodeStatus status = FlateModule::FlateDecodeToSink( + compressed, /*max_decoded_bytes=*/0, + [&](pdfium::span chunk) { + ++sink_calls; + decoded.insert(decoded.end(), chunk.begin(), chunk.end()); + return true; + }, + &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kSuccess, status); + EXPECT_EQ(original.size(), total); + EXPECT_GE(sink_calls, 3u); + EXPECT_TRUE(decoded == original); +} + +TEST(FlateModule, DecodeToSinkEmptyStream) { + const DataVector compressed = FlateModule::Encode({}); + size_t sink_calls = 0; + uint64_t total = 1; // Poison; must be reset to 0. + FlateModule::SinkDecodeStatus status = FlateModule::FlateDecodeToSink( + compressed, /*max_decoded_bytes=*/0, + [&](pdfium::span) { + ++sink_calls; + return true; + }, + &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kSuccess, status); + EXPECT_EQ(0u, total); + EXPECT_EQ(0u, sink_calls); +} + +TEST(FlateModule, DecodeToSinkLimitExceeded) { + const DataVector original = MakePatternedData(3 * 1024 * 1024); + const DataVector compressed = FlateModule::Encode(original); + + // A tiny cap trips before the first full chunk can be delivered. + size_t sink_calls = 0; + uint64_t total = 0; + FlateModule::SinkDecodeStatus status = FlateModule::FlateDecodeToSink( + compressed, /*max_decoded_bytes=*/100, + [&](pdfium::span) { + ++sink_calls; + return true; + }, + &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kLimitExceeded, status); + EXPECT_EQ(0u, total); + EXPECT_EQ(0u, sink_calls); + + // A one-chunk cap delivers the first chunk, then trips on the second. + uint64_t delivered = 0; + status = FlateModule::FlateDecodeToSink( + compressed, /*max_decoded_bytes=*/1024 * 1024, + [&](pdfium::span chunk) { + delivered += chunk.size(); + return true; + }, + &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kLimitExceeded, status); + EXPECT_EQ(delivered, total); + EXPECT_LE(total, 1024u * 1024u); +} + +TEST(FlateModule, DecodeToSinkSinkAbort) { + const DataVector original = MakePatternedData(64); + const DataVector compressed = FlateModule::Encode(original); + + uint64_t total = 0; + FlateModule::SinkDecodeStatus status = FlateModule::FlateDecodeToSink( + compressed, /*max_decoded_bytes=*/0, + [](pdfium::span) { return false; }, &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kSinkError, status); + EXPECT_EQ(0u, total); +} + +TEST(FlateModule, DecodeToSinkGarbageInput) { + // Matches FlateOrLZWDecode(): undecodable input yields the successfully + // inflated prefix — here, nothing — rather than a distinct error. + static const char kGarbage[] = "preposterous nonsense"; + size_t sink_calls = 0; + uint64_t total = 0; + FlateModule::SinkDecodeStatus status = FlateModule::FlateDecodeToSink( + pdfium::as_bytes(pdfium::span(kGarbage)), /*max_decoded_bytes=*/0, + [&](pdfium::span) { + ++sink_calls; + return true; + }, + &total); + EXPECT_EQ(FlateModule::SinkDecodeStatus::kSuccess, status); + EXPECT_EQ(0u, total); + EXPECT_EQ(0u, sink_calls); +} diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp index 40ae66baef..66b293dfd1 100644 --- a/fpdfsdk/fpdf_attachment.cpp +++ b/fpdfsdk/fpdf_attachment.cpp @@ -5,9 +5,14 @@ #include "public/fpdf_attachment.h" #include +#include +#include #include +#include +#include #include +#include #include #include "constants/stream_dict_common.h" @@ -19,14 +24,17 @@ #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfdoc/cpdf_filespec.h" #include "core/fpdfdoc/cpdf_nametree.h" #include "core/fxcodec/data_and_bytes_consumed.h" +#include "core/fxcodec/flate/flatemodule.h" #include "core/fxcrt/cfx_datetime.h" #include "core/fxcrt/data_vector.h" #include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/notreached.h" #include "core/fxcrt/numerics/safe_conversions.h" #include "fpdfsdk/cpdfsdk_helpers.h" @@ -34,6 +42,101 @@ namespace { constexpr char kChecksumKey[] = "CheckSum"; +// How EPDFAttachment_ExtractFile* decodes a given embedded file stream. +enum class ExtractFilterPath { + kUnfiltered, // No filters — the raw stream bytes ARE the file. + kSingleFlate, // Exactly one predictor-less FlateDecode — streamable. + kGeneric, // Anything else — decode fully in memory (stock behavior). +}; + +ExtractFilterPath ClassifyExtractFilters(const CPDF_Stream* stream) { + std::optional decoders = GetDecoderArray(stream->GetDict()); + if (!decoders.has_value()) { + return ExtractFilterPath::kGeneric; + } + if (decoders->empty()) { + return ExtractFilterPath::kUnfiltered; + } + if (decoders->size() != 1) { + return ExtractFilterPath::kGeneric; + } + const ByteString& name = (*decoders)[0].first; + if (name != "FlateDecode" && name != "Fl") { + return ExtractFilterPath::kGeneric; + } + RetainPtr param = ToDictionary((*decoders)[0].second); + if (param && param->GetIntegerFor("Predictor", 1) > 1) { + return ExtractFilterPath::kGeneric; + } + return ExtractFilterPath::kSingleFlate; +} + +struct ExtractOutcome { + EPDFAttachmentExtractStatus status; + uint64_t size; +}; + +using ExtractSink = std::function)>; + +// Shared core of the EPDFAttachment_ExtractFile* APIs: locates the embedded +// file stream and pushes its decoded bytes into |sink|. Termination and +// malformed-filter behavior deliberately match FPDFAttachment_GetFile(), +// which this replaces on the read path. +ExtractOutcome ExtractAttachmentFileToSink(FPDF_ATTACHMENT attachment, + uint64_t max_decoded_bytes, + const ExtractSink& sink) { + CPDF_Object* file = CPDFObjectFromFPDFAttachment(attachment); + if (!file) { + return {EPDFAttachmentExtractStatus_kNoFileStream, 0}; + } + + CPDF_FileSpec spec(pdfium::WrapRetain(file)); + RetainPtr file_stream = spec.GetFileStream(); + if (!file_stream) { + return {EPDFAttachmentExtractStatus_kNoFileStream, 0}; + } + + const ExtractFilterPath path = ClassifyExtractFilters(file_stream.Get()); + auto stream_acc = pdfium::MakeRetain(std::move(file_stream)); + if (path == ExtractFilterPath::kSingleFlate) { + stream_acc->LoadAllDataRaw(); + uint64_t total = 0; + switch (FlateModule::FlateDecodeToSink(stream_acc->GetSpan(), + max_decoded_bytes, sink, &total)) { + case FlateModule::SinkDecodeStatus::kSuccess: + return {EPDFAttachmentExtractStatus_kSuccess, total}; + case FlateModule::SinkDecodeStatus::kLimitExceeded: + return {EPDFAttachmentExtractStatus_kSizeLimitExceeded, total}; + case FlateModule::SinkDecodeStatus::kSinkError: + return {EPDFAttachmentExtractStatus_kWriteFailed, total}; + } + NOTREACHED(); + } + + if (path == ExtractFilterPath::kUnfiltered) { + stream_acc->LoadAllDataRaw(); + } else { + stream_acc->LoadAllDataFiltered(); + } + pdfium::span data = stream_acc->GetSpan(); + if (max_decoded_bytes && data.size() > max_decoded_bytes) { + return {EPDFAttachmentExtractStatus_kSizeLimitExceeded, 0}; + } + if (!data.empty() && !sink(data)) { + return {EPDFAttachmentExtractStatus_kWriteFailed, 0}; + } + return {EPDFAttachmentExtractStatus_kSuccess, data.size()}; +} + +// Sizes these APIs can report are capped by the uint32_t |out_size|. +ExtractOutcome CapOutcomeToUint32(ExtractOutcome outcome) { + if (outcome.status == EPDFAttachmentExtractStatus_kSuccess && + outcome.size > std::numeric_limits::max()) { + outcome.status = EPDFAttachmentExtractStatus_kSizeLimitExceeded; + } + return outcome; +} + } // namespace FPDF_EXPORT int FPDF_CALLCONV @@ -99,6 +202,55 @@ FPDFDoc_GetAttachment(FPDF_DOCUMENT document, int index) { name_tree->LookupValueAndName(index, &csName)); } +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetAttachmentKey(FPDF_DOCUMENT document, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || index < 0) { + return 0; + } + + auto name_tree = CPDF_NameTree::CreateForReading(doc, "EmbeddedFiles"); + if (!name_tree || static_cast(index) >= name_tree->GetCount()) { + return 0; + } + + WideString key; + if (!name_tree->LookupValueAndName(index, &key)) { + return 0; + } + + // SAFETY: required from caller. + return Utf16EncodeMaybeCopyAndReturnLength( + key, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetAttachmentIndexByKey(FPDF_DOCUMENT document, FPDF_WIDESTRING key) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !key) { + return -1; + } + + auto name_tree = CPDF_NameTree::CreateForReading(doc, "EmbeddedFiles"); + if (!name_tree) { + return -1; + } + + // SAFETY: required from caller. + WideString target = UNSAFE_BUFFERS(WideStringFromFPDFWideString(key)); + const size_t count = name_tree->GetCount(); + for (size_t i = 0; i < count; ++i) { + WideString candidate; + if (name_tree->LookupValueAndName(i, &candidate) && candidate == target) { + return pdfium::checked_cast(i); + } + } + return -1; +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFDoc_DeleteAttachment(FPDF_DOCUMENT document, int index) { CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); @@ -435,3 +587,91 @@ EPDFAttachment_GetIntegerValue(FPDF_ATTACHMENT attachment, num->IsInteger() ? num->GetInteger() : static_cast(num->GetNumber()); return true; } + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAttachment_ExtractFile(FPDF_ATTACHMENT attachment, + FPDF_FILEWRITE* file_write, + uint64_t max_decoded_bytes, + uint32_t* out_size, + EPDFAttachmentExtractStatus* out_status) { + if (out_size) { + *out_size = 0; + } + if (out_status) { + *out_status = EPDFAttachmentExtractStatus_kWriteFailed; + } + if (!file_write || file_write->version != 1 || !file_write->WriteBlock) { + return false; + } + + ExtractOutcome outcome = CapOutcomeToUint32(ExtractAttachmentFileToSink( + attachment, max_decoded_bytes, + [file_write](pdfium::span chunk) { + return file_write->WriteBlock( + file_write, chunk.data(), + pdfium::checked_cast(chunk.size())) != 0; + })); + if (out_status) { + *out_status = outcome.status; + } + if (outcome.status != EPDFAttachmentExtractStatus_kSuccess) { + return false; + } + if (out_size) { + *out_size = static_cast(outcome.size); + } + return true; +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAttachment_ExtractFileToOwnedBuffer( + FPDF_ATTACHMENT attachment, + uint64_t max_decoded_bytes, + void** out_buffer, + uint32_t* out_size, + EPDFAttachmentExtractStatus* out_status) { + if (out_buffer) { + *out_buffer = nullptr; + } + if (out_size) { + *out_size = 0; + } + if (out_status) { + *out_status = EPDFAttachmentExtractStatus_kWriteFailed; + } + if (!out_buffer || !out_size) { + return false; + } + + DataVector data; + ExtractOutcome outcome = CapOutcomeToUint32(ExtractAttachmentFileToSink( + attachment, max_decoded_bytes, + [&data](pdfium::span chunk) { + data.insert(data.end(), chunk.begin(), chunk.end()); + return true; + })); + if (out_status) { + *out_status = outcome.status; + } + if (outcome.status != EPDFAttachmentExtractStatus_kSuccess) { + return false; + } + // A zero-byte embedded file is a valid success: NULL buffer, size 0. + if (data.empty()) { + return true; + } + + // Must be malloc() so EPDF_FreeBuffer() (which calls free()) can release + // it — same contract as the EPDF_*ToOwnedBuffer() save APIs. + void* buffer = malloc(data.size()); + if (!buffer) { + if (out_status) { + *out_status = EPDFAttachmentExtractStatus_kWriteFailed; + } + return false; + } + memcpy(buffer, data.data(), data.size()); + *out_buffer = buffer; + *out_size = static_cast(data.size()); + return true; +} diff --git a/fpdfsdk/fpdf_attachment_embeddertest.cpp b/fpdfsdk/fpdf_attachment_embeddertest.cpp index ca51f3f9a3..5f247a85f4 100644 --- a/fpdfsdk/fpdf_attachment_embeddertest.cpp +++ b/fpdfsdk/fpdf_attachment_embeddertest.cpp @@ -439,3 +439,325 @@ TEST_F(FPDFAttachmentEmbedderTest, GetSubtypeInvalid) { EXPECT_EQ(2u * (strlen(kExpectedSubtype) + 1), FPDFAttachment_GetSubtype(attachment, nullptr, 10)); } + +namespace { + +class CollectingFileWriter final : public FPDF_FILEWRITE { + public: + CollectingFileWriter() { + version = 1; + WriteBlock = WriteBlockImpl; + } + + const std::string& data() const { return data_; } + int write_calls() const { return write_calls_; } + + private: + static int WriteBlockImpl(FPDF_FILEWRITE* self, + const void* data, + unsigned long size) { + auto* writer = static_cast(self); + ++writer->write_calls_; + writer->data_.append(static_cast(data), size); + return 1; + } + + std::string data_; + int write_calls_ = 0; +}; + +class FailingFileWriter final : public FPDF_FILEWRITE { + public: + FailingFileWriter() { + version = 1; + WriteBlock = WriteBlockImpl; + } + + private: + static int WriteBlockImpl(FPDF_FILEWRITE*, const void*, unsigned long) { + return 0; + } +}; + +std::string GetFileViaStockApi(FPDF_ATTACHMENT attachment) { + unsigned long length = 0; + if (!FPDFAttachment_GetFile(attachment, nullptr, 0, &length)) { + ADD_FAILURE() << "stock FPDFAttachment_GetFile failed"; + return std::string(); + } + std::vector buf(length); + unsigned long actual = 0; + EXPECT_TRUE(FPDFAttachment_GetFile(attachment, buf.data(), length, &actual)); + return std::string(buf.data(), actual); +} + +} // namespace + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileMatchesGetFile) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + ASSERT_EQ(2, FPDFDoc_GetAttachmentCount(document())); + + for (int i = 0; i < 2; ++i) { + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), i); + ASSERT_TRUE(attachment); + const std::string expected = GetFileViaStockApi(attachment); + ASSERT_FALSE(expected.empty()); + + // FPDF_FILEWRITE variant produces byte-identical output. + CollectingFileWriter writer; + uint32_t size = 0; + EPDFAttachmentExtractStatus status = + EPDFAttachmentExtractStatus_kWriteFailed; + ASSERT_TRUE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/0, &size, + &status)) + << " for attachment " << i; + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + EXPECT_EQ(expected.size(), static_cast(size)); + EXPECT_EQ(expected, writer.data()); + + // Owned-buffer variant too. + void* buffer = nullptr; + uint32_t buffer_size = 0; + ASSERT_TRUE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/0, &buffer, &buffer_size, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + ASSERT_EQ(expected.size(), static_cast(buffer_size)); + ASSERT_TRUE(buffer); + EXPECT_EQ(expected, std::string(static_cast(buffer), + buffer_size)); + EPDF_FreeBuffer(buffer); + } +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileSizeLimit) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + + // The second attachment is 5869 bytes. + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), 1); + ASSERT_TRUE(attachment); + + CollectingFileWriter writer; + uint32_t size = 0; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kSuccess; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/100, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSizeLimitExceeded, status); + EXPECT_EQ(0u, size); + + void* buffer = nullptr; + uint32_t buffer_size = 0; + EXPECT_FALSE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/100, &buffer, &buffer_size, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSizeLimitExceeded, status); + EXPECT_FALSE(buffer); + EXPECT_EQ(0u, buffer_size); + + // A limit exactly equal to the file size succeeds. + CollectingFileWriter exact_writer; + EXPECT_TRUE(EPDFAttachment_ExtractFile(attachment, &exact_writer, + /*max_decoded_bytes=*/5869, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + EXPECT_EQ(5869u, size); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileNoFileStream) { + // This fixture's attachment is missing the embedded file (/EF). + ASSERT_TRUE(OpenDocument("embedded_attachments_invalid_data.pdf")); + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), 0); + ASSERT_TRUE(attachment); + + CollectingFileWriter writer; + uint32_t size = 0; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kSuccess; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kNoFileStream, status); + EXPECT_EQ(0, writer.write_calls()); + + void* buffer = nullptr; + uint32_t buffer_size = 0; + EXPECT_FALSE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/0, &buffer, &buffer_size, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kNoFileStream, status); + EXPECT_FALSE(buffer); + + // A null attachment behaves the same. + EXPECT_FALSE(EPDFAttachment_ExtractFile(nullptr, &writer, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kNoFileStream, status); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileInvalidWriter) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), 0); + ASSERT_TRUE(attachment); + + uint32_t size = 1; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kSuccess; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, nullptr, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); + EXPECT_EQ(0u, size); + + CollectingFileWriter bad_version; + bad_version.version = 2; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, &bad_version, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); + + CollectingFileWriter no_callback; + no_callback.WriteBlock = nullptr; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, &no_callback, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileWriterFailure) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), 0); + ASSERT_TRUE(attachment); + + FailingFileWriter writer; + uint32_t size = 1; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kSuccess; + EXPECT_FALSE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); + EXPECT_EQ(0u, size); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileEmptyAttachment) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + ScopedFPDFWideString file_name = GetFPDFWideString(L"empty.bin"); + FPDF_ATTACHMENT attachment = + FPDFDoc_AddAttachment(document(), file_name.get()); + ASSERT_TRUE(attachment); + ASSERT_TRUE(FPDFAttachment_SetFile(attachment, document(), nullptr, 0)); + + // A zero-byte embedded file extracts successfully without any writes. + CollectingFileWriter writer; + uint32_t size = 1; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kWriteFailed; + EXPECT_TRUE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + EXPECT_EQ(0u, size); + EXPECT_EQ(0, writer.write_calls()); + + // The owned-buffer variant reports success with a null buffer. + void* buffer = reinterpret_cast(1); + uint32_t buffer_size = 1; + EXPECT_TRUE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/0, &buffer, &buffer_size, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + EXPECT_FALSE(buffer); + EXPECT_EQ(0u, buffer_size); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileLargeAttachment) { + ASSERT_TRUE(OpenDocument("hello_world.pdf")); + ScopedFPDFWideString file_name = GetFPDFWideString(L"big.bin"); + FPDF_ATTACHMENT attachment = + FPDFDoc_AddAttachment(document(), file_name.get()); + ASSERT_TRUE(attachment); + + std::string contents(2 * 1024 * 1024 + 17, '\0'); + for (size_t i = 0; i < contents.size(); ++i) { + contents[i] = static_cast((i * 31 + i / 997) & 0xff); + } + ASSERT_TRUE(FPDFAttachment_SetFile(attachment, document(), contents.data(), + contents.size())); + + CollectingFileWriter writer; + uint32_t size = 0; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kWriteFailed; + ASSERT_TRUE(EPDFAttachment_ExtractFile(attachment, &writer, + /*max_decoded_bytes=*/0, &size, + &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kSuccess, status); + ASSERT_EQ(contents.size(), static_cast(size)); + EXPECT_EQ(contents, writer.data()); +} + +TEST_F(FPDFAttachmentEmbedderTest, ExtractFileToOwnedBufferBadArgs) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + FPDF_ATTACHMENT attachment = FPDFDoc_GetAttachment(document(), 0); + ASSERT_TRUE(attachment); + + void* buffer = nullptr; + uint32_t size = 0; + EPDFAttachmentExtractStatus status = EPDFAttachmentExtractStatus_kSuccess; + EXPECT_FALSE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/0, nullptr, &size, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); + EXPECT_FALSE(EPDFAttachment_ExtractFileToOwnedBuffer( + attachment, /*max_decoded_bytes=*/0, &buffer, nullptr, &status)); + EXPECT_EQ(EPDFAttachmentExtractStatus_kWriteFailed, status); + EXPECT_FALSE(buffer); +} + +TEST_F(FPDFAttachmentEmbedderTest, GetAttachmentKey) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + ASSERT_EQ(2, FPDFDoc_GetAttachmentCount(document())); + + // This fixture's tree keys equal the /UF names (as do all + // FPDFDoc_AddAttachment-created entries). + unsigned long length_bytes = + EPDFDoc_GetAttachmentKey(document(), 0, nullptr, 0); + ASSERT_EQ(12u, length_bytes); + std::vector buf = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(12u, + EPDFDoc_GetAttachmentKey(document(), 0, buf.data(), length_bytes)); + EXPECT_EQ(L"1.txt", GetPlatformWString(buf.data())); + + length_bytes = EPDFDoc_GetAttachmentKey(document(), 1, nullptr, 0); + ASSERT_EQ(26u, length_bytes); + buf = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(26u, + EPDFDoc_GetAttachmentKey(document(), 1, buf.data(), length_bytes)); + EXPECT_EQ(L"attached.pdf", GetPlatformWString(buf.data())); + + // Bad indices / bad document. + EXPECT_EQ(0u, EPDFDoc_GetAttachmentKey(document(), -1, nullptr, 0)); + EXPECT_EQ(0u, EPDFDoc_GetAttachmentKey(document(), 2, nullptr, 0)); + EXPECT_EQ(0u, EPDFDoc_GetAttachmentKey(nullptr, 0, nullptr, 0)); +} + +TEST_F(FPDFAttachmentEmbedderTest, GetAttachmentIndexByKey) { + ASSERT_TRUE(OpenDocument("embedded_attachments.pdf")); + + ScopedFPDFWideString key1 = GetFPDFWideString(L"1.txt"); + ScopedFPDFWideString key2 = GetFPDFWideString(L"attached.pdf"); + ScopedFPDFWideString missing = GetFPDFWideString(L"nope.bin"); + EXPECT_EQ(0, EPDFDoc_GetAttachmentIndexByKey(document(), key1.get())); + EXPECT_EQ(1, EPDFDoc_GetAttachmentIndexByKey(document(), key2.get())); + EXPECT_EQ(-1, EPDFDoc_GetAttachmentIndexByKey(document(), missing.get())); + EXPECT_EQ(-1, EPDFDoc_GetAttachmentIndexByKey(nullptr, key1.get())); + EXPECT_EQ(-1, EPDFDoc_GetAttachmentIndexByKey(document(), nullptr)); + + // The name tree is sorted, so adding "0.txt" shifts every index. Keys + // keep resolving to the CURRENT position. + ScopedFPDFWideString key0 = GetFPDFWideString(L"0.txt"); + FPDF_ATTACHMENT attachment = + FPDFDoc_AddAttachment(document(), key0.get()); + ASSERT_TRUE(attachment); + EXPECT_EQ(0, EPDFDoc_GetAttachmentIndexByKey(document(), key0.get())); + EXPECT_EQ(1, EPDFDoc_GetAttachmentIndexByKey(document(), key1.get())); + EXPECT_EQ(2, EPDFDoc_GetAttachmentIndexByKey(document(), key2.get())); + + // Deleting shifts them back; the deleted key stops resolving. + EXPECT_TRUE(FPDFDoc_DeleteAttachment(document(), 0)); + EXPECT_EQ(-1, EPDFDoc_GetAttachmentIndexByKey(document(), key0.get())); + EXPECT_EQ(0, EPDFDoc_GetAttachmentIndexByKey(document(), key1.get())); + EXPECT_EQ(1, EPDFDoc_GetAttachmentIndexByKey(document(), key2.get())); +} diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index b2a0c70e2e..2afdea12fe 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -118,6 +118,14 @@ int CheckPDFiumCApi() { CHK(EPDFFont_RegisterMemFont64); // fpdf_attachment.h + CHK(EPDFAttachment_ExtractFile); + CHK(EPDFAttachment_ExtractFileToOwnedBuffer); + CHK(EPDFAttachment_GetDescription); + CHK(EPDFAttachment_GetIntegerValue); + CHK(EPDFAttachment_SetDescription); + CHK(EPDFAttachment_SetSubtype); + CHK(EPDFDoc_GetAttachmentIndexByKey); + CHK(EPDFDoc_GetAttachmentKey); CHK(FPDFAttachment_GetFile); CHK(FPDFAttachment_GetName); CHK(FPDFAttachment_GetStringValue); diff --git a/public/fpdf_attachment.h b/public/fpdf_attachment.h index cc32447f0b..5aa9580972 100644 --- a/public/fpdf_attachment.h +++ b/public/fpdf_attachment.h @@ -5,9 +5,14 @@ #ifndef PUBLIC_FPDF_ATTACHMENT_H_ #define PUBLIC_FPDF_ATTACHMENT_H_ +#include + // NOLINTNEXTLINE(build/include) #include "fpdfview.h" +// For FPDF_FILEWRITE. NOLINTNEXTLINE(build/include) +#include "fpdf_save.h" + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -58,6 +63,41 @@ FPDFDoc_GetAttachment(FPDF_DOCUMENT document, int index); FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFDoc_DeleteAttachment(FPDF_DOCUMENT document, int index); +// Experimental EmbedPDF API. +// Get the |document|'s EmbeddedFiles name-tree KEY at |index|, encoded in +// UTF-16LE. The key is the tree's unique identifier for the entry; it is +// usually — but not necessarily — equal to the filespec's /UF file name +// returned by FPDFAttachment_GetName() (foreign PDFs may diverge, and /UF +// values may collide while keys cannot). |buffer| is only modified if +// |buflen| is longer than the length of the key. On errors, |buffer| is +// unmodified and the returned length is 0. +// +// document - handle to a document. +// index - the index of the embedded file. +// buffer - buffer for holding the key, encoded in UTF-16LE. +// buflen - length of the buffer in bytes. +// +// Returns the length of the key in bytes, or 0 on error. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFDoc_GetAttachmentKey(FPDF_DOCUMENT document, + int index, + FPDF_WCHAR* buffer, + unsigned long buflen); + +// Experimental EmbedPDF API. +// Find the current index of the embedded file whose EmbeddedFiles +// name-tree key equals |key|. Keys are unique within the tree, so at most +// one entry matches. Note that indices shift when attachments are added +// (the tree is name-sorted) or deleted — the returned index is only valid +// until the next mutation. +// +// document - handle to a document. +// key - the name-tree key to look for, encoded in UTF-16LE. +// +// Returns the index of the matching embedded file, or -1 if there is none. +FPDF_EXPORT int FPDF_CALLCONV +EPDFDoc_GetAttachmentIndexByKey(FPDF_DOCUMENT document, FPDF_WIDESTRING key); + // Experimental API. // Get the name of the |attachment| file. |buffer| is only modified if |buflen| // is longer than the length of the file name. On errors, |buffer| is unmodified @@ -172,6 +212,71 @@ FPDFAttachment_GetFile(FPDF_ATTACHMENT attachment, unsigned long buflen, unsigned long* out_buflen); +// Detailed outcome of the EPDFAttachment_ExtractFile* APIs. +typedef enum { + EPDFAttachmentExtractStatus_kSuccess = 0, + // The attachment has no embedded file stream (no /EF entry). + EPDFAttachmentExtractStatus_kNoFileStream = 1, + // The file stream could not be decoded. + EPDFAttachmentExtractStatus_kDecodeFailed = 2, + // The decoded file exceeds |max_decoded_bytes| (or 2^32 - 1 bytes, the + // largest size these APIs can report). + EPDFAttachmentExtractStatus_kSizeLimitExceeded = 3, + // Writing to the destination failed (invalid FPDF_FILEWRITE, a + // WriteBlock() failure, or an invalid output argument). The destination + // may contain a partial file. + EPDFAttachmentExtractStatus_kWriteFailed = 4, +} EPDFAttachmentExtractStatus; + +// Experimental EmbedPDF API. +// Decode the embedded file of |attachment| ONCE and write it to |file_write|. +// Unfiltered and Flate-compressed file streams (the overwhelmingly common +// cases) are written through |file_write| in bounded chunks without +// materializing the whole decoded file; other filter chains are decoded in +// memory first, then written out. Unlike the two-call +// FPDFAttachment_GetFile() pattern, the stream is never decoded twice. +// +// attachment - handle to an attachment. +// file_write - the destination; |version| must be 1 and +// |WriteBlock| non-null. +// max_decoded_bytes - fail with kSizeLimitExceeded once the decoded file +// would exceed this many bytes (decompression-bomb +// guard). 0 means unlimited. +// out_size - optional; receives the decoded file size in bytes. +// out_status - optional; receives the detailed status. +// +// Returns true on success. On failure the destination may contain a +// partial file. Output parameters are zeroed before any work is done. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAttachment_ExtractFile(FPDF_ATTACHMENT attachment, + FPDF_FILEWRITE* file_write, + uint64_t max_decoded_bytes, + uint32_t* out_size, + EPDFAttachmentExtractStatus* out_status); + +// Experimental EmbedPDF API. +// Decode the embedded file of |attachment| ONCE into an owned memory buffer. +// The caller must release the returned buffer with EPDF_FreeBuffer(). A +// zero-byte embedded file is a valid success: true is returned with +// |*out_buffer| set to NULL and |*out_size| set to 0. +// +// attachment - handle to an attachment. +// max_decoded_bytes - fail with kSizeLimitExceeded once the decoded file +// would exceed this many bytes (decompression-bomb +// guard). 0 means unlimited. +// out_buffer - receives the owned buffer holding the decoded file. +// out_size - receives the decoded file size in bytes. +// out_status - optional; receives the detailed status. +// +// Returns true on success. Output parameters are zeroed before any work is +// done. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAttachment_ExtractFileToOwnedBuffer(FPDF_ATTACHMENT attachment, + uint64_t max_decoded_bytes, + void** out_buffer, + uint32_t* out_size, + EPDFAttachmentExtractStatus* out_status); + // Experimental API. // Get the MIME type (Subtype) of the embedded file |attachment|. |buffer| is // only modified if |buflen| is longer than the length of the MIME type string. From 9196b8d6c834d4f550b403deadf4acbed3c4a987 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 17 Jul 2026 11:50:32 +0300 Subject: [PATCH 50/56] Add EPDFDest_GetPageObjectNumber API Expose a way to resolve a destination to its page dictionary object number. Implements CPDF_Dest::GetPageObjectNumber (handles numeric page indexes and page dictionary references, validates page visibility and XFA/extension cases) and exports EPDFDest_GetPageObjectNumber in the public API. Adds unit tests covering numeric and dictionary destinations and invalid references, updates headers and includes, and makes minor formatting/whitespace fixes in the C API test harness. --- core/fpdfdoc/cpdf_dest.cpp | 32 + core/fpdfdoc/cpdf_dest.h | 2 + fpdfsdk/fpdf_doc.cpp | 17 + fpdfsdk/fpdf_doc_embeddertest.cpp | 38 + fpdfsdk/fpdf_view_c_api_test.c | 1065 +++++++++++++++-------------- public/fpdf_doc.h | 123 ++-- 6 files changed, 698 insertions(+), 579 deletions(-) diff --git a/core/fpdfdoc/cpdf_dest.cpp b/core/fpdfdoc/cpdf_dest.cpp index ac99bbcc95..bf12f00e6c 100644 --- a/core/fpdfdoc/cpdf_dest.cpp +++ b/core/fpdfdoc/cpdf_dest.cpp @@ -12,6 +12,7 @@ #include #include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" @@ -72,6 +73,37 @@ int CPDF_Dest::GetDestPageIndex(CPDF_Document* doc) const { return doc->GetPageIndex(pPage->GetObjNum()); } +uint32_t CPDF_Dest::GetPageObjectNumber(CPDF_Document* doc) const { + if (!doc || !array_) { + return 0; + } + + RetainPtr pPage = array_->GetDirectObjectAt(0); + if (!pPage) { + return 0; + } + + if (pPage->IsNumber()) { + const int page_index = pPage->GetInteger(); + if (page_index < 0 || page_index >= doc->GetPageCount()) { + return 0; + } + + RetainPtr page = doc->GetPageDictionary(page_index); + return page ? page->GetObjNum() : 0; + } + + if (!pPage->IsDictionary()) { + return 0; + } + + const uint32_t page_object_number = pPage->GetObjNum(); + if (page_object_number == 0 || doc->GetPageIndex(page_object_number) < 0) { + return 0; + } + return page_object_number; +} + std::vector CPDF_Dest::GetScrollPositionArray() const { std::vector result; if (array_) { diff --git a/core/fpdfdoc/cpdf_dest.h b/core/fpdfdoc/cpdf_dest.h index c79010d3e6..a0b496fe61 100644 --- a/core/fpdfdoc/cpdf_dest.h +++ b/core/fpdfdoc/cpdf_dest.h @@ -7,6 +7,7 @@ #ifndef CORE_FPDFDOC_CPDF_DEST_H_ #define CORE_FPDFDOC_CPDF_DEST_H_ +#include #include #include "core/fpdfapi/parser/cpdf_array.h" @@ -28,6 +29,7 @@ class CPDF_Dest { const CPDF_Array* GetArray() const { return array_.Get(); } int GetDestPageIndex(CPDF_Document* doc) const; + uint32_t GetPageObjectNumber(CPDF_Document* doc) const; std::vector GetScrollPositionArray() const; // Returns the zoom mode, as one of the PDFDEST_VIEW_* values in fpdf_doc.h. diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index f0ba7f4c51..cec99ec448 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp @@ -336,6 +336,23 @@ FPDF_EXPORT int FPDF_CALLCONV FPDFDest_GetDestPageIndex(FPDF_DOCUMENT document, return destination.GetDestPageIndex(doc); } +FPDF_EXPORT unsigned int FPDF_CALLCONV +EPDFDest_GetPageObjectNumber(FPDF_DOCUMENT document, FPDF_DEST dest) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + if (!doc || !dest) { + return 0; + } + +#ifdef PDF_ENABLE_XFA + if (doc->GetExtension()) { + return 0; + } +#endif // PDF_ENABLE_XFA + + CPDF_Dest destination(pdfium::WrapRetain(CPDFArrayFromFPDFDest(dest))); + return destination.GetPageObjectNumber(doc); +} + FPDF_EXPORT unsigned long FPDF_CALLCONV FPDFDest_GetView(FPDF_DEST dest, unsigned long* pNumParams, FS_FLOAT* pParams) { if (!dest) { diff --git a/fpdfsdk/fpdf_doc_embeddertest.cpp b/fpdfsdk/fpdf_doc_embeddertest.cpp index c76a91986c..1c5448da15 100644 --- a/fpdfsdk/fpdf_doc_embeddertest.cpp +++ b/fpdfsdk/fpdf_doc_embeddertest.cpp @@ -142,6 +142,44 @@ TEST_F(FPDFDocEmbedderTest, DestGetPageIndex) { EXPECT_EQ(-1, FPDFDest_GetDestPageIndex(document(), dest)); } +TEST_F(FPDFDocEmbedderTest, DestGetPageObjectNumber) { + ASSERT_TRUE(OpenDocument("named_dests.pdf")); + + EXPECT_EQ(0u, EPDFDest_GetPageObjectNumber(nullptr, nullptr)); + EXPECT_EQ(0u, EPDFDest_GetPageObjectNumber(document(), nullptr)); + + const unsigned int page_1_object_number = + EPDFDoc_GetPageObjectNumberByIndex(document(), 1); + const unsigned int page_11_object_number = + EPDFDoc_GetPageObjectNumberByIndex(document(), 11); + ASSERT_GT(page_1_object_number, 0u); + ASSERT_GT(page_11_object_number, 0u); + + // Numeric page index in the Dests NameTree. + FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); + ASSERT_TRUE(dest); + EXPECT_EQ(0u, EPDFDest_GetPageObjectNumber(nullptr, dest)); + EXPECT_EQ(page_1_object_number, + EPDFDest_GetPageObjectNumber(document(), dest)); + + // Page dictionary reference in the Dests NameTree. + dest = FPDF_GetNamedDestByName(document(), "Next"); + ASSERT_TRUE(dest); + EXPECT_EQ(page_1_object_number, + EPDFDest_GetPageObjectNumber(document(), dest)); + + // Numeric page index in the legacy Dests dictionary. + dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); + ASSERT_TRUE(dest); + EXPECT_EQ(page_11_object_number, + EPDFDest_GetPageObjectNumber(document(), dest)); + + // Invalid object reference in the Dests NameTree. + dest = FPDF_GetNamedDestByName(document(), "LastAlternate"); + ASSERT_TRUE(dest); + EXPECT_EQ(0u, EPDFDest_GetPageObjectNumber(document(), dest)); +} + TEST_F(FPDFDocEmbedderTest, DestGetView) { ASSERT_TRUE(OpenDocument("named_dests.pdf")); diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c index 2afdea12fe..8203adc8f2 100644 --- a/fpdfsdk/fpdf_view_c_api_test.c +++ b/fpdfsdk/fpdf_view_c_api_test.c @@ -34,578 +34,581 @@ #include "public/fpdfview.h" // Scheme for avoiding LTO out of existence, warnings, etc. -typedef void (*fnptr)(void); // Legal generic function type for casts. +typedef void (*fnptr)(void); // Legal generic function type for casts. fnptr g_c_api_test_fnptr = NULL; // Extern, so can't know it doesn't change. -#define CHK(x) if ((fnptr)(x) == g_c_api_test_fnptr) return 0 +#define CHK(x) \ + if ((fnptr)(x) == g_c_api_test_fnptr) \ + return 0 // Function to call from gtest harness to ensure linker resolution. int CheckPDFiumCApi() { - // fpdf_annot.h - CHK(FPDFAnnot_AddFileAttachment); - CHK(FPDFAnnot_AddInkStroke); - CHK(FPDFAnnot_AppendAttachmentPoints); - CHK(FPDFAnnot_AppendObject); - CHK(FPDFAnnot_CountAttachmentPoints); - CHK(FPDFAnnot_GetAP); - CHK(FPDFAnnot_GetAttachmentPoints); - CHK(FPDFAnnot_GetBorder); - CHK(FPDFAnnot_GetColor); - CHK(FPDFAnnot_GetFileAttachment); - CHK(FPDFAnnot_GetFlags); - CHK(FPDFAnnot_GetFocusableSubtypes); - CHK(FPDFAnnot_GetFocusableSubtypesCount); - CHK(FPDFAnnot_GetFontColor); - CHK(FPDFAnnot_GetFontSize); - CHK(FPDFAnnot_GetFormAdditionalActionJavaScript); - CHK(FPDFAnnot_GetFormControlCount); - CHK(FPDFAnnot_GetFormControlIndex); - CHK(FPDFAnnot_GetFormFieldAlternateName); - CHK(FPDFAnnot_GetFormFieldAtPoint); - CHK(FPDFAnnot_GetFormFieldExportValue); - CHK(FPDFAnnot_GetFormFieldFlags); - CHK(FPDFAnnot_GetFormFieldName); - CHK(FPDFAnnot_GetFormFieldType); - CHK(FPDFAnnot_GetFormFieldValue); - CHK(FPDFAnnot_GetInkListCount); - CHK(FPDFAnnot_GetInkListPath); - CHK(FPDFAnnot_GetLine); - CHK(FPDFAnnot_GetLink); - CHK(FPDFAnnot_GetLinkedAnnot); - CHK(FPDFAnnot_GetNumberValue); - CHK(FPDFAnnot_GetObject); - CHK(FPDFAnnot_GetObjectCount); - CHK(FPDFAnnot_GetOptionCount); - CHK(FPDFAnnot_GetOptionLabel); - CHK(FPDFAnnot_GetRect); - CHK(FPDFAnnot_GetStringValue); - CHK(FPDFAnnot_GetSubtype); - CHK(FPDFAnnot_GetValueType); - CHK(FPDFAnnot_GetVertices); - CHK(FPDFAnnot_HasAttachmentPoints); - CHK(FPDFAnnot_HasKey); - CHK(FPDFAnnot_IsChecked); - CHK(FPDFAnnot_IsObjectSupportedSubtype); - CHK(FPDFAnnot_IsOptionSelected); - CHK(FPDFAnnot_IsSupportedSubtype); - CHK(FPDFAnnot_RemoveInkList); - CHK(FPDFAnnot_RemoveObject); - CHK(FPDFAnnot_SetAP); - CHK(FPDFAnnot_SetAttachmentPoints); - CHK(FPDFAnnot_SetBorder); - CHK(FPDFAnnot_SetColor); - CHK(FPDFAnnot_SetFlags); - CHK(FPDFAnnot_SetFocusableSubtypes); - CHK(FPDFAnnot_SetFontColor); - CHK(FPDFAnnot_SetFormFieldFlags); - CHK(FPDFAnnot_SetRect); - CHK(FPDFAnnot_SetStringValue); - CHK(FPDFAnnot_SetURI); - CHK(FPDFAnnot_UpdateObject); - CHK(FPDFPage_CloseAnnot); - CHK(FPDFPage_CreateAnnot); - CHK(FPDFPage_GetAnnot); - CHK(FPDFPage_GetAnnotCount); - CHK(FPDFPage_GetAnnotIndex); - CHK(FPDFPage_RemoveAnnot); - CHK(EPDFAnnot_SetDefaultAppearanceRegisteredFont); + // fpdf_annot.h + CHK(FPDFAnnot_AddFileAttachment); + CHK(FPDFAnnot_AddInkStroke); + CHK(FPDFAnnot_AppendAttachmentPoints); + CHK(FPDFAnnot_AppendObject); + CHK(FPDFAnnot_CountAttachmentPoints); + CHK(FPDFAnnot_GetAP); + CHK(FPDFAnnot_GetAttachmentPoints); + CHK(FPDFAnnot_GetBorder); + CHK(FPDFAnnot_GetColor); + CHK(FPDFAnnot_GetFileAttachment); + CHK(FPDFAnnot_GetFlags); + CHK(FPDFAnnot_GetFocusableSubtypes); + CHK(FPDFAnnot_GetFocusableSubtypesCount); + CHK(FPDFAnnot_GetFontColor); + CHK(FPDFAnnot_GetFontSize); + CHK(FPDFAnnot_GetFormAdditionalActionJavaScript); + CHK(FPDFAnnot_GetFormControlCount); + CHK(FPDFAnnot_GetFormControlIndex); + CHK(FPDFAnnot_GetFormFieldAlternateName); + CHK(FPDFAnnot_GetFormFieldAtPoint); + CHK(FPDFAnnot_GetFormFieldExportValue); + CHK(FPDFAnnot_GetFormFieldFlags); + CHK(FPDFAnnot_GetFormFieldName); + CHK(FPDFAnnot_GetFormFieldType); + CHK(FPDFAnnot_GetFormFieldValue); + CHK(FPDFAnnot_GetInkListCount); + CHK(FPDFAnnot_GetInkListPath); + CHK(FPDFAnnot_GetLine); + CHK(FPDFAnnot_GetLink); + CHK(FPDFAnnot_GetLinkedAnnot); + CHK(FPDFAnnot_GetNumberValue); + CHK(FPDFAnnot_GetObject); + CHK(FPDFAnnot_GetObjectCount); + CHK(FPDFAnnot_GetOptionCount); + CHK(FPDFAnnot_GetOptionLabel); + CHK(FPDFAnnot_GetRect); + CHK(FPDFAnnot_GetStringValue); + CHK(FPDFAnnot_GetSubtype); + CHK(FPDFAnnot_GetValueType); + CHK(FPDFAnnot_GetVertices); + CHK(FPDFAnnot_HasAttachmentPoints); + CHK(FPDFAnnot_HasKey); + CHK(FPDFAnnot_IsChecked); + CHK(FPDFAnnot_IsObjectSupportedSubtype); + CHK(FPDFAnnot_IsOptionSelected); + CHK(FPDFAnnot_IsSupportedSubtype); + CHK(FPDFAnnot_RemoveInkList); + CHK(FPDFAnnot_RemoveObject); + CHK(FPDFAnnot_SetAP); + CHK(FPDFAnnot_SetAttachmentPoints); + CHK(FPDFAnnot_SetBorder); + CHK(FPDFAnnot_SetColor); + CHK(FPDFAnnot_SetFlags); + CHK(FPDFAnnot_SetFocusableSubtypes); + CHK(FPDFAnnot_SetFontColor); + CHK(FPDFAnnot_SetFormFieldFlags); + CHK(FPDFAnnot_SetRect); + CHK(FPDFAnnot_SetStringValue); + CHK(FPDFAnnot_SetURI); + CHK(FPDFAnnot_UpdateObject); + CHK(FPDFPage_CloseAnnot); + CHK(FPDFPage_CreateAnnot); + CHK(FPDFPage_GetAnnot); + CHK(FPDFPage_GetAnnotCount); + CHK(FPDFPage_GetAnnotIndex); + CHK(FPDFPage_RemoveAnnot); + CHK(EPDFAnnot_SetDefaultAppearanceRegisteredFont); - // epdf_font.h - CHK(EPDFFont_AddFallbackFont); - CHK(EPDFFont_ClearFallbackFonts); - CHK(EPDFFont_ClearRegisteredFonts); - CHK(EPDFFont_RegisterFont); - CHK(EPDFFont_RegisterMemFont); - CHK(EPDFFont_RegisterMemFont64); + // epdf_font.h + CHK(EPDFFont_AddFallbackFont); + CHK(EPDFFont_ClearFallbackFonts); + CHK(EPDFFont_ClearRegisteredFonts); + CHK(EPDFFont_RegisterFont); + CHK(EPDFFont_RegisterMemFont); + CHK(EPDFFont_RegisterMemFont64); - // fpdf_attachment.h - CHK(EPDFAttachment_ExtractFile); - CHK(EPDFAttachment_ExtractFileToOwnedBuffer); - CHK(EPDFAttachment_GetDescription); - CHK(EPDFAttachment_GetIntegerValue); - CHK(EPDFAttachment_SetDescription); - CHK(EPDFAttachment_SetSubtype); - CHK(EPDFDoc_GetAttachmentIndexByKey); - CHK(EPDFDoc_GetAttachmentKey); - CHK(FPDFAttachment_GetFile); - CHK(FPDFAttachment_GetName); - CHK(FPDFAttachment_GetStringValue); - CHK(FPDFAttachment_GetSubtype); - CHK(FPDFAttachment_GetValueType); - CHK(FPDFAttachment_HasKey); - CHK(FPDFAttachment_SetFile); - CHK(FPDFAttachment_SetStringValue); - CHK(FPDFDoc_AddAttachment); - CHK(FPDFDoc_DeleteAttachment); - CHK(FPDFDoc_GetAttachment); - CHK(FPDFDoc_GetAttachmentCount); + // fpdf_attachment.h + CHK(EPDFAttachment_ExtractFile); + CHK(EPDFAttachment_ExtractFileToOwnedBuffer); + CHK(EPDFAttachment_GetDescription); + CHK(EPDFAttachment_GetIntegerValue); + CHK(EPDFAttachment_SetDescription); + CHK(EPDFAttachment_SetSubtype); + CHK(EPDFDoc_GetAttachmentIndexByKey); + CHK(EPDFDoc_GetAttachmentKey); + CHK(FPDFAttachment_GetFile); + CHK(FPDFAttachment_GetName); + CHK(FPDFAttachment_GetStringValue); + CHK(FPDFAttachment_GetSubtype); + CHK(FPDFAttachment_GetValueType); + CHK(FPDFAttachment_HasKey); + CHK(FPDFAttachment_SetFile); + CHK(FPDFAttachment_SetStringValue); + CHK(FPDFDoc_AddAttachment); + CHK(FPDFDoc_DeleteAttachment); + CHK(FPDFDoc_GetAttachment); + CHK(FPDFDoc_GetAttachmentCount); - // fpdf_catalog.h - CHK(FPDFCatalog_GetLanguage); - CHK(FPDFCatalog_IsTagged); - CHK(FPDFCatalog_SetLanguage); + // fpdf_catalog.h + CHK(FPDFCatalog_GetLanguage); + CHK(FPDFCatalog_IsTagged); + CHK(FPDFCatalog_SetLanguage); - // fpdf_dataavail.h - CHK(FPDFAvail_Create); - CHK(FPDFAvail_Destroy); - CHK(FPDFAvail_GetDocument); - CHK(FPDFAvail_GetFirstPageNum); - CHK(FPDFAvail_IsDocAvail); - CHK(FPDFAvail_IsFormAvail); - CHK(FPDFAvail_IsLinearized); - CHK(FPDFAvail_IsPageAvail); + // fpdf_dataavail.h + CHK(FPDFAvail_Create); + CHK(FPDFAvail_Destroy); + CHK(FPDFAvail_GetDocument); + CHK(FPDFAvail_GetFirstPageNum); + CHK(FPDFAvail_IsDocAvail); + CHK(FPDFAvail_IsFormAvail); + CHK(FPDFAvail_IsLinearized); + CHK(FPDFAvail_IsPageAvail); - // fpdf_doc.h - CHK(FPDFAction_GetDest); - CHK(FPDFAction_GetFilePath); - CHK(FPDFAction_GetType); - CHK(FPDFAction_GetURIPath); - CHK(FPDFBookmark_Find); - CHK(FPDFBookmark_GetAction); - CHK(FPDFBookmark_GetCount); - CHK(FPDFBookmark_GetDest); - CHK(FPDFBookmark_GetFirstChild); - CHK(FPDFBookmark_GetNextSibling); - CHK(FPDFBookmark_GetTitle); - CHK(FPDFDest_GetDestPageIndex); - CHK(FPDFDest_GetLocationInPage); - CHK(FPDFDest_GetView); - CHK(FPDFLink_CountQuadPoints); - CHK(FPDFLink_Enumerate); - CHK(FPDFLink_GetAction); - CHK(FPDFLink_GetAnnot); - CHK(FPDFLink_GetAnnotRect); - CHK(FPDFLink_GetDest); - CHK(FPDFLink_GetLinkAtPoint); - CHK(FPDFLink_GetLinkZOrderAtPoint); - CHK(FPDFLink_GetQuadPoints); - CHK(FPDF_GetFileIdentifier); - CHK(FPDF_GetMetaText); - CHK(FPDF_GetPageAAction); - CHK(FPDF_GetPageLabel); + // fpdf_doc.h + CHK(FPDFAction_GetDest); + CHK(FPDFAction_GetFilePath); + CHK(FPDFAction_GetType); + CHK(FPDFAction_GetURIPath); + CHK(FPDFBookmark_Find); + CHK(FPDFBookmark_GetAction); + CHK(FPDFBookmark_GetCount); + CHK(FPDFBookmark_GetDest); + CHK(FPDFBookmark_GetFirstChild); + CHK(FPDFBookmark_GetNextSibling); + CHK(FPDFBookmark_GetTitle); + CHK(EPDFDest_GetPageObjectNumber); + CHK(FPDFDest_GetDestPageIndex); + CHK(FPDFDest_GetLocationInPage); + CHK(FPDFDest_GetView); + CHK(FPDFLink_CountQuadPoints); + CHK(FPDFLink_Enumerate); + CHK(FPDFLink_GetAction); + CHK(FPDFLink_GetAnnot); + CHK(FPDFLink_GetAnnotRect); + CHK(FPDFLink_GetDest); + CHK(FPDFLink_GetLinkAtPoint); + CHK(FPDFLink_GetLinkZOrderAtPoint); + CHK(FPDFLink_GetQuadPoints); + CHK(FPDF_GetFileIdentifier); + CHK(FPDF_GetMetaText); + CHK(FPDF_GetPageAAction); + CHK(FPDF_GetPageLabel); - // fpdf_edit.h - CHK(FPDFFont_Close); - CHK(FPDFFont_GetAscent); - CHK(FPDFFont_GetBaseFontName); - CHK(FPDFFont_GetDescent); - CHK(FPDFFont_GetFamilyName); - CHK(FPDFFont_GetFlags); - CHK(FPDFFont_GetFontData); - CHK(FPDFFont_GetGlyphPath); - CHK(FPDFFont_GetGlyphWidth); - CHK(FPDFFont_GetIsEmbedded); - CHK(FPDFFont_GetItalicAngle); - CHK(FPDFFont_GetWeight); - CHK(FPDFFormObj_CountObjects); - CHK(FPDFFormObj_GetObject); - CHK(FPDFFormObj_RemoveObject); - CHK(FPDFGlyphPath_CountGlyphSegments); - CHK(FPDFGlyphPath_GetGlyphPathSegment); - CHK(FPDFImageObj_GetBitmap); - CHK(FPDFImageObj_GetIccProfileDataDecoded); - CHK(FPDFImageObj_GetImageDataDecoded); - CHK(FPDFImageObj_GetImageDataRaw); - CHK(FPDFImageObj_GetImageFilter); - CHK(FPDFImageObj_GetImageFilterCount); - CHK(FPDFImageObj_GetImageMetadata); - CHK(FPDFImageObj_GetImagePixelSize); - CHK(FPDFImageObj_GetRenderedBitmap); - CHK(FPDFImageObj_LoadJpegFile); - CHK(FPDFImageObj_LoadJpegFileInline); - CHK(FPDFImageObj_SetBitmap); - CHK(FPDFImageObj_SetMatrix); - CHK(FPDFPageObjMark_CountParams); - CHK(FPDFPageObjMark_GetName); - CHK(FPDFPageObjMark_GetParamBlobValue); - CHK(FPDFPageObjMark_GetParamFloatValue); - CHK(FPDFPageObjMark_GetParamIntValue); - CHK(FPDFPageObjMark_GetParamKey); - CHK(FPDFPageObjMark_GetParamStringValue); - CHK(FPDFPageObjMark_GetParamValueType); - CHK(FPDFPageObjMark_RemoveParam); - CHK(FPDFPageObjMark_SetBlobParam); - CHK(FPDFPageObjMark_SetFloatParam); - CHK(FPDFPageObjMark_SetIntParam); - CHK(FPDFPageObjMark_SetStringParam); - CHK(FPDFPageObj_AddMark); - CHK(FPDFPageObj_CountMarks); - CHK(FPDFPageObj_CreateNewPath); - CHK(FPDFPageObj_CreateNewRect); - CHK(FPDFPageObj_CreateTextObj); - CHK(FPDFPageObj_Destroy); - CHK(FPDFPageObj_GetBounds); - CHK(FPDFPageObj_GetDashArray); - CHK(FPDFPageObj_GetDashCount); - CHK(FPDFPageObj_GetDashPhase); - CHK(FPDFPageObj_GetFillColor); - CHK(FPDFPageObj_GetIsActive); - CHK(FPDFPageObj_GetLineCap); - CHK(FPDFPageObj_GetLineJoin); - CHK(FPDFPageObj_GetMark); - CHK(FPDFPageObj_GetMarkedContentID); - CHK(FPDFPageObj_GetMatrix); - CHK(FPDFPageObj_GetRotatedBounds); - CHK(FPDFPageObj_GetStrokeColor); - CHK(FPDFPageObj_GetStrokeWidth); - CHK(FPDFPageObj_GetType); - CHK(FPDFPageObj_HasTransparency); - CHK(FPDFPageObj_NewImageObj); - CHK(FPDFPageObj_NewTextObj); - CHK(FPDFPageObj_RemoveMark); - CHK(FPDFPageObj_SetBlendMode); - CHK(FPDFPageObj_SetDashArray); - CHK(FPDFPageObj_SetDashPhase); - CHK(FPDFPageObj_SetFillColor); - CHK(FPDFPageObj_SetIsActive); - CHK(FPDFPageObj_SetLineCap); - CHK(FPDFPageObj_SetLineJoin); - CHK(FPDFPageObj_SetMatrix); - CHK(FPDFPageObj_SetStrokeColor); - CHK(FPDFPageObj_SetStrokeWidth); - CHK(FPDFPageObj_Transform); - CHK(FPDFPageObj_TransformF); - CHK(FPDFPage_CountObjects); - CHK(FPDFPage_Delete); - CHK(FPDFPage_GenerateContent); - CHK(FPDFPage_GetObject); - CHK(FPDFPage_GetRotation); - CHK(FPDFPage_HasTransparency); - CHK(FPDFPage_InsertObject); - CHK(FPDFPage_InsertObjectAtIndex); - CHK(FPDFPage_New); - CHK(FPDFPage_RemoveObject); - CHK(FPDFPage_SetRotation); - CHK(FPDFPage_TransformAnnots); - CHK(FPDFPathSegment_GetClose); - CHK(FPDFPathSegment_GetPoint); - CHK(FPDFPathSegment_GetType); - CHK(FPDFPath_BezierTo); - CHK(FPDFPath_Close); - CHK(FPDFPath_CountSegments); - CHK(FPDFPath_GetDrawMode); - CHK(FPDFPath_GetPathSegment); - CHK(FPDFPath_LineTo); - CHK(FPDFPath_MoveTo); - CHK(FPDFPath_SetDrawMode); - CHK(FPDFTextObj_GetFont); - CHK(FPDFTextObj_GetFontSize); - CHK(FPDFTextObj_GetRenderedBitmap); - CHK(FPDFTextObj_GetText); - CHK(FPDFTextObj_GetTextRenderMode); - CHK(FPDFTextObj_SetTextRenderMode); - CHK(FPDFText_LoadCidType2Font); - CHK(FPDFText_LoadFont); - CHK(FPDFText_LoadStandardFont); - CHK(FPDFText_SetCharcodes); - CHK(FPDFText_SetText); - CHK(FPDF_CreateNewDocument); - CHK(FPDF_MovePages); + // fpdf_edit.h + CHK(FPDFFont_Close); + CHK(FPDFFont_GetAscent); + CHK(FPDFFont_GetBaseFontName); + CHK(FPDFFont_GetDescent); + CHK(FPDFFont_GetFamilyName); + CHK(FPDFFont_GetFlags); + CHK(FPDFFont_GetFontData); + CHK(FPDFFont_GetGlyphPath); + CHK(FPDFFont_GetGlyphWidth); + CHK(FPDFFont_GetIsEmbedded); + CHK(FPDFFont_GetItalicAngle); + CHK(FPDFFont_GetWeight); + CHK(FPDFFormObj_CountObjects); + CHK(FPDFFormObj_GetObject); + CHK(FPDFFormObj_RemoveObject); + CHK(FPDFGlyphPath_CountGlyphSegments); + CHK(FPDFGlyphPath_GetGlyphPathSegment); + CHK(FPDFImageObj_GetBitmap); + CHK(FPDFImageObj_GetIccProfileDataDecoded); + CHK(FPDFImageObj_GetImageDataDecoded); + CHK(FPDFImageObj_GetImageDataRaw); + CHK(FPDFImageObj_GetImageFilter); + CHK(FPDFImageObj_GetImageFilterCount); + CHK(FPDFImageObj_GetImageMetadata); + CHK(FPDFImageObj_GetImagePixelSize); + CHK(FPDFImageObj_GetRenderedBitmap); + CHK(FPDFImageObj_LoadJpegFile); + CHK(FPDFImageObj_LoadJpegFileInline); + CHK(FPDFImageObj_SetBitmap); + CHK(FPDFImageObj_SetMatrix); + CHK(FPDFPageObjMark_CountParams); + CHK(FPDFPageObjMark_GetName); + CHK(FPDFPageObjMark_GetParamBlobValue); + CHK(FPDFPageObjMark_GetParamFloatValue); + CHK(FPDFPageObjMark_GetParamIntValue); + CHK(FPDFPageObjMark_GetParamKey); + CHK(FPDFPageObjMark_GetParamStringValue); + CHK(FPDFPageObjMark_GetParamValueType); + CHK(FPDFPageObjMark_RemoveParam); + CHK(FPDFPageObjMark_SetBlobParam); + CHK(FPDFPageObjMark_SetFloatParam); + CHK(FPDFPageObjMark_SetIntParam); + CHK(FPDFPageObjMark_SetStringParam); + CHK(FPDFPageObj_AddMark); + CHK(FPDFPageObj_CountMarks); + CHK(FPDFPageObj_CreateNewPath); + CHK(FPDFPageObj_CreateNewRect); + CHK(FPDFPageObj_CreateTextObj); + CHK(FPDFPageObj_Destroy); + CHK(FPDFPageObj_GetBounds); + CHK(FPDFPageObj_GetDashArray); + CHK(FPDFPageObj_GetDashCount); + CHK(FPDFPageObj_GetDashPhase); + CHK(FPDFPageObj_GetFillColor); + CHK(FPDFPageObj_GetIsActive); + CHK(FPDFPageObj_GetLineCap); + CHK(FPDFPageObj_GetLineJoin); + CHK(FPDFPageObj_GetMark); + CHK(FPDFPageObj_GetMarkedContentID); + CHK(FPDFPageObj_GetMatrix); + CHK(FPDFPageObj_GetRotatedBounds); + CHK(FPDFPageObj_GetStrokeColor); + CHK(FPDFPageObj_GetStrokeWidth); + CHK(FPDFPageObj_GetType); + CHK(FPDFPageObj_HasTransparency); + CHK(FPDFPageObj_NewImageObj); + CHK(FPDFPageObj_NewTextObj); + CHK(FPDFPageObj_RemoveMark); + CHK(FPDFPageObj_SetBlendMode); + CHK(FPDFPageObj_SetDashArray); + CHK(FPDFPageObj_SetDashPhase); + CHK(FPDFPageObj_SetFillColor); + CHK(FPDFPageObj_SetIsActive); + CHK(FPDFPageObj_SetLineCap); + CHK(FPDFPageObj_SetLineJoin); + CHK(FPDFPageObj_SetMatrix); + CHK(FPDFPageObj_SetStrokeColor); + CHK(FPDFPageObj_SetStrokeWidth); + CHK(FPDFPageObj_Transform); + CHK(FPDFPageObj_TransformF); + CHK(FPDFPage_CountObjects); + CHK(FPDFPage_Delete); + CHK(FPDFPage_GenerateContent); + CHK(FPDFPage_GetObject); + CHK(FPDFPage_GetRotation); + CHK(FPDFPage_HasTransparency); + CHK(FPDFPage_InsertObject); + CHK(FPDFPage_InsertObjectAtIndex); + CHK(FPDFPage_New); + CHK(FPDFPage_RemoveObject); + CHK(FPDFPage_SetRotation); + CHK(FPDFPage_TransformAnnots); + CHK(FPDFPathSegment_GetClose); + CHK(FPDFPathSegment_GetPoint); + CHK(FPDFPathSegment_GetType); + CHK(FPDFPath_BezierTo); + CHK(FPDFPath_Close); + CHK(FPDFPath_CountSegments); + CHK(FPDFPath_GetDrawMode); + CHK(FPDFPath_GetPathSegment); + CHK(FPDFPath_LineTo); + CHK(FPDFPath_MoveTo); + CHK(FPDFPath_SetDrawMode); + CHK(FPDFTextObj_GetFont); + CHK(FPDFTextObj_GetFontSize); + CHK(FPDFTextObj_GetRenderedBitmap); + CHK(FPDFTextObj_GetText); + CHK(FPDFTextObj_GetTextRenderMode); + CHK(FPDFTextObj_SetTextRenderMode); + CHK(FPDFText_LoadCidType2Font); + CHK(FPDFText_LoadFont); + CHK(FPDFText_LoadStandardFont); + CHK(FPDFText_SetCharcodes); + CHK(FPDFText_SetText); + CHK(FPDF_CreateNewDocument); + CHK(FPDF_MovePages); - // fpdf_ext.h - CHK(FPDFDoc_GetPageMode); - CHK(FSDK_SetLocaltimeFunction); - CHK(FSDK_SetTimeFunction); - CHK(FSDK_SetUnSpObjProcessHandler); + // fpdf_ext.h + CHK(FPDFDoc_GetPageMode); + CHK(FSDK_SetLocaltimeFunction); + CHK(FSDK_SetTimeFunction); + CHK(FSDK_SetUnSpObjProcessHandler); - // fpdf_flatten.h - CHK(EPDFAnnot_Flatten); - CHK(EPDFPage_Flatten); - CHK(FPDFPage_Flatten); + // fpdf_flatten.h + CHK(EPDFAnnot_Flatten); + CHK(EPDFPage_Flatten); + CHK(FPDFPage_Flatten); - // fpdf_fwlevent.h - no exports. + // fpdf_fwlevent.h - no exports. - // fpdf_formfill.h - CHK(FORM_CanRedo); - CHK(FORM_CanUndo); - CHK(FORM_DoDocumentAAction); - CHK(FORM_DoDocumentJSAction); - CHK(FORM_DoDocumentOpenAction); - CHK(FORM_DoPageAAction); - CHK(FORM_ForceToKillFocus); - CHK(FORM_GetFocusedAnnot); - CHK(FORM_GetFocusedText); - CHK(FORM_GetSelectedText); - CHK(FORM_IsIndexSelected); - CHK(FORM_OnAfterLoadPage); - CHK(FORM_OnBeforeClosePage); - CHK(FORM_OnChar); - CHK(FORM_OnFocus); - CHK(FORM_OnKeyDown); - CHK(FORM_OnKeyUp); - CHK(FORM_OnLButtonDoubleClick); - CHK(FORM_OnLButtonDown); - CHK(FORM_OnLButtonUp); - CHK(FORM_OnMouseMove); - CHK(FORM_OnMouseWheel); - CHK(FORM_OnRButtonDown); - CHK(FORM_OnRButtonUp); - CHK(FORM_Redo); - CHK(FORM_ReplaceAndKeepSelection); - CHK(FORM_ReplaceSelection); - CHK(FORM_SelectAllText); - CHK(FORM_SetFocusedAnnot); - CHK(FORM_SetIndexSelected); - CHK(FORM_Undo); - CHK(FPDFDOC_ExitFormFillEnvironment); - CHK(FPDFDOC_InitFormFillEnvironment); - CHK(FPDFPage_FormFieldZOrderAtPoint); - CHK(FPDFPage_HasFormFieldAtPoint); - CHK(FPDF_FFLDraw); + // fpdf_formfill.h + CHK(FORM_CanRedo); + CHK(FORM_CanUndo); + CHK(FORM_DoDocumentAAction); + CHK(FORM_DoDocumentJSAction); + CHK(FORM_DoDocumentOpenAction); + CHK(FORM_DoPageAAction); + CHK(FORM_ForceToKillFocus); + CHK(FORM_GetFocusedAnnot); + CHK(FORM_GetFocusedText); + CHK(FORM_GetSelectedText); + CHK(FORM_IsIndexSelected); + CHK(FORM_OnAfterLoadPage); + CHK(FORM_OnBeforeClosePage); + CHK(FORM_OnChar); + CHK(FORM_OnFocus); + CHK(FORM_OnKeyDown); + CHK(FORM_OnKeyUp); + CHK(FORM_OnLButtonDoubleClick); + CHK(FORM_OnLButtonDown); + CHK(FORM_OnLButtonUp); + CHK(FORM_OnMouseMove); + CHK(FORM_OnMouseWheel); + CHK(FORM_OnRButtonDown); + CHK(FORM_OnRButtonUp); + CHK(FORM_Redo); + CHK(FORM_ReplaceAndKeepSelection); + CHK(FORM_ReplaceSelection); + CHK(FORM_SelectAllText); + CHK(FORM_SetFocusedAnnot); + CHK(FORM_SetIndexSelected); + CHK(FORM_Undo); + CHK(FPDFDOC_ExitFormFillEnvironment); + CHK(FPDFDOC_InitFormFillEnvironment); + CHK(FPDFPage_FormFieldZOrderAtPoint); + CHK(FPDFPage_HasFormFieldAtPoint); + CHK(FPDF_FFLDraw); #if defined(PDF_USE_SKIA) - CHK(FPDF_FFLDrawSkia); + CHK(FPDF_FFLDrawSkia); #endif - CHK(FPDF_GetFormType); - CHK(FPDF_LoadXFA); - CHK(FPDF_RemoveFormFieldHighlight); - CHK(FPDF_SetFormFieldHighlightAlpha); - CHK(FPDF_SetFormFieldHighlightColor); + CHK(FPDF_GetFormType); + CHK(FPDF_LoadXFA); + CHK(FPDF_RemoveFormFieldHighlight); + CHK(FPDF_SetFormFieldHighlightAlpha); + CHK(FPDF_SetFormFieldHighlightColor); - // fpdf_javascript.h - CHK(FPDFDoc_CloseJavaScriptAction); - CHK(FPDFDoc_GetJavaScriptAction); - CHK(FPDFDoc_GetJavaScriptActionCount); - CHK(FPDFJavaScriptAction_GetName); - CHK(FPDFJavaScriptAction_GetScript); + // fpdf_javascript.h + CHK(FPDFDoc_CloseJavaScriptAction); + CHK(FPDFDoc_GetJavaScriptAction); + CHK(FPDFDoc_GetJavaScriptActionCount); + CHK(FPDFJavaScriptAction_GetName); + CHK(FPDFJavaScriptAction_GetScript); - // fpdf_ppo.h - CHK(FPDF_CloseXObject); - CHK(FPDF_CopyViewerPreferences); - CHK(FPDF_ImportNPagesToOne); - CHK(FPDF_ImportPages); - CHK(FPDF_ImportPagesByIndex); - CHK(FPDF_NewFormObjectFromXObject); - CHK(FPDF_NewXObjectFromPage); + // fpdf_ppo.h + CHK(FPDF_CloseXObject); + CHK(FPDF_CopyViewerPreferences); + CHK(FPDF_ImportNPagesToOne); + CHK(FPDF_ImportPages); + CHK(FPDF_ImportPagesByIndex); + CHK(FPDF_NewFormObjectFromXObject); + CHK(FPDF_NewXObjectFromPage); - // fpdf_progressive.h - CHK(FPDF_RenderPageBitmapWithColorScheme_Start); - CHK(FPDF_RenderPageBitmap_Start); - CHK(FPDF_RenderPage_Close); - CHK(FPDF_RenderPage_Continue); + // fpdf_progressive.h + CHK(FPDF_RenderPageBitmapWithColorScheme_Start); + CHK(FPDF_RenderPageBitmap_Start); + CHK(FPDF_RenderPage_Close); + CHK(FPDF_RenderPage_Continue); - // fpdf_save.h - CHK(FPDF_SaveAsCopy); - CHK(FPDF_SaveWithVersion); + // fpdf_save.h + CHK(FPDF_SaveAsCopy); + CHK(FPDF_SaveWithVersion); - // fpdf_searchex.h - CHK(FPDFText_GetCharIndexFromTextIndex); - CHK(FPDFText_GetTextIndexFromCharIndex); + // fpdf_searchex.h + CHK(FPDFText_GetCharIndexFromTextIndex); + CHK(FPDFText_GetTextIndexFromCharIndex); - // fpdf_signature.h - CHK(FPDFSignatureObj_GetByteRange); - CHK(FPDFSignatureObj_GetContents); - CHK(FPDFSignatureObj_GetDocMDPPermission); - CHK(FPDFSignatureObj_GetReason); - CHK(FPDFSignatureObj_GetSubFilter); - CHK(FPDFSignatureObj_GetTime); - CHK(FPDF_GetSignatureCount); - CHK(FPDF_GetSignatureObject); + // fpdf_signature.h + CHK(FPDFSignatureObj_GetByteRange); + CHK(FPDFSignatureObj_GetContents); + CHK(FPDFSignatureObj_GetDocMDPPermission); + CHK(FPDFSignatureObj_GetReason); + CHK(FPDFSignatureObj_GetSubFilter); + CHK(FPDFSignatureObj_GetTime); + CHK(FPDF_GetSignatureCount); + CHK(FPDF_GetSignatureObject); - // fpdf_structtree.h - CHK(FPDF_StructElement_Attr_CountChildren); - CHK(FPDF_StructElement_Attr_GetBlobValue); - CHK(FPDF_StructElement_Attr_GetBooleanValue); - CHK(FPDF_StructElement_Attr_GetChildAtIndex); - CHK(FPDF_StructElement_Attr_GetCount); - CHK(FPDF_StructElement_Attr_GetName); - CHK(FPDF_StructElement_Attr_GetNumberValue); - CHK(FPDF_StructElement_Attr_GetStringValue); - CHK(FPDF_StructElement_Attr_GetType); - CHK(FPDF_StructElement_Attr_GetValue); - CHK(FPDF_StructElement_CountChildren); - CHK(FPDF_StructElement_GetActualText); - CHK(FPDF_StructElement_GetAltText); - CHK(FPDF_StructElement_GetAttributeAtIndex); - CHK(FPDF_StructElement_GetAttributeCount); - CHK(FPDF_StructElement_GetChildAtIndex); - CHK(FPDF_StructElement_GetChildMarkedContentID); - CHK(FPDF_StructElement_GetID); - CHK(FPDF_StructElement_GetLang); - CHK(FPDF_StructElement_GetMarkedContentID); - CHK(FPDF_StructElement_GetMarkedContentIdAtIndex); - CHK(FPDF_StructElement_GetMarkedContentIdCount); - CHK(FPDF_StructElement_GetObjType); - CHK(FPDF_StructElement_GetParent); - CHK(FPDF_StructElement_GetStringAttribute); - CHK(FPDF_StructElement_GetTitle); - CHK(FPDF_StructElement_GetType); - CHK(FPDF_StructTree_Close); - CHK(FPDF_StructTree_CountChildren); - CHK(FPDF_StructTree_GetChildAtIndex); - CHK(FPDF_StructTree_GetForPage); + // fpdf_structtree.h + CHK(FPDF_StructElement_Attr_CountChildren); + CHK(FPDF_StructElement_Attr_GetBlobValue); + CHK(FPDF_StructElement_Attr_GetBooleanValue); + CHK(FPDF_StructElement_Attr_GetChildAtIndex); + CHK(FPDF_StructElement_Attr_GetCount); + CHK(FPDF_StructElement_Attr_GetName); + CHK(FPDF_StructElement_Attr_GetNumberValue); + CHK(FPDF_StructElement_Attr_GetStringValue); + CHK(FPDF_StructElement_Attr_GetType); + CHK(FPDF_StructElement_Attr_GetValue); + CHK(FPDF_StructElement_CountChildren); + CHK(FPDF_StructElement_GetActualText); + CHK(FPDF_StructElement_GetAltText); + CHK(FPDF_StructElement_GetAttributeAtIndex); + CHK(FPDF_StructElement_GetAttributeCount); + CHK(FPDF_StructElement_GetChildAtIndex); + CHK(FPDF_StructElement_GetChildMarkedContentID); + CHK(FPDF_StructElement_GetID); + CHK(FPDF_StructElement_GetLang); + CHK(FPDF_StructElement_GetMarkedContentID); + CHK(FPDF_StructElement_GetMarkedContentIdAtIndex); + CHK(FPDF_StructElement_GetMarkedContentIdCount); + CHK(FPDF_StructElement_GetObjType); + CHK(FPDF_StructElement_GetParent); + CHK(FPDF_StructElement_GetStringAttribute); + CHK(FPDF_StructElement_GetTitle); + CHK(FPDF_StructElement_GetType); + CHK(FPDF_StructTree_Close); + CHK(FPDF_StructTree_CountChildren); + CHK(FPDF_StructTree_GetChildAtIndex); + CHK(FPDF_StructTree_GetForPage); - // fpdf_sysfontinfo.h - CHK(FPDF_AddInstalledFont); - CHK(FPDF_FreeDefaultSystemFontInfo); - CHK(FPDF_GetDefaultSystemFontInfo); - CHK(FPDF_GetDefaultTTFMap); - CHK(FPDF_GetDefaultTTFMapCount); - CHK(FPDF_GetDefaultTTFMapEntry); - CHK(FPDF_SetSystemFontInfo); + // fpdf_sysfontinfo.h + CHK(FPDF_AddInstalledFont); + CHK(FPDF_FreeDefaultSystemFontInfo); + CHK(FPDF_GetDefaultSystemFontInfo); + CHK(FPDF_GetDefaultTTFMap); + CHK(FPDF_GetDefaultTTFMapCount); + CHK(FPDF_GetDefaultTTFMapEntry); + CHK(FPDF_SetSystemFontInfo); - // fpdf_text.h - CHK(FPDFLink_CloseWebLinks); - CHK(FPDFLink_CountRects); - CHK(FPDFLink_CountWebLinks); - CHK(FPDFLink_GetRect); - CHK(FPDFLink_GetTextRange); - CHK(FPDFLink_GetURL); - CHK(FPDFLink_LoadWebLinks); - CHK(FPDFText_ClosePage); - CHK(FPDFText_CountChars); - CHK(FPDFText_CountRects); - CHK(FPDFText_FindClose); - CHK(FPDFText_FindNext); - CHK(FPDFText_FindPrev); - CHK(FPDFText_FindStart); - CHK(FPDFText_GetBoundedText); - CHK(FPDFText_GetCharAngle); - CHK(FPDFText_GetCharBox); - CHK(FPDFText_GetCharIndexAtPos); - CHK(FPDFText_GetCharOrigin); - CHK(FPDFText_GetFillColor); - CHK(FPDFText_GetFontInfo); - CHK(FPDFText_GetFontSize); - CHK(FPDFText_GetFontWeight); - CHK(FPDFText_GetLooseCharBox); - CHK(FPDFText_GetMatrix); - CHK(FPDFText_GetRect); - CHK(FPDFText_GetSchCount); - CHK(FPDFText_GetSchResultIndex); - CHK(FPDFText_GetStrokeColor); - CHK(FPDFText_GetText); - CHK(FPDFText_GetTextObject); - CHK(FPDFText_GetUnicode); - CHK(FPDFText_HasUnicodeMapError); - CHK(FPDFText_IsGenerated); - CHK(FPDFText_IsHyphen); - CHK(FPDFText_LoadPage); + // fpdf_text.h + CHK(FPDFLink_CloseWebLinks); + CHK(FPDFLink_CountRects); + CHK(FPDFLink_CountWebLinks); + CHK(FPDFLink_GetRect); + CHK(FPDFLink_GetTextRange); + CHK(FPDFLink_GetURL); + CHK(FPDFLink_LoadWebLinks); + CHK(FPDFText_ClosePage); + CHK(FPDFText_CountChars); + CHK(FPDFText_CountRects); + CHK(FPDFText_FindClose); + CHK(FPDFText_FindNext); + CHK(FPDFText_FindPrev); + CHK(FPDFText_FindStart); + CHK(FPDFText_GetBoundedText); + CHK(FPDFText_GetCharAngle); + CHK(FPDFText_GetCharBox); + CHK(FPDFText_GetCharIndexAtPos); + CHK(FPDFText_GetCharOrigin); + CHK(FPDFText_GetFillColor); + CHK(FPDFText_GetFontInfo); + CHK(FPDFText_GetFontSize); + CHK(FPDFText_GetFontWeight); + CHK(FPDFText_GetLooseCharBox); + CHK(FPDFText_GetMatrix); + CHK(FPDFText_GetRect); + CHK(FPDFText_GetSchCount); + CHK(FPDFText_GetSchResultIndex); + CHK(FPDFText_GetStrokeColor); + CHK(FPDFText_GetText); + CHK(FPDFText_GetTextObject); + CHK(FPDFText_GetUnicode); + CHK(FPDFText_HasUnicodeMapError); + CHK(FPDFText_IsGenerated); + CHK(FPDFText_IsHyphen); + CHK(FPDFText_LoadPage); - // fpdf_thumbnail.h - CHK(FPDFPage_GetDecodedThumbnailData); - CHK(FPDFPage_GetRawThumbnailData); - CHK(FPDFPage_GetThumbnailAsBitmap); + // fpdf_thumbnail.h + CHK(FPDFPage_GetDecodedThumbnailData); + CHK(FPDFPage_GetRawThumbnailData); + CHK(FPDFPage_GetThumbnailAsBitmap); - // fpdf_transformpage.h - CHK(FPDFClipPath_CountPathSegments); - CHK(FPDFClipPath_CountPaths); - CHK(FPDFClipPath_GetPathSegment); - CHK(FPDFPageObj_GetClipPath); - CHK(FPDFPageObj_TransformClipPath); - CHK(FPDFPage_GetArtBox); - CHK(FPDFPage_GetBleedBox); - CHK(FPDFPage_GetCropBox); - CHK(FPDFPage_GetMediaBox); - CHK(FPDFPage_GetTrimBox); - CHK(FPDFPage_InsertClipPath); - CHK(FPDFPage_SetArtBox); - CHK(FPDFPage_SetBleedBox); - CHK(FPDFPage_SetCropBox); - CHK(FPDFPage_SetMediaBox); - CHK(FPDFPage_SetTrimBox); - CHK(FPDFPage_TransFormWithClip); - CHK(FPDF_CreateClipPath); - CHK(FPDF_DestroyClipPath); + // fpdf_transformpage.h + CHK(FPDFClipPath_CountPathSegments); + CHK(FPDFClipPath_CountPaths); + CHK(FPDFClipPath_GetPathSegment); + CHK(FPDFPageObj_GetClipPath); + CHK(FPDFPageObj_TransformClipPath); + CHK(FPDFPage_GetArtBox); + CHK(FPDFPage_GetBleedBox); + CHK(FPDFPage_GetCropBox); + CHK(FPDFPage_GetMediaBox); + CHK(FPDFPage_GetTrimBox); + CHK(FPDFPage_InsertClipPath); + CHK(FPDFPage_SetArtBox); + CHK(FPDFPage_SetBleedBox); + CHK(FPDFPage_SetCropBox); + CHK(FPDFPage_SetMediaBox); + CHK(FPDFPage_SetTrimBox); + CHK(FPDFPage_TransFormWithClip); + CHK(FPDF_CreateClipPath); + CHK(FPDF_DestroyClipPath); - // fpdfview.h - CHK(FPDFBitmap_Create); - CHK(FPDFBitmap_CreateEx); - CHK(FPDFBitmap_Destroy); - CHK(FPDFBitmap_FillRect); - CHK(FPDFBitmap_GetBuffer); - CHK(FPDFBitmap_GetFormat); - CHK(FPDFBitmap_GetHeight); - CHK(FPDFBitmap_GetStride); - CHK(FPDFBitmap_GetWidth); + // fpdfview.h + CHK(FPDFBitmap_Create); + CHK(FPDFBitmap_CreateEx); + CHK(FPDFBitmap_Destroy); + CHK(FPDFBitmap_FillRect); + CHK(FPDFBitmap_GetBuffer); + CHK(FPDFBitmap_GetFormat); + CHK(FPDFBitmap_GetHeight); + CHK(FPDFBitmap_GetStride); + CHK(FPDFBitmap_GetWidth); #ifdef PDF_ENABLE_XFA - CHK(FPDF_BStr_Clear); - CHK(FPDF_BStr_Init); - CHK(FPDF_BStr_Set); + CHK(FPDF_BStr_Clear); + CHK(FPDF_BStr_Init); + CHK(FPDF_BStr_Set); #endif - CHK(FPDF_CloseDocument); - CHK(FPDF_ClosePage); - CHK(FPDF_CountNamedDests); - CHK(FPDF_DestroyLibrary); - CHK(FPDF_DeviceToPage); - CHK(FPDF_DocumentHasValidCrossReferenceTable); + CHK(FPDF_CloseDocument); + CHK(FPDF_ClosePage); + CHK(FPDF_CountNamedDests); + CHK(FPDF_DestroyLibrary); + CHK(FPDF_DeviceToPage); + CHK(FPDF_DocumentHasValidCrossReferenceTable); #ifdef PDF_ENABLE_V8 - CHK(FPDF_GetArrayBufferAllocatorSharedInstance); + CHK(FPDF_GetArrayBufferAllocatorSharedInstance); #endif - CHK(EPDF_CheckPasswordPermissions); - CHK(EPDF_SetRuntimeOwnerPermissions); - CHK(FPDF_GetDocPermissions); - CHK(FPDF_GetDocUserPermissions); - CHK(FPDF_GetFileVersion); - CHK(FPDF_GetLastError); - CHK(FPDF_GetNamedDest); - CHK(FPDF_GetNamedDestByName); - CHK(FPDF_GetPageBoundingBox); - CHK(FPDF_GetPageCount); - CHK(FPDF_GetPageHeight); - CHK(FPDF_GetPageHeightF); - CHK(FPDF_GetPageSizeByIndex); - CHK(FPDF_GetPageSizeByIndexF); - CHK(FPDF_GetPageWidth); - CHK(FPDF_GetPageWidthF); + CHK(EPDF_CheckPasswordPermissions); + CHK(EPDF_SetRuntimeOwnerPermissions); + CHK(FPDF_GetDocPermissions); + CHK(FPDF_GetDocUserPermissions); + CHK(FPDF_GetFileVersion); + CHK(FPDF_GetLastError); + CHK(FPDF_GetNamedDest); + CHK(FPDF_GetNamedDestByName); + CHK(FPDF_GetPageBoundingBox); + CHK(FPDF_GetPageCount); + CHK(FPDF_GetPageHeight); + CHK(FPDF_GetPageHeightF); + CHK(FPDF_GetPageSizeByIndex); + CHK(FPDF_GetPageSizeByIndexF); + CHK(FPDF_GetPageWidth); + CHK(FPDF_GetPageWidthF); #ifdef PDF_ENABLE_V8 - CHK(FPDF_GetRecommendedV8Flags); + CHK(FPDF_GetRecommendedV8Flags); #endif - CHK(FPDF_GetSecurityHandlerRevision); - CHK(FPDF_GetTrailerEnds); - CHK(FPDF_GetXFAPacketContent); - CHK(FPDF_GetXFAPacketCount); - CHK(FPDF_GetXFAPacketName); - CHK(FPDF_InitLibrary); - CHK(FPDF_InitLibraryWithConfig); - CHK(EPDF_InitThread); - CHK(EPDF_ShutdownThread); - CHK(EPDF_GetPageBoxByIndex); - CHK(EPDF_GetPageUserUnitByIndex); - CHK(EPDF_LoadBaseDocument); - CHK(EPDF_LoadMemBaseDocument); - CHK(EPDF_LoadMemBaseDocument64); - CHK(EPDFDoc_DeletePageByObjectNumber); - CHK(EPDFDoc_GetPageObjectNumberByIndex); - CHK(EPDFDoc_SetPageRotationByObjectNumber); - CHK(EPDF_FreeBuffer); - CHK(EPDF_SaveDocumentToOwnedBuffer); - CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); - CHK(EPDFLayer_GetBaseDocument); - CHK(EPDFLayer_GetPromotedObjectCount); - CHK(EPDFLayer_IsObjectPromoted); - CHK(EPDFLayer_OpenLayer); - CHK(EPDFLayer_OpenLayerArtifact); - CHK(EPDFLayer_SaveDelta); - CHK(EPDFLayer_SaveDeltaToOwnedBuffer); - CHK(EPDFLayer_SaveLayerArtifact); - CHK(EPDFLayer_SaveLayerArtifactToOwnedBuffer); - CHK(EPDF_ReleaseBaseDocument); - CHK(FPDF_LoadCustomDocument); - CHK(FPDF_LoadDocument); - CHK(FPDF_LoadMemDocument); - CHK(FPDF_LoadMemDocument64); - CHK(FPDF_LoadPage); - CHK(FPDF_PageToDevice); + CHK(FPDF_GetSecurityHandlerRevision); + CHK(FPDF_GetTrailerEnds); + CHK(FPDF_GetXFAPacketContent); + CHK(FPDF_GetXFAPacketCount); + CHK(FPDF_GetXFAPacketName); + CHK(FPDF_InitLibrary); + CHK(FPDF_InitLibraryWithConfig); + CHK(EPDF_InitThread); + CHK(EPDF_ShutdownThread); + CHK(EPDF_GetPageBoxByIndex); + CHK(EPDF_GetPageUserUnitByIndex); + CHK(EPDF_LoadBaseDocument); + CHK(EPDF_LoadMemBaseDocument); + CHK(EPDF_LoadMemBaseDocument64); + CHK(EPDFDoc_DeletePageByObjectNumber); + CHK(EPDFDoc_GetPageObjectNumberByIndex); + CHK(EPDFDoc_SetPageRotationByObjectNumber); + CHK(EPDF_FreeBuffer); + CHK(EPDF_SaveDocumentToOwnedBuffer); + CHK(EPDF_SaveDocumentToOwnedBufferWithVersion); + CHK(EPDFLayer_GetBaseDocument); + CHK(EPDFLayer_GetPromotedObjectCount); + CHK(EPDFLayer_IsObjectPromoted); + CHK(EPDFLayer_OpenLayer); + CHK(EPDFLayer_OpenLayerArtifact); + CHK(EPDFLayer_SaveDelta); + CHK(EPDFLayer_SaveDeltaToOwnedBuffer); + CHK(EPDFLayer_SaveLayerArtifact); + CHK(EPDFLayer_SaveLayerArtifactToOwnedBuffer); + CHK(EPDF_ReleaseBaseDocument); + CHK(FPDF_LoadCustomDocument); + CHK(FPDF_LoadDocument); + CHK(FPDF_LoadMemDocument); + CHK(FPDF_LoadMemDocument64); + CHK(FPDF_LoadPage); + CHK(FPDF_PageToDevice); #ifdef _WIN32 - CHK(FPDF_RenderPage); + CHK(FPDF_RenderPage); #endif - CHK(FPDF_RenderPageBitmap); - CHK(FPDF_RenderPageBitmapWithMatrix); + CHK(FPDF_RenderPageBitmap); + CHK(FPDF_RenderPageBitmapWithMatrix); #if defined(PDF_USE_SKIA) - CHK(FPDF_RenderPageSkia); + CHK(FPDF_RenderPageSkia); #endif #if defined(_WIN32) - CHK(FPDF_SetPrintMode); + CHK(FPDF_SetPrintMode); #endif - CHK(FPDF_SetSandBoxPolicy); - CHK(FPDF_VIEWERREF_GetDuplex); - CHK(FPDF_VIEWERREF_GetName); - CHK(FPDF_VIEWERREF_GetNumCopies); - CHK(FPDF_VIEWERREF_GetPrintPageRange); - CHK(FPDF_VIEWERREF_GetPrintPageRangeCount); - CHK(FPDF_VIEWERREF_GetPrintPageRangeElement); - CHK(FPDF_VIEWERREF_GetPrintScaling); + CHK(FPDF_SetSandBoxPolicy); + CHK(FPDF_VIEWERREF_GetDuplex); + CHK(FPDF_VIEWERREF_GetName); + CHK(FPDF_VIEWERREF_GetNumCopies); + CHK(FPDF_VIEWERREF_GetPrintPageRange); + CHK(FPDF_VIEWERREF_GetPrintPageRangeCount); + CHK(FPDF_VIEWERREF_GetPrintPageRangeElement); + CHK(FPDF_VIEWERREF_GetPrintScaling); - return 1; + return 1; } #undef CHK diff --git a/public/fpdf_doc.h b/public/fpdf_doc.h index 2feee5303e..78632566a3 100644 --- a/public/fpdf_doc.h +++ b/public/fpdf_doc.h @@ -48,10 +48,10 @@ typedef enum { // The trapped status of the document. See section 14.10.2.4 "Trapped" of the // ISO 32000-1:2008 spec. typedef enum FPDF_TRAPPED_STATUS { - PDFTRAPPED_NOTSET = 0, // No /Trapped key - PDFTRAPPED_TRUE = 1, // Explicitly /Trapped /True - PDFTRAPPED_FALSE = 2, // Explicitly /Trapped /False - PDFTRAPPED_UNKNOWN = 3 // Explicitly /Trapped /Unknown or invalid + PDFTRAPPED_NOTSET = 0, // No /Trapped key + PDFTRAPPED_TRUE = 1, // Explicitly /Trapped /True + PDFTRAPPED_FALSE = 2, // Explicitly /Trapped /False + PDFTRAPPED_UNKNOWN = 3 // Explicitly /Trapped /Unknown or invalid } FPDF_TRAPPED_STATUS; // Get the first child of |bookmark|, or the first top-level bookmark item. @@ -227,6 +227,21 @@ FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_EXPORT int FPDF_CALLCONV FPDFDest_GetDestPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest); +// Experimental EmbedPDF Extension API. +// Get the PDF indirect object number of the page targeted by |dest|. +// +// document - handle to the document containing the destination page. +// dest - handle to the destination. +// +// Returns the page dictionary object number (> 0) on success, or 0 if the +// document/destination is invalid, the target is not a visible page in the +// document, the page dictionary is a direct object, or the page is an XFA +// page. If the destination contains a numeric page index, it is resolved +// against |document|, matching FPDFDest_GetDestPageIndex() compatibility +// behavior. +FPDF_EXPORT unsigned int FPDF_CALLCONV +EPDFDest_GetPageObjectNumber(FPDF_DOCUMENT document, FPDF_DEST dest); + // Experimental API. // Get the view (fit type) specified by |dest|. // @@ -448,10 +463,9 @@ FPDF_GetPageLabel(FPDF_DOCUMENT document, // value - the value to set. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDF_SetMetaText(FPDF_DOCUMENT document, - FPDF_BYTESTRING tag, - FPDF_WIDESTRING value); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_SetMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag, + FPDF_WIDESTRING value); // Experimental EmbedPDF Extension API. // Check if meta-data |tag| exists in |document|. @@ -460,8 +474,8 @@ EPDF_SetMetaText(FPDF_DOCUMENT document, // tag - the tag to check. // // Returns true if |tag| exists in |document|. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDF_HasMetaText(FPDF_DOCUMENT document, FPDF_BYTESTRING tag); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDF_HasMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag); // Experimental EmbedPDF Extension API. // Get the trapped status of |document|. @@ -490,8 +504,8 @@ EPDF_SetMetaTrapped(FPDF_DOCUMENT document, FPDF_TRAPPED_STATUS status); // count all keys. // // Returns the number of keys (possibly 0). On error, returns 0. -FPDF_EXPORT int FPDF_CALLCONV -EPDF_GetMetaKeyCount(FPDF_DOCUMENT document, FPDF_BOOL custom_only); +FPDF_EXPORT int FPDF_CALLCONV EPDF_GetMetaKeyCount(FPDF_DOCUMENT document, + FPDF_BOOL custom_only); // Experimental EmbedPDF Extension API. // Get the name of the Info dictionary key at |index|. @@ -500,8 +514,8 @@ EPDF_GetMetaKeyCount(FPDF_DOCUMENT document, FPDF_BOOL custom_only); // index - 0-based key index in the order returned by PDFium. // custom_only - if true, indexes only over non-reserved (custom) keys; if // false, indexes over all keys. -// buffer - a buffer for the key name in UTF-8 with trailing NUL. May be NULL. -// buflen - the length of the buffer, in bytes. May be 0. +// buffer - a buffer for the key name in UTF-8 with trailing NUL. May be +// NULL. buflen - the length of the buffer, in bytes. May be 0. // // Returns the number of bytes in the key name including the trailing NUL, or 0 // on error (bad |document|, |index| out of range, etc.). If |buflen| is less @@ -521,38 +535,44 @@ EPDF_GetMetaKeyName(FPDF_DOCUMENT document, // Create a new destination array of the form [page /XYZ left top zoom]. // // page - handle to the destination page. -// has_left - whether |left| is specified; if false, |left| is encoded as null. -// left - the left coordinate, in page coordinates. -// has_top - whether |top| is specified; if false, |top| is encoded as null. -// top - the top coordinate, in page coordinates. -// has_zoom - whether |zoom| is specified; if false or |zoom|==0, encoded as null. -// zoom - the zoom factor (must be non-zero to be considered specified). +// has_left - whether |left| is specified; if false, |left| is encoded as +// null. left - the left coordinate, in page coordinates. has_top - +// whether |top| is specified; if false, |top| is encoded as null. top - +// the top coordinate, in page coordinates. has_zoom - whether |zoom| is +// specified; if false or |zoom|==0, encoded as null. zoom - the zoom +// factor (must be non-zero to be considered specified). // -// Returns a handle to the created (INDIRECT) destination array, or NULL on error. +// Returns a handle to the created (INDIRECT) destination array, or NULL on +// error. // // Notes: // * The returned object is an INDIRECT array suitable for use by // EPDFBookmark_SetDest() or EPDFAction_CreateGoTo(). // * Unspecified fields are encoded as PDF nulls. -FPDF_EXPORT FPDF_DEST FPDF_CALLCONV -EPDFDest_CreateXYZ(FPDF_PAGE page, - FPDF_BOOL has_left, FS_FLOAT left, - FPDF_BOOL has_top, FS_FLOAT top, - FPDF_BOOL has_zoom, FS_FLOAT zoom); +FPDF_EXPORT FPDF_DEST FPDF_CALLCONV EPDFDest_CreateXYZ(FPDF_PAGE page, + FPDF_BOOL has_left, + FS_FLOAT left, + FPDF_BOOL has_top, + FS_FLOAT top, + FPDF_BOOL has_zoom, + FS_FLOAT zoom); // Experimental EmbedPDF Extension API. // Create a new destination array of the form [page / params…]. // // page - handle to the destination page. // view - one of the PDFDEST_VIEW_* constants EXCEPT PDFDEST_VIEW_XYZ. -// Valid: PDFDEST_VIEW_FIT, FITH, FITV, FITR, FITB, FITBH, FITBV. +// Valid: PDFDEST_VIEW_FIT, FITH, FITV, FITR, FITB, FITBH, +// FITBV. // params - pointer to an array of float parameters (may be NULL). // num_params - number of entries in |params|. // -// Returns a handle to the created (INDIRECT) destination array, or NULL on error. +// Returns a handle to the created (INDIRECT) destination array, or NULL on +// error. // // Notes: -// * The required parameter count depends on |view| and matches FPDFDest_GetView(). +// * The required parameter count depends on |view| and matches +// FPDFDest_GetView(). // Excess parameters are ignored; missing parameters default to 0. // * Use EPDFDest_CreateXYZ() for /XYZ destinations. FPDF_EXPORT FPDF_DEST FPDF_CALLCONV @@ -562,7 +582,8 @@ EPDFDest_CreateView(FPDF_PAGE page, unsigned long num_params); // Experimental EmbedPDF Extension API. -// Create a new *remote* destination array of the form [pageIndex / params…]. +// Create a new *remote* destination array of the form [pageIndex / +// params…]. // // document - handle to the owning document. // page_index - 0-based page index in the *remote* file (must be >= 0). @@ -570,7 +591,8 @@ EPDFDest_CreateView(FPDF_PAGE page, // params - pointer to float parameters (may be NULL). // num_params - number of parameters. // -// Returns a handle to the created (INDIRECT) destination array, or NULL on error. +// Returns a handle to the created (INDIRECT) destination array, or NULL on +// error. // // Notes: // * This is an explicit *remote* dest (first element is a number). @@ -589,16 +611,20 @@ EPDFDest_CreateRemoteView(FPDF_DOCUMENT document, // page_index - 0-based page index in the *remote* file (must be >= 0). // has_left,left,has_top,top,has_zoom,zoom - as in EPDFDest_CreateXYZ(). // -// Returns a handle to the created (INDIRECT) destination array, or NULL on error. +// Returns a handle to the created (INDIRECT) destination array, or NULL on +// error. // // Notes: // * The left/top/zoom fields are encoded as number-or-null as in local /XYZ. FPDF_EXPORT FPDF_DEST FPDF_CALLCONV EPDFDest_CreateRemoteXYZ(FPDF_DOCUMENT document, int page_index, - FPDF_BOOL has_left, FS_FLOAT left, - FPDF_BOOL has_top, FS_FLOAT top, - FPDF_BOOL has_zoom, FS_FLOAT zoom); + FPDF_BOOL has_left, + FS_FLOAT left, + FPDF_BOOL has_top, + FS_FLOAT top, + FPDF_BOOL has_zoom, + FS_FLOAT zoom); // ----------------------------------------------------------------------------- // Named destinations @@ -609,7 +635,8 @@ EPDFDest_CreateRemoteXYZ(FPDF_DOCUMENT document, // // document - handle to the document owning both the name tree and |dest|. // name - UTF-8 zero-terminated name key. -// dest - handle to an INDIRECT destination array that belongs to |document|. +// dest - handle to an INDIRECT destination array that belongs to +// |document|. // // Returns true on success. // @@ -628,8 +655,8 @@ EPDFNamedDest_SetDest(FPDF_DOCUMENT document, // name - UTF-8 zero-terminated name key. // // Returns true on success (or if the name did not exist). -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFNamedDest_Remove(FPDF_DOCUMENT document, FPDF_BYTESTRING name); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFNamedDest_Remove(FPDF_DOCUMENT document, + FPDF_BYTESTRING name); // ----------------------------------------------------------------------------- // Actions @@ -759,8 +786,8 @@ EPDFBookmark_Create(FPDF_DOCUMENT document, FPDF_WIDESTRING title); // * Removes the node from its parent's list and deletes the entire subtree, // fixing /First, /Last, /Prev, /Next as needed. // * Fails if |bookmark| does not belong to |document|. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFBookmark_Delete(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFBookmark_Delete(FPDF_DOCUMENT document, + FPDF_BOOKMARK bookmark); // Experimental EmbedPDF Outline API. // Create and append a new child bookmark under |parent|. @@ -823,11 +850,11 @@ EPDFBookmark_SetTitle(FPDF_BOOKMARK bookmark, FPDF_WIDESTRING title); // Notes: // * On success, /Dest is set to an indirect reference to |dest| and any /A is // removed. -// * |dest| must belong to |document| and be indirect; otherwise the call fails. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFBookmark_SetDest(FPDF_DOCUMENT document, - FPDF_BOOKMARK bookmark, - FPDF_DEST dest); +// * |dest| must belong to |document| and be indirect; otherwise the call +// fails. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFBookmark_SetDest(FPDF_DOCUMENT document, + FPDF_BOOKMARK bookmark, + FPDF_DEST dest); // Experimental EmbedPDF Extension API. // Set the target of |bookmark| to |action| (clears any existing destination). @@ -841,7 +868,8 @@ EPDFBookmark_SetDest(FPDF_DOCUMENT document, // Notes: // * On success, /A is set to an indirect reference to |action| and any /Dest // is removed. -// * |action| must belong to |document| and be indirect; otherwise the call fails. +// * |action| must belong to |document| and be indirect; otherwise the call +// fails. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFBookmark_SetAction(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark, @@ -862,8 +890,7 @@ EPDFBookmark_ClearTarget(FPDF_BOOKMARK bookmark); // document - handle to the document. // // Returns true on success. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFBookmark_Clear(FPDF_DOCUMENT document); +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFBookmark_Clear(FPDF_DOCUMENT document); #ifdef __cplusplus } // extern "C" From 1bc2a6c6aa0761faa5af7a5c6f7b1a9ddece7a8a Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Fri, 17 Jul 2026 13:28:20 +0300 Subject: [PATCH 51/56] Add action node payload getters and link removers Retain action dictionaries on ActionNodeRecord so node payloads can be read on demand. Implement EPDFAction_GetNodeDest, EPDFAction_GetNodeURI, EPDFAction_GetNodeFilePath and EPDFAction_GetNodeName (with header docs) to expose goto/URI/file/name payloads; these getters consult the retained dictionary and may require the originating FPDF_DOCUMENT for name resolution. Update AppendAction to keep the dictionary alive. Make EPDFAnnot_SetAction remove any direct /Dest (ISO 32000-1 compliance) and add EPDFAnnot_RemoveAction and EPDFAnnot_RemoveDest with a shared RemoveLinkDictEntry helper. Add unit tests covering URI, destination, file path and named-action payloads and a missing include required by the tests. --- fpdfsdk/epdf_action.cpp | 82 +++++++++++++++++ fpdfsdk/epdf_action_embeddertest.cpp | 133 +++++++++++++++++++++++++++ fpdfsdk/fpdf_annot.cpp | 35 ++++++- public/epdf_action.h | 52 ++++++++++- public/fpdf_annot.h | 34 ++++++- 5 files changed, 330 insertions(+), 6 deletions(-) diff --git a/fpdfsdk/epdf_action.cpp b/fpdfsdk/epdf_action.cpp index 78f415d8da..45bf73133a 100644 --- a/fpdfsdk/epdf_action.cpp +++ b/fpdfsdk/epdf_action.cpp @@ -38,6 +38,11 @@ struct ActionNodeRecord { int type = EPDF_ACTION_TYPE_UNKNOWN; std::optional javascript; std::vector next; + // Keeps the node's action dictionary alive for the model's lifetime so + // the EPDFAction_GetNode{Dest,URI,FilePath,Name} payload getters can + // rehydrate a CPDF_Action on demand. Nothing is extracted eagerly: + // building a model costs the same as before this field existed. + RetainPtr dict; }; int NormalizeActionType(CPDF_Action::Type type) { @@ -112,6 +117,7 @@ std::optional AppendAction( ActionNodeRecord node; node.subtype = dict->GetNameFor("S"); node.type = NormalizeActionType(action.GetType()); + node.dict = pdfium::WrapRetain(dict); if (node.type == EPDF_ACTION_TYPE_JAVASCRIPT || node.type == EPDF_ACTION_TYPE_RENDITION) { node.javascript = action.MaybeGetJavaScript(); @@ -296,6 +302,82 @@ EPDFAction_GetNodeJavaScript(EPDF_ACTION_MODEL model, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } +FPDF_EXPORT FPDF_DEST FPDF_CALLCONV +EPDFAction_GetNodeDest(FPDF_DOCUMENT document, + EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!doc || !record || !record->dict) { + return nullptr; + } + // Same type gate as FPDFAction_GetDest. + if (record->type != EPDF_ACTION_TYPE_GOTO && + record->type != EPDF_ACTION_TYPE_GOTO_REMOTE && + record->type != EPDF_ACTION_TYPE_GOTO_EMBEDDED) { + return nullptr; + } + CPDF_Action cAction(record->dict); + return FPDFDestFromCPDFArray(cAction.GetDest(doc).GetArray()); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeURI(FPDF_DOCUMENT document, + EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen) { + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!doc || !record || !record->dict || + record->type != EPDF_ACTION_TYPE_URI) { + return 0; + } + CPDF_Action cAction(record->dict); + ByteString uri = cAction.GetURI(doc); + // SAFETY: required from caller. + return NulTerminateMaybeCopyAndReturnLength( + uri, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeFilePath(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!record || !record->dict) { + return 0; + } + // Same type gate as FPDFAction_GetFilePath. + if (record->type != EPDF_ACTION_TYPE_GOTO_REMOTE && + record->type != EPDF_ACTION_TYPE_GOTO_EMBEDDED && + record->type != EPDF_ACTION_TYPE_LAUNCH) { + return 0; + } + CPDF_Action cAction(record->dict); + ByteString path = cAction.GetFilePath().ToUTF8(); + // SAFETY: required from caller. + return NulTerminateMaybeCopyAndReturnLength( + path, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeName(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen) { + const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); + if (!record || !record->dict || + record->type != EPDF_ACTION_TYPE_NAMED) { + return 0; + } + ByteString name = record->dict->GetNameFor("N"); + // SAFETY: required from caller. + return NulTerminateMaybeCopyAndReturnLength( + name, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); +} + FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNextCount(EPDF_ACTION_MODEL model, EPDF_ACTION_NODE_ID node) { const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); diff --git a/fpdfsdk/epdf_action_embeddertest.cpp b/fpdfsdk/epdf_action_embeddertest.cpp index b55a0b7f45..201255ef1b 100644 --- a/fpdfsdk/epdf_action_embeddertest.cpp +++ b/fpdfsdk/epdf_action_embeddertest.cpp @@ -22,6 +22,7 @@ #include "fpdfsdk/cpdfsdk_helpers.h" #include "public/epdf_form.h" #include "public/fpdf_annot.h" +#include "public/fpdf_doc.h" #include "public/fpdf_edit.h" #include "public/fpdf_javascript.h" #include "testing/embedder_test.h" @@ -388,3 +389,135 @@ TEST_F(EPDFActionEmbedderTest, EXPECT_EQ(L"focus();", GetActionJavaScript(focus.get(), 0)); EXPECT_EQ(L"enter();", GetActionJavaScript(enter.get(), 0)); } + +TEST_F(EPDFActionEmbedderTest, NodeUriPayloadFromRealDocument) { + ASSERT_TRUE(OpenDocument("annots_action_handling.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + bool checked_link = false; + const int annotation_count = FPDFPage_GetAnnotCount(page); + for (int i = 0; i < annotation_count; ++i) { + ScopedFPDFAnnotation annotation(FPDFPage_GetAnnot(page, i)); + ASSERT_TRUE(annotation); + if (FPDFAnnot_GetSubtype(annotation.get()) != FPDF_ANNOT_LINK) { + continue; + } + ScopedEPDFActionModel model( + EPDFAnnot_GetActionModel(annotation.get(), EPDF_ANNOT_ACTION_ACTIVATE)); + ASSERT_TRUE(model); + const EPDF_ACTION_NODE_ID root = EPDFAction_GetRootNode(model.get()); + ASSERT_NE(EPDF_ACTION_NODE_INVALID, root); + ASSERT_EQ(EPDF_ACTION_TYPE_URI, EPDFAction_GetNodeType(model.get(), root)); + + const unsigned long len = + EPDFAction_GetNodeURI(document(), model.get(), root, nullptr, 0); + ASSERT_GT(len, 1ul); + std::vector buffer(len); + ASSERT_EQ(len, EPDFAction_GetNodeURI(document(), model.get(), root, + buffer.data(), len)); + const ByteString uri(buffer.data()); + EXPECT_EQ(0u, uri.Find("https://").value_or(1u)); + + // Wrong-type payload getters answer empty rather than lying. + EXPECT_FALSE(EPDFAction_GetNodeDest(document(), model.get(), root)); + EXPECT_EQ(0ul, EPDFAction_GetNodeFilePath(model.get(), root, nullptr, 0)); + EXPECT_EQ(0ul, EPDFAction_GetNodeName(model.get(), root, nullptr, 0)); + checked_link = true; + } + EXPECT_TRUE(checked_link); + UnloadPage(page); +} + +TEST_F(EPDFActionEmbedderTest, NodeDestPayloadFromCreatedGoTo) { + ScopedFPDFDocument document(FPDF_CreateNewDocument()); + ASSERT_TRUE(document); + ScopedFPDFPage page(FPDFPage_New(document.get(), 0, 612, 792)); + ASSERT_TRUE(page); + + FPDF_DEST dest = EPDFDest_CreateXYZ(page.get(), /*has_left=*/true, 30.0f, + /*has_top=*/true, 500.0f, + /*has_zoom=*/false, 0.0f); + ASSERT_TRUE(dest); + FPDF_ACTION action = EPDFAction_CreateGoTo(document.get(), dest); + ASSERT_TRUE(action); + + ScopedEPDFActionModel model(EPDFAction_LoadModel(action)); + ASSERT_TRUE(model); + const EPDF_ACTION_NODE_ID root = EPDFAction_GetRootNode(model.get()); + ASSERT_NE(EPDF_ACTION_NODE_INVALID, root); + ASSERT_EQ(EPDF_ACTION_TYPE_GOTO, EPDFAction_GetNodeType(model.get(), root)); + + FPDF_DEST node_dest = + EPDFAction_GetNodeDest(document.get(), model.get(), root); + ASSERT_TRUE(node_dest); + FPDF_BOOL has_x = false; + FPDF_BOOL has_y = false; + FPDF_BOOL has_zoom = false; + FS_FLOAT x = 0; + FS_FLOAT y = 0; + FS_FLOAT zoom = 0; + ASSERT_TRUE(FPDFDest_GetLocationInPage(node_dest, &has_x, &has_y, &has_zoom, + &x, &y, &zoom)); + EXPECT_TRUE(has_x); + EXPECT_TRUE(has_y); + EXPECT_FALSE(has_zoom); + EXPECT_FLOAT_EQ(30.0f, x); + EXPECT_FLOAT_EQ(500.0f, y); + + // A goto node has no URI/file/name payload. + EXPECT_EQ(0ul, EPDFAction_GetNodeURI(document.get(), model.get(), root, + nullptr, 0)); + EXPECT_EQ(0ul, EPDFAction_GetNodeName(model.get(), root, nullptr, 0)); +} + +TEST_F(EPDFActionEmbedderTest, NodeFilePathAndNamePayloadsFromSyntheticDicts) { + ScopedFPDFDocument document(FPDF_CreateNewDocument()); + ASSERT_TRUE(document); + CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document.get()); + ASSERT_TRUE(doc); + + RetainPtr launch = doc->NewIndirect(); + launch->SetNewFor("S", "Launch"); + launch->SetNewFor("F", "app.exe"); + ScopedEPDFActionModel launch_model( + EPDFAction_LoadModel(FPDFActionFromCPDFDictionary(launch.Get()))); + ASSERT_TRUE(launch_model); + const EPDF_ACTION_NODE_ID launch_root = + EPDFAction_GetRootNode(launch_model.get()); + ASSERT_EQ(EPDF_ACTION_TYPE_LAUNCH, + EPDFAction_GetNodeType(launch_model.get(), launch_root)); + unsigned long len = + EPDFAction_GetNodeFilePath(launch_model.get(), launch_root, nullptr, 0); + ASSERT_GT(len, 1ul); + std::vector path(len); + ASSERT_EQ(len, EPDFAction_GetNodeFilePath(launch_model.get(), launch_root, + path.data(), len)); + EXPECT_STREQ("app.exe", path.data()); + + RetainPtr named = doc->NewIndirect(); + named->SetNewFor("S", "Named"); + named->SetNewFor("N", "NextPage"); + ScopedEPDFActionModel named_model( + EPDFAction_LoadModel(FPDFActionFromCPDFDictionary(named.Get()))); + ASSERT_TRUE(named_model); + const EPDF_ACTION_NODE_ID named_root = + EPDFAction_GetRootNode(named_model.get()); + ASSERT_EQ(EPDF_ACTION_TYPE_NAMED, + EPDFAction_GetNodeType(named_model.get(), named_root)); + len = EPDFAction_GetNodeName(named_model.get(), named_root, nullptr, 0); + ASSERT_GT(len, 1ul); + std::vector name(len); + ASSERT_EQ(len, EPDFAction_GetNodeName(named_model.get(), named_root, + name.data(), len)); + EXPECT_STREQ("NextPage", name.data()); + + // Cross-type checks: a launch node answers nothing for uri/name and a + // named node nothing for file paths. + EXPECT_EQ(0ul, EPDFAction_GetNodeURI(document.get(), launch_model.get(), + launch_root, nullptr, 0)); + EXPECT_EQ(0ul, EPDFAction_GetNodeName(launch_model.get(), launch_root, + nullptr, 0)); + EXPECT_EQ(0ul, EPDFAction_GetNodeFilePath(named_model.get(), named_root, + nullptr, 0)); +} diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index c81b1b90c1..6976f78547 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -2703,11 +2703,44 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAction(FPDF_ANNOTATION annot, CPDF_Document* pDoc = pAnnotContext->GetPage()->GetDocument(); - // Set /A as an indirect reference to the action. + // Set /A as an indirect reference to the action. A link dictionary must + // not carry both /A and /Dest (ISO 32000-1 Table 173), so drop any + // pre-existing direct destination while we are at it. annot_dict->SetNewFor("A", pDoc, act_dict->GetObjNum()); + annot_dict->RemoveFor("Dest"); return true; } +namespace { + +// Shared body of the two link-entry removers: single-purpose, idempotent. +FPDF_BOOL RemoveLinkDictEntry(FPDF_ANNOTATION annot, const char* key) { + if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_LINK) { + return false; + } + + RetainPtr annot_dict = + GetMutableAnnotDictFromFPDFAnnotation(annot); + if (!annot_dict) { + return false; + } + + annot_dict->RemoveFor(key); + return true; +} + +} // namespace + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_RemoveAction(FPDF_ANNOTATION annot) { + return RemoveLinkDictEntry(annot, "A"); +} + +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV +EPDFAnnot_RemoveDest(FPDF_ANNOTATION annot) { + return RemoveLinkDictEntry(annot, "Dest"); +} + FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFAnnot_GetFileAttachment(FPDF_ANNOTATION annot) { if (FPDFAnnot_GetSubtype(annot) != FPDF_ANNOT_FILEATTACHMENT) { diff --git a/public/epdf_action.h b/public/epdf_action.h index 269242ff9d..cc59ef6f51 100644 --- a/public/epdf_action.h +++ b/public/epdf_action.h @@ -16,10 +16,15 @@ extern "C" { // Experimental EmbedPDF Extension API. // -// Detached, immutable PDF action model. A model contains one root action and -// its normalized /Next descendants. It owns all copied strings and holds no -// pointers into the PDF document, so it remains valid after the document or -// originating owner is closed or mutated. +// Detached PDF action model. A model contains one root action and its +// normalized /Next descendants. The structural fields (type, subtype, +// script, chain) are copied at build time and stay valid after the +// document is closed or mutated. Each node additionally RETAINS its action +// dictionary so the EPDFAction_GetNode{Dest,URI,FilePath,Name} payload +// getters can read payloads on demand: those getters read the CURRENT +// dictionary state, and the ones taking a FPDF_DOCUMENT require the +// originating document to still be open (they resolve named destinations +// and URI normalization through it). // // The API extracts action data only. It never executes JavaScript. typedef struct epdf_action_model_t__* EPDF_ACTION_MODEL; @@ -98,6 +103,45 @@ EPDFAction_GetNodeJavaScript(EPDF_ACTION_MODEL model, FPDF_WCHAR* buffer, unsigned long buflen); +// Get the destination of a goto / goto-remote / goto-embedded |node| as an +// explicit FPDF_DEST. Named destinations resolve through |document|'s +// catalog — same normalization as FPDFLink_GetDest. Returns NULL when the +// node carries no destination, has a different type, or |document| is +// invalid. |document| must be the document the model was built from. +FPDF_EXPORT FPDF_DEST FPDF_CALLCONV +EPDFAction_GetNodeDest(FPDF_DOCUMENT document, + EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node); + +// Copy the /URI of a uri-type |node| as a NUL-terminated byte string. +// Returns the required byte length including the NUL, or 0 when the node +// is not a uri action. |buffer| may be NULL to query the length. +// |document| must be the document the model was built from. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeURI(FPDF_DOCUMENT document, + EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen); + +// Copy the file spec of a goto-remote / goto-embedded / launch |node| as +// UTF-8, including the trailing NUL. Returns the required byte length, or +// 0 for other node types. |buffer| may be NULL to query the length. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeFilePath(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen); + +// Copy the /N name of a named-type |node| (NextPage, PrevPage, ...) as +// UTF-8, including the trailing NUL. Returns the required byte length, or +// 0 for other node types. |buffer| may be NULL to query the length. +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAction_GetNodeName(EPDF_ACTION_MODEL model, + EPDF_ACTION_NODE_ID node, + void* buffer, + unsigned long buflen); + FPDF_EXPORT int FPDF_CALLCONV EPDFAction_GetNextCount(EPDF_ACTION_MODEL model, EPDF_ACTION_NODE_ID node); diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 605f1a74c2..78117e4fec 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -1710,10 +1710,42 @@ EPDFAnnot_SetLinkedAnnot(FPDF_ANNOTATION annot, // Notes: // * Only valid for FPDF_ANNOT_LINK annotations. // * The action must be an indirect object. -// * Any existing /A entry will be replaced. +// * Any existing /A entry will be replaced, and any direct /Dest entry is +// removed — ISO 32000-1 Table 173 forbids a link dictionary carrying +// both, so setting an action leaves the dictionary spec-clean. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_SetAction(FPDF_ANNOTATION annot, FPDF_ACTION action); +// Experimental EmbedPDF Extension API. +// Remove the /A action entry of a Link annotation. +// +// annot - handle to a link annotation. +// +// Returns true when the entry is absent afterwards, including when there +// was none to begin with (idempotent). False for non-link annotations. +// +// Notes: +// * Only valid for FPDF_ANNOT_LINK annotations. +// * Removes ONLY /A. A link may also carry a direct /Dest — remove it +// with EPDFAnnot_RemoveDest() when the intent is a target-less link, +// otherwise the /Dest becomes the link's effective target again. +// * The removed action dictionary itself is not garbage-collected; like +// every unreferenced indirect object it is dropped by a full save. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_RemoveAction(FPDF_ANNOTATION annot); + +// Experimental EmbedPDF Extension API. +// Remove the direct /Dest destination entry of a Link annotation. +// +// annot - handle to a link annotation. +// +// Returns true when the entry is absent afterwards, including when there +// was none to begin with (idempotent). False for non-link annotations. +// +// Notes: +// * Only valid for FPDF_ANNOT_LINK annotations. +// * Removes ONLY /Dest; an /A action entry is left untouched. +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_RemoveDest(FPDF_ANNOTATION annot); + // Experimental EmbedPDF Extension API. // Get the annotation count. // From f93dde9ad964c3cf6e27305a33f8c9ae1baabff0 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Sun, 19 Jul 2026 15:50:20 +0300 Subject: [PATCH 52/56] Redaction: build overlays & avoid unsafe pruning Avoid resource-pruning bugs when content streams are appended by tracking whether this pass regenerated every existing content stream (CPDF_PageContentGenerator: CountExistingContentStreams + UpdateResourcesDict(regenerated_all_streams)). Rewrite redaction appearance generation to synthesize/flatten a final overlay form when no /RO is present: add helpers to get redact regions/BBox, build Form XObjects (MakeRedactFormStream / BuildRedactOverlayForm), layout overlay text with /DA and /Repeat, and emit overlay ops (AppendRedactOverlayOps). Update GenerateRedactAP to use the new overlay form and commonize resources. Simplify the public redaction APIs and internal reporting: remove the complex removed-annotation report buffers and replace them with an optional out_removed_annot_count that returns the number of non-REDACT annotations removed as a side-effect. Ensure pages are parsed before applying redactions and resolve overlays (pre-baked /RO wins, otherwise synthesize). Update public header signatures accordingly and add a test PDF (testing/resources/redact_inherited_colorspace.pdf) for inherited colorspace cases. Misc: minor include cleanups and refactors. --- .../edit/cpdf_pagecontentgenerator.cpp | 49 ++- core/fpdfapi/edit/cpdf_pagecontentgenerator.h | 9 +- core/fpdfdoc/cpdf_generateap.cpp | 383 ++++++++++++------ core/fpdfdoc/cpdf_generateap.h | 12 + fpdfsdk/epdf_redact.cpp | 212 +++------- public/epdf_redact.h | 94 ++--- .../resources/redact_inherited_colorspace.pdf | Bin 0 -> 912 bytes 7 files changed, 427 insertions(+), 332 deletions(-) create mode 100644 testing/resources/redact_inherited_colorspace.pdf diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp index 2a4428e25a..fcba2105a4 100644 --- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp +++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp @@ -379,8 +379,42 @@ void CPDF_PageContentGenerator::GenerateContent() { return; } + // EmbedPDF: did this pass rewrite EVERY existing content stream? Computed + // before the move — an append-only pass (a lone kNoContentStream bucket) + // leaves the existing streams' ops out of `page_objects_`' bookkeeping, so + // resource pruning must not run (see UpdateResourcesDict). + const int32_t existing_streams = CountExistingContentStreams(); + bool regenerated_all_streams = true; + for (int32_t i = 0; i < existing_streams; ++i) { + if (!pdfium::Contains(new_stream_data, i)) { + regenerated_all_streams = false; + break; + } + } + UpdateContentStreams(std::move(new_stream_data)); - UpdateResourcesDict(); + UpdateResourcesDict(regenerated_all_streams); +} + +int32_t CPDF_PageContentGenerator::CountExistingContentStreams() { + if (obj_holder_->GetMutableFormStream()) { + return 1; + } + RetainPtr contents = + obj_holder_->GetDict()->GetObjectFor(pdfium::page_object::kContents); + if (!contents) { + return 0; + } + // Resolve indirection: /Contents is commonly an indirect reference to a + // stream or to an array of streams. + RetainPtr direct = contents->GetDirect(); + if (!direct) { + return 0; + } + if (const CPDF_Array* arr = direct->AsArray()) { + return pdfium::checked_cast(arr->size()); + } + return direct->IsStream() ? 1 : 0; } std::map @@ -540,7 +574,7 @@ void CPDF_PageContentGenerator::UpdateContentStreams( } } -void CPDF_PageContentGenerator::UpdateResourcesDict() { +void CPDF_PageContentGenerator::UpdateResourcesDict(bool regenerated_all_streams) { RetainPtr resources = obj_holder_->GetMutableResources(); if (!resources) { return; @@ -560,6 +594,17 @@ void CPDF_PageContentGenerator::UpdateResourcesDict() { // shared. Checked for that and clone those as well. CloneResourcesDictEntries(document_, resources); + // EmbedPDF: pruning is only sound when THIS pass rewrote every content + // stream. `page_objects_` / `seen_resources` describe the SERIALIZED + // output; an untouched stream's raw ops can reference resources no page + // object records — e.g. a page-level `/C1 cs` prolog whose colorspace is + // inherited by a bare-`scn` Form XObject. Pruning after an append-only + // pass orphans those references (the classic symptom: the whole page + // collapses to grayscale after applying a redaction that touched nothing). + if (!regenerated_all_streams) { + return; + } + ResourcesMap seen_resources; for (auto& page_object : page_objects_) { if (!page_object->IsActive()) { diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h index 05e2821554..fe2ecbd4b2 100644 --- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h +++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h @@ -81,7 +81,14 @@ class CPDF_PageContentGenerator { // Updates the resource dictionary for `obj_holder_` to account for all the // changes. - void UpdateResourcesDict(); + // EmbedPDF: `regenerated_all_streams` reports whether THIS pass rewrote + // every existing content stream. Resource pruning is only sound then — + // see the guard in the implementation. + void UpdateResourcesDict(bool regenerated_all_streams); + + // EmbedPDF: the holder's current content-stream count (form = its single + // stream; page = resolved /Contents array size, or 1 for a lone stream). + int32_t CountExistingContentStreams(); UnownedPtr const obj_holder_; UnownedPtr const document_; diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index 9ee43b22cb..4eb369f188 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -2808,151 +2808,278 @@ bool GenerateLinkAP(CPDF_Document* doc, return true; } -void GenerateRedactAPDicts(CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - fxcrt::ostringstream* normal_stream, - fxcrt::ostringstream* rollover_stream, - RetainPtr resource_dict, - bool is_text_markup) { - CFX_FloatRect rect = is_text_markup - ? CPDF_Annot::BoundingRectFromQuadPoints(annot_dict) - : annot_dict->GetRectFor(pdfium::annotation::kRect); - - // Create Normal appearance stream (border only) - auto normal_stream_dict = pdfium::MakeRetain(); - normal_stream_dict->SetNewFor("FormType", 1); - normal_stream_dict->SetNewFor("Type", "XObject"); - normal_stream_dict->SetNewFor("Subtype", "Form"); - normal_stream_dict->SetMatrixFor("Matrix", CFX_Matrix()); - normal_stream_dict->SetRectFor("BBox", rect); - normal_stream_dict->SetFor("Resources", resource_dict->Clone()); - - auto normal_pdf_stream = - doc->NewIndirect(std::move(normal_stream_dict)); - normal_pdf_stream->SetDataFromStringstream(normal_stream); - - // Create Rollover/Down/RO appearance stream (filled preview) - // This single stream is shared by R, D, and RO - auto rollover_stream_dict = pdfium::MakeRetain(); - rollover_stream_dict->SetNewFor("FormType", 1); - rollover_stream_dict->SetNewFor("Type", "XObject"); - rollover_stream_dict->SetNewFor("Subtype", "Form"); - rollover_stream_dict->SetMatrixFor("Matrix", CFX_Matrix()); - rollover_stream_dict->SetRectFor("BBox", rect); - rollover_stream_dict->SetFor("Resources", resource_dict->Clone()); - - auto rollover_pdf_stream = - doc->NewIndirect(std::move(rollover_stream_dict)); - rollover_pdf_stream->SetDataFromStringstream(rollover_stream); - - // Get the object number for the shared rollover stream - uint32_t rollover_obj_num = rollover_pdf_stream->GetObjNum(); - - // Set all entries in AP dictionary - RetainPtr ap_dict = - annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); - ap_dict->SetNewFor("N", doc, normal_pdf_stream->GetObjNum()); - ap_dict->SetNewFor("R", doc, rollover_obj_num); // Rollover - ap_dict->SetNewFor("D", doc, rollover_obj_num); // Down +// EmbedPDF: the regions a /Redact annotation targets — /QuadPoints quads when +// present (text redactions), else the annotation /Rect (area redactions). +std::vector GetRedactOverlayRegions( + const CPDF_Dictionary* annot_dict) { + std::vector regions; + RetainPtr quad_points_array = + annot_dict->GetArrayFor("QuadPoints"); + if (quad_points_array && quad_points_array->size() >= 8) { + const size_t quad_count = + CPDF_Annot::QuadPointCount(quad_points_array.Get()); + for (size_t i = 0; i < quad_count; ++i) { + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(annot_dict, i); + rect.Normalize(); + if (!rect.IsEmpty()) { + regions.push_back(rect); + } + } + if (!regions.empty()) { + return regions; + } + } + CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + rect.Normalize(); + if (!rect.IsEmpty()) { + regions.push_back(rect); + } + return regions; +} - // Set RO (Redact Overlay) - this is what gets applied when redaction is - // finalized RO is stored directly on the annotation dict, not inside AP - annot_dict->SetNewFor("RO", doc, rollover_obj_num); +// EmbedPDF: the marking-stage /AP BBox and the overlay BBox share this rule: +// quad bounding box for text redactions, /Rect for area redactions. +CFX_FloatRect GetRedactOverlayBBox(const CPDF_Dictionary* annot_dict) { + RetainPtr quad_points_array = + annot_dict->GetArrayFor("QuadPoints"); + if (quad_points_array && quad_points_array->size() >= 8) { + return CPDF_Annot::BoundingRectFromQuadPoints(annot_dict); + } + CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); + rect.Normalize(); + return rect; } -bool GenerateRedactAP(CPDF_Document* doc, - CPDF_Dictionary* annot_dict, - const ByteString& blend_name) { - fxcrt::ostringstream normal_stream; - fxcrt::ostringstream rollover_stream; - normal_stream << "/" << kGSDictName << " gs "; - rollover_stream << "/" << kGSDictName << " gs "; +RetainPtr MakeRedactFormStream( + CPDF_Document* doc, + const CFX_FloatRect& bbox, + RetainPtr resources, + fxcrt::ostringstream* ops) { + auto stream_dict = pdfium::MakeRetain(); + stream_dict->SetNewFor("FormType", 1); + stream_dict->SetNewFor("Type", "XObject"); + stream_dict->SetNewFor("Subtype", "Form"); + stream_dict->SetMatrixFor("Matrix", CFX_Matrix()); + stream_dict->SetRectFor("BBox", bbox); + if (resources) { + stream_dict->SetFor("Resources", std::move(resources)); + } + auto stream = doc->NewIndirect(std::move(stream_dict)); + stream->SetDataFromStringstream(ops); + return stream; +} + +constexpr float kRedactRepeatFallbackFontSize = 12.0f; +constexpr int kRedactMaxRepeatDoublings = 10; // 2^10 = 1024 label instances + +// EmbedPDF: lay out the /OverlayText label for one redacted region with the +// same CPVT + annotation-font-map stack as FreeText appearances, so /DA fonts +// (standard, DR-resolved, or registered runtime fonts) shape and subset +// identically. Top-aligned in reading order; ISO 32000-2 prescribes neither +// the vertical placement nor the /Repeat tiling, so /Repeat is expressed as +// "repeat the label, space-joined, wrapped to the region, clipped". +void AppendRedactLabelForRegion(CPDF_AnnotFontMap& map, + const CPDF_Dictionary* annot_dict, + const WideString& overlay_text, + float da_font_size, + const CFX_Color& label_color, + const CFX_FloatRect& region, + fxcrt::ostringstream& stream) { + CPVT_VariableText::Provider provider(&map); + CPVT_VariableText vt(&provider); + vt.SetPlateRect(region); + vt.SetAlignment(annot_dict->GetIntegerFor("Q")); + vt.SetMultiLine(true); + vt.SetAutoReturn(true); + + const bool repeat = annot_dict->GetBooleanFor("Repeat", false); + // CPVT auto-sizing fits ALL text into the plate, so it cannot combine with + // /Repeat (more repetitions would only shrink the font); pin a concrete + // size for the repeat case when /DA asks for auto (size 0). + float font_size = da_font_size; + if (repeat && FXSYS_IsFloatZero(font_size)) { + font_size = kRedactRepeatFallbackFontSize; + } + SetVtFontSize(font_size, vt); + vt.Initialize(); + vt.SetText(overlay_text); + vt.RearrangeAll(); - // Get colors from annotation dictionary - // C - stroke/border color (default: red for redact) - // IC - interior color (fill when redaction applied, default: black) - RetainPtr stroke_color = - annot_dict->GetArrayFor(pdfium::annotation::kC); + if (repeat) { + // Double the space-joined text until the wrapped layout covers the region + // vertically; the last row's surplus is removed by the region clip below. + // Bounded to keep tiny-font/huge-region combinations sane. + WideString tiled = overlay_text; + for (int i = 0; i < kRedactMaxRepeatDoublings && + vt.GetContentRect().Height() < region.Height(); + ++i) { + WideString doubled = tiled; + doubled += L' '; + doubled += tiled; + tiled = std::move(doubled); + vt.SetText(tiled); + vt.RearrangeAll(); + } + } + + const ByteString body = + GenerateEditAP(vt.GetProvider()->GetFontMap(), vt.GetIterator(), + CFX_PointF(0.0f, 0.0f), /*continuous=*/true, + /*sub_word=*/0); + if (body.IsEmpty()) { + return; + } + stream << "q\n"; + WriteRect(stream, region) << " re W n\n"; + stream << "BT\n" + << GenerateColorAP(label_color, PaintOperation::kFill) << body + << "ET\nQ\n"; +} + +// EmbedPDF: emit the final ("post-apply") overlay ops for a /Redact +// annotation: opaque /IC fill of every region, then the /OverlayText label. +// The marking-stage /CA opacity is deliberately not carried over — the +// content underneath is destroyed, so the replacement marking paints opaque, +// matching Acrobat. Returns false when the annotation defines neither a fill +// nor a label. +bool AppendRedactOverlayOps(CPDF_Document* doc, + const CPDF_Dictionary* annot_dict, + fxcrt::ostringstream& stream, + RetainPtr* out_font_resources) { + const WideString overlay_text = annot_dict->GetUnicodeTextFor("OverlayText"); RetainPtr interior_color = annot_dict->GetArrayFor("IC"); const bool has_fill = interior_color && !interior_color->IsEmpty(); + if (!has_fill && overlay_text.IsEmpty()) { + return false; + } - // Normal appearance: stroke color for border - normal_stream << GetColorStringWithDefault( - stroke_color.Get(), - CFX_Color(CFX_Color::Type::kRGB, 1, 0, 0), // default: red - PaintOperation::kStroke); + const std::vector regions = + GetRedactOverlayRegions(annot_dict); + if (regions.empty()) { + return false; + } - // Rollover appearance: interior color for fill - rollover_stream << GetColorStringWithDefault( - interior_color.Get(), - CFX_Color(CFX_Color::Type::kTransparent), // default: no fill - PaintOperation::kFill); + if (has_fill) { + stream << GetColorStringWithDefault( + interior_color.Get(), CFX_Color(CFX_Color::Type::kTransparent), + PaintOperation::kFill); + for (const CFX_FloatRect& region : regions) { + WriteRect(stream, region) << " re f\n"; + } + } - float border_width = GetBorderWidth(annot_dict); - if (border_width > 0) { - normal_stream << border_width << " w "; - normal_stream << GetDashPatternString(annot_dict); + if (overlay_text.IsEmpty()) { + return true; } - // Check for QuadPoints (text-based redaction) - RetainPtr quad_points_array = - annot_dict->GetArrayFor("QuadPoints"); + // /DA resolution mirrors the FreeText persistent path, but is forgiving: + // redact annotations marked by other producers can lack /DA (ISO requires + // it alongside /OverlayText, but such files exist) or an AcroForm /DR — + // fall back to Helvetica rather than dropping the label. + RetainPtr root_dict = doc->GetMutableRoot(); + RetainPtr form_dict; + if (root_dict) { + form_dict = root_dict->GetMutableDictFor("AcroForm"); + if (!form_dict) { + form_dict = CPDF_InteractiveForm::InitAcroFormDict(doc); + } + } - if (quad_points_array && quad_points_array->size() >= 8) { - // QuadPoints present - iterate through each quad - const size_t quad_point_count = - CPDF_Annot::QuadPointCount(quad_points_array.Get()); - for (size_t i = 0; i < quad_point_count; ++i) { - CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(annot_dict, i); - rect.Normalize(); + std::optional da_info = + form_dict ? GetDefaultAppearanceInfo(annot_dict, form_dict.Get()) + : std::nullopt; + const ByteString font_name = + da_info.has_value() ? da_info.value().font_name : ByteString("Helv"); + const float da_font_size = + da_info.has_value() ? da_info.value().font_size : 0.0f; - // Normal: stroke the rectangle (border only) - if (border_width > 0) { - CFX_FloatRect stroke_rect = rect; - stroke_rect.Deflate(border_width / 2, border_width / 2); - normal_stream << stroke_rect.left << " " << stroke_rect.bottom << " " - << stroke_rect.Width() << " " << stroke_rect.Height() - << " re S\n"; - } + CFX_Color label_color = + da_info.has_value() ? da_info.value().text_color : CFX_Color(); + if (label_color.nColorType == CFX_Color::Type::kTransparent) { + // Legacy EmbedPDF v2 files carry the label colour in /OC; ISO keeps it + // in the /DA string. Default to black when neither is present. + RetainPtr oc = annot_dict->GetArrayFor("OC"); + label_color = (oc && oc->size() >= 3) + ? fpdfdoc::CFXColorFromArray(*oc) + : CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0); + } - // Rollover: fill the rectangle (only if interior color is set) - if (has_fill) { - rollover_stream << rect.left << " " << rect.top << " m " << rect.right - << " " << rect.top << " l " << rect.right << " " - << rect.bottom << " l " << rect.left << " " - << rect.bottom << " l h f\n"; - } - } + RetainPtr font_dict; + if (form_dict) { + RetainPtr dr_font_dict = + form_dict->GetOrCreateDictFor("DR")->GetOrCreateDictFor("Font"); + font_dict = GetFontFromDrFontDictOrGenerateFallback(doc, dr_font_dict.Get(), + font_name); } else { - // No QuadPoints - use the annotation Rect - CFX_FloatRect rect = annot_dict->GetRectFor(pdfium::annotation::kRect); - rect.Normalize(); + font_dict = GenerateFallbackFontDict(doc); + } + RetainPtr default_font = + CPDF_DocPageData::FromDocument(doc)->GetFont(font_dict); + if (!default_font) { + return has_fill; + } - // Normal: stroke the rectangle (border only) - if (border_width > 0) { - CFX_FloatRect stroke_rect = rect; + CPDF_AnnotFontMap map(doc, std::move(default_font), font_name, + /*allow_registered_fallbacks=*/true); + for (const CFX_FloatRect& region : regions) { + AppendRedactLabelForRegion(map, annot_dict, overlay_text, da_font_size, + label_color, region, stream); + } + *out_font_resources = map.CreateFontResourceDict(); + return true; +} + +bool GenerateRedactAP(CPDF_Document* doc, + CPDF_Dictionary* annot_dict, + const ByteString& blend_name) { + // Normal (marking-stage) appearance: border-only outline in /C, default + // red. The filled preview is NOT drawn here — R/D and /RO all share the + // final overlay from BuildRedactOverlayForm, so hovering a marked + // redaction previews exactly what apply will paint. + fxcrt::ostringstream normal_stream; + normal_stream << "/" << kGSDictName << " gs "; + normal_stream << GetColorStringWithDefault( + annot_dict->GetArrayFor(pdfium::annotation::kC).Get(), + CFX_Color(CFX_Color::Type::kRGB, 1, 0, 0), // default: red + PaintOperation::kStroke); + + const float border_width = GetBorderWidth(annot_dict); + if (border_width > 0) { + normal_stream << border_width << " w "; + normal_stream << GetDashPatternString(annot_dict); + for (const CFX_FloatRect& region : GetRedactOverlayRegions(annot_dict)) { + CFX_FloatRect stroke_rect = region; stroke_rect.Deflate(border_width / 2, border_width / 2); normal_stream << stroke_rect.left << " " << stroke_rect.bottom << " " << stroke_rect.Width() << " " << stroke_rect.Height() << " re S\n"; } - - // Rollover: fill the rectangle (only if interior color is set) - if (has_fill) { - rollover_stream << rect.left << " " << rect.bottom << " " << rect.Width() - << " " << rect.Height() << " re f\n"; - } } - // Build resources auto gs_dict = GenerateExtGStateDict(*annot_dict, blend_name); auto resources_dict = GenerateResourcesDict(doc, std::move(gs_dict), nullptr); + const CFX_FloatRect bbox = GetRedactOverlayBBox(annot_dict); + RetainPtr normal_pdf_stream = MakeRedactFormStream( + doc, bbox, std::move(resources_dict), &normal_stream); + + // Rollover/Down and /RO share the final overlay (fill + label). + RetainPtr overlay = + CPDF_GenerateAP::BuildRedactOverlayForm(doc, annot_dict); + if (!overlay) { + // Neither /IC nor /OverlayText: keep the AP structure (and the baked /RO + // that pre-v3 clients flatten on apply) with an empty overlay. + fxcrt::ostringstream empty_stream; + overlay = MakeRedactFormStream(doc, bbox, nullptr, &empty_stream); + } - // Generate both Normal and Rollover appearance streams - bool has_quad_points = quad_points_array && quad_points_array->size() >= 8; - GenerateRedactAPDicts(doc, annot_dict, &normal_stream, &rollover_stream, - resources_dict, has_quad_points); + RetainPtr ap_dict = + annot_dict->GetOrCreateDictFor(pdfium::annotation::kAP); + ap_dict->SetNewFor("N", doc, normal_pdf_stream->GetObjNum()); + ap_dict->SetNewFor("R", doc, overlay->GetObjNum()); + ap_dict->SetNewFor("D", doc, overlay->GetObjNum()); + // /RO lives on the annotation dict, not inside /AP. + annot_dict->SetNewFor("RO", doc, overlay->GetObjNum()); return true; } @@ -3799,6 +3926,26 @@ bool CPDF_GenerateAP::CanGenerateEphemeralAnnotAP(CPDF_Annot::Subtype subtype) { return SupportsEphemeralAnnotAP(subtype); } +// static +RetainPtr CPDF_GenerateAP::BuildRedactOverlayForm( + CPDF_Document* doc, + const CPDF_Dictionary* annot_dict) { + if (!doc || !annot_dict) { + return nullptr; + } + fxcrt::ostringstream ops; + RetainPtr font_resources; + if (!AppendRedactOverlayOps(doc, annot_dict, ops, &font_resources)) { + return nullptr; + } + RetainPtr resources; + if (font_resources) { + resources = GenerateResourcesDict(doc, nullptr, std::move(font_resources)); + } + return MakeRedactFormStream(doc, GetRedactOverlayBBox(annot_dict), + std::move(resources), &ops); +} + // static bool CPDF_GenerateAP::GenerateDefaultAppearanceWithColor( CPDF_Document* doc, diff --git a/core/fpdfdoc/cpdf_generateap.h b/core/fpdfdoc/cpdf_generateap.h index 0372e6f5c6..250fc6b372 100644 --- a/core/fpdfdoc/cpdf_generateap.h +++ b/core/fpdfdoc/cpdf_generateap.h @@ -15,6 +15,7 @@ class CPDF_Dictionary; class CPDF_Document; +class CPDF_Stream; struct CFX_Color; enum class BlendMode; @@ -72,6 +73,17 @@ class CPDF_GenerateAP { static bool CanGenerateEphemeralAnnotAP(CPDF_Annot::Subtype subtype); + // EmbedPDF: build the final redaction overlay for a /Redact annotation as + // an indirect Form XObject: opaque /IC fill plus the /OverlayText label per + // /DA, /Q and /Repeat. The single source of truth for what an applied + // redaction looks like — marking-stage AP generation bakes it as the R/D + // and /RO streams, and the apply path synthesizes it when a file carries no + // pre-baked /RO. Returns null when the annotation defines neither fill nor + // label. + static RetainPtr BuildRedactOverlayForm( + CPDF_Document* doc, + const CPDF_Dictionary* annot_dict); + static bool GenerateDefaultAppearanceWithColor(CPDF_Document* doc, CPDF_Dictionary* annot_dict, const CFX_Color& color); diff --git a/fpdfsdk/epdf_redact.cpp b/fpdfsdk/epdf_redact.cpp index d025043021..92b2fde9b4 100644 --- a/fpdfsdk/epdf_redact.cpp +++ b/fpdfsdk/epdf_redact.cpp @@ -6,7 +6,6 @@ #include #include -#include #include #include @@ -21,6 +20,7 @@ #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/fpdf_parser_utility.h" #include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_generateap.h" #include "core/fpdfdoc/cpdf_interactiveform.h" #include "core/fxcrt/bytestring.h" #include "core/fxcrt/containers/contains.h" @@ -71,20 +71,9 @@ std::vector GetRedactRectsFromAnnotDict( struct RemovedAnnotCandidate { size_t index = 0; uint32_t object_number = 0; - ByteString nm_utf8; RetainPtr dict; }; -struct RedactionReportBuffers { - EPDF_RemovedAnnotInfo* removed = nullptr; - uint32_t removed_capacity = 0; - char* nm_utf8_pool = nullptr; - uint32_t nm_utf8_pool_capacity = 0; - uint32_t* written_count = nullptr; - uint32_t* total_count = nullptr; - uint32_t* nm_utf8_bytes_used = nullptr; -}; - uint32_t GetAnnotObjectNumber(const CPDF_Object* entry, const CPDF_Dictionary* dict) { if (entry && entry->IsReference()) { @@ -93,13 +82,6 @@ uint32_t GetAnnotObjectNumber(const CPDF_Object* entry, return dict ? dict->GetObjNum() : 0; } -ByteString GetAnnotNMUtf8(const CPDF_Dictionary* dict) { - if (!dict || !dict->KeyExist("NM")) { - return ByteString(); - } - return dict->GetUnicodeTextFor("NM").ToUTF8(); -} - bool RectsIntersectWithPositiveArea(CFX_FloatRect a, CFX_FloatRect b) { a.Normalize(); b.Normalize(); @@ -152,7 +134,6 @@ bool AddRemovalCandidate(CPDF_Page* page, RemovedAnnotCandidate candidate; candidate.index = index; candidate.object_number = GetAnnotObjectNumber(entry.Get(), dict.Get()); - candidate.nm_utf8 = GetAnnotNMUtf8(dict.Get()); candidate.dict = std::move(dict); candidates->push_back(std::move(candidate)); return true; @@ -301,55 +282,20 @@ void DetachWidgetsFromAcroForm( } } -void WriteRemovalReport(const std::vector& candidates, - const RedactionReportBuffers* report) { - if (!report) { - return; - } - - const uint32_t total = - pdfium::checked_cast(candidates.size()); - uint32_t written = 0; - uint32_t nm_bytes_used = 0; - const uint32_t capacity = report->removed ? report->removed_capacity : 0; - const uint32_t limit = std::min(total, capacity); - - for (; written < limit; ++written) { - const RemovedAnnotCandidate& candidate = candidates[written]; - EPDF_RemovedAnnotInfo& out = report->removed[written]; - out.object_number = candidate.object_number; - out.index_at_removal = - pdfium::checked_cast(candidate.index); - out.nm_utf8_offset = 0; - out.nm_utf8_len = 0; - - const uint32_t nm_len = - pdfium::checked_cast(candidate.nm_utf8.GetLength()); - if (nm_len == 0) { - continue; - } - if (!report->nm_utf8_pool || - nm_len > report->nm_utf8_pool_capacity - nm_bytes_used) { - out.nm_utf8_len = EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW; - continue; +// The count deliberately excludes REDACT annotations: they are the removal +// instructions (the applied one, and every sibling consumed by a page-wide +// apply), not collateral. Callers use this to warn that a redaction also +// destroyed annotations the user never explicitly marked. +uint32_t CountRemovedNonRedactAnnots( + const std::vector& candidates) { + uint32_t count = 0; + for (const RemovedAnnotCandidate& candidate : candidates) { + if (candidate.dict && candidate.dict->GetNameFor( + pdfium::annotation::kSubtype) != "Redact") { + ++count; } - - out.nm_utf8_offset = nm_bytes_used; - out.nm_utf8_len = nm_len; - memcpy(report->nm_utf8_pool + nm_bytes_used, candidate.nm_utf8.c_str(), - nm_len); - nm_bytes_used += nm_len; - } - - if (report->written_count) { - *report->written_count = written; - } - if (report->total_count) { - *report->total_count = total; - } - if (report->nm_utf8_bytes_used) { - *report->nm_utf8_bytes_used = nm_bytes_used; } + return count; } void RemoveCandidatesFromPage( @@ -381,13 +327,33 @@ void SortCandidatesByOriginalIndex( const RemovedAnnotCandidate& b) { return a.index < b.index; }); } +// Resolve the overlay to flatten for one redact annotation: a pre-baked /RO +// always wins (ISO 32000-2); without one (e.g. the file was marked by another +// processor) the overlay is synthesized from the declarative entries. Returns +// null when there is nothing to paint. +RetainPtr ResolveRedactOverlay( + CPDF_Document* doc, + const CPDF_Dictionary* redact_dict) { + RetainPtr overlay = redact_dict->GetStreamFor("RO"); + if (overlay) { + return overlay; + } + return CPDF_GenerateAP::BuildRedactOverlayForm(doc, redact_dict); +} + bool ApplySingleRedactionCore(CPDF_Page* page, const CPDF_Dictionary* redact_dict, - const RedactionReportBuffers* report) { + uint32_t* out_removed_annot_count) { if (!page || !redact_dict) { return false; } + // The caller may hand us a never-rendered page. Redaction MUST see the full + // object model: an unparsed page would silently remove nothing (a security + // failure, not a cosmetic one) and would let content regeneration reason + // from an empty object list. + page->ParseContent(); + std::vector rects = GetRedactRectsFromAnnotDict(redact_dict); if (rects.empty()) { return false; @@ -426,26 +392,33 @@ bool ApplySingleRedactionCore(CPDF_Page* page, /*recurse_forms=*/true, /*draw_black_boxes=*/false); - RetainPtr ro_stream = redact_dict->GetStreamFor("RO"); - if (ro_stream) { + RetainPtr overlay = + ResolveRedactOverlay(page->GetDocument(), redact_dict); + if (overlay) { CFX_FloatRect annot_rect = redact_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); - EpdfAppendFormXObjectToPage(page, ro_stream, annot_rect); + EpdfAppendFormXObjectToPage(page, overlay, annot_rect); } DetachWidgetsFromAcroForm(page, removals); - WriteRemovalReport(removals, report); + if (out_removed_annot_count) { + *out_removed_annot_count = CountRemovedNonRedactAnnots(removals); + } RemoveCandidatesFromPage(page, removals); return true; } bool ApplyAllRedactionsCore(CPDF_Page* page, - const RedactionReportBuffers* report) { + uint32_t* out_removed_annot_count) { if (!page) { return false; } + // See ApplySingleRedactionCore: redaction must never run on an unparsed + // object model. + page->ParseContent(); + RetainPtr annots = page->GetMutableAnnotsArray(); if (!annots || annots->IsEmpty()) { return false; @@ -453,7 +426,7 @@ bool ApplyAllRedactionsCore(CPDF_Page* page, std::vector all_rects; std::vector, CFX_FloatRect>> - ro_streams; + overlays; std::vector removals; for (size_t i = 0; i < annots->size(); ++i) { @@ -473,12 +446,13 @@ bool ApplyAllRedactionsCore(CPDF_Page* page, all_rects.push_back(rect); } - RetainPtr ro_stream = annot_dict->GetStreamFor("RO"); - if (ro_stream) { + RetainPtr overlay = + ResolveRedactOverlay(page->GetDocument(), annot_dict.Get()); + if (overlay) { CFX_FloatRect annot_rect = annot_dict->GetRectFor(pdfium::annotation::kRect); annot_rect.Normalize(); - ro_streams.push_back({ro_stream, annot_rect}); + overlays.push_back({std::move(overlay), annot_rect}); } } @@ -508,12 +482,14 @@ bool ApplyAllRedactionsCore(CPDF_Page* page, /*recurse_forms=*/true, /*draw_black_boxes=*/false); - for (const auto& [ro_stream, annot_rect] : ro_streams) { - EpdfAppendFormXObjectToPage(page, ro_stream, annot_rect); + for (const auto& [overlay, annot_rect] : overlays) { + EpdfAppendFormXObjectToPage(page, overlay, annot_rect); } DetachWidgetsFromAcroForm(page, removals); - WriteRemovalReport(removals, report); + if (out_removed_annot_count) { + *out_removed_annot_count = CountRemovedNonRedactAnnots(removals); + } RemoveCandidatesFromPage(page, removals); return true; } @@ -521,30 +497,11 @@ bool ApplyAllRedactionsCore(CPDF_Page* page, } // namespace FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot) { - return EPDFAnnot_ApplyRedactionWithReport( - page, annot, nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr); -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedactionWithReport( - FPDF_PAGE page, - FPDF_ANNOTATION annot, - EPDF_RemovedAnnotInfo* out_removed, - uint32_t out_removed_capacity, - char* nm_utf8_pool, - uint32_t nm_utf8_pool_capacity, - uint32_t* out_written_count, - uint32_t* out_total_count, - uint32_t* out_nm_utf8_bytes_used) { - if (out_written_count) { - *out_written_count = 0; - } - if (out_total_count) { - *out_total_count = 0; - } - if (out_nm_utf8_bytes_used) { - *out_nm_utf8_bytes_used = 0; +EPDFAnnot_ApplyRedaction(FPDF_PAGE page, + FPDF_ANNOTATION annot, + uint32_t* out_removed_annot_count) { + if (out_removed_annot_count) { + *out_removed_annot_count = 0; } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); @@ -558,41 +515,13 @@ EPDFAnnot_ApplyRedactionWithReport( return false; } - RedactionReportBuffers report = { - out_removed, - out_removed_capacity, - nm_utf8_pool, - nm_utf8_pool_capacity, - out_written_count, - out_total_count, - out_nm_utf8_bytes_used, - }; - return ApplySingleRedactionCore(pPage, annot_dict, &report); -} - -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFPage_ApplyRedactions(FPDF_PAGE page) { - return EPDFPage_ApplyRedactionsWithReport(page, nullptr, 0, nullptr, 0, - nullptr, nullptr, nullptr); + return ApplySingleRedactionCore(pPage, annot_dict, out_removed_annot_count); } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_ApplyRedactionsWithReport( - FPDF_PAGE page, - EPDF_RemovedAnnotInfo* out_removed, - uint32_t out_removed_capacity, - char* nm_utf8_pool, - uint32_t nm_utf8_pool_capacity, - uint32_t* out_written_count, - uint32_t* out_total_count, - uint32_t* out_nm_utf8_bytes_used) { - if (out_written_count) { - *out_written_count = 0; - } - if (out_total_count) { - *out_total_count = 0; - } - if (out_nm_utf8_bytes_used) { - *out_nm_utf8_bytes_used = 0; +EPDFPage_ApplyRedactions(FPDF_PAGE page, uint32_t* out_removed_annot_count) { + if (out_removed_annot_count) { + *out_removed_annot_count = 0; } CPDF_Page* pPage = CPDFPageFromFPDFPage(page); @@ -600,14 +529,5 @@ EPDFPage_ApplyRedactionsWithReport( return false; } - RedactionReportBuffers report = { - out_removed, - out_removed_capacity, - nm_utf8_pool, - nm_utf8_pool_capacity, - out_written_count, - out_total_count, - out_nm_utf8_bytes_used, - }; - return ApplyAllRedactionsCore(pPage, &report); + return ApplyAllRedactionsCore(pPage, out_removed_annot_count); } diff --git a/public/epdf_redact.h b/public/epdf_redact.h index e0f62b68a3..52b3ce97d6 100644 --- a/public/epdf_redact.h +++ b/public/epdf_redact.h @@ -14,91 +14,55 @@ extern "C" { #endif // __cplusplus -// Experimental EmbedPDF Extension API. -// Report entry produced by redaction APIs that delete annotations. -// -// `object_number` is 0 when the removed annotation was a direct object. -// `nm_utf8_len` is 0 when no /NM was present. It is -// EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW when /NM existed but the caller's -// UTF-8 byte pool had no room for it. -#define EPDF_REMOVED_ANNOT_NM_UTF8_OVERFLOW 0xFFFFFFFFu - -typedef struct { - uint32_t object_number; - uint32_t index_at_removal; - uint32_t nm_utf8_offset; - uint32_t nm_utf8_len; -} EPDF_RemovedAnnotInfo; - // Experimental EmbedPDF Extension API. // Apply a redact annotation, permanently removing content underneath. -// If the annotation has an RO (Redact Overlay) stream, it will be flattened -// as page content (filled rectangles with overlay text). -// If no RO stream exists, content is simply removed with no overlay. -// The annotation is automatically removed from the page after applying. +// +// Overlay precedence follows ISO 32000-2: if the annotation has an /RO +// (Redact Overlay) stream it is flattened as page content; otherwise an +// overlay is synthesized from the declarative entries (/IC fill and +// /OverlayText per /DA, /Q and /Repeat) and flattened the same way. An +// annotation with neither /RO nor declarative entries leaves the region +// transparent. +// +// Annotations whose /Rect intersects the redacted region with positive area +// are removed as well, including their popup cascade; removed widgets are +// detached from the AcroForm tree. Sibling REDACT annotations are preserved. +// The applied annotation itself is removed from the page. // // The caller is responsible for: // 1. Closing the annotation handle with FPDFPage_CloseAnnot after this call // 2. Calling FPDFPage_GenerateContent to persist changes // -// page - handle to the page containing the annotation -// annot - handle to a REDACT annotation +// page - handle to the page containing the annotation +// annot - handle to a REDACT annotation +// out_removed_annot_count - optional, may be NULL. Receives the number of +// annotations removed as a side effect of this +// redaction, NOT counting REDACT annotations +// themselves. Zeroed on entry. // // Returns TRUE on success, FALSE if not a REDACT annotation or on error. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedaction(FPDF_PAGE page, FPDF_ANNOTATION annot); - -// Experimental EmbedPDF Extension API. -// Same as EPDFAnnot_ApplyRedaction(), but also reports every annotation that -// was removed. This includes annotations whose /Rect intersects the redaction -// area, popup annotations cascaded from removed parents, and the originating -// REDACT annotation itself. Sibling REDACT annotations are preserved. -// -// The caller owns both output buffers. `out_written_count` is the number of -// records safely written to `out_removed`; `out_total_count` is the total -// number of annotations removed. If total > written, the report was truncated. -// /NM values are normalized to UTF-8 and written into `nm_utf8_pool`. -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFAnnot_ApplyRedactionWithReport( - FPDF_PAGE page, - FPDF_ANNOTATION annot, - EPDF_RemovedAnnotInfo* out_removed, - uint32_t out_removed_capacity, - char* nm_utf8_pool, - uint32_t nm_utf8_pool_capacity, - uint32_t* out_written_count, - uint32_t* out_total_count, - uint32_t* out_nm_utf8_bytes_used); +EPDFAnnot_ApplyRedaction(FPDF_PAGE page, + FPDF_ANNOTATION annot, + uint32_t* out_removed_annot_count); // Experimental EmbedPDF Extension API. // Apply all redact annotations on a page, permanently removing content -// underneath each one. For each annotation with an RO stream, the overlay -// is flattened as page content. Annotations without RO simply have content -// removed with no overlay. -// All REDACT annotations are automatically removed from the page after applying. +// underneath each one. Overlay and removal semantics match +// EPDFAnnot_ApplyRedaction, as does the count contract: REDACT annotations +// (all of which are consumed by the apply) are never counted. // // The caller is responsible for: // 1. Calling FPDFPage_GenerateContent to persist changes // -// page - handle to a page +// page - handle to a page +// out_removed_annot_count - optional, may be NULL. Receives the number of +// non-REDACT annotations removed. Zeroed on +// entry. // // Returns TRUE if any redactions were applied, FALSE otherwise. FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_ApplyRedactions(FPDF_PAGE page); - -// Experimental EmbedPDF Extension API. -// Same as EPDFPage_ApplyRedactions(), but reports removed annotations using -// the same buffer contract as EPDFAnnot_ApplyRedactionWithReport(). -FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV -EPDFPage_ApplyRedactionsWithReport( - FPDF_PAGE page, - EPDF_RemovedAnnotInfo* out_removed, - uint32_t out_removed_capacity, - char* nm_utf8_pool, - uint32_t nm_utf8_pool_capacity, - uint32_t* out_written_count, - uint32_t* out_total_count, - uint32_t* out_nm_utf8_bytes_used); +EPDFPage_ApplyRedactions(FPDF_PAGE page, uint32_t* out_removed_annot_count); #ifdef __cplusplus } // extern "C" diff --git a/testing/resources/redact_inherited_colorspace.pdf b/testing/resources/redact_inherited_colorspace.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3e1f835045a81b7d593a5bf1714e5c26b51a14f0 GIT binary patch literal 912 zcmZuw!A|2a5WV{==F%gLoz@|hP$imDgmw|#bfra#dT>*>4Jt7>t^|Ay2fh&P2keX! zNH-8AO7b$#^WGb$H=oWJHA%7(np*`9VXFD5v&jOTb)hbp;_7 zrEENAx?E#1qxUY!R}v*Lhth$d#~;PIf^0zSQ3j*b8ZEkQe*nmrbpuH))4&E z<<{*WlvGkVtJOWD*2%)(@`^pO0GF8>_KVVQN}4&4tJXw4JnxuK2${j%| z3CkqLgAGIJW4uc0X!&tEq`JFsW9+}BXU5(WF!^>uALd46zEMv5jYE}}Ome_e;6&-N znr*%se6o7OIK+&99uP@6kg$PIOkkjNK-pqZ`~?#O?A@sgBixG}Y!G9t9c&n(>JBD{ pqZV^k6?<))-zYT({{ZyqcjcmZ(P+VEpse$rqFAzC@8V|0{sE9X Date: Sun, 19 Jul 2026 19:27:24 +0300 Subject: [PATCH 53/56] Support ephemeral AcroForm & reconciled form view Allow appearance generation for non-persistent targets by creating an ephemeral AcroForm view instead of failing when the document lacks /AcroForm. Relax DR (/DR) handling so a missing or font-less /DR does not veto generation: persistent targets seed or mutate the document's DR/Font to add a fallback, while ephemeral targets use a direct fallback font dict without mutating the doc. Introduce a reconciled form view and related helpers in epdf_form.cpp: BuildReconciledForm, FinishTxnControl, CollectRawTxnControls, ReconciledFieldByObjNum, CollectReconciledTxnControls and an overload of CollectTxnControls that accepts an optional reconciled CPDF_InteractiveForm. Transactional control collection now prefers the reconciled (merged) widget set and falls back to the raw /Kids walk when needed. Update callers to accept and pass the reconciled view where appropriate (including using a fresh reconciled form during repair/bake steps). These changes improve correctness for multi-plane documents (e.g. recovered fields, twin widgets) and avoid unnecessary document mutation for ephemeral operations. --- core/fpdfdoc/cpdf_generateap.cpp | 48 ++++-- fpdfsdk/epdf_form.cpp | 271 ++++++++++++++++++++++++------- 2 files changed, 246 insertions(+), 73 deletions(-) diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index 4eb369f188..d2be5aa2a1 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -3340,8 +3340,15 @@ bool GenerateFormAPToTarget(APGenerationTarget* target, RetainPtr form_dict = root_dict->GetDictFor("AcroForm"); + RetainPtr ephemeral_form_dict; if (!form_dict) { - return false; + if (target->IsPersistent()) { + form_dict = CPDF_InteractiveForm::InitAcroFormDict(doc); + CHECK(form_dict); + } else { + ephemeral_form_dict = GenerateEphemeralDefaultAcroFormDict(); + form_dict = ephemeral_form_dict; + } } std::optional default_appearance_info = @@ -3350,26 +3357,43 @@ bool GenerateFormAPToTarget(APGenerationTarget* target, return false; } + // A missing or font-less /DR must not veto appearance generation — the + // widget's own /DA names the font it wants, and DR-less AcroForms are + // common in flattened government forms (the IRS f1040 class). Persistent + // targets seed /DR/Font with a fallback the same way redaction overlays + // do; ephemeral targets fall back without mutating the document. RetainPtr dr_dict = form_dict->GetDictFor("DR"); - if (!dr_dict) { - return false; - } - - RetainPtr dr_font_dict = dr_dict->GetDictFor("Font"); + RetainPtr dr_font_dict = + dr_dict ? dr_dict->GetDictFor("Font") : nullptr; if (!ValidateFontResourceDict(dr_font_dict.Get())) { - return false; + dr_font_dict.Reset(); } const ByteString& font_name = default_appearance_info.value().font_name; RetainPtr font_dict; if (target->IsPersistent()) { + RetainPtr mutable_dr_font_dict; + if (dr_font_dict) { + mutable_dr_font_dict = + pdfium::WrapRetain(const_cast(dr_font_dict.Get())); + } else { + RetainPtr mutable_root = doc->GetMutableRoot(); + RetainPtr mutable_form_dict = + mutable_root ? mutable_root->GetMutableDictFor("AcroForm") : nullptr; + if (!mutable_form_dict) { + return false; + } + mutable_dr_font_dict = + mutable_form_dict->GetOrCreateDictFor("DR")->GetOrCreateDictFor( + "Font"); + dr_dict = mutable_form_dict->GetDictFor("DR"); + } font_dict = GetFontFromDrFontDictOrGenerateFallback( - doc, - pdfium::WrapRetain(const_cast(dr_font_dict.Get())), - font_name); + doc, mutable_dr_font_dict.Get(), font_name); } else { - font_dict = - GetFontFromDrFontDictOrDirectFallback(dr_font_dict.Get(), font_name); + font_dict = dr_font_dict ? GetFontFromDrFontDictOrDirectFallback( + dr_font_dict.Get(), font_name) + : GenerateDirectFallbackFontDict(); } auto* doc_page_data = CPDF_DocPageData::FromDocument(doc); RetainPtr default_font = doc_page_data->GetFont(font_dict); diff --git a/fpdfsdk/epdf_form.cpp b/fpdfsdk/epdf_form.cpp index 9bce5c7a58..82d9ab52df 100644 --- a/fpdfsdk/epdf_form.cpp +++ b/fpdfsdk/epdf_form.cpp @@ -266,6 +266,18 @@ std::map SweepPageWidgets( return widget_pages; } +// The reconciled view of the form: the /AcroForm tree merged by fully +// qualified name and reconciled with the page sweep, so recovered fields +// participate and promoted values win. This is the ONE lens both reads +// (model snapshot, interchange export) and write transactions look through; +// a write planned against the raw field dictionary alone would miss +// same-FQN twin widgets that only the reconciliation knows about. +std::unique_ptr BuildReconciledForm(CPDF_Document* doc) { + auto form = std::make_unique(doc); + SweepPageWidgets(doc, form.get()); + return form; +} + uint32_t PageObjNumForWidget( const std::map& widget_pages, const CPDF_Dictionary* widget_dict) { @@ -456,38 +468,43 @@ WideString OptExportAt(const CPDF_Array* opt, size_t index) { return pair ? pair->GetUnicodeTextAt(0) : element->GetUnicodeText(); } -// Resolve the widgets of a terminal field, each through the document so -// layer promotions win. Fails when a kid carries /T: the target is a -// non-terminal field and value transactions must address terminal fields. -bool CollectTxnControls(CPDF_Document* doc, - const CPDF_Dictionary* field_dict, - uint32_t field_objnum, - bool want_toggle_info, - std::vector* out) { +// Populate the planning info of one resolved control and append it. +// Mirrors CPDF_FormControl::GetExportValue(): toggle /Opt entries are +// plain strings indexed by control ordinal, with a "Yes" fallback. +void FinishTxnControl(const CPDF_Array* opt_array, + bool want_toggle_info, + std::vector* out, + TxnControl control) { + if (want_toggle_info && control.dict) { + control.on_state = ReadWidgetOnState(control.dict.Get()); + control.current_as = control.dict->GetNameFor("AS"); + const size_t ordinal = out->size(); + ByteString export_bytes = control.on_state; + if (opt_array && ordinal < opt_array->size()) { + export_bytes = opt_array->GetByteStringAt(ordinal); + } + if (export_bytes.IsEmpty()) { + export_bytes = "Yes"; + } + control.export_value = PDF_DecodeText(export_bytes.unsigned_span()); + } + out->push_back(std::move(control)); +} + +// Resolve the widgets of a terminal field from its own dictionary, each +// through the document so layer promotions win. Fails when a kid carries +// /T: the target is a non-terminal field and value transactions must +// address terminal fields. +bool CollectRawTxnControls(CPDF_Document* doc, + const CPDF_Dictionary* field_dict, + uint32_t field_objnum, + bool want_toggle_info, + std::vector* out) { RetainPtr opt_array; if (want_toggle_info) { opt_array = ToArray(CPDF_FormField::GetFieldAttrForDict(field_dict, "Opt")); } - auto finish_control = [&](TxnControl control) { - if (want_toggle_info && control.dict) { - control.on_state = ReadWidgetOnState(control.dict.Get()); - control.current_as = control.dict->GetNameFor("AS"); - // Mirrors CPDF_FormControl::GetExportValue(): toggle /Opt entries are - // plain strings indexed by control ordinal, with a "Yes" fallback. - const size_t ordinal = out->size(); - ByteString export_bytes = control.on_state; - if (opt_array && ordinal < opt_array->size()) { - export_bytes = opt_array->GetByteStringAt(ordinal); - } - if (export_bytes.IsEmpty()) { - export_bytes = "Yes"; - } - control.export_value = PDF_DecodeText(export_bytes.unsigned_span()); - } - out->push_back(std::move(control)); - }; - RetainPtr kids = field_dict->GetArrayFor(pdfium::form_fields::kKids); if (!kids) { @@ -495,7 +512,8 @@ bool CollectTxnControls(CPDF_Document* doc, control.merged = true; control.objnum = field_objnum; control.dict = pdfium::WrapRetain(field_dict); - finish_control(std::move(control)); + FinishTxnControl(opt_array.Get(), want_toggle_info, out, + std::move(control)); return true; } @@ -519,11 +537,131 @@ bool CollectTxnControls(CPDF_Document* doc, if (control.dict->KeyExist(pdfium::form_fields::kT)) { return false; // Child field: |field_dict| is not terminal. } - finish_control(std::move(control)); + FinishTxnControl(opt_array.Get(), want_toggle_info, out, + std::move(control)); } return !out->empty(); } +// Locate the reconciled field owning |field_objnum|: the merged +// CPDF_FormField whose storage dictionary carries that object number. +CPDF_FormField* ReconciledFieldByObjNum(const CPDF_InteractiveForm* form, + uint32_t field_objnum) { + const size_t count = form->CountFields(WideString()); + for (size_t i = 0; i < count; ++i) { + CPDF_FormField* field = form->GetField(i, WideString()); + if (field && field->GetFieldDict() && + field->GetFieldDict()->GetObjNum() == field_objnum) { + return field; + } + } + return nullptr; +} + +// Resolve the widgets of a terminal field from the reconciled form view. +// Two-plane documents (the IRS f1040 class: an orphaned /AcroForm twin plus +// a standalone page-annot twin sharing one fully qualified name) fill +// correctly only when a write covers every twin — the raw /Kids walk cannot +// see across planes, but the reconciled control list is exactly the widget +// set the model snapshot reported to the caller. This mirrors what stock +// CPDF_FormField::CheckControl gets for free from its in-memory state. +bool CollectReconciledTxnControls(CPDF_Document* doc, + const CPDF_InteractiveForm* form, + const CPDF_Dictionary* field_dict, + uint32_t field_objnum, + bool want_toggle_info, + std::vector* out) { + const CPDF_FormField* field = ReconciledFieldByObjNum(form, field_objnum); + if (!field) { + return false; + } + + RetainPtr opt_array; + if (want_toggle_info) { + opt_array = ToArray(CPDF_FormField::GetFieldAttrForDict(field_dict, "Opt")); + } + + const CPDF_Dictionary* storage_dict = field->GetFieldDict().Get(); + const int count = field->CountControls(); + for (int i = 0; i < count; ++i) { + const CPDF_FormControl* form_control = field->GetControl(i); + if (!form_control) { + continue; + } + RetainPtr control_dict = + form_control->GetWidgetDict(); + if (!control_dict) { + continue; + } + + TxnControl control; + const uint32_t objnum = control_dict->GetObjNum(); + if (objnum == field_objnum || control_dict.Get() == storage_dict) { + // The merged control: the field dictionary itself is the widget. + control.merged = true; + control.objnum = field_objnum; + control.dict = pdfium::WrapRetain(field_dict); + } else if (objnum != 0) { + control.objnum = objnum; + // Re-resolve through the document so layer promotions win over the + // instance the form captured at build time. + control.dict = ToDictionary(doc->GetOrParseIndirectObject(objnum)); + } else { + // Direct (spec-violating) kid: recover its /Kids index from the + // form-held storage dictionary, then plan against the current view. + RetainPtr storage_kids = + storage_dict->GetArrayFor(pdfium::form_fields::kKids); + RetainPtr current_kids = + field_dict->GetArrayFor(pdfium::form_fields::kKids); + if (!storage_kids || !current_kids) { + continue; + } + for (size_t k = 0; k < storage_kids->size(); ++k) { + if (storage_kids->GetDictAt(k).Get() == control_dict.Get()) { + control.kids_index = k; + control.dict = current_kids->GetDictAt(k); + break; + } + } + if (!control.dict) { + continue; + } + } + if (!control.dict) { + continue; + } + FinishTxnControl(opt_array.Get(), want_toggle_info, out, + std::move(control)); + } + return !out->empty(); +} + +// Resolve the widgets of a terminal field for a transaction. The reconciled +// view is authoritative — reads and writes must see the SAME widget set. +// Falls back to the raw /Kids walk for fields the interactive form cannot +// represent (unnamed, type-less, or unplaced authoring drafts). |reconciled| +// may be null; batch callers (interchange import) pass their own so the +// form is built once per batch instead of once per field. +bool CollectTxnControls(CPDF_Document* doc, + const CPDF_Dictionary* field_dict, + uint32_t field_objnum, + bool want_toggle_info, + const CPDF_InteractiveForm* reconciled, + std::vector* out) { + std::unique_ptr owned_form; + if (!reconciled) { + owned_form = BuildReconciledForm(doc); + reconciled = owned_form.get(); + } + if (CollectReconciledTxnControls(doc, reconciled, field_dict, field_objnum, + want_toggle_info, out)) { + return true; + } + out->clear(); + return CollectRawTxnControls(doc, field_dict, field_objnum, want_toggle_info, + out); +} + // Resolve a control for mutation. Everything routes through promotion: // indirect widgets promote themselves; direct kids are reached through the // already-promoted field clone. @@ -683,6 +821,7 @@ struct ToggleContext { }; bool PrepareToggle(CPDF_Document* doc, + const CPDF_InteractiveForm* reconciled, uint32_t field_objnum, ToggleContext* ctx) { ctx->field = ResolveFieldDict(doc, field_objnum); @@ -696,7 +835,8 @@ bool PrepareToggle(CPDF_Document* doc, } ctx->is_radio = ctx->flags & pdfium::form_flags::kButtonRadio; return CollectTxnControls(doc, ctx->field.Get(), field_objnum, - /*want_toggle_info=*/true, &ctx->controls); + /*want_toggle_info=*/true, reconciled, + &ctx->controls); } bool RejectClearForNoToggleToOff(const ToggleContext& ctx) { @@ -791,6 +931,7 @@ bool ExecuteToggle(CPDF_Document* doc, // Select the target widget by appearance state name ("Off"/empty clears). bool ApplyToggle(CPDF_Document* doc, + const CPDF_InteractiveForm* reconciled, uint32_t field_objnum, const ByteString& requested_state, bool lenient_unknown_state, @@ -798,7 +939,7 @@ bool ApplyToggle(CPDF_Document* doc, unsigned long buffer_size, unsigned long* out_changed_count) { ToggleContext ctx; - if (!PrepareToggle(doc, field_objnum, &ctx)) { + if (!PrepareToggle(doc, reconciled, field_objnum, &ctx)) { return false; } const bool clearing = @@ -826,13 +967,14 @@ bool ApplyToggle(CPDF_Document* doc, // Select the target widget by export value - the identity FDF/XFDF carry. bool ApplyToggleByExport(CPDF_Document* doc, + const CPDF_InteractiveForm* reconciled, uint32_t field_objnum, const WideString& export_value, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { ToggleContext ctx; - if (!PrepareToggle(doc, field_objnum, &ctx)) { + if (!PrepareToggle(doc, reconciled, field_objnum, &ctx)) { return false; } const bool clearing = export_value.IsEmpty() || export_value == L"Off"; @@ -896,7 +1038,7 @@ bool ApplyToggleDefault(CPDF_Document* doc, unsigned long buffer_size, unsigned long* out_changed_count) { ToggleContext ctx; - if (!PrepareToggle(doc, field_objnum, &ctx)) { + if (!PrepareToggle(doc, /*reconciled=*/nullptr, field_objnum, &ctx)) { return false; } const TxnControl* target = nullptr; @@ -940,6 +1082,7 @@ bool RegenerateControlAppearances( // Internal text transaction; the public wrapper converts the wire string. bool ApplyTextValue(CPDF_Document* doc, + const CPDF_InteractiveForm* reconciled, uint32_t field_objnum, const WideString& new_value, uint32_t* changed_widget_objnums, @@ -960,7 +1103,7 @@ bool ApplyTextValue(CPDF_Document* doc, std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, reconciled, &controls)) { return false; } @@ -991,6 +1134,7 @@ bool ApplyTextValue(CPDF_Document* doc, // Internal choice transaction; the public wrapper converts the wire strings. bool ApplyChoiceValues(CPDF_Document* doc, + const CPDF_InteractiveForm* reconciled, uint32_t field_objnum, const std::vector& new_values, uint32_t* changed_widget_objnums, @@ -1009,7 +1153,7 @@ bool ApplyChoiceValues(CPDF_Document* doc, std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, reconciled, &controls)) { return false; } @@ -1111,7 +1255,8 @@ bool ApplyFieldDisplay(CPDF_Document* doc, } std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, /*reconciled=*/nullptr, + &controls)) { return false; } @@ -1191,7 +1336,8 @@ bool ApplyFieldAppearanceText(CPDF_Document* doc, std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, /*reconciled=*/nullptr, + &controls)) { return false; } const bool needs_promoted_field = std::any_of( @@ -1229,14 +1375,6 @@ bool ApplyFieldAppearanceText(CPDF_Document* doc, // FDF / XFDF interchange helpers. // --------------------------------------------------------------------------- -// The interchange view of the form: the /AcroForm tree reconciled with the -// page sweep, so recovered fields participate and promoted values win. -std::unique_ptr BuildReconciledForm(CPDF_Document* doc) { - auto form = std::make_unique(doc); - SweepPageWidgets(doc, form.get()); - return form; -} - unsigned long CopyPayloadToBuffer(const ByteString& payload, void* buffer, unsigned long buflen) { @@ -1292,20 +1430,20 @@ void ApplyImportedValues(CPDF_Document* doc, case CPDF_FormField::kCheckBox: case CPDF_FormField::kRadioButton: applied = values.size() == 1 && - ApplyToggleByExport(doc, field_objnum, values[0], nullptr, 0, - &changed); + ApplyToggleByExport(doc, form, field_objnum, values[0], nullptr, + 0, &changed); break; case CPDF_FormField::kText: case CPDF_FormField::kRichText: case CPDF_FormField::kFile: applied = values.size() == 1 && - ApplyTextValue(doc, field_objnum, values[0], nullptr, 0, + ApplyTextValue(doc, form, field_objnum, values[0], nullptr, 0, &changed); break; case CPDF_FormField::kComboBox: case CPDF_FormField::kListBox: - applied = - ApplyChoiceValues(doc, field_objnum, values, nullptr, 0, &changed); + applied = ApplyChoiceValues(doc, form, field_objnum, values, nullptr, 0, + &changed); break; default: break; // Push buttons, signatures, unknown: never written. @@ -1993,7 +2131,8 @@ EPDFForm_SetToggle(FPDF_DOCUMENT document, if (!doc) { return false; } - return ApplyToggle(doc, field_objnum, ByteString(on_state ? on_state : ""), + return ApplyToggle(doc, /*reconciled=*/nullptr, field_objnum, + ByteString(on_state ? on_state : ""), /*lenient_unknown_state=*/false, changed_widget_objnums, buffer_size, out_changed_count); } @@ -2010,7 +2149,7 @@ EPDFForm_SetTextValue(FPDF_DOCUMENT document, return false; } return ApplyTextValue( - doc, field_objnum, + doc, /*reconciled=*/nullptr, field_objnum, value ? WideStringFromFPDFWideString(value) : WideString(), changed_widget_objnums, buffer_size, out_changed_count); } @@ -2036,8 +2175,8 @@ EPDFForm_SetChoiceValues(FPDF_DOCUMENT document, : WideString()); } } - return ApplyChoiceValues(doc, field_objnum, new_values, - changed_widget_objnums, buffer_size, + return ApplyChoiceValues(doc, /*reconciled=*/nullptr, field_objnum, + new_values, changed_widget_objnums, buffer_size, out_changed_count); } @@ -2104,8 +2243,8 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, defaults.clear(); } } - return ApplyChoiceValues(doc, field_objnum, defaults, - changed_widget_objnums, buffer_size, + return ApplyChoiceValues(doc, /*reconciled=*/nullptr, field_objnum, + defaults, changed_widget_objnums, buffer_size, out_changed_count); } @@ -2114,7 +2253,8 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, } std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, /*reconciled=*/nullptr, + &controls)) { return false; } RetainPtr promoted_field = @@ -2411,6 +2551,12 @@ EPDFForm_Repair(FPDF_DOCUMENT document, ++report.widgets_linked; } + // The structural phase above may have linked fields and widgets; bake + // against a FRESH reconciled view so just-linked widgets participate. + std::unique_ptr bake_form; + if (!bake_fields.empty()) { + bake_form = BuildReconciledForm(doc); + } for (const BakeStep& step : bake_fields) { RetainPtr field_dict = ResolveFieldDict(doc, step.field_objnum); @@ -2419,7 +2565,8 @@ EPDFForm_Repair(FPDF_DOCUMENT document, } std::vector controls; if (!CollectTxnControls(doc, field_dict.Get(), step.field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, bake_form.get(), + &controls)) { continue; } RetainPtr promoted_field; @@ -3085,7 +3232,8 @@ void RegenerateFieldAppearances(CPDF_Document* doc, uint32_t field_objnum) { } std::vector controls; if (!CollectTxnControls(doc, field.Get(), field_objnum, - /*want_toggle_info=*/false, &controls)) { + /*want_toggle_info=*/false, /*reconciled=*/nullptr, + &controls)) { return; } RetainPtr promoted_field; @@ -3349,7 +3497,7 @@ EPDFForm_SetFieldDefaultToggle(FPDF_DOCUMENT document, return false; } ToggleContext ctx; - if (!PrepareToggle(doc, field_objnum, &ctx)) { + if (!PrepareToggle(doc, /*reconciled=*/nullptr, field_objnum, &ctx)) { return false; } @@ -3549,7 +3697,8 @@ EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, mutable_field->RemoveFor("I"); } RegenerateFieldAppearances(doc, field_objnum); - } else if (!ApplyChoiceValues(doc, field_objnum, kept, nullptr, 0, nullptr)) { + } else if (!ApplyChoiceValues(doc, /*reconciled=*/nullptr, field_objnum, kept, + nullptr, 0, nullptr)) { return false; } From cc7b8d6ff20f745a8920ddae80e7407e45889ca5 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Mon, 20 Jul 2026 17:43:21 +0300 Subject: [PATCH 54/56] Mirror field values to twin controls and tests Add MirrorFieldValueToTwinControls to copy /V, /I and /RV from a promoted field to same-FQN twin control dictionaries (same-name twins living in their own plane) and call it from ApplyTextValue, ApplyChoiceValues and EPDFForm_ResetField so appearance generation sees the value. Update form/embedder tests by adding a two_plane_form.pdf fixture and a TwoPlaneTwinWidgetsFillTogether test that verifies toggles, text commits, and /DR seeding cover both twins. Adjust annotation appearance-related expectations (rect/BBox inflation) and refactor many fpdfsdk tests: rename MemoryFontFileAccess->MemoryFileAccess, replace detailed redaction-report helpers with simpler removed-count helpers, add bitmap/render helpers and numerous redaction overlay tests, and modernize action/form test usage (ScopedPage, null-model handling, widget creation via annot+field attach). Also tweak DestGetPageObjectNumber behavior for out-of-range legacy Dests and various minor test cleanups. --- core/fpdfdoc/cpdf_annot_unittest.cpp | 4 +- core/fpdfdoc/cpdf_generateap_unittest.cpp | 4 +- fpdfsdk/epdf_action_embeddertest.cpp | 13 +- fpdfsdk/epdf_form.cpp | 33 ++ fpdfsdk/epdf_form_embeddertest.cpp | 76 +++ fpdfsdk/fpdf_annot_embeddertest.cpp | 629 +++++++++++++++++++--- fpdfsdk/fpdf_doc_embeddertest.cpp | 10 +- testing/resources/two_plane_form.pdf | Bin 0 -> 2180 bytes 8 files changed, 671 insertions(+), 98 deletions(-) create mode 100644 testing/resources/two_plane_form.pdf diff --git a/core/fpdfdoc/cpdf_annot_unittest.cpp b/core/fpdfdoc/cpdf_annot_unittest.cpp index 547c025ff3..9c554cad64 100644 --- a/core/fpdfdoc/cpdf_annot_unittest.cpp +++ b/core/fpdfdoc/cpdf_annot_unittest.cpp @@ -189,5 +189,7 @@ TEST_F(CPDFAnnotWithPageModuleTest, EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); EXPECT_EQ(CFX_FloatRect(0, 0, 10, 10), annot_dict->GetRectFor(pdfium::annotation::kRect)); - EXPECT_EQ(CFX_FloatRect(-2, -2, 12, 12), annot.GetRect()); + // The drawing rect is the minimal union of the authored /Rect and the + // stroked ink bounds: points 1..9 inflated by half the width (2). + EXPECT_EQ(CFX_FloatRect(-1, -1, 11, 11), annot.GetRect()); } diff --git a/core/fpdfdoc/cpdf_generateap_unittest.cpp b/core/fpdfdoc/cpdf_generateap_unittest.cpp index 635e1533c3..10028c5336 100644 --- a/core/fpdfdoc/cpdf_generateap_unittest.cpp +++ b/core/fpdfdoc/cpdf_generateap_unittest.cpp @@ -270,7 +270,9 @@ TEST_F(CPDFGenerateAPTest, GenerateEphemeralInkAPDoesNotInflateAnnotRect) { EXPECT_EQ(0u, generated->normal_stream->GetObjNum()); EXPECT_EQ(last_obj_num, doc.GetLastObjNum()); EXPECT_EQ(original_rect, annot_dict->GetRectFor(pdfium::annotation::kRect)); - EXPECT_EQ(CFX_FloatRect(-2, -2, 12, 12), + // The ephemeral BBox minimally encloses both the authored /Rect and the + // stroked ink: points 1..9 inflated by half the width (2). + EXPECT_EQ(CFX_FloatRect(-1, -1, 11, 11), generated->normal_stream->GetDict()->GetRectFor("BBox")); EXPECT_FALSE(annot_dict->KeyExist(pdfium::annotation::kAP)); } diff --git a/fpdfsdk/epdf_action_embeddertest.cpp b/fpdfsdk/epdf_action_embeddertest.cpp index 201255ef1b..3f582d0d47 100644 --- a/fpdfsdk/epdf_action_embeddertest.cpp +++ b/fpdfsdk/epdf_action_embeddertest.cpp @@ -392,20 +392,24 @@ TEST_F(EPDFActionEmbedderTest, TEST_F(EPDFActionEmbedderTest, NodeUriPayloadFromRealDocument) { ASSERT_TRUE(OpenDocument("annots_action_handling.pdf")); - FPDF_PAGE page = LoadPage(0); + ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); bool checked_link = false; - const int annotation_count = FPDFPage_GetAnnotCount(page); + const int annotation_count = FPDFPage_GetAnnotCount(page.get()); for (int i = 0; i < annotation_count; ++i) { - ScopedFPDFAnnotation annotation(FPDFPage_GetAnnot(page, i)); + ScopedFPDFAnnotation annotation(FPDFPage_GetAnnot(page.get(), i)); ASSERT_TRUE(annotation); if (FPDFAnnot_GetSubtype(annotation.get()) != FPDF_ANNOT_LINK) { continue; } ScopedEPDFActionModel model( EPDFAnnot_GetActionModel(annotation.get(), EPDF_ANNOT_ACTION_ACTIVATE)); - ASSERT_TRUE(model); + // This fixture also contains destination-only links. They correctly have + // no activate action model; keep looking for its URI-action link. + if (!model) { + continue; + } const EPDF_ACTION_NODE_ID root = EPDFAction_GetRootNode(model.get()); ASSERT_NE(EPDF_ACTION_NODE_INVALID, root); ASSERT_EQ(EPDF_ACTION_TYPE_URI, EPDFAction_GetNodeType(model.get(), root)); @@ -426,7 +430,6 @@ TEST_F(EPDFActionEmbedderTest, NodeUriPayloadFromRealDocument) { checked_link = true; } EXPECT_TRUE(checked_link); - UnloadPage(page); } TEST_F(EPDFActionEmbedderTest, NodeDestPayloadFromCreatedGoTo) { diff --git a/fpdfsdk/epdf_form.cpp b/fpdfsdk/epdf_form.cpp index 82d9ab52df..e83071c183 100644 --- a/fpdfsdk/epdf_form.cpp +++ b/fpdfsdk/epdf_form.cpp @@ -1052,6 +1052,36 @@ bool ApplyToggleDefault(CPDF_Document* doc, changed_widget_objnums, buffer_size, out_changed_count); } +// Same-FQN twin controls are field roots in their own plane (they carry +// /T). Value state must land on them too: appearance generation re-reads +// the value by climbing the control's own dictionary chain — which never +// crosses planes — and per-widget readers in other viewers do the same. +// Runs after the field-level value write and before appearance regen. +void MirrorFieldValueToTwinControls( + CPDF_Document* doc, + const RetainPtr& promoted_field, + const std::vector& controls) { + for (const TxnControl& control : controls) { + if (control.merged || !control.dict || + !control.dict->KeyExist(pdfium::form_fields::kT)) { + continue; + } + RetainPtr twin = + MutableControlDict(doc, control, promoted_field); + if (!twin || twin == promoted_field) { + continue; + } + for (const char* key : {pdfium::form_fields::kV, "I", "RV"}) { + RetainPtr value = promoted_field->GetObjectFor(key); + if (value) { + twin->SetFor(key, value->Clone()); + } else { + twin->RemoveFor(key); + } + } + } +} + // Regenerate the /AP of every control and report them all as changed. bool RegenerateControlAppearances( CPDF_Document* doc, @@ -1126,6 +1156,7 @@ bool ApplyTextValue(CPDF_Document* doc, normalized_value.AsStringView()); // A rich text value would now contradict /V; drop it rather than lie. promoted_field->RemoveFor("RV"); + MirrorFieldValueToTwinControls(doc, promoted_field, controls); return RegenerateControlAppearances( doc, controls, promoted_field, CPDF_GenerateAP::kTextField, @@ -1207,6 +1238,7 @@ bool ApplyChoiceValues(CPDF_Document* doc, } } promoted_field->RemoveFor("RV"); + MirrorFieldValueToTwinControls(doc, promoted_field, controls); return RegenerateControlAppearances( doc, controls, promoted_field, ChoiceFormType(flags), @@ -2275,6 +2307,7 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, } } promoted_field->RemoveFor("RV"); + MirrorFieldValueToTwinControls(doc, promoted_field, controls); return RegenerateControlAppearances( doc, controls, promoted_field, CPDF_GenerateAP::kTextField, changed_widget_objnums, buffer_size, out_changed_count); diff --git a/fpdfsdk/epdf_form_embeddertest.cpp b/fpdfsdk/epdf_form_embeddertest.cpp index a6b37bdfbb..e3b6a7fe46 100644 --- a/fpdfsdk/epdf_form_embeddertest.cpp +++ b/fpdfsdk/epdf_form_embeddertest.cpp @@ -384,6 +384,82 @@ TEST_F(EPDFFormEmbedderTest, OrphanWidgetsRecovered) { EPDFForm_CloseModel(model); } +// A "two-plane" document (the IRS f1040 class): every field exists TWICE +// under one fully qualified name — an orphaned twin inside /AcroForm +// /Fields that no page references, and a standalone merged twin in page +// /Annots that /AcroForm cannot reach. Reads reconcile the planes into ONE +// field, so writes must cover BOTH twins; a write planned from the raw +// field dictionary alone would edit the invisible orphan while the +// on-screen widget never changes. +TEST_F(EPDFFormEmbedderTest, TwoPlaneTwinWidgetsFillTogether) { + ASSERT_TRUE(OpenDocument("two_plane_form.pdf")); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + // Two logical fields, not four: the same-FQN twins merge, and each field + // carries both twin widgets (the orphan first — /Fields loads before the + // page sweep — then the page twin). + ASSERT_EQ(2, EPDFForm_CountFields(model)); + const int checkbox = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(checkbox, 0); + ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, checkbox)); + EXPECT_EQ(4u, EPDFForm_GetFieldWidgetObjNum(model, checkbox, 0)); + EXPECT_EQ(9u, EPDFForm_GetFieldWidgetObjNum(model, checkbox, 1)); + const int text = EPDFForm_GetFieldIndexByObjNum(model, 5u); + ASSERT_GE(text, 0); + ASSERT_EQ(2, EPDFForm_CountFieldWidgets(model, text)); + EXPECT_EQ(10u, EPDFForm_GetFieldWidgetObjNum(model, text, 1)); + EPDFForm_CloseModel(model); + + // Toggling flips /AS on BOTH twins — above all the page twin (obj 11), + // the only one the user can see. + uint32_t changed[4] = {}; + unsigned long changed_count = 0; + ASSERT_TRUE( + EPDFForm_SetToggle(document(), 4u, "1", changed, 4, &changed_count)); + ASSERT_EQ(2ul, changed_count); + EXPECT_EQ(4u, changed[0]); + EXPECT_EQ(9u, changed[1]); + for (const uint32_t objnum : {4u, 9u}) { + RetainPtr widget = + GetEffectiveIndirectDictionary(document(), objnum); + ASSERT_TRUE(widget); + EXPECT_EQ("1", widget->GetNameFor("AS")) << "widget " << objnum; + } + + model = EPDFForm_LoadModel(document()); + ASSERT_TRUE(model); + const int checked = EPDFForm_GetFieldIndexByObjNum(model, 4u); + ASSERT_GE(checked, 0); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, checked, 0)); + EXPECT_TRUE(EPDFForm_IsFieldWidgetChecked(model, checked, 1)); + EPDFForm_CloseModel(model); + + // A text commit regenerates the page twin's appearance with the value — + // even though this document has no /AcroForm /DR: generation must seed a + // fallback font instead of vetoing the appearance. + ScopedFPDFWideString value = GetFPDFWideString(L"TWIN"); + changed_count = 0; + ASSERT_TRUE(EPDFForm_SetTextValue(document(), 5u, value.get(), changed, 4, + &changed_count)); + ASSERT_EQ(2ul, changed_count); + EXPECT_EQ(5u, changed[0]); + EXPECT_EQ(10u, changed[1]); + const std::wstring appearance = + GetEffectiveWidgetAppearance(document(), 10u); + EXPECT_NE(std::wstring::npos, appearance.find(L"TWIN")) << appearance; + + // The write seeded /DR/Font with the /DA-named font. + RetainPtr acroform = + GetEffectiveIndirectDictionary(document(), 2u); + ASSERT_TRUE(acroform); + RetainPtr dr_dict = acroform->GetDictFor("DR"); + ASSERT_TRUE(dr_dict); + RetainPtr dr_font_dict = dr_dict->GetDictFor("Font"); + ASSERT_TRUE(dr_font_dict); + EXPECT_TRUE(dr_font_dict->KeyExist("Helv")); +} + // Building a form model must be a pure read: over a layer document it must // not promote a single object into the layer, even while it reconciles // orphan widgets in memory. diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index 4245f224e2..d67f89a18d 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "public/fpdf_annot.h" +#include "public/epdf_form.h" #include @@ -139,25 +140,17 @@ std::wstring GetNormalAppearance(FPDF_ANNOTATION annot) { return GetPlatformWString(buffer.data()); } -struct RedactionReport { - std::vector object_numbers; - uint32_t written_count = 0; - uint32_t total_count = 0; - uint32_t nm_utf8_bytes_used = 0; -}; - class ScopedRegisteredFonts { public: ScopedRegisteredFonts() { EPDFFont_ClearRegisteredFonts(); } ~ScopedRegisteredFonts() { EPDFFont_ClearRegisteredFonts(); } }; -class MemoryFontFileAccess final : public FPDF_FILEACCESS { +class MemoryFileAccess final : public FPDF_FILEACCESS { public: - explicit MemoryFontFileAccess(std::vector data) - : data_(std::move(data)) { + explicit MemoryFileAccess(std::vector data) : data_(std::move(data)) { m_FileLen = static_cast(data_.size()); - m_GetBlock = &MemoryFontFileAccess::GetBlock; + m_GetBlock = &MemoryFileAccess::GetBlock; m_Param = this; } @@ -166,7 +159,7 @@ class MemoryFontFileAccess final : public FPDF_FILEACCESS { unsigned long pos, unsigned char* buf, unsigned long size) { - auto* file_access = static_cast(param); + auto* file_access = static_cast(param); if (!file_access || !buf || pos > file_access->data_.size() || size > file_access->data_.size() - pos) { return 0; @@ -383,37 +376,63 @@ void AddBrokenTrueTypeCjkTextPageContent(FPDF_DOCUMENT doc, FPDF_PAGE page) { contents->GetObjNum()); } -RedactionReport ApplyRedactionWithReport(FPDF_PAGE page, - FPDF_ANNOTATION annot) { - std::array removed = {}; - std::array nm_utf8_pool = {}; - RedactionReport report; +// Applies one redaction and returns how many annotations other than REDACT +// ones were removed alongside it. +uint32_t ApplyRedactionCountingRemoved(FPDF_PAGE page, FPDF_ANNOTATION annot) { + uint32_t removed_count = 0; + EXPECT_TRUE(EPDFAnnot_ApplyRedaction(page, annot, &removed_count)); + return removed_count; +} - EXPECT_TRUE(EPDFAnnot_ApplyRedactionWithReport( - page, annot, removed.data(), removed.size(), nm_utf8_pool.data(), - nm_utf8_pool.size(), &report.written_count, &report.total_count, - &report.nm_utf8_bytes_used)); +uint32_t ApplyPageRedactionsCountingRemoved(FPDF_PAGE page) { + uint32_t removed_count = 0; + EXPECT_TRUE(EPDFPage_ApplyRedactions(page, &removed_count)); + return removed_count; +} - for (uint32_t i = 0; i < report.written_count; ++i) { - report.object_numbers.push_back(removed[i].object_number); +ScopedFPDFAnnotation CreateRedactAnnot(FPDF_PAGE page, const FS_RECTF& rect) { + ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page, FPDF_ANNOT_REDACT)); + EXPECT_TRUE(annot); + if (annot) { + EXPECT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); } - return report; + return annot; } -RedactionReport ApplyPageRedactionsWithReport(FPDF_PAGE page) { - std::array removed = {}; - std::array nm_utf8_pool = {}; - RedactionReport report; - - EXPECT_TRUE(EPDFPage_ApplyRedactionsWithReport( - page, removed.data(), removed.size(), nm_utf8_pool.data(), - nm_utf8_pool.size(), &report.written_count, &report.total_count, - &report.nm_utf8_bytes_used)); +ScopedFPDFBitmap RenderPageOnWhite(FPDF_PAGE page, int width, int height) { + ScopedFPDFBitmap bitmap(FPDFBitmap_Create(width, height, /*alpha=*/0)); + FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF); + FPDF_RenderPageBitmap(bitmap.get(), page, 0, 0, width, height, /*rotate=*/0, + /*flags=*/0); + return bitmap; +} - for (uint32_t i = 0; i < report.written_count; ++i) { - report.object_numbers.push_back(removed[i].object_number); +uint32_t GetPixelColor(FPDF_BITMAP bitmap, int x, int y) { + const uint8_t* buffer = + static_cast(FPDFBitmap_GetBuffer(bitmap)); + const int stride = FPDFBitmap_GetStride(bitmap); + const uint8_t* pixel = buffer + y * stride + x * 4; + return (uint32_t{pixel[3]} << 24) | (uint32_t{pixel[2]} << 16) | + (uint32_t{pixel[1]} << 8) | uint32_t{pixel[0]}; +} + +// Number of pixels in [left, right) x [top, bottom), bitmap coordinates, that +// differ from `background`. +int CountInkPixels(FPDF_BITMAP bitmap, + int left, + int top, + int right, + int bottom, + uint32_t background) { + int count = 0; + for (int y = top; y < bottom; ++y) { + for (int x = left; x < right; ++x) { + if (GetPixelColor(bitmap, x, y) != background) { + ++count; + } + } } - return report; + return count; } void VerifyFocusableAnnotSubtypes( @@ -715,6 +734,63 @@ TEST_F(FPDFAnnotEmbedderTest, RemoveInkList) { EXPECT_FALSE(annot_dict->KeyExist("InkList")); } +TEST_F(FPDFAnnotEmbedderTest, GenerateInkAppearanceIsIdempotentOnRect) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + ScopedFPDFAnnotation annot(FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_INK)); + ASSERT_TRUE(annot); + + static constexpr FS_POINTF kStroke[] = { + {50.0f, 50.0f}, {80.0f, 90.0f}, {120.0f, 60.0f}}; + ASSERT_EQ(0, + FPDFAnnot_AddInkStroke(annot.get(), kStroke, std::size(kStroke))); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), FPDFANNOT_COLORTYPE_Color, 255, + 0, 0, 255)); + ASSERT_TRUE(FPDFAnnot_SetBorder(annot.get(), /*horizontal_radius=*/0.0f, + /*vertical_radius=*/0.0f, + /*border_width=*/6.0f)); + + // A caller-authored /Rect that already encloses the STROKED ink: the point + // bounds (50..120, 50..90) inflated by border_width / 2 = 3 on every side — + // exactly the rect EmbedPDF's writers supply. + const FS_RECTF authored{/*left=*/47.0f, /*top=*/93.0f, /*right=*/123.0f, + /*bottom=*/47.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &authored)); + + // Generating the appearance must NOT disturb a rect the ink already fits in + // — no matter how many times it runs (the engine re-bakes after every + // edit). The old behavior inflated /Rect by border_width / 2 per call. + for (int i = 0; i < 3; ++i) { + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + FS_RECTF rect; + ASSERT_TRUE(FPDFAnnot_GetRect(annot.get(), &rect)); + EXPECT_FLOAT_EQ(authored.left, rect.left) << "iteration " << i; + EXPECT_FLOAT_EQ(authored.top, rect.top) << "iteration " << i; + EXPECT_FLOAT_EQ(authored.right, rect.right) << "iteration " << i; + EXPECT_FLOAT_EQ(authored.bottom, rect.bottom) << "iteration " << i; + } + + // A TIGHT rect (bare point bounds, no stroke padding — common in foreign + // documents, the case the upstream inflate was hacked in for) is corrected + // ONCE to the minimal rect that contains the stroked ink, then stays + // stable on further regenerations. + const FS_RECTF tight{/*left=*/50.0f, /*top=*/90.0f, /*right=*/120.0f, + /*bottom=*/50.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &tight)); + for (int i = 0; i < 3; ++i) { + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + FS_RECTF rect; + ASSERT_TRUE(FPDFAnnot_GetRect(annot.get(), &rect)); + EXPECT_FLOAT_EQ(47.0f, rect.left) << "iteration " << i; + EXPECT_FLOAT_EQ(93.0f, rect.top) << "iteration " << i; + EXPECT_FLOAT_EQ(123.0f, rect.right) << "iteration " << i; + EXPECT_FLOAT_EQ(47.0f, rect.bottom) << "iteration " << i; + } +} + TEST_F(FPDFAnnotEmbedderTest, BadParams) { ASSERT_TRUE(OpenDocument("hello_world.pdf")); ScopedPage page = LoadScopedPage(0); @@ -989,7 +1065,7 @@ TEST_F(FPDFAnnotEmbedderTest, FreeTextRegistersFontFromFileAccess) { std::vector font_data = LoadRobotoFontData(); ASSERT_FALSE(font_data.empty()); const size_t original_font_size = font_data.size(); - MemoryFontFileAccess font_access(std::move(font_data)); + MemoryFileAccess font_access(std::move(font_data)); EPDF_FONT_ID font_id = EPDFFont_RegisterFont("Roboto", /*weight=*/400, /*italic=*/0, &font_access); @@ -1100,19 +1176,29 @@ TEST_F(FPDFAnnotEmbedderTest, TextFieldKoreanUsesRegisteredDroidFallbackFont) { ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); ASSERT_TRUE(page); - ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_text"); - ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( - page.get(), form_handle(), FPDF_FORMFIELD_TEXTFIELD, field_name.get())); + // Widgets are born through the annotation API and adopted by a field + // (EPDFForm_AttachWidget); values flow through the typed EPDFForm_* + // transactions, which regenerate the appearance stream. + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_WIDGET)); ASSERT_TRUE(annot); - const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, 18.0f, 0, 0, 0)); + + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_text"); + const uint32_t field = EPDFForm_CreateField( + document(), 4 /* EPDF_FORMFIELD_FAMILY_TEXT */, field_name.get()); + ASSERT_GT(field, 0u); + ASSERT_TRUE(EPDFForm_AttachWidget( + document(), field, EPDFAnnot_GetObjectNumber(annot.get()), nullptr)); + ScopedFPDFWideString value = GetFPDFWideString(L"\xD55C\xAE00"); - ASSERT_TRUE( - EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), value.get())); + ASSERT_TRUE(EPDFForm_SetTextValue(document(), field, value.get(), nullptr, + 0, nullptr)); + // The annotation-plane companion regenerates the same appearance. ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, {L'\xD55C', L'\xAE00'}); @@ -1130,23 +1216,28 @@ TEST_F(FPDFAnnotEmbedderTest, ComboBoxKoreanUsesRegisteredDroidFallbackFont) { ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); ASSERT_TRUE(page); - ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_combo"); - ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( - page.get(), form_handle(), FPDF_FORMFIELD_COMBOBOX, field_name.get())); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_WIDGET)); ASSERT_TRUE(annot); - const FS_RECTF rect{50.0f, 250.0f, 350.0f, 320.0f}; ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, 18.0f, 0, 0, 0)); + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_combo"); + const uint32_t field = EPDFForm_CreateField( + document(), 5 /* EPDF_FORMFIELD_FAMILY_COMBOBOX */, field_name.get()); + ASSERT_GT(field, 0u); + ASSERT_TRUE(EPDFForm_AttachWidget( + document(), field, EPDFAnnot_GetObjectNumber(annot.get()), nullptr)); + ScopedFPDFWideString latin_option = GetFPDFWideString(L"Latin"); ScopedFPDFWideString korean_option = GetFPDFWideString(L"\xD55C\xAE00"); FPDF_WIDESTRING labels[] = {latin_option.get(), korean_option.get()}; - ASSERT_TRUE( - EPDFAnnot_SetFormFieldOptions(form_handle(), annot.get(), labels, 2)); - ASSERT_TRUE(EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), - korean_option.get())); + ASSERT_TRUE(EPDFForm_SetFieldOptions(document(), field, labels, labels, 2)); + FPDF_WIDESTRING selection[] = {korean_option.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), field, selection, 1, + nullptr, 0, nullptr)); ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, @@ -1165,23 +1256,28 @@ TEST_F(FPDFAnnotEmbedderTest, ListBoxKoreanUsesRegisteredDroidFallbackFont) { ScopedFPDFPage page(FPDFPage_New(document(), 0, 400, 400)); ASSERT_TRUE(page); - ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_list"); - ScopedFPDFAnnotation annot(EPDFPage_CreateFormField( - page.get(), form_handle(), FPDF_FORMFIELD_LISTBOX, field_name.get())); + ScopedFPDFAnnotation annot( + EPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_WIDGET)); ASSERT_TRUE(annot); - const FS_RECTF rect{50.0f, 220.0f, 350.0f, 330.0f}; ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, 18.0f, 0, 0, 0)); + ScopedFPDFWideString field_name = GetFPDFWideString(L"korean_list"); + const uint32_t field = EPDFForm_CreateField( + document(), 6 /* EPDF_FORMFIELD_FAMILY_LISTBOX */, field_name.get()); + ASSERT_GT(field, 0u); + ASSERT_TRUE(EPDFForm_AttachWidget( + document(), field, EPDFAnnot_GetObjectNumber(annot.get()), nullptr)); + ScopedFPDFWideString latin_option = GetFPDFWideString(L"Latin"); ScopedFPDFWideString korean_option = GetFPDFWideString(L"\xD55C\xAE00"); FPDF_WIDESTRING labels[] = {latin_option.get(), korean_option.get()}; - ASSERT_TRUE( - EPDFAnnot_SetFormFieldOptions(form_handle(), annot.get(), labels, 2)); - ASSERT_TRUE(EPDFAnnot_SetFormFieldValue(form_handle(), annot.get(), - korean_option.get())); + ASSERT_TRUE(EPDFForm_SetFieldOptions(document(), field, labels, labels, 2)); + FPDF_WIDESTRING selection[] = {korean_option.get()}; + ASSERT_TRUE(EPDFForm_SetChoiceValues(document(), field, selection, 1, + nullptr, 0, nullptr)); ASSERT_TRUE(EPDFAnnot_GenerateFormFieldAP(annot.get())); ExpectRegisteredAppearanceMapsUnicode(annot.get(), font_id, @@ -1305,7 +1401,7 @@ TEST_F(FPDFAnnotEmbedderTest, RegisteredFallbackFontRendersPageMissingGlyph) { }; auto render_broken_pdf = [](const std::vector& pdf_bytes) { - MemoryFontFileAccess file_access(pdf_bytes); + MemoryFileAccess file_access(pdf_bytes); ScopedFPDFDocument doc(FPDF_LoadCustomDocument(&file_access, nullptr)); EXPECT_TRUE(doc); ScopedFPDFPage page(FPDF_LoadPage(doc.get(), 0)); @@ -4238,7 +4334,7 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionRemovesTextInMiddleOfSentence) { { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get())); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); } ASSERT_EQ(0, FPDFPage_GetAnnotCount(page.get())); @@ -4260,7 +4356,7 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionRemovesTextInMiddleOfSentence) { EXPECT_NE(before_hash, after_hash); } -TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionReportsIntersectingAnnotation) { +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionCountsIntersectingAnnotation) { ASSERT_TRUE(OpenDocument("redact_remove_annots.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); @@ -4269,10 +4365,8 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionReportsIntersectingAnnotation) { { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); - EXPECT_EQ(2u, report.written_count); - EXPECT_EQ(2u, report.total_count); - EXPECT_THAT(report.object_numbers, testing::UnorderedElementsAre(5u, 6u)); + // The intersecting Square counts; the applied REDACT itself does not. + EXPECT_EQ(1u, ApplyRedactionCountingRemoved(page.get(), annot.get())); } EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); @@ -4287,10 +4381,9 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionPreservesSiblingRedactions) { { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); - EXPECT_EQ(2u, report.written_count); - EXPECT_EQ(2u, report.total_count); - EXPECT_THAT(report.object_numbers, testing::UnorderedElementsAre(5u, 7u)); + // Only the intersecting Square counts: the applied REDACT is the + // instruction and the sibling REDACT is preserved. + EXPECT_EQ(1u, ApplyRedactionCountingRemoved(page.get(), annot.get())); } ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); @@ -4308,10 +4401,9 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionDoesNotRemoveTouchOnlyAnnotation) { { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); - EXPECT_EQ(1u, report.written_count); - EXPECT_EQ(1u, report.total_count); - EXPECT_THAT(report.object_numbers, testing::ElementsAre(5u)); + // The edge-touching Square (no positive-area intersection) survives, so + // nothing but the REDACT itself was removed. + EXPECT_EQ(0u, ApplyRedactionCountingRemoved(page.get(), annot.get())); } ASSERT_EQ(1, FPDFPage_GetAnnotCount(page.get())); @@ -4329,30 +4421,321 @@ TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionCascadesPopupRemoval) { { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); - RedactionReport report = ApplyRedactionWithReport(page.get(), annot.get()); - EXPECT_EQ(3u, report.written_count); - EXPECT_EQ(3u, report.total_count); - EXPECT_THAT(report.object_numbers, - testing::UnorderedElementsAre(5u, 6u, 7u)); + // The Text annotation and its cascaded Popup both count. + EXPECT_EQ(2u, ApplyRedactionCountingRemoved(page.get(), annot.get())); } EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); } -TEST_F(FPDFAnnotEmbedderTest, ApplyPageRedactionsReportsAllRemovedAnnotations) { +TEST_F(FPDFAnnotEmbedderTest, ApplyPageRedactionsCountsRemovedAnnotations) { ASSERT_TRUE(OpenDocument("redact_apply_all_visible.pdf")); ScopedPage page = LoadScopedPage(0); ASSERT_TRUE(page); ASSERT_EQ(4, FPDFPage_GetAnnotCount(page.get())); - RedactionReport report = ApplyPageRedactionsWithReport(page.get()); - EXPECT_EQ(4u, report.written_count); - EXPECT_EQ(4u, report.total_count); - EXPECT_THAT(report.object_numbers, - testing::UnorderedElementsAre(5u, 6u, 7u, 8u)); + // Two Squares count; the two REDACT annotations consumed by the apply do + // not. + EXPECT_EQ(2u, ApplyPageRedactionsCountingRemoved(page.get())); EXPECT_EQ(0, FPDFPage_GetAnnotCount(page.get())); } +// The overlay tests below author a REDACT annotation via the public API on a +// blank page. Since FPDFPage_CreateAnnot() bakes no /RO, applying exercises +// the synthesis path from the declarative entries (/IC, /OverlayText, /DA, +// /Q, /Repeat) — the same situation as a file marked by another processor. +// Page: 200x200; region /Rect [20 50 180 150] => bitmap x [20,180), y +// [50,150) with the top half of the region at y [50,100). + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionSynthesizesInteriorColorFill) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + uint32_t removed_count = 7; // Sentinel: must be zeroed on entry. + ASSERT_TRUE( + EPDFAnnot_ApplyRedaction(page.get(), annot.get(), &removed_count)); + EXPECT_EQ(0u, removed_count); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + EXPECT_EQ(0xFF000000u, GetPixelColor(bitmap.get(), 100, 100)); // inside + EXPECT_EQ(0xFFFFFFFFu, GetPixelColor(bitmap.get(), 10, 100)); // outside +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionSynthesizesOverlayTextLabel) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + ScopedFPDFWideString text = GetFPDFWideString(L"SECRET"); + ASSERT_TRUE(EPDFAnnot_SetOverlayText(annot.get(), text.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), + FPDF_FONT_HELVETICA, 12.0f, + /*R=*/255, /*G=*/255, + /*B=*/255)); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + // The label is drawn top-aligned into the black fill, so the top half of + // the region has non-black ink and a single 12pt line never reaches the + // bottom half. + EXPECT_GT(CountInkPixels(bitmap.get(), 20, 50, 180, 100, 0xFF000000u), 0); + EXPECT_EQ(0, CountInkPixels(bitmap.get(), 20, 100, 180, 150, 0xFF000000u)); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionRepeatsOverlayTextToFillRegion) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + ScopedFPDFWideString text = GetFPDFWideString(L"SECRET"); + ASSERT_TRUE(EPDFAnnot_SetOverlayText(annot.get(), text.get())); + ASSERT_TRUE(EPDFAnnot_SetOverlayTextRepeat(annot.get(), true)); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), + FPDF_FONT_HELVETICA, 12.0f, + /*R=*/255, /*G=*/255, + /*B=*/255)); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + // /Repeat tiles the label down the region, so unlike the single-label case + // the bottom half of the region carries ink too. + EXPECT_GT(CountInkPixels(bitmap.get(), 20, 50, 180, 100, 0xFF000000u), 0); + EXPECT_GT(CountInkPixels(bitmap.get(), 20, 100, 180, 150, 0xFF000000u), 0); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionHonorsOverlayTextAlignment) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + ScopedFPDFWideString text = GetFPDFWideString(L"X"); + ASSERT_TRUE(EPDFAnnot_SetOverlayText(annot.get(), text.get())); + ASSERT_TRUE(EPDFAnnot_SetTextAlignment(annot.get(), + FPDF_TEXT_ALIGNMENT_RIGHT)); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), + FPDF_FONT_HELVETICA, 12.0f, + /*R=*/255, /*G=*/255, + /*B=*/255)); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + // /Q 2 pushes the single short label into the right half of the region. + EXPECT_EQ(0, CountInkPixels(bitmap.get(), 20, 50, 100, 150, 0xFF000000u)); + EXPECT_GT(CountInkPixels(bitmap.get(), 100, 50, 180, 150, 0xFF000000u), 0); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionPrefersBakedOverlayStream) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + // Bake the appearance (and with it /RO, black fill), then flip /IC to + // white WITHOUT regenerating. ISO 32000-2: an existing /RO takes + // precedence over the declarative entries, so apply must paint black. + // FPDFAnnot_SetColor() refuses to touch an annotation that already has an + // /AP, which is precisely the stale-/RO situation this test needs — write + // the dict entry directly. + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + CPDF_AnnotContext* context = + CPDFAnnotContextFromFPDFAnnotation(annot.get()); + ASSERT_TRUE(context); + RetainPtr ic = + context->GetMutableAnnotDict()->SetNewFor("IC"); + ic->AppendNew(1.0f); + ic->AppendNew(1.0f); + ic->AppendNew(1.0f); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + EXPECT_EQ(0xFF000000u, GetPixelColor(bitmap.get(), 100, 100)); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionWithoutOverlayLeavesRegionClear) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + { + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + // No /RO, no /IC, no /OverlayText: ISO leaves the region transparent. + uint32_t removed_count = 7; + ASSERT_TRUE( + EPDFAnnot_ApplyRedaction(page.get(), annot.get(), &removed_count)); + EXPECT_EQ(0u, removed_count); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + ScopedFPDFBitmap bitmap = RenderPageOnWhite(page.get(), 200, 200); + EXPECT_EQ(0, CountInkPixels(bitmap.get(), 20, 50, 180, 150, 0xFFFFFFFFu)); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionPreservesInheritedColorspaceResources) { + // The fixture models a common exporter pattern: the page content stream is + // a bare prolog (`/C1 CS /C1 cs q /X1 Do Q`) and the artwork form paints + // with `scn` alone, INHERITING the page-level colorspace. No page object + // "owns" the /C1 reference, so an append-only regeneration (the redaction + // overlay) must NOT let resource pruning delete it — that turned whole + // pages grayscale. + ASSERT_TRUE(OpenDocument("redact_inherited_colorspace.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + auto is_reddish = [](uint32_t argb) { + const int r = (argb >> 16) & 0xff; + const int g = (argb >> 8) & 0xff; + const int b = argb & 0xff; + return r > 180 && g < 100 && b < 100; + }; + + { + ScopedFPDFBitmap bmp = RenderPageOnWhite(page.get(), 200, 200); + ASSERT_TRUE(is_reddish(GetPixelColor(bmp.get(), 100, 100))); + } + + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + uint32_t removed_count = 7; + ASSERT_TRUE( + EPDFAnnot_ApplyRedaction(page.get(), annot.get(), &removed_count)); + EXPECT_EQ(0u, removed_count); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + + // Live: the artwork keeps its colour, the corner box is painted. + { + ScopedFPDFBitmap bmp = RenderPageOnWhite(page.get(), 200, 200); + EXPECT_TRUE(is_reddish(GetPixelColor(bmp.get(), 100, 100))); + EXPECT_EQ(0xFF000000u, GetPixelColor(bmp.get(), 15, 185)); + } + + // Round-trip: the saved file must still carry the /C1 resource. + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + ASSERT_TRUE(OpenSavedDocument()); + FPDF_PAGE saved_page = LoadSavedPage(0); + ASSERT_TRUE(saved_page); + { + ScopedFPDFBitmap bmp = RenderPageOnWhite(saved_page, 200, 200); + EXPECT_TRUE(is_reddish(GetPixelColor(bmp.get(), 100, 100))); + EXPECT_EQ(0xFF000000u, GetPixelColor(bmp.get(), 15, 185)); + } + CloseSavedPage(saved_page); +} + +TEST_F(FPDFAnnotEmbedderTest, ApplyRedactionOnNeverParsedPageRemovesText) { + ASSERT_TRUE(OpenDocument("redact_text_middle.pdf")); + ScopedPage page = LoadScopedPage(0); + ASSERT_TRUE(page); + + // Deliberately touch NOTHING that would parse the page first — a headless + // worker page looks exactly like this. The apply itself must parse; an + // unparsed apply would silently remove nothing. + { + ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(annot); + ASSERT_TRUE(EPDFAnnot_ApplyRedaction(page.get(), annot.get(), nullptr)); + } + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + + ASSERT_TRUE(OpenSavedDocument()); + FPDF_PAGE saved_page = LoadSavedPage(0); + ASSERT_TRUE(saved_page); + std::wstring after = ExtractPageText(saved_page); + EXPECT_EQ(std::wstring::npos, after.find(L"secret")); + EXPECT_NE(std::wstring::npos, after.find(L"hello")); + EXPECT_NE(std::wstring::npos, after.find(L"world")); + CloseSavedPage(saved_page); +} + +TEST_F(FPDFAnnotEmbedderTest, GenerateRedactAppearanceBakesLabelIntoOverlay) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 200, 200)); + ASSERT_TRUE(page); + + ScopedFPDFAnnotation annot = + CreateRedactAnnot(page.get(), {20, 150, 180, 50}); + ASSERT_TRUE(annot); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), + FPDFANNOT_COLORTYPE_InteriorColor, + /*R=*/0, /*G=*/0, /*B=*/0, /*A=*/255)); + ScopedFPDFWideString text = GetFPDFWideString(L"SECRET"); + ASSERT_TRUE(EPDFAnnot_SetOverlayText(annot.get(), text.get())); + ASSERT_TRUE(EPDFAnnot_SetDefaultAppearance(annot.get(), FPDF_FONT_HELVETICA, + 12.0f, /*R=*/255, /*G=*/255, + /*B=*/255)); + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + + // The rollover appearance shares the final overlay stream with /RO, so the + // baked marking-stage hover preview must contain both the fill and the + // label text ops. + unsigned long length_bytes = FPDFAnnot_GetAP( + annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER, nullptr, 0); + ASSERT_GT(length_bytes, 0u); + std::vector buffer = GetFPDFWideStringBuffer(length_bytes); + EXPECT_EQ(length_bytes, + FPDFAnnot_GetAP(annot.get(), FPDF_ANNOT_APPEARANCEMODE_ROLLOVER, + buffer.data(), length_bytes)); + std::wstring rollover = GetPlatformWString(buffer.data()); + EXPECT_NE(std::wstring::npos, rollover.find(L" re f")); // /IC fill + EXPECT_NE(std::wstring::npos, rollover.find(L"Tj")); // label text +} + TEST_F(FPDFAnnotEmbedderTest, PolygonAnnotation) { ASSERT_TRUE(OpenDocument("polygon_annot.pdf")); ScopedPage page = LoadScopedPage(0); @@ -4921,3 +5304,79 @@ TEST_F(FPDFAnnotEmbedderTest, SharedFormXObjectMatrix) { EXPECT_FLOAT_EQ(-10.395f, matrix2.e); EXPECT_FLOAT_EQ(-5.42212f, matrix2.f); } + +TEST_F(FPDFAnnotEmbedderTest, GenerateFileAttachmentAppearance) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FILEATTACHMENT)); + ASSERT_TRUE(annot); + + const FS_RECTF rect{50.0f, 130.0f, 90.0f, 50.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ASSERT_TRUE(FPDFAnnot_SetColor(annot.get(), FPDFANNOT_COLORTYPE_Color, 255, 0, + 0, 255)); + ASSERT_TRUE( + EPDFAnnot_SetName(annot.get(), FPDF_ANNOT_NAME_File_Paperclip)); + + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + + // The paperclip is a stroked wire glyph. + std::wstring appearance = GetNormalAppearance(annot.get()); + EXPECT_THAT(appearance, HasSubstr(L"S\n")); + + // Like the note icon, the /Rect is forced to the fixed 20x20 icon box + // anchored at the original bottom-left corner. + FS_RECTF actual_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(annot.get(), &actual_rect)); + EXPECT_FLOAT_EQ(50.0f, actual_rect.left); + EXPECT_FLOAT_EQ(50.0f, actual_rect.bottom); + EXPECT_FLOAT_EQ(70.0f, actual_rect.right); + EXPECT_FLOAT_EQ(70.0f, actual_rect.top); +} + +TEST_F(FPDFAnnotEmbedderTest, GenerateFileAttachmentAppearancePerIcon) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 400, 400)); + ASSERT_TRUE(page); + + auto make_appearance = [&](FPDF_ANNOT_NAME icon) { + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_FILEATTACHMENT)); + EXPECT_TRUE(annot); + const FS_RECTF rect{10.0f, 30.0f, 30.0f, 10.0f}; + EXPECT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + if (icon != FPDF_ANNOT_NAME_UNKNOWN) { + EXPECT_TRUE(EPDFAnnot_SetName(annot.get(), icon)); + } + EXPECT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + return GetNormalAppearance(annot.get()); + }; + + const std::wstring pushpin = make_appearance(FPDF_ANNOT_NAME_File_PushPin); + const std::wstring paperclip = + make_appearance(FPDF_ANNOT_NAME_File_Paperclip); + const std::wstring graph = make_appearance(FPDF_ANNOT_NAME_File_Graph); + const std::wstring tag = make_appearance(FPDF_ANNOT_NAME_File_Tag); + + // Each icon draws a distinct glyph. + EXPECT_NE(pushpin, paperclip); + EXPECT_NE(pushpin, graph); + EXPECT_NE(pushpin, tag); + EXPECT_NE(paperclip, graph); + EXPECT_NE(paperclip, tag); + EXPECT_NE(graph, tag); + + // Filled glyphs paint fill+stroke; the paperclip wire only strokes. + EXPECT_THAT(pushpin, HasSubstr(L"B\n")); + EXPECT_THAT(graph, HasSubstr(L"B*\n")); + EXPECT_THAT(tag, HasSubstr(L"B*\n")); + EXPECT_THAT(paperclip, HasSubstr(L"S\n")); + + // An absent /Name renders the PushPin glyph (the ISO 32000 default). + const std::wstring default_icon = make_appearance(FPDF_ANNOT_NAME_UNKNOWN); + EXPECT_EQ(pushpin, default_icon); +} diff --git a/fpdfsdk/fpdf_doc_embeddertest.cpp b/fpdfsdk/fpdf_doc_embeddertest.cpp index 1c5448da15..1ae6e07161 100644 --- a/fpdfsdk/fpdf_doc_embeddertest.cpp +++ b/fpdfsdk/fpdf_doc_embeddertest.cpp @@ -150,10 +150,7 @@ TEST_F(FPDFDocEmbedderTest, DestGetPageObjectNumber) { const unsigned int page_1_object_number = EPDFDoc_GetPageObjectNumberByIndex(document(), 1); - const unsigned int page_11_object_number = - EPDFDoc_GetPageObjectNumberByIndex(document(), 11); ASSERT_GT(page_1_object_number, 0u); - ASSERT_GT(page_11_object_number, 0u); // Numeric page index in the Dests NameTree. FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); @@ -168,11 +165,12 @@ TEST_F(FPDFDocEmbedderTest, DestGetPageObjectNumber) { EXPECT_EQ(page_1_object_number, EPDFDest_GetPageObjectNumber(document(), dest)); - // Numeric page index in the legacy Dests dictionary. + // Out-of-range numeric page index in the legacy Dests dictionary. The + // compatibility index API reports the stored 11, but there is no visible + // page object at that index in this two-page fixture. dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); ASSERT_TRUE(dest); - EXPECT_EQ(page_11_object_number, - EPDFDest_GetPageObjectNumber(document(), dest)); + EXPECT_EQ(0u, EPDFDest_GetPageObjectNumber(document(), dest)); // Invalid object reference in the Dests NameTree. dest = FPDF_GetNamedDestByName(document(), "LastAlternate"); diff --git a/testing/resources/two_plane_form.pdf b/testing/resources/two_plane_form.pdf new file mode 100644 index 0000000000000000000000000000000000000000..210d6cc235d706a59f73979277b441efb784b2da GIT binary patch literal 2180 zcmdT_&2G~`5H3;=$WJksNJY@@t{o?~R7FY}tU_rUC4nMEJ@{uGT%~s8Y*66NTX5n< zxbY$!cm!^UnT?&K4x&Y%N?4msGM=ArXTF)O^}61^IIxV`=kK3>7y>wC!Ig1%2&^6E znV03)V4|=OtmlvA46Nm!;k&5>cH}F6l8vF&GGrQ&A?cP5yhKi-8H}K=ZEU??0y~p3 zYEP%q&;2w+mnxsj4Hp!lba9l;Qw0LpNuoV9N*~MkOGxYJ6sR<9_kd1urgs5NZOP8# z7##hx)xwx~$^mF0^AINUhQK;11$KHucBIgkp~5o=u9pMC0X)NC9w?oHizFIL1#Ad= zDx1cbuMxjI2nFtsP^xv>X_}$Rt7W7$T*^oZx7&t2b}T1v5#BJy7h^PEVHz$rfmj?| z4t4VmK-4dQtN~CuO8^=qRm;`s!Shnp@u){xs${BWAc!4Egi{$MekWU?E-9IO`9am5 zpQC2Uk-nT|^PDPNq;g%fjdD|AN(`N~R|oTe9*Kb33^{PaAM52=IKa%0Fl^UDT`Jb9 zESk7Q`d^<1S5!pyLZ)N&2230MCKDxd{GRwqc4e4Fnu0TxOaIzfe0)6Qz2ghM+p*xu z^Owhihr2ubUv@tb%?q7^@ImEZNOCC5^$wQMA7NgBx2do2~I+~EBhH5YIA-g14I0qKO!>LeMG;NgHEOk|=brHs+gMLz literal 0 HcmV?d00001 From 6208a24c1f70b27cf913a02e9eac5e0ab51e42e0 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 29 Jul 2026 01:02:34 +0300 Subject: [PATCH 55/56] Add document view scope & overlay epoch caching Introduce CPDF_DocumentViewScope and overlay-aware caching to support layer/view-safe reference resolution. Add GetOverlayEpoch() to CPDF_Document and override in layer docs; update CPDF_BaseDocument to consult the scope when resolving non-const indirect objects and to track live layers in DCHECK builds. Update many page/form/annotation holders (CPDF_PageObjectHolder, CPDF_Page, CPDF_Form, CPDF_AnnotContext) to refresh cached dicts/streams/resources when the document overlay epoch changes (new epoch fields, refresh helpers, RebindFormStream, ResetParsedContent, etc.). Update BUILD.gn and unit tests to reflect the new behavior. Overall aim: make resolution path-independent across base/layer views and invalidate caches cleanly when the effective overlay identity changes. --- core/fpdfapi/page/cpdf_annotcontext.cpp | 50 ++++ core/fpdfapi/page/cpdf_annotcontext.h | 10 +- core/fpdfapi/page/cpdf_form.cpp | 74 ++++- core/fpdfapi/page/cpdf_form.h | 8 +- core/fpdfapi/page/cpdf_page.cpp | 41 +++ core/fpdfapi/page/cpdf_page.h | 3 + core/fpdfapi/page/cpdf_pageobjectholder.cpp | 60 +++- core/fpdfapi/page/cpdf_pageobjectholder.h | 14 +- core/fpdfapi/parser/BUILD.gn | 2 + core/fpdfapi/parser/cpdf_base_document.cpp | 49 ++++ core/fpdfapi/parser/cpdf_base_document.h | 23 ++ core/fpdfapi/parser/cpdf_document.cpp | 8 + core/fpdfapi/parser/cpdf_document.h | 10 + .../parser/cpdf_document_view_scope.cpp | 83 ++++++ .../fpdfapi/parser/cpdf_document_view_scope.h | 44 +++ core/fpdfapi/parser/cpdf_layer_document.cpp | 28 +- core/fpdfapi/parser/cpdf_layer_document.h | 4 + .../parser/cpdf_layer_document_unittest.cpp | 218 ++++++++++++++ core/fpdfdoc/cpdf_annotlist.cpp | 5 + core/fpdfdoc/cpdf_linklist.cpp | 6 + core/fpdfdoc/cpdf_linklist.h | 1 + fpdfsdk/cpdfsdk_helpers.cpp | 21 ++ fpdfsdk/cpdfsdk_helpers.h | 52 ++++ fpdfsdk/epdf_action.cpp | 175 ++++++++---- fpdfsdk/epdf_action_embeddertest.cpp | 33 +++ fpdfsdk/epdf_action_helpers.h | 4 +- fpdfsdk/epdf_form.cpp | 79 ++++-- fpdfsdk/epdf_form_embeddertest.cpp | 21 ++ fpdfsdk/fpdf_annot.cpp | 86 ++++-- fpdfsdk/fpdf_attachment.cpp | 28 +- fpdfsdk/fpdf_doc.cpp | 40 ++- fpdfsdk/fpdf_javascript.cpp | 17 +- fpdfsdk/fpdf_progressive.cpp | 10 +- fpdfsdk/fpdf_text.cpp | 5 +- fpdfsdk/fpdf_view.cpp | 43 ++- fpdfsdk/fpdf_view_embeddertest.cpp | 265 ++++++++++++++++++ public/epdf_action.h | 14 +- 37 files changed, 1453 insertions(+), 181 deletions(-) create mode 100644 core/fpdfapi/parser/cpdf_document_view_scope.cpp create mode 100644 core/fpdfapi/parser/cpdf_document_view_scope.h diff --git a/core/fpdfapi/page/cpdf_annotcontext.cpp b/core/fpdfapi/page/cpdf_annotcontext.cpp index 75fa276107..259e60d52d 100644 --- a/core/fpdfapi/page/cpdf_annotcontext.cpp +++ b/core/fpdfapi/page/cpdf_annotcontext.cpp @@ -13,6 +13,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/check.h" @@ -27,12 +28,14 @@ CPDF_AnnotContext::CPDF_AnnotContext(RetainPtr pAnnotDict, DCHECK(annot_dict_); DCHECK(page_); DCHECK(page_->AsPDFPage()); + annot_dict_epoch_ = page_->GetDocument()->GetOverlayEpoch(); } CPDF_AnnotContext::~CPDF_AnnotContext() = default; void CPDF_AnnotContext::SetForm(RetainPtr pStream) { CHECK(pStream); + CPDF_DocumentViewScope document_view(page_->GetDocument()); annot_form_ = std::make_unique( page_->GetDocument(), pdfium::WrapRetain(const_cast( @@ -50,6 +53,8 @@ void CPDF_AnnotContext::SetForm(RetainPtr pStream) { } RetainPtr CPDF_AnnotContext::GetMutableAnnotDict() { + RefreshAnnotDictIfNeeded(); + CPDF_Page* page = page_ ? page_->AsPDFPage() : nullptr; CPDF_Document* doc = page ? page->GetDocument() : nullptr; if (!doc) { @@ -62,15 +67,60 @@ RetainPtr CPDF_AnnotContext::GetMutableAnnotDict() { if (live && live.Get() != annot_dict_.Get()) { annot_dict_ = pdfium::WrapRetain(live->AsMutableDictionary()); } + annot_dict_epoch_ = doc->GetOverlayEpoch(); return annot_dict_; } if (annot_dict_->IsFrozen()) { EnsureMutableBackingForAnnotDict(); } + annot_dict_epoch_ = doc->GetOverlayEpoch(); return annot_dict_; } +const CPDF_Dictionary* CPDF_AnnotContext::GetAnnotDict() const { + RefreshAnnotDictIfNeeded(); + return annot_dict_.Get(); +} + +void CPDF_AnnotContext::RefreshAnnotDictIfNeeded() const { + CPDF_Page* page = page_ ? page_->AsPDFPage() : nullptr; + CPDF_Document* doc = page ? page->GetDocument() : nullptr; + if (!doc) { + return; + } + + const uint64_t current_epoch = doc->GetOverlayEpoch(); + if (annot_dict_epoch_ == current_epoch) { + return; + } + + CPDF_DocumentViewScope document_view(doc); + const uint32_t objnum = annot_dict_->GetObjNum(); + if (objnum != 0) { + RetainPtr effective = doc->GetIndirectObject(objnum); + const CPDF_Dictionary* effective_dict = + effective ? effective->AsDictionary() : nullptr; + if (effective_dict && effective_dict != annot_dict_.Get()) { + annot_dict_ = pdfium::WrapRetain( + const_cast(effective_dict)); + annot_form_.reset(); + } + } else if (annot_index_ >= 0) { + RetainPtr annots = page->GetAnnotsArray(); + RetainPtr effective = + annots && static_cast(annot_index_) < annots->size() + ? annots->GetDictAt(static_cast(annot_index_)) + : nullptr; + if (effective && effective.Get() != annot_dict_.Get()) { + annot_dict_ = + pdfium::WrapRetain(const_cast(effective.Get())); + annot_form_.reset(); + } + } + annot_dict_epoch_ = current_epoch; +} + void CPDF_AnnotContext::EnsureMutableBackingForAnnotDict() { CHECK_GE(annot_index_, 0); CPDF_Page* page = page_->AsPDFPage(); diff --git a/core/fpdfapi/page/cpdf_annotcontext.h b/core/fpdfapi/page/cpdf_annotcontext.h index b28c9948c7..d156f293df 100644 --- a/core/fpdfapi/page/cpdf_annotcontext.h +++ b/core/fpdfapi/page/cpdf_annotcontext.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFAPI_PAGE_CPDF_ANNOTCONTEXT_H_ #define CORE_FPDFAPI_PAGE_CPDF_ANNOTCONTEXT_H_ +#include + #include #include "core/fxcrt/retain_ptr.h" @@ -30,7 +32,7 @@ class CPDF_AnnotContext { // Never nullptr. RetainPtr GetMutableAnnotDict(); - const CPDF_Dictionary* GetAnnotDict() const { return annot_dict_.Get(); } + const CPDF_Dictionary* GetAnnotDict() const; // Never nullptr. IPDF_Page* GetPage() const { return page_; } @@ -40,12 +42,14 @@ class CPDF_AnnotContext { int GetAnnotIndex() const { return annot_index_; } private: + void RefreshAnnotDictIfNeeded() const; void EnsureMutableBackingForAnnotDict(); - std::unique_ptr annot_form_; - RetainPtr annot_dict_; + mutable std::unique_ptr annot_form_; + mutable RetainPtr annot_dict_; UnownedPtr const page_; const int annot_index_ = -1; + mutable uint64_t annot_dict_epoch_ = 0; }; #endif // CORE_FPDFAPI_PAGE_CPDF_ANNOTCONTEXT_H_ diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp index 76daf765ba..e64b586d02 100644 --- a/core/fpdfapi/page/cpdf_form.cpp +++ b/core/fpdfapi/page/cpdf_form.cpp @@ -15,6 +15,7 @@ #include "core/fpdfapi/page/cpdf_pageobjectholder.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcrt/check_op.h" @@ -52,12 +53,14 @@ CPDF_Form::CPDF_Form(CPDF_Document* doc, pdfium::WrapRetain( const_cast(pFormStream->GetDict().Get())), pPageResources, - pdfium::WrapRetain(const_cast(ChooseResourcesDict( - pFormStream->GetDict()->GetDictFor("Resources").Get(), - pParentResources, - pPageResources.Get())))), + nullptr), + fallback_resources_( + pParentResources ? pdfium::WrapRetain(pParentResources) + : std::move(pPageResources)), form_stream_(std::move(pFormStream)) { - LoadTransparencyInfo(); + CPDF_DocumentViewScope document_view(doc); + RebindFormStream(form_stream_, /*reset_parsed_content=*/false); + form_stream_epoch_ = doc ? doc->GetOverlayEpoch() : 0; } CPDF_Form::~CPDF_Form() = default; @@ -80,13 +83,16 @@ void CPDF_Form::ParseContentInternal(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, CPDF_Type3Char* pType3Char, RecursionState* recursion_state) { + CPDF_DocumentViewScope document_view(GetDocument()); + RetainPtr stream = GetStream(); + if (GetParseState() == ParseState::kParsed) { return; } if (GetParseState() == ParseState::kNotParsed) { StartParse(std::make_unique( - GetStream(), this, pGraphicStates, pParentMatrix, pType3Char, + std::move(stream), this, pGraphicStates, pParentMatrix, pType3Char, recursion_state ? recursion_state : &recursion_state_)); } DCHECK_EQ(GetParseState(), ParseState::kParsing); @@ -125,12 +131,17 @@ RetainPtr CPDF_Form::GetMutableFormStream() { return form_stream_; } + // Rebind a cached base stream to the effective layer object before asking + // the document for a mutable version. + (void)GetStream(); const uint32_t objnum = form_stream_->GetObjNum(); DCHECK(objnum); RetainPtr live = doc->GetMutableIndirectObject(objnum); if (live && live.Get() != form_stream_.Get()) { - form_stream_ = pdfium::WrapRetain(live->AsMutableStream()); + RebindFormStream(pdfium::WrapRetain(live->AsMutableStream()), + /*reset_parsed_content=*/false); } + form_stream_epoch_ = doc->GetOverlayEpoch(); return form_stream_; } @@ -142,9 +153,58 @@ void CPDF_Form::EnsureMutableBackingObjectForDict() { } RetainPtr CPDF_Form::GetStream() const { + CPDF_Document* doc = GetDocument(); + if (!doc || !form_stream_) { + return form_stream_; + } + + const uint64_t current_epoch = doc->GetOverlayEpoch(); + if (form_stream_epoch_ == current_epoch) { + return form_stream_; + } + form_stream_epoch_ = current_epoch; + + const uint32_t objnum = form_stream_->GetObjNum(); + if (objnum != 0) { + RetainPtr effective = doc->GetIndirectObject(objnum); + const CPDF_Stream* effective_stream = + effective ? effective->AsStream() : nullptr; + if (effective_stream && effective_stream != form_stream_.Get()) { + const_cast(this)->RebindFormStream( + pdfium::WrapRetain(const_cast(effective_stream)), + /*reset_parsed_content=*/true); + } + } return form_stream_; } +void CPDF_Form::RebindFormStream(RetainPtr stream, + bool reset_parsed_content) { + CHECK(stream); + form_stream_ = std::move(stream); + dict_ = form_stream_->GetMutableDict(); + + RetainPtr stream_resources = + dict_->GetDictFor("Resources"); + resources_ = stream_resources + ? pdfium::WrapRetain( + const_cast(stream_resources.Get())) + : fallback_resources_; + + const uint64_t current_epoch = + GetDocument() ? GetDocument()->GetOverlayEpoch() : 0; + dict_epoch_ = current_epoch; + resources_epoch_ = current_epoch; + + if (reset_parsed_content) { + ResetParsedContent(); + recursion_state_.parsed_set.clear(); + } + + transparency_ = CPDF_Transparency(); + LoadTransparencyInfo(); +} + std::optional, CFX_Matrix>> CPDF_Form::GetBitmapAndMatrixFromSoleImageOfForm() const { // TODO(crbug.com/377660088): Determine if there is a case where only a single diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index 80ab06eeec..a95a0f6405 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFAPI_PAGE_CPDF_FORM_H_ #define CORE_FPDFAPI_PAGE_CPDF_FORM_H_ +#include + #include #include @@ -68,13 +70,17 @@ class CPDF_Form final : public CPDF_PageObjectHolder, // CPDF_PageObjectHolder: void EnsureMutableBackingObjectForDict() override; + void RebindFormStream(RetainPtr stream, + bool reset_parsed_content); void ParseContentInternal(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, CPDF_Type3Char* pType3Char, RecursionState* recursion_state); RecursionState recursion_state_; - RetainPtr form_stream_; + RetainPtr const fallback_resources_; + mutable RetainPtr form_stream_; + mutable uint64_t form_stream_epoch_ = 0; }; #endif // CORE_FPDFAPI_PAGE_CPDF_FORM_H_ diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp index 2490f624a4..dbe40e3afd 100644 --- a/core/fpdfapi/page/cpdf_page.cpp +++ b/core/fpdfapi/page/cpdf_page.cpp @@ -16,6 +16,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fxcrt/check.h" #include "core/fxcrt/check_op.h" @@ -26,6 +27,8 @@ CPDF_Page::CPDF_Page(CPDF_Document* document, : CPDF_PageObjectHolder(document, std::move(pPageDict), nullptr, nullptr), page_size_(100, 100), pdf_document_(document) { + CPDF_DocumentViewScope document_view(document); + // Cannot initialize |resources_| and |page_resources_| via the // CPDF_PageObjectHolder ctor because GetPageAttr() requires // CPDF_PageObjectHolder to finish initializing first. @@ -66,7 +69,19 @@ bool CPDF_Page::IsPage() const { return true; } +RetainPtr CPDF_Page::GetResources() const { + RefreshResourcesIfNeeded(); + return CPDF_PageObjectHolder::GetResources(); +} + +RetainPtr CPDF_Page::GetPageResources() const { + RefreshResourcesIfNeeded(); + return CPDF_PageObjectHolder::GetPageResources(); +} + void CPDF_Page::ParseContent() { + CPDF_DocumentViewScope document_view(GetDocument()); + if (GetParseState() == ParseState::kParsed) { return; } @@ -98,7 +113,33 @@ void CPDF_Page::EnsureMutableBackingObjectForPageResources() { page_resources_ = resources_; } +void CPDF_Page::RefreshResourcesIfNeeded() const { + CPDF_Document* document = GetDocument(); + if (!document) { + return; + } + + const uint64_t current_epoch = document->GetOverlayEpoch(); + if (resources_epoch_ == current_epoch && + page_resources_epoch_ == current_epoch) { + return; + } + + RetainPtr page_attr = + GetPageAttr(pdfium::page_object::kResources); + RetainPtr effective_resources = + page_attr ? page_attr->GetDict() : nullptr; + auto* mutable_this = const_cast(this); + mutable_this->resources_ = pdfium::WrapRetain( + const_cast(effective_resources.Get())); + mutable_this->page_resources_ = mutable_this->resources_; + resources_epoch_ = current_epoch; + page_resources_epoch_ = current_epoch; +} + RetainPtr CPDF_Page::GetPageAttr(ByteStringView name) const { + CPDF_DocumentViewScope document_view(GetDocument()); + std::set> visited; RetainPtr pPageDict = GetDict(); while (pPageDict && !pdfium::Contains(visited, pPageDict)) { diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h index ae9b829f3c..798e2d3123 100644 --- a/core/fpdfapi/page/cpdf_page.h +++ b/core/fpdfapi/page/cpdf_page.h @@ -70,6 +70,8 @@ class CPDF_Page final : public IPDF_Page, public CPDF_PageObjectHolder { // CPDF_PageObjectHolder: bool IsPage() const override; + RetainPtr GetResources() const override; + RetainPtr GetPageResources() const override; void ParseContent(); const CFX_SizeF& GetPageSize() const { return page_size_; } @@ -109,6 +111,7 @@ class CPDF_Page final : public IPDF_Page, public CPDF_PageObjectHolder { // CPDF_PageObjectHolder: void EnsureMutableBackingObjectForResources() override; void EnsureMutableBackingObjectForPageResources() override; + void RefreshResourcesIfNeeded() const; RetainPtr GetMutablePageAttr(ByteStringView name); RetainPtr GetPageAttr(ByteStringView name) const; diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/core/fpdfapi/page/cpdf_pageobjectholder.cpp index 4e44212c61..609431c3a3 100644 --- a/core/fpdfapi/page/cpdf_pageobjectholder.cpp +++ b/core/fpdfapi/page/cpdf_pageobjectholder.cpp @@ -51,10 +51,19 @@ CPDF_PageObjectHolder::CPDF_PageObjectHolder( dict_(std::move(dict)), document_(doc) { DCHECK(dict_); + const uint64_t overlay_epoch = document_ ? document_->GetOverlayEpoch() : 0; + page_resources_epoch_ = overlay_epoch; + resources_epoch_ = overlay_epoch; + dict_epoch_ = overlay_epoch; } CPDF_PageObjectHolder::~CPDF_PageObjectHolder() = default; +void CPDF_PageObjectHolder::SetResources(RetainPtr dict) { + resources_ = std::move(dict); + resources_epoch_ = document_ ? document_->GetOverlayEpoch() : 0; +} + bool CPDF_PageObjectHolder::IsPage() const { return false; } @@ -68,15 +77,21 @@ RetainPtr CPDF_PageObjectHolder::GetDict() const { return dict_; } + const uint64_t current_epoch = document_->GetOverlayEpoch(); + if (dict_epoch_ == current_epoch) { + return dict_; + } + dict_epoch_ = current_epoch; + const uint32_t objnum = dict_->GetObjNum(); if (objnum == 0) { return dict_; } - RetainPtr live = document_->FindPromotedObject(objnum); + RetainPtr live = document_->GetIndirectObject(objnum); if (live && live.Get() != dict_.Get()) { const_cast(this)->dict_ = - pdfium::WrapRetain(live->AsMutableDictionary()); + pdfium::WrapRetain(const_cast(live->AsDictionary())); } return dict_; } @@ -92,12 +107,14 @@ RetainPtr CPDF_PageObjectHolder::GetMutableDict() { if (live && live.Get() != dict_.Get()) { dict_ = pdfium::WrapRetain(live->AsMutableDictionary()); } + dict_epoch_ = document_->GetOverlayEpoch(); return dict_; } if (dict_->IsFrozen()) { EnsureMutableBackingObjectForDict(); } + dict_epoch_ = document_->GetOverlayEpoch(); return dict_; } @@ -106,15 +123,21 @@ RetainPtr CPDF_PageObjectHolder::GetResources() const { return resources_; } + const uint64_t current_epoch = document_->GetOverlayEpoch(); + if (resources_epoch_ == current_epoch) { + return resources_; + } + resources_epoch_ = current_epoch; + const uint32_t objnum = resources_->GetObjNum(); if (objnum == 0) { return resources_; } - RetainPtr live = document_->FindPromotedObject(objnum); + RetainPtr live = document_->GetIndirectObject(objnum); if (live && live.Get() != resources_.Get()) { const_cast(this)->resources_ = - pdfium::WrapRetain(live->AsMutableDictionary()); + pdfium::WrapRetain(const_cast(live->AsDictionary())); } return resources_; } @@ -130,12 +153,14 @@ RetainPtr CPDF_PageObjectHolder::GetMutableResources() { if (live && live.Get() != resources_.Get()) { resources_ = pdfium::WrapRetain(live->AsMutableDictionary()); } + resources_epoch_ = document_->GetOverlayEpoch(); return resources_; } if (resources_->IsFrozen()) { EnsureMutableBackingObjectForResources(); } + resources_epoch_ = document_->GetOverlayEpoch(); return resources_; } @@ -145,15 +170,21 @@ RetainPtr CPDF_PageObjectHolder::GetPageResources() return page_resources_; } + const uint64_t current_epoch = document_->GetOverlayEpoch(); + if (page_resources_epoch_ == current_epoch) { + return page_resources_; + } + page_resources_epoch_ = current_epoch; + const uint32_t objnum = page_resources_->GetObjNum(); if (objnum == 0) { return page_resources_; } - RetainPtr live = document_->FindPromotedObject(objnum); + RetainPtr live = document_->GetIndirectObject(objnum); if (live && live.Get() != page_resources_.Get()) { const_cast(this)->page_resources_ = - pdfium::WrapRetain(live->AsMutableDictionary()); + pdfium::WrapRetain(const_cast(live->AsDictionary())); } return page_resources_; } @@ -169,12 +200,14 @@ RetainPtr CPDF_PageObjectHolder::GetMutablePageResources() { if (live && live.Get() != page_resources_.Get()) { page_resources_ = pdfium::WrapRetain(live->AsMutableDictionary()); } + page_resources_epoch_ = document_->GetOverlayEpoch(); return page_resources_; } if (page_resources_->IsFrozen()) { EnsureMutableBackingObjectForPageResources(); } + page_resources_epoch_ = document_->GetOverlayEpoch(); return page_resources_; } @@ -217,6 +250,21 @@ void CPDF_PageObjectHolder::ContinueParse(PauseIndicatorIface* pPause) { parser_.reset(); } +void CPDF_PageObjectHolder::ResetParsedContent() { + parser_.reset(); + parse_state_ = ParseState::kNotParsed; + page_object_list_.clear(); + all_ctms_.clear(); + mask_bounding_boxes_.clear(); + dirty_streams_.clear(); + graphics_map_.clear(); + fonts_map_.clear(); + fonts_by_objnum_.clear(); + colorspace_map_.clear(); + all_removed_resources_map_.clear(); + background_alpha_needed_ = false; +} + void CPDF_PageObjectHolder::AddImageMaskBoundingBox(const CFX_FloatRect& box) { mask_bounding_boxes_.push_back(box); } diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h index 5ac3a6cc77..af4cd30732 100644 --- a/core/fpdfapi/page/cpdf_pageobjectholder.h +++ b/core/fpdfapi/page/cpdf_pageobjectholder.h @@ -89,14 +89,12 @@ class CPDF_PageObjectHolder { ParseState GetParseState() const { return parse_state_; } CPDF_Document* GetDocument() const { return document_; } - RetainPtr GetDict() const; + virtual RetainPtr GetDict() const; RetainPtr GetMutableDict(); - RetainPtr GetResources() const; + virtual RetainPtr GetResources() const; RetainPtr GetMutableResources(); - void SetResources(RetainPtr dict) { - resources_ = std::move(dict); - } - RetainPtr GetPageResources() const; + void SetResources(RetainPtr dict); + virtual RetainPtr GetPageResources() const; RetainPtr GetMutablePageResources(); size_t GetPageObjectCount() const { return page_object_list_.size(); } size_t GetActivePageObjectCount() const; @@ -156,6 +154,7 @@ class CPDF_PageObjectHolder { protected: void LoadTransparencyInfo(); + void ResetParsedContent(); virtual void EnsureMutableBackingObjectForDict(); virtual void EnsureMutableBackingObjectForResources(); virtual void EnsureMutableBackingObjectForPageResources(); @@ -163,6 +162,9 @@ class CPDF_PageObjectHolder { RetainPtr page_resources_; RetainPtr resources_; RetainPtr dict_; + mutable uint64_t page_resources_epoch_ = 0; + mutable uint64_t resources_epoch_ = 0; + mutable uint64_t dict_epoch_ = 0; std::map graphics_map_; std::map fonts_map_; std::map fonts_by_objnum_; diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn index a66441b47e..55f180fed5 100644 --- a/core/fpdfapi/parser/BUILD.gn +++ b/core/fpdfapi/parser/BUILD.gn @@ -29,6 +29,8 @@ source_set("parser") { "cpdf_dictionary.h", "cpdf_document.cpp", "cpdf_document.h", + "cpdf_document_view_scope.cpp", + "cpdf_document_view_scope.h", "cpdf_encryptor.cpp", "cpdf_encryptor.h", "cpdf_flateencoder.cpp", diff --git a/core/fpdfapi/parser/cpdf_base_document.cpp b/core/fpdfapi/parser/cpdf_base_document.cpp index 92abccff44..aa06a1aaaf 100644 --- a/core/fpdfapi/parser/cpdf_base_document.cpp +++ b/core/fpdfapi/parser/cpdf_base_document.cpp @@ -15,6 +15,8 @@ #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" +#include "core/fpdfapi/parser/cpdf_layer_document.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" @@ -152,3 +154,50 @@ RetainPtr CPDF_BaseDocument::GetFrozenObjectForLayer( uint32_t objnum) const { return GetIndirectObject(objnum); } + +#if DCHECK_IS_ON() +void CPDF_BaseDocument::RegisterLiveLayer( + const CPDF_LayerDocument* layer) { + DCHECK(layer); + DCHECK_EQ(layer->GetBaseDocument(), this); + DCHECK_EQ(std::find(live_layers_.begin(), live_layers_.end(), layer), + live_layers_.end()); + live_layers_.push_back(layer); +} + +void CPDF_BaseDocument::UnregisterLiveLayer( + const CPDF_LayerDocument* layer) { + auto it = std::find(live_layers_.begin(), live_layers_.end(), layer); + DCHECK(it != live_layers_.end()); + live_layers_.erase(it); +} + +bool CPDF_BaseDocument::IsObjectPromotedInAnyLiveLayer( + uint32_t objnum) const { + return std::any_of( + live_layers_.begin(), live_layers_.end(), + [objnum](const CPDF_LayerDocument* layer) { + return layer->FindPromotedObject(objnum) != nullptr; + }); +} +#endif + +CPDF_Object* CPDF_BaseDocument::GetOrParseIndirectObjectInternal( + uint32_t objnum) { + const CPDF_LayerDocument* layer = + CPDF_DocumentViewScope::GetCurrentLayerForBase(this); + if (layer && layer->HasPromotedObjects()) { + RetainPtr promoted = layer->FindPromotedObject(objnum); + if (promoted) { + return promoted.Get(); + } + } +#if DCHECK_IS_ON() + // A promoted object resolved without an effective or explicitly frozen view + // is path-dependent: the answer silently depends on which holder owns the + // reference that happened to lead here. + DCHECK(layer || !IsObjectPromotedInAnyLiveLayer(objnum) || + CPDF_DocumentViewScope::IsFrozenForBase(this)); +#endif + return CPDF_Document::GetOrParseIndirectObjectInternal(objnum); +} diff --git a/core/fpdfapi/parser/cpdf_base_document.h b/core/fpdfapi/parser/cpdf_base_document.h index abd434efe4..ce3ac9fa66 100644 --- a/core/fpdfapi/parser/cpdf_base_document.h +++ b/core/fpdfapi/parser/cpdf_base_document.h @@ -8,12 +8,15 @@ #include #include +#include #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/check.h" #include "core/fxcrt/fx_types.h" #include "core/fxcrt/retain_ptr.h" class IFX_SeekableReadStream; +class CPDF_LayerDocument; class CPDF_BaseDocument final : public CPDF_Document, public Retainable { public: @@ -28,16 +31,36 @@ class CPDF_BaseDocument final : public CPDF_Document, public Retainable { FX_FILESIZE GetLayerAppendBaseOffset() const override { return layer_append_base_offset_; } + const CPDF_BaseDocument* GetBaseDocumentForViewScope() const override { + return this; + } const std::array& GetRawBaseSha256() const { return raw_base_sha256_; } +#if DCHECK_IS_ON() + void RegisterLiveLayer(const CPDF_LayerDocument* layer); + void UnregisterLiveLayer(const CPDF_LayerDocument* layer); +#endif + private: CPDF_BaseDocument(); ~CPDF_BaseDocument() override; bool CacheBaseIdentity(); + // CPDF_IndirectObjectHolder: + // This override is intentionally limited to the non-const reference + // resolution path. Const base lookups must remain frozen so layer promotion + // always clones from the shared base rather than resolving back into the + // layer overlay. + CPDF_Object* GetOrParseIndirectObjectInternal(uint32_t objnum) override; + +#if DCHECK_IS_ON() + bool IsObjectPromotedInAnyLiveLayer(uint32_t objnum) const; + std::vector live_layers_; +#endif + FX_FILESIZE raw_base_size_ = 0; // PDFium parser offsets are logical PDF offsets after the syntax parser's // header offset has been subtracted. Layer append-only xref offsets must use diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index be03ea2e66..75d69f3800 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -530,10 +530,18 @@ bool CPDF_Document::IsObjectPromoted(uint32_t objnum) const { return !!FindPromotedObject(objnum); } +uint64_t CPDF_Document::GetOverlayEpoch() const { + return 0; +} + bool CPDF_Document::IsLayerDocument() const { return false; } +const CPDF_BaseDocument* CPDF_Document::GetBaseDocumentForViewScope() const { + return nullptr; +} + FX_FILESIZE CPDF_Document::GetLayerAppendBaseOffset() const { CPDF_Parser* parser = GetParser(); return parser ? parser->GetDocumentSize() : 0; diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 2216cb37c0..a675b95f96 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ #define CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ +#include + #include #include #include @@ -23,6 +25,7 @@ #include "core/fxcrt/unowned_ptr.h" class CPDF_ReadValidator; +class CPDF_BaseDocument; class CPDF_StreamAcc; class IFX_SeekableReadStream; class JBig2_DocumentContext; @@ -163,7 +166,14 @@ class CPDF_Document : public Observable, // document overlay. Always false for ordinary documents. virtual RetainPtr FindPromotedObject(uint32_t objnum) const; bool IsObjectPromoted(uint32_t objnum) const; + // Changes whenever the effective identity of an indirect object can change. + // Ordinary documents have no overlay and always return 0. + virtual uint64_t GetOverlayEpoch() const; virtual bool IsLayerDocument() const; + // Returns non-null only for the immutable base document itself. This avoids + // RTTI in the ambient-view boundary while preserving exact frozen-view + // identity for the debug detector. + virtual const CPDF_BaseDocument* GetBaseDocumentForViewScope() const; virtual FX_FILESIZE GetLayerAppendBaseOffset() const; // CPDF_Parser::ParsedObjectsHolder: diff --git a/core/fpdfapi/parser/cpdf_document_view_scope.cpp b/core/fpdfapi/parser/cpdf_document_view_scope.cpp new file mode 100644 index 0000000000..6c13fdaa79 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_document_view_scope.cpp @@ -0,0 +1,83 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" + +#include "core/fpdfapi/parser/cpdf_layer_document.h" +#include "core/fxcrt/check_op.h" +#include "core/fxcrt/epdf_tls.h" + +namespace { + +EPDF_TLS CPDF_DocumentViewScope::Mode g_current_view_mode = + CPDF_DocumentViewScope::Mode::kNone; +EPDF_TLS const CPDF_LayerDocument* g_current_layer_view = nullptr; +EPDF_TLS const CPDF_BaseDocument* g_current_frozen_base = nullptr; + +CPDF_DocumentViewScope::Mode GetModeForDocument(CPDF_Document* document) { + if (!document) { + return g_current_view_mode; + } + return CPDF_LayerDocument::FromDocument(document) + ? CPDF_DocumentViewScope::Mode::kEffective + : CPDF_DocumentViewScope::Mode::kFrozen; +} + +const CPDF_LayerDocument* GetLayerForDocument(CPDF_Document* document) { + return document ? CPDF_LayerDocument::FromDocument(document) + : g_current_layer_view; +} + +const CPDF_BaseDocument* GetFrozenBaseForDocument(CPDF_Document* document) { + if (!document) { + return g_current_frozen_base; + } + return !CPDF_LayerDocument::FromDocument(document) + ? document->GetBaseDocumentForViewScope() + : nullptr; +} + +} // namespace + +CPDF_DocumentViewScope::CPDF_DocumentViewScope(CPDF_Document* document) + : previous_mode_(g_current_view_mode), + previous_layer_(g_current_layer_view), + previous_frozen_base_(g_current_frozen_base), + mode_(GetModeForDocument(document)), + layer_(GetLayerForDocument(document)), + frozen_base_(GetFrozenBaseForDocument(document)) { + g_current_view_mode = mode_; + g_current_layer_view = layer_; + g_current_frozen_base = frozen_base_; +} + +CPDF_DocumentViewScope::~CPDF_DocumentViewScope() { + DCHECK_EQ(g_current_view_mode, mode_); + DCHECK_EQ(g_current_layer_view, layer_); + DCHECK_EQ(g_current_frozen_base, frozen_base_); + g_current_view_mode = previous_mode_; + g_current_layer_view = previous_layer_; + g_current_frozen_base = previous_frozen_base_; +} + +// static +const CPDF_LayerDocument* CPDF_DocumentViewScope::GetCurrentLayerForBase( + const CPDF_BaseDocument* base) { + return g_current_view_mode == Mode::kEffective && g_current_layer_view && + g_current_layer_view->GetBaseDocument() == base + ? g_current_layer_view + : nullptr; +} + +// static +CPDF_DocumentViewScope::Mode CPDF_DocumentViewScope::GetCurrentMode() { + return g_current_view_mode; +} + +// static +bool CPDF_DocumentViewScope::IsFrozenForBase( + const CPDF_BaseDocument* base) { + return g_current_view_mode == Mode::kFrozen && + g_current_frozen_base == base; +} diff --git a/core/fpdfapi/parser/cpdf_document_view_scope.h b/core/fpdfapi/parser/cpdf_document_view_scope.h new file mode 100644 index 0000000000..2bac24470f --- /dev/null +++ b/core/fpdfapi/parser/cpdf_document_view_scope.h @@ -0,0 +1,44 @@ +// Copyright 2026 The PDFium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_VIEW_SCOPE_H_ +#define CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_VIEW_SCOPE_H_ + +class CPDF_BaseDocument; +class CPDF_Document; +class CPDF_LayerDocument; + +// Establishes the effective document view used while resolving references +// inherited from a frozen base document. Scopes are nestable so operations +// involving more than one document can switch views explicitly and restore the +// caller's view on return. +class CPDF_DocumentViewScope final { + public: + enum class Mode { + kNone, + kEffective, + kFrozen, + }; + + explicit CPDF_DocumentViewScope(CPDF_Document* document); + ~CPDF_DocumentViewScope(); + + CPDF_DocumentViewScope(const CPDF_DocumentViewScope&) = delete; + CPDF_DocumentViewScope& operator=(const CPDF_DocumentViewScope&) = delete; + + static const CPDF_LayerDocument* GetCurrentLayerForBase( + const CPDF_BaseDocument* base); + static Mode GetCurrentMode(); + static bool IsFrozenForBase(const CPDF_BaseDocument* base); + + private: + const Mode previous_mode_; + const CPDF_LayerDocument* const previous_layer_; + const CPDF_BaseDocument* const previous_frozen_base_; + const Mode mode_; + const CPDF_LayerDocument* const layer_; + const CPDF_BaseDocument* const frozen_base_; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_VIEW_SCOPE_H_ diff --git a/core/fpdfapi/parser/cpdf_layer_document.cpp b/core/fpdfapi/parser/cpdf_layer_document.cpp index 9637e0a7c4..ea3c6f6653 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document.cpp @@ -12,6 +12,7 @@ #include "core/fpdfapi/parser/cpdf_concat_read_stream.h" #include "core/fpdfapi/parser/cpdf_cross_ref_table.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fpdfapi/render/cpdf_docrenderdata.h" @@ -80,11 +81,25 @@ CPDF_LayerDocument::CPDF_LayerDocument( file_access_(std::move(file_access)) { CHECK(base_); SetLastObjNum(base_->GetLastObjNum()); - InitializeFromBase(); - IngestCurrentDelta(); + { + // Initialization deliberately copies the immutable base view. + CPDF_DocumentViewScope frozen_view(base_.Get()); + InitializeFromBase(); + } +#if DCHECK_IS_ON() + base_->RegisterLiveLayer(this); +#endif + { + CPDF_DocumentViewScope effective_view(this); + IngestCurrentDelta(); + } } -CPDF_LayerDocument::~CPDF_LayerDocument() = default; +CPDF_LayerDocument::~CPDF_LayerDocument() { +#if DCHECK_IS_ON() + base_->UnregisterLiveLayer(this); +#endif +} // static CPDF_LayerDocument* CPDF_LayerDocument::FromDocument(CPDF_Document* document) { @@ -185,6 +200,10 @@ RetainPtr CPDF_LayerDocument::FindPromotedObject( return FindLocalIndirectObject(objnum); } +uint64_t CPDF_LayerDocument::GetOverlayEpoch() const { + return overlay_epoch_; +} + bool CPDF_LayerDocument::IsLayerDocument() const { return true; } @@ -224,6 +243,7 @@ RetainPtr CPDF_LayerDocument::GetMutableIndirectObject( void CPDF_LayerDocument::DeleteIndirectObject(uint32_t objnum) { if (FindLocalIndirectObject(objnum)) { CPDF_Document::DeleteIndirectObject(objnum); + ++overlay_epoch_; } } @@ -364,6 +384,7 @@ void CPDF_LayerDocument::IngestCurrentDelta() { } clone->SetGenNum(info.gennum); AddPromotedObject(objnum, std::move(clone)); + ++overlay_epoch_; ++selected_delta_object_count; } @@ -420,6 +441,7 @@ RetainPtr CPDF_LayerDocument::PromoteFromBase(uint32_t objnum) { } clone->SetGenNum(base_object->GetGenNum()); AddPromotedObject(objnum, clone); + ++overlay_epoch_; CPDF_Parser* parser = base_->GetParser(); if (parser) { diff --git a/core/fpdfapi/parser/cpdf_layer_document.h b/core/fpdfapi/parser/cpdf_layer_document.h index deff9b76e8..9532a5bca5 100644 --- a/core/fpdfapi/parser/cpdf_layer_document.h +++ b/core/fpdfapi/parser/cpdf_layer_document.h @@ -34,6 +34,7 @@ class CPDF_LayerDocument final : public CPDF_Document { OpenStatus ingest_status() const { return ingest_status_; } size_t GetPromotedObjectCount() const; + bool HasPromotedObjects() const { return begin() != end(); } CPDF_BaseDocument* GetBaseDocument() const { return base_.Get(); } // CPDF_Document: @@ -45,6 +46,7 @@ class CPDF_LayerDocument final : public CPDF_Document { RetainPtr GetMutablePageDictionary(int iPage) override; uint32_t GetUserPermissions(bool get_owner_perms) const override; RetainPtr FindPromotedObject(uint32_t objnum) const override; + uint64_t GetOverlayEpoch() const override; bool IsLayerDocument() const override; FX_FILESIZE GetLayerAppendBaseOffset() const override; bool ShouldReplaceDeletedPageWithNull(uint32_t page_obj_num) const override; @@ -76,6 +78,8 @@ class CPDF_LayerDocument final : public CPDF_Document { RetainPtr const base_; RetainPtr file_access_; std::vector layer_page_list_; + // Generation for caches that retain effective-object pointers. + uint64_t overlay_epoch_ = 0; OpenStatus ingest_status_ = OpenStatus::kSuccess; }; diff --git a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp index 0b1880226c..e6316f25b9 100644 --- a/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_layer_document_unittest.cpp @@ -13,15 +13,19 @@ #include #include +#include "core/fpdfapi/page/cpdf_form.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_base_document.h" #include "core/fpdfapi/parser/cpdf_concat_read_stream.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_object.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" #include "core/fxcrt/cfx_read_only_span_stream.h" #include "core/fxcrt/fx_stream.h" @@ -128,6 +132,79 @@ std::string BuildSimplePdfWithInfo() { return pdf.str(); } +std::string BuildPdfWithIndirectAnnotation() { + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100]\n" + " /Annots [4 0 R] >>\n" + "endobj\n", + "4 0 obj\n" + "<< /Type /Annot /Subtype /Polygon /Rect [10 10 30 30]\n" + " /Vertices [10 10 30 10 20 30] >>\n" + "endobj\n", + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + +std::string BuildPdfWithFormXObject() { + const std::string form_content = "0 0 10 10 re f\n"; + std::ostringstream form_object; + form_object << "4 0 obj\n" + << "<< /Type /XObject /Subtype /Form /BBox [0 0 100 100]\n" + << " /Resources << /BaseMarker 1 >> /Length " + << form_content.size() << " >>\n" + << "stream\n" + << form_content + << "endstream\nendobj\n"; + + const std::vector objects = { + "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", + "2 0 obj\n<< /Type /Pages /Count 1 /Kids [3 0 R] >>\nendobj\n", + "3 0 obj\n" + "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 100 100]\n" + " /Resources << /XObject << /Fm0 4 0 R >> >> >>\n" + "endobj\n", + form_object.str(), + }; + + std::ostringstream pdf; + pdf << "%PDF-1.7\n"; + std::vector offsets; + for (const std::string& object : objects) { + offsets.push_back(pdf.tellp()); + pdf << object; + } + + const size_t xref_offset = pdf.tellp(); + pdf << "xref\n0 " << (objects.size() + 1) << "\n0000000000 65535 f \n"; + for (size_t offset : offsets) { + pdf << std::setw(10) << std::setfill('0') << offset << " 00000 n \n"; + } + pdf << "trailer\n<< /Size " << (objects.size() + 1) + << " /Root 1 0 R >>\nstartxref\n" + << xref_offset << "\n%%EOF\n"; + return pdf.str(); +} + std::string BuildPdfWithDirectResources() { const std::vector objects = { "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n", @@ -422,6 +499,143 @@ TEST_F(CPDFLayerDocumentTest, CrossHandleReadRefreshesAfterPagePromotion) { base->GetFrozenObjectForLayer(3)->AsDictionary()->KeyExist("Bar")); } +TEST_F(CPDFLayerDocumentTest, + FrozenReferencesResolveThroughOwningLayerWithoutCrossLayerLeakage) { + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kNone, + CPDF_DocumentViewScope::GetCurrentMode()); + const std::string pdf = BuildPdfWithIndirectAnnotation(); + RetainPtr base = LoadBaseDocumentFromString(pdf); + ASSERT_TRUE(base); + auto layer_a = std::make_unique(base, nullptr); + auto layer_b = std::make_unique(base, nullptr); + + auto page_a = MakeLayerPage(layer_a.get(), 0); + auto page_b = MakeLayerPage(layer_b.get(), 0); + ASSERT_TRUE(page_a); + ASSERT_TRUE(page_b); + + RetainPtr annots_a = page_a->GetAnnotsArray(); + RetainPtr annots_b = page_b->GetAnnotsArray(); + ASSERT_TRUE(annots_a); + ASSERT_TRUE(annots_b); + ASSERT_TRUE(annots_a->GetDictAt(0)); + ASSERT_TRUE(annots_b->GetDictAt(0)); + EXPECT_FALSE(annots_a->GetDictAt(0)->KeyExist("LayerMarker")); + EXPECT_FALSE(annots_b->GetDictAt(0)->KeyExist("LayerMarker")); + + RetainPtr promoted_a = layer_a->GetMutableIndirectObject(4); + ASSERT_TRUE(promoted_a); + promoted_a->AsMutableDictionary()->SetNewFor("LayerMarker", 41); + + { + CPDF_DocumentViewScope scope(layer_a.get()); + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kEffective, + CPDF_DocumentViewScope::GetCurrentMode()); + EXPECT_EQ(41, page_a->GetAnnotsArray()->GetDictAt(0)->GetIntegerFor( + "LayerMarker")); + } + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kNone, + CPDF_DocumentViewScope::GetCurrentMode()); + { + CPDF_DocumentViewScope scope(layer_b.get()); + EXPECT_FALSE( + page_b->GetAnnotsArray()->GetDictAt(0)->KeyExist("LayerMarker")); + } + + RetainPtr promoted_b = layer_b->GetMutableIndirectObject(4); + ASSERT_TRUE(promoted_b); + promoted_b->AsMutableDictionary()->SetNewFor("LayerMarker", 82); + + { + CPDF_DocumentViewScope scope_a(layer_a.get()); + EXPECT_EQ(41, page_a->GetAnnotsArray()->GetDictAt(0)->GetIntegerFor( + "LayerMarker")); + { + CPDF_DocumentViewScope scope_b(layer_b.get()); + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kEffective, + CPDF_DocumentViewScope::GetCurrentMode()); + EXPECT_EQ(82, page_b->GetAnnotsArray()->GetDictAt(0)->GetIntegerFor( + "LayerMarker")); + } + EXPECT_EQ(41, page_a->GetAnnotsArray()->GetDictAt(0)->GetIntegerFor( + "LayerMarker")); + } + EXPECT_FALSE(base->GetFrozenObjectForLayer(4)->AsDictionary()->KeyExist( + "LayerMarker")); + + { + CPDF_DocumentViewScope frozen_scope(base.Get()); + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kFrozen, + CPDF_DocumentViewScope::GetCurrentMode()); + EXPECT_FALSE(base->GetOrParseIndirectObject(4) + ->AsDictionary() + ->KeyExist("LayerMarker")); + } + EXPECT_EQ(CPDF_DocumentViewScope::Mode::kNone, + CPDF_DocumentViewScope::GetCurrentMode()); +} + +#if DCHECK_IS_ON() +TEST_F(CPDFLayerDocumentTest, + DebugDetectorRejectsUnscopedPromotedBaseResolution) { + RetainPtr base = + LoadBaseDocumentFromString(BuildPdfWithIndirectAnnotation()); + ASSERT_TRUE(base); + auto layer = std::make_unique(base, nullptr); + ASSERT_TRUE(layer->GetMutableIndirectObject(4)); + + EXPECT_DEATH_IF_SUPPORTED(base->GetOrParseIndirectObject(4), ""); + { + CPDF_DocumentViewScope frozen_scope(base.Get()); + EXPECT_TRUE(base->GetOrParseIndirectObject(4)); + } + { + CPDF_DocumentViewScope effective_scope(layer.get()); + EXPECT_EQ(layer->FindPromotedObject(4).Get(), + base->GetOrParseIndirectObject(4).Get()); + } +} +#endif // DCHECK_IS_ON() + +TEST_F(CPDFLayerDocumentTest, + ParsedFormRefreshesAfterSiblingPromotesStream) { + RetainPtr base = + LoadBaseDocumentFromString(BuildPdfWithFormXObject()); + ASSERT_TRUE(base); + auto layer = std::make_unique(base, nullptr); + + RetainPtr form_object = layer->GetIndirectObject(4); + ASSERT_TRUE(form_object); + const CPDF_Stream* form_stream = form_object->AsStream(); + ASSERT_TRUE(form_stream); + + CPDF_Form writer( + layer.get(), nullptr, + pdfium::WrapRetain(const_cast(form_stream))); + CPDF_Form reader( + layer.get(), nullptr, + pdfium::WrapRetain(const_cast(form_stream))); + writer.ParseContent(); + reader.ParseContent(); + ASSERT_EQ(1u, reader.GetPageObjectCount()); + EXPECT_FLOAT_EQ(10.0f, reader.CalcBoundingBox().Width()); + EXPECT_EQ(1, reader.GetResources()->GetIntegerFor("BaseMarker")); + + RetainPtr mutable_stream = writer.GetMutableFormStream(); + ASSERT_TRUE(mutable_stream); + fxcrt::ostringstream updated_content; + updated_content << "0 0 20 20 re f\n"; + mutable_stream->SetDataFromStringstreamAndRemoveFilter(&updated_content); + mutable_stream->GetMutableDict() + ->GetMutableDictFor("Resources") + ->SetNewFor("LayerMarker", 9); + + reader.ParseContent(); + ASSERT_EQ(1u, reader.GetPageObjectCount()); + EXPECT_FLOAT_EQ(20.0f, reader.CalcBoundingBox().Width()); + EXPECT_EQ(9, reader.GetResources()->GetIntegerFor("LayerMarker")); +} + TEST_F(CPDFLayerDocumentTest, GetOrCreateInfoPromotesBaseInfo) { const std::string pdf = BuildSimplePdfWithInfo(); RetainPtr base = LoadBaseDocumentFromString(pdf); @@ -482,13 +696,17 @@ TEST_F(CPDFLayerDocumentTest, DirectResourcesPromoteOwningPage) { auto layer = std::make_unique(base, nullptr); auto page = MakeLayerPage(layer.get(), 0); + auto second_page_handle = MakeLayerPage(layer.get(), 0); ASSERT_TRUE(page); + ASSERT_TRUE(second_page_handle); RetainPtr resources = page->GetMutableResources(); ASSERT_TRUE(resources); EXPECT_EQ(1u, layer->GetPromotedObjectCount()); resources->SetNewFor("Tier3ResourceMarker", 5); EXPECT_EQ(5, page->GetResources()->GetIntegerFor("Tier3ResourceMarker")); + EXPECT_EQ(5, second_page_handle->GetResources()->GetIntegerFor( + "Tier3ResourceMarker")); RetainPtr base_page = base->GetFrozenObjectForLayer(3)->GetDict(); diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp index 8b53e30398..103fd0ed02 100644 --- a/core/fpdfdoc/cpdf_annotlist.cpp +++ b/core/fpdfdoc/cpdf_annotlist.cpp @@ -18,6 +18,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" @@ -125,6 +126,8 @@ std::unique_ptr CreatePopupAnnot(CPDF_Document* document, CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) : page_(pPage), document_(page_->GetDocument()) { + CPDF_DocumentViewScope document_view(document_); + RetainPtr pAnnots = page_->GetAnnotsArray(); if (!pAnnots) { return; @@ -182,6 +185,8 @@ void CPDF_AnnotList::DisplayPass(CPDF_RenderContext* context, bool bPrinting, const CFX_Matrix& mtMatrix, bool bWidgetPass) { + CPDF_DocumentViewScope document_view(document_); + CHECK(context); for (const auto& pAnnot : annot_list_) { bool bWidget = pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET; diff --git a/core/fpdfdoc/cpdf_linklist.cpp b/core/fpdfdoc/cpdf_linklist.cpp index a7296bc7c9..08b64f3bbc 100644 --- a/core/fpdfdoc/cpdf_linklist.cpp +++ b/core/fpdfdoc/cpdf_linklist.cpp @@ -49,6 +49,12 @@ CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, const std::vector>* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage) { + const uint64_t current_epoch = pPage->GetDocument()->GetOverlayEpoch(); + if (overlay_epoch_ != current_epoch) { + page_map_.clear(); + overlay_epoch_ = current_epoch; + } + uint32_t objnum = pPage->GetDict()->GetObjNum(); if (objnum == 0) { return nullptr; diff --git a/core/fpdfdoc/cpdf_linklist.h b/core/fpdfdoc/cpdf_linklist.h index d9d1257741..a47b968ff5 100644 --- a/core/fpdfdoc/cpdf_linklist.h +++ b/core/fpdfdoc/cpdf_linklist.h @@ -32,6 +32,7 @@ class CPDF_LinkList final : public CPDF_Document::LinkListIface { const std::vector>* GetPageLinks( CPDF_Page* pPage); + uint64_t overlay_epoch_ = 0; std::map>> page_map_; }; diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 9bab8ec218..6f294389ae 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp @@ -11,6 +11,7 @@ #include "build/build_config.h" #include "constants/form_fields.h" #include "constants/stream_dict_common.h" +#include "core/fpdfapi/page/cpdf_annotcontext.h" #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" @@ -234,6 +235,26 @@ CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { return page ? IPDFPageFromFPDFPage(page)->AsPDFPage() : nullptr; } +ScopedFPDFDocumentView::ScopedFPDFDocumentView(FPDF_DOCUMENT document) + : document_(CPDFDocumentFromFPDFDocument(document)), + view_scope_(document_) {} + +ScopedFPDFDocumentView::~ScopedFPDFDocumentView() = default; + +ScopedFPDFPageView::ScopedFPDFPageView(FPDF_PAGE page) + : page_(CPDFPageFromFPDFPage(page)), + view_scope_(page_ ? page_->GetDocument() : nullptr) {} + +ScopedFPDFPageView::~ScopedFPDFPageView() = default; + +ScopedFPDFAnnotationView::ScopedFPDFAnnotationView( + FPDF_ANNOTATION annotation) + : annotation_(CPDFAnnotContextFromFPDFAnnotation(annotation)), + view_scope_(annotation_ ? annotation_->GetPage()->GetDocument() + : nullptr) {} + +ScopedFPDFAnnotationView::~ScopedFPDFAnnotationView() = default; + FXDIB_Format FXDIBFormatFromFPDFFormat(int format) { switch (format) { case FPDFBitmap_Gray: diff --git a/fpdfsdk/cpdfsdk_helpers.h b/fpdfsdk/cpdfsdk_helpers.h index 4e1dc08741..6d214ba9ef 100644 --- a/fpdfsdk/cpdfsdk_helpers.h +++ b/fpdfsdk/cpdfsdk_helpers.h @@ -11,6 +11,7 @@ #include "build/build_config.h" #include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_parser.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/numerics/safe_conversions.h" @@ -57,6 +58,57 @@ CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page); FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc); CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc); +// Typed public-handle doors for APIs that traverse the live PDF graph. Keeping +// the view scope beside the unwrap makes effective-layer resolution structural +// instead of relying on every call site to remember a separate scope. +class ScopedFPDFDocumentView final { + public: + explicit ScopedFPDFDocumentView(FPDF_DOCUMENT document); + ~ScopedFPDFDocumentView(); + + ScopedFPDFDocumentView(const ScopedFPDFDocumentView&) = delete; + ScopedFPDFDocumentView& operator=(const ScopedFPDFDocumentView&) = delete; + + CPDF_Document* Get() const { return document_; } + explicit operator bool() const { return document_ != nullptr; } + + private: + CPDF_Document* const document_; + CPDF_DocumentViewScope view_scope_; +}; + +class ScopedFPDFPageView final { + public: + explicit ScopedFPDFPageView(FPDF_PAGE page); + ~ScopedFPDFPageView(); + + ScopedFPDFPageView(const ScopedFPDFPageView&) = delete; + ScopedFPDFPageView& operator=(const ScopedFPDFPageView&) = delete; + + CPDF_Page* Get() const { return page_; } + explicit operator bool() const { return page_ != nullptr; } + + private: + CPDF_Page* const page_; + CPDF_DocumentViewScope view_scope_; +}; + +class ScopedFPDFAnnotationView final { + public: + explicit ScopedFPDFAnnotationView(FPDF_ANNOTATION annotation); + ~ScopedFPDFAnnotationView(); + + ScopedFPDFAnnotationView(const ScopedFPDFAnnotationView&) = delete; + ScopedFPDFAnnotationView& operator=(const ScopedFPDFAnnotationView&) = delete; + + CPDF_AnnotContext* Get() const { return annotation_; } + explicit operator bool() const { return annotation_ != nullptr; } + + private: + CPDF_AnnotContext* const annotation_; + CPDF_DocumentViewScope view_scope_; +}; + // Conversions to/from incomplete FPDF_ API types. inline FPDF_ACTION FPDFActionFromCPDFDictionary(const CPDF_Dictionary* action) { return reinterpret_cast(const_cast(action)); diff --git a/fpdfsdk/epdf_action.cpp b/fpdfsdk/epdf_action.cpp index 45bf73133a..5e6f1b88e0 100644 --- a/fpdfsdk/epdf_action.cpp +++ b/fpdfsdk/epdf_action.cpp @@ -15,7 +15,10 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "core/fpdfdoc/cpdf_nametree.h" #include "core/fxcrt/bytestring.h" #include "core/fxcrt/compiler_specific.h" #include "core/fxcrt/fx_string_wrappers.h" @@ -37,12 +40,12 @@ struct ActionNodeRecord { ByteString subtype; int type = EPDF_ACTION_TYPE_UNKNOWN; std::optional javascript; + RetainPtr destination; + ByteString named_destination; + ByteString uri; + ByteString file_path; + ByteString name; std::vector next; - // Keeps the node's action dictionary alive for the model's lifetime so - // the EPDFAction_GetNode{Dest,URI,FilePath,Name} payload getters can - // rehydrate a CPDF_Action on demand. Nothing is extracted eagerly: - // building a model costs the same as before this field existed. - RetainPtr dict; }; int NormalizeActionType(CPDF_Action::Type type) { @@ -89,6 +92,49 @@ int NormalizeActionType(CPDF_Action::Type type) { return EPDF_ACTION_TYPE_UNKNOWN; } +RetainPtr SnapshotDestination(const CPDF_Action& action, + CPDF_Document* document) { + const CPDF_Dictionary* dict = action.GetDict(); + if (!dict) { + return nullptr; + } + + RetainPtr source; + if (document) { + CPDF_Dest destination = action.GetDest(document); + source = pdfium::WrapRetain(destination.GetArray()); + } else { + source = ToArray(dict->GetDirectObjectFor("D")); + } + if (!source) { + return nullptr; + } + + auto snapshot = pdfium::MakeRetain(); + for (size_t i = 0; i < source->size(); ++i) { + RetainPtr value = source->GetDirectObjectAt(i); + if (!value) { + return nullptr; + } + if (i == 0 && value->IsDictionary()) { + // FPDFDest only needs the page dictionary's object number. A minimal + // detached stand-in preserves that identity without retaining the live + // page graph. + RetainPtr page = + snapshot->AppendNew(); + page->SetObjNum(value->GetObjNum()); + continue; + } + RetainPtr clone = value->CloneDirectObject(); + if (!clone) { + return nullptr; + } + snapshot->Append(std::move(clone)); + } + snapshot->Freeze(); + return snapshot; +} + } // namespace struct ActionModelData { @@ -100,6 +146,7 @@ namespace { std::optional AppendAction( const CPDF_Action& action, + CPDF_Document* document, size_t depth, size_t* javascript_code_units, std::set* active_path, @@ -117,7 +164,6 @@ std::optional AppendAction( ActionNodeRecord node; node.subtype = dict->GetNameFor("S"); node.type = NormalizeActionType(action.GetType()); - node.dict = pdfium::WrapRetain(dict); if (node.type == EPDF_ACTION_TYPE_JAVASCRIPT || node.type == EPDF_ACTION_TYPE_RENDITION) { node.javascript = action.MaybeGetJavaScript(); @@ -130,6 +176,29 @@ std::optional AppendAction( *javascript_code_units += length; } } + if (node.type == EPDF_ACTION_TYPE_GOTO || + node.type == EPDF_ACTION_TYPE_GOTO_REMOTE || + node.type == EPDF_ACTION_TYPE_GOTO_EMBEDDED) { + node.destination = SnapshotDestination(action, document); + RetainPtr raw_destination = + dict->GetDirectObjectFor("D"); + if (!node.destination && raw_destination && + (raw_destination->IsName() || raw_destination->IsString())) { + node.named_destination = raw_destination->GetString(); + } + } + if (node.type == EPDF_ACTION_TYPE_URI) { + node.uri = + document ? action.GetURI(document) : dict->GetByteStringFor("URI"); + } + if (node.type == EPDF_ACTION_TYPE_GOTO_REMOTE || + node.type == EPDF_ACTION_TYPE_GOTO_EMBEDDED || + node.type == EPDF_ACTION_TYPE_LAUNCH) { + node.file_path = action.GetFilePath().ToUTF8(); + } + if (node.type == EPDF_ACTION_TYPE_NAMED) { + node.name = dict->GetNameFor("N"); + } const EPDF_ACTION_NODE_ID node_id = pdfium::checked_cast(model->nodes.size()); @@ -155,7 +224,7 @@ std::optional AppendAction( continue; } std::optional child_id = AppendAction( - child, depth + 1, javascript_code_units, active_path, model); + child, document, depth + 1, javascript_code_units, active_path, model); if (child_id.has_value()) { model->nodes[node_id].next.push_back(child_id.value()); } @@ -169,14 +238,16 @@ const ActionModelData* DataFromHandle(EPDF_ACTION_MODEL model); } // namespace -ActionModelDataPtr BuildActionModel(const CPDF_Action& action) { +ActionModelDataPtr BuildActionModel(const CPDF_Action& action, + CPDF_Document* document) { if (!action.HasDict()) { return nullptr; } auto model = std::make_shared(); size_t javascript_code_units = 0; std::set active_path; - AppendAction(action, 0, &javascript_code_units, &active_path, model.get()); + AppendAction(action, document, 0, &javascript_code_units, &active_path, + model.get()); return model; } @@ -204,21 +275,17 @@ const ActionNodeRecord* GetNode(EPDF_ACTION_MODEL model, } EPDF_ACTION_MODEL MakeModelFromDictionary( - RetainPtr dictionary) { + RetainPtr dictionary, + CPDF_Document* document) { return dictionary ? MakeActionModelHandle( - BuildActionModel(CPDF_Action(std::move(dictionary)))) + BuildActionModel(CPDF_Action(std::move(dictionary)), + document)) : nullptr; } -const CPDF_Dictionary* GetDocumentRoot(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - return doc ? doc->GetRoot() : nullptr; -} - RetainPtr GetPageDictionaryByObjectNumber( - FPDF_DOCUMENT document, + CPDF_Document* doc, uint32_t page_object_number) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); if (!doc || page_object_number == 0) { return nullptr; } @@ -306,9 +373,10 @@ FPDF_EXPORT FPDF_DEST FPDF_CALLCONV EPDFAction_GetNodeDest(FPDF_DOCUMENT document, EPDF_ACTION_MODEL model, EPDF_ACTION_NODE_ID node) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); - if (!doc || !record || !record->dict) { + if (!doc || !record) { return nullptr; } // Same type gate as FPDFAction_GetDest. @@ -317,8 +385,14 @@ EPDFAction_GetNodeDest(FPDF_DOCUMENT document, record->type != EPDF_ACTION_TYPE_GOTO_EMBEDDED) { return nullptr; } - CPDF_Action cAction(record->dict); - return FPDFDestFromCPDFArray(cAction.GetDest(doc).GetArray()); + if (record->destination) { + return FPDFDestFromCPDFArray(record->destination.Get()); + } + RetainPtr named = + record->named_destination.IsEmpty() + ? nullptr + : CPDF_NameTree::LookupNamedDest(doc, record->named_destination); + return FPDFDestFromCPDFArray(named.Get()); } FPDF_EXPORT unsigned long FPDF_CALLCONV @@ -327,17 +401,15 @@ EPDFAction_GetNodeURI(FPDF_DOCUMENT document, EPDF_ACTION_NODE_ID node, void* buffer, unsigned long buflen) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); - if (!doc || !record || !record->dict || - record->type != EPDF_ACTION_TYPE_URI) { + if (!doc || !record || record->type != EPDF_ACTION_TYPE_URI) { return 0; } - CPDF_Action cAction(record->dict); - ByteString uri = cAction.GetURI(doc); // SAFETY: required from caller. return NulTerminateMaybeCopyAndReturnLength( - uri, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + record->uri, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } FPDF_EXPORT unsigned long FPDF_CALLCONV @@ -346,7 +418,7 @@ EPDFAction_GetNodeFilePath(EPDF_ACTION_MODEL model, void* buffer, unsigned long buflen) { const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); - if (!record || !record->dict) { + if (!record) { return 0; } // Same type gate as FPDFAction_GetFilePath. @@ -355,11 +427,10 @@ EPDFAction_GetNodeFilePath(EPDF_ACTION_MODEL model, record->type != EPDF_ACTION_TYPE_LAUNCH) { return 0; } - CPDF_Action cAction(record->dict); - ByteString path = cAction.GetFilePath().ToUTF8(); // SAFETY: required from caller. return NulTerminateMaybeCopyAndReturnLength( - path, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + record->file_path, + UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } FPDF_EXPORT unsigned long FPDF_CALLCONV @@ -368,14 +439,12 @@ EPDFAction_GetNodeName(EPDF_ACTION_MODEL model, void* buffer, unsigned long buflen) { const epdf::ActionNodeRecord* record = epdf::GetNode(model, node); - if (!record || !record->dict || - record->type != EPDF_ACTION_TYPE_NAMED) { + if (!record || record->type != EPDF_ACTION_TYPE_NAMED) { return 0; } - ByteString name = record->dict->GetNameFor("N"); // SAFETY: required from caller. return NulTerminateMaybeCopyAndReturnLength( - name, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); + record->name, UNSAFE_BUFFERS(SpanFromFPDFApiArgs(buffer, buflen))); } FPDF_EXPORT int FPDF_CALLCONV @@ -411,8 +480,11 @@ EPDFAction_IsComplete(EPDF_ACTION_MODEL model) { FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV EPDFDoc_GetOpenActionModel(FPDF_DOCUMENT document) { - const CPDF_Dictionary* root = epdf::GetDocumentRoot(document); - return root ? epdf::MakeModelFromDictionary(root->GetDictFor("OpenAction")) + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); + const CPDF_Dictionary* root = doc ? doc->GetRoot() : nullptr; + return root ? epdf::MakeModelFromDictionary(root->GetDictFor("OpenAction"), + doc) : nullptr; } @@ -423,11 +495,13 @@ EPDFDoc_GetAdditionalActionModel(FPDF_DOCUMENT document, int event) { if (event < 0 || event >= static_cast(kKeys.size())) { return nullptr; } - const CPDF_Dictionary* root = epdf::GetDocumentRoot(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); + const CPDF_Dictionary* root = doc ? doc->GetRoot() : nullptr; RetainPtr additional = root ? root->GetDictFor("AA") : nullptr; return additional ? epdf::MakeModelFromDictionary( - additional->GetDictFor(kKeys[event])) + additional->GetDictFor(kKeys[event]), doc) : nullptr; } @@ -438,13 +512,16 @@ EPDFDoc_GetPageActionModel(FPDF_DOCUMENT document, if (event != EPDF_PAGE_ACTION_OPEN && event != EPDF_PAGE_ACTION_CLOSE) { return nullptr; } + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); RetainPtr page = - epdf::GetPageDictionaryByObjectNumber(document, page_object_number); + epdf::GetPageDictionaryByObjectNumber(doc, page_object_number); RetainPtr additional = page ? page->GetDictFor("AA") : nullptr; const char* key = event == EPDF_PAGE_ACTION_OPEN ? "O" : "C"; - return additional ? epdf::MakeModelFromDictionary(additional->GetDictFor(key)) - : nullptr; + return additional + ? epdf::MakeModelFromDictionary(additional->GetDictFor(key), doc) + : nullptr; } FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV @@ -455,19 +532,23 @@ EPDFAnnot_GetActionModel(FPDF_ANNOTATION annotation, int event) { event > EPDF_ANNOT_ACTION_PAGE_INVISIBLE) { return nullptr; } - CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annotation); + ScopedFPDFAnnotationView annotation_view(annotation); + CPDF_AnnotContext* context = annotation_view.Get(); const CPDF_Dictionary* annotation_dict = context ? context->GetAnnotDict() : nullptr; if (!annotation_dict) { return nullptr; } if (event == EPDF_ANNOT_ACTION_ACTIVATE) { - return epdf::MakeModelFromDictionary(annotation_dict->GetDictFor("A")); + return epdf::MakeModelFromDictionary( + annotation_dict->GetDictFor("A"), context->GetPage()->GetDocument()); } RetainPtr additional = annotation_dict->GetDictFor("AA"); const int additional_index = event - EPDF_ANNOT_ACTION_CURSOR_ENTER; - return additional ? epdf::MakeModelFromDictionary(additional->GetDictFor( - kAdditionalKeys[additional_index])) + return additional ? epdf::MakeModelFromDictionary( + additional->GetDictFor( + kAdditionalKeys[additional_index]), + context->GetPage()->GetDocument()) : nullptr; } diff --git a/fpdfsdk/epdf_action_embeddertest.cpp b/fpdfsdk/epdf_action_embeddertest.cpp index 3f582d0d47..46e71be8dc 100644 --- a/fpdfsdk/epdf_action_embeddertest.cpp +++ b/fpdfsdk/epdf_action_embeddertest.cpp @@ -314,6 +314,39 @@ TEST_F(EPDFActionEmbedderTest, LayerActionReadsDoNotPromote) { EPDF_ReleaseBaseDocument(base); } +TEST_F(EPDFActionEmbedderTest, + NamedJavaScriptModelReadsPromotedActionFromLayer) { + const std::string path = PathService::GetTestFilePath("js.pdf"); + ASSERT_FALSE(path.empty()); + const std::vector bytes = GetFileContents(path.c_str()); + ASSERT_FALSE(bytes.empty()); + EPDF_BASE_DOCUMENT base = EPDF_LoadMemBaseDocument( + bytes.data(), static_cast(bytes.size()), nullptr); + ASSERT_TRUE(base); + EPDFLayerOpenStatus status; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + CPDF_Document* layer_doc = + CPDFDocumentFromFPDFDocument(layer.get()); + ASSERT_TRUE(layer_doc); + RetainPtr action = + ToDictionary(layer_doc->GetMutableIndirectObject(5u)); + ASSERT_TRUE(action); + action->SetNewFor("JS", L"layer();"); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(layer.get(), 5u)); + + ScopedEPDFActionModel model( + EPDFDoc_GetNamedJavaScriptActionModel(layer.get(), 0)); + ASSERT_TRUE(model); + EXPECT_EQ(L"layer();", GetActionJavaScript(model.get(), 0)); + + layer.reset(); + EPDF_ReleaseBaseDocument(base); +} + TEST_F(EPDFActionEmbedderTest, MergedFieldAndWidgetAdditionalActionsStaySeparate) { ASSERT_TRUE(OpenDocument("text_form.pdf")); diff --git a/fpdfsdk/epdf_action_helpers.h b/fpdfsdk/epdf_action_helpers.h index 19b12487cb..eea7ef1a24 100644 --- a/fpdfsdk/epdf_action_helpers.h +++ b/fpdfsdk/epdf_action_helpers.h @@ -10,13 +10,15 @@ #include "public/epdf_action.h" class CPDF_Action; +class CPDF_Document; namespace epdf { struct ActionModelData; using ActionModelDataPtr = std::shared_ptr; -ActionModelDataPtr BuildActionModel(const CPDF_Action& action); +ActionModelDataPtr BuildActionModel(const CPDF_Action& action, + CPDF_Document* document = nullptr); EPDF_ACTION_MODEL MakeActionModelHandle(ActionModelDataPtr data); } // namespace epdf diff --git a/fpdfsdk/epdf_form.cpp b/fpdfsdk/epdf_form.cpp index e83071c183..c5d952b81c 100644 --- a/fpdfsdk/epdf_form.cpp +++ b/fpdfsdk/epdf_form.cpp @@ -292,6 +292,7 @@ uint32_t PageObjNumForWidget( } FieldRecord SnapshotField( + CPDF_Document* document, CPDF_FormField* field, const std::set& initial_fields, const std::map& widget_pages) { @@ -318,7 +319,8 @@ FieldRecord SnapshotField( for (size_t i = 0; i < kActionTypes.size(); ++i) { if (additional_actions.ActionExist(kActionTypes[i])) { record.actions[i] = - epdf::BuildActionModel(additional_actions.GetAction(kActionTypes[i])); + epdf::BuildActionModel(additional_actions.GetAction(kActionTypes[i]), + document); } } if (record.family == EPDF_FORMFIELD_FAMILY_TEXT) { @@ -1785,7 +1787,8 @@ bool ArrayReferencesDict(const CPDF_Array* array, FPDF_EXPORT EPDF_FORM_MODEL FPDF_CALLCONV EPDFForm_LoadModel(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return nullptr; } @@ -1820,7 +1823,8 @@ EPDFForm_LoadModel(FPDF_DOCUMENT document) { if (!field) { continue; } - FieldRecord record = SnapshotField(field, initial_fields, widget_pages); + FieldRecord record = + SnapshotField(doc, field, initial_fields, widget_pages); const int index = fxcrt::CollectionSize(model->fields); field_index_by_dict.try_emplace(field->GetFieldDict().Get(), index); if (record.objnum != 0) { @@ -2159,7 +2163,8 @@ EPDFForm_SetToggle(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return false; } @@ -2176,7 +2181,8 @@ EPDFForm_SetTextValue(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return false; } @@ -2194,7 +2200,8 @@ EPDFForm_SetChoiceValues(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || (value_count > 0 && !values)) { return false; } @@ -2218,7 +2225,8 @@ EPDFForm_ResetField(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return false; } @@ -2320,7 +2328,8 @@ EPDFForm_SetFieldDisplay(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); return doc && ApplyFieldDisplay(doc, field_objnum, display, changed_widget_objnums, buffer_size, out_changed_count); @@ -2333,7 +2342,8 @@ EPDFForm_SetFieldAppearanceText(FPDF_DOCUMENT document, uint32_t* changed_widget_objnums, unsigned long buffer_size, unsigned long* out_changed_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || !appearance_text) { return false; } @@ -2348,7 +2358,8 @@ EPDFForm_ExportFDF(FPDF_DOCUMENT document, uint32_t export_flags, void* buffer, unsigned long buflen) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return 0; } @@ -2369,7 +2380,8 @@ EPDFForm_ExportXFDF(FPDF_DOCUMENT document, uint32_t export_flags, void* buffer, unsigned long buflen) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return 0; } @@ -2390,7 +2402,8 @@ EPDFForm_ImportFDF(FPDF_DOCUMENT document, if (out_result) { *out_result = {}; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || !data || size == 0) { return false; } @@ -2425,7 +2438,8 @@ EPDFForm_ImportXFDF(FPDF_DOCUMENT document, if (out_result) { *out_result = {}; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || !data || size == 0) { return false; } @@ -2468,7 +2482,8 @@ EPDFForm_Repair(FPDF_DOCUMENT document, if (out_report) { *out_report = {}; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || !doc->GetRoot()) { return false; } @@ -2887,7 +2902,8 @@ FPDF_EXPORT uint32_t FPDF_CALLCONV EPDFForm_CreateField(FPDF_DOCUMENT document, int family, FPDF_WIDESTRING full_name) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); AuthorFamily author; if (!doc || !doc->GetRoot() || !AuthorFamilyFromCode(family, &author)) { return 0; @@ -2989,7 +3005,8 @@ EPDFForm_AttachWidget(FPDF_DOCUMENT document, uint32_t field_objnum, uint32_t widget_objnum, FPDF_BYTESTRING on_state) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || widget_objnum == 0 || field_objnum == widget_objnum) { return false; @@ -3087,7 +3104,8 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_DetachWidget(FPDF_DOCUMENT document, uint32_t field_objnum, uint32_t widget_objnum) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || widget_objnum == 0) { return false; } @@ -3139,7 +3157,8 @@ EPDFForm_DeleteField(FPDF_DOCUMENT document, if (out_detached_count) { *out_detached_count = 0; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0) { return false; } @@ -3292,7 +3311,8 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_SetFieldName(FPDF_DOCUMENT document, uint32_t field_objnum, FPDF_WIDESTRING partial_name) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0) { return false; } @@ -3349,7 +3369,8 @@ EPDFForm_SetFieldFlags(FPDF_DOCUMENT document, uint32_t field_objnum, uint32_t set_bits, uint32_t clear_bits) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0) { return false; } @@ -3426,7 +3447,8 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_SetFieldMaxLen(FPDF_DOCUMENT document, uint32_t field_objnum, int max_len) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || max_len < 0) { return false; } @@ -3466,7 +3488,8 @@ EPDFForm_SetFieldDefaultValues(FPDF_DOCUMENT document, uint32_t field_objnum, const FPDF_WIDESTRING* values, unsigned long value_count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || value_count == 0 || !values) { return false; } @@ -3525,7 +3548,8 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_SetFieldDefaultToggle(FPDF_DOCUMENT document, uint32_t field_objnum, FPDF_BYTESTRING on_state) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || !on_state || on_state[0] == '\0') { return false; } @@ -3571,7 +3595,8 @@ EPDFForm_SetFieldDefaultToggle(FPDF_DOCUMENT document, FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFForm_RemoveFieldDefaultValue(FPDF_DOCUMENT document, uint32_t field_objnum) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0) { return false; } @@ -3597,7 +3622,8 @@ FPDF_BOOL SetOptionalFieldText(FPDF_DOCUMENT document, uint32_t field_objnum, FPDF_WIDESTRING value, const char* key) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0) { return false; } @@ -3647,7 +3673,8 @@ EPDFForm_SetFieldOptions(FPDF_DOCUMENT document, const FPDF_WIDESTRING* labels, const FPDF_WIDESTRING* exports, unsigned long count) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || field_objnum == 0 || (count > 0 && (!labels || !exports))) { return false; } diff --git a/fpdfsdk/epdf_form_embeddertest.cpp b/fpdfsdk/epdf_form_embeddertest.cpp index e3b6a7fe46..06f279db03 100644 --- a/fpdfsdk/epdf_form_embeddertest.cpp +++ b/fpdfsdk/epdf_form_embeddertest.cpp @@ -489,6 +489,27 @@ TEST_F(EPDFFormEmbedderTest, LayerModelLoadIsPure) { EPDF_ReleaseBaseDocument(base); } +// A promoted non-terminal field is only reachable through frozen /Fields and +// /Kids references. Rebuilding the model must resolve those references through +// the effective layer view so the child's fully qualified name observes the +// promoted ancestor. +TEST_F(EPDFFormEmbedderTest, LayerModelReadsPromotedFieldAncestor) { + LayerDoc doc; + ASSERT_TRUE(OpenLayer("toggle_fields.pdf", &doc)); + + ASSERT_TRUE(EPDFForm_SetFieldName( + doc.layer, 16u, GetFPDFWideString(L"account").get())); + EXPECT_TRUE(EPDFLayer_IsObjectPromoted(doc.layer, 16u)); + + EPDF_FORM_MODEL model = EPDFForm_LoadModel(doc.layer); + ASSERT_TRUE(model); + const int field = EPDFForm_GetFieldIndexByObjNum(model, 17u); + ASSERT_GE(field, 0); + EXPECT_EQ(L"account.name", + GetWideString(EPDFForm_GetFieldName, model, field)); + EPDFForm_CloseModel(model); +} + // The radio walkthrough: flipping the group promotes exactly the field plus // the two widgets whose /AS changed - the minimal FDF-shaped delta. TEST_F(EPDFFormEmbedderTest, SetToggleRadioOnLayer) { diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 6976f78547..0b0f759284 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -29,6 +29,7 @@ #include "core/fpdfapi/parser/cpdf_boolean.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" @@ -640,14 +641,15 @@ BlendMode GetEffectiveAnnotBlendMode(CPDF_AnnotContext* ctx) { return BlendMode::kNormal; } - RetainPtr annot_dict = ctx->GetMutableAnnotDict(); + CPDF_DocumentViewScope document_view(ctx->GetPage()->GetDocument()); + const CPDF_Dictionary* annot_dict = ctx->GetAnnotDict(); if (!annot_dict) { return BlendMode::kNormal; } // Get (or detect absence of) normal appearance stream. RetainPtr ap_stream = - GetAnnotAP(annot_dict.Get(), CPDF_Annot::AppearanceMode::kNormal); + GetAnnotAP(annot_dict, CPDF_Annot::AppearanceMode::kNormal); if (!ap_stream) { // Heuristic: highlight annotations without AP are effectively Multiply. const CPDF_Annot::Subtype subtype = CPDF_Annot::StringToAnnotSubtype( @@ -1117,10 +1119,11 @@ FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetAnnotCount(FPDF_PAGE page) { FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page, int index) { - const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage || index < 0) { + ScopedFPDFPageView page_view(page); + if (!page_view || index < 0) { return nullptr; } + const CPDF_Page* pPage = page_view.Get(); RetainPtr pAnnots = pPage->GetAnnotsArray(); if (!pAnnots || static_cast(index) >= pAnnots->size()) { @@ -1144,15 +1147,17 @@ FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFPage_GetAnnot(FPDF_PAGE page, FPDF_EXPORT int FPDF_CALLCONV FPDFPage_GetAnnotIndex(FPDF_PAGE page, FPDF_ANNOTATION annot) { - const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return -1; } + const CPDF_Page* pPage = page_view.Get(); - const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) { + ScopedFPDFAnnotationView annot_view(annot); + if (!annot_view) { return -1; } + const CPDF_Dictionary* pAnnotDict = annot_view.Get()->GetAnnotDict(); RetainPtr pAnnots = pPage->GetAnnotsArray(); if (!pAnnots) { @@ -1339,10 +1344,11 @@ FPDF_EXPORT int FPDF_CALLCONV FPDFAnnot_GetObjectCount(FPDF_ANNOTATION annot) { return 0; } + CPDF_DocumentViewScope document_view(pAnnot->GetPage()->GetDocument()); if (!pAnnot->HasForm()) { - RetainPtr dict = pAnnot->GetMutableAnnotDict(); + const CPDF_Dictionary* dict = pAnnot->GetAnnotDict(); RetainPtr pStream = - GetAnnotAP(dict.Get(), CPDF_Annot::AppearanceMode::kNormal); + GetAnnotAP(dict, CPDF_Annot::AppearanceMode::kNormal); if (!pStream) { return 0; } @@ -1359,10 +1365,11 @@ FPDFAnnot_GetObject(FPDF_ANNOTATION annot, int index) { return nullptr; } + CPDF_DocumentViewScope document_view(pAnnot->GetPage()->GetDocument()); if (!pAnnot->HasForm()) { - RetainPtr pAnnotDict = pAnnot->GetMutableAnnotDict(); + const CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict(); RetainPtr pStream = - GetAnnotAP(pAnnotDict.Get(), CPDF_Annot::AppearanceMode::kNormal); + GetAnnotAP(pAnnotDict, CPDF_Annot::AppearanceMode::kNormal); if (!pStream) { return nullptr; } @@ -2234,8 +2241,12 @@ FPDFAnnot_GetLinkedAnnot(FPDF_ANNOTATION annot, FPDF_BYTESTRING key) { return nullptr; } + CPDF_DocumentViewScope document_view(pAnnot->GetPage()->GetDocument()); + const CPDF_Dictionary* annot_dict = pAnnot->GetAnnotDict(); + RetainPtr const_linked_dict = + annot_dict ? annot_dict->GetDictFor(key) : nullptr; RetainPtr pLinkedDict = - pAnnot->GetMutableAnnotDict()->GetMutableDictFor(key); + pdfium::WrapRetain(const_cast(const_linked_dict.Get())); if (!pLinkedDict || pLinkedDict->GetNameFor("Type") != "Annot") { return nullptr; } @@ -2615,9 +2626,14 @@ FPDF_EXPORT FPDF_LINK FPDF_CALLCONV FPDFAnnot_GetLink(FPDF_ANNOTATION annot) { return nullptr; } + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return nullptr; + } + // Unretained reference in public API. NOLINTNEXTLINE return FPDFLinkFromCPDFDictionary( - CPDFAnnotContextFromFPDFAnnotation(annot)->GetMutableAnnotDict()); + const_cast(context->GetAnnotDict())); } FPDF_EXPORT int FPDF_CALLCONV @@ -2747,7 +2763,12 @@ FPDFAnnot_GetFileAttachment(FPDF_ANNOTATION annot) { return nullptr; } - const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot); + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot); + if (!context) { + return nullptr; + } + CPDF_DocumentViewScope document_view(context->GetPage()->GetDocument()); + const CPDF_Dictionary* annot_dict = context->GetAnnotDict(); if (!annot_dict) { return nullptr; } @@ -3700,10 +3721,6 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, if (!context) { return false; } - RetainPtr annot_dict = context->GetMutableAnnotDict(); - if (!annot_dict) { - return false; - } // Allow FREETEXT, WIDGET, and REDACT annotations (all use DA for text // styling) @@ -3717,14 +3734,19 @@ EPDFAnnot_GetDefaultAppearance(FPDF_ANNOTATION annot, if (!doc) { return false; } + CPDF_DocumentViewScope document_view(doc); + const CPDF_Dictionary* annot_dict = context->GetAnnotDict(); + if (!annot_dict) { + return false; + } // Get AcroForm for inherited /DA and /DR. - RetainPtr root_dict = doc->GetMutableRoot(); + const CPDF_Dictionary* root_dict = doc->GetRoot(); RetainPtr acroform_dict = root_dict ? root_dict->GetDictFor("AcroForm") : nullptr; // Parse the /DA string, inheriting from AcroForm if necessary. - CPDF_DefaultAppearance da(annot_dict.Get(), acroform_dict.Get()); + CPDF_DefaultAppearance da(annot_dict, acroform_dict.Get()); // Get Font and Font Size std::optional font_info = @@ -3822,10 +3844,11 @@ EPDFPage_GetAnnotByName(FPDF_PAGE page, FPDF_WIDESTRING nm) { if (!page || !nm || !*nm) { return nullptr; } - const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return nullptr; } + const CPDF_Page* pPage = page_view.Get(); RetainPtr annots = pPage->GetAnnotsArray(); if (!annots) { @@ -3960,6 +3983,7 @@ FPDF_EXPORT int FPDF_CALLCONV EPDFPage_GetAnnotCountRaw(FPDF_DOCUMENT doc, if (!pdf || page_index < 0 || page_index >= pdf->GetPageCount()) { return 0; } + CPDF_DocumentViewScope document_view(pdf); RetainPtr page_dict = pdf->GetPageDictionary(page_index); if (!page_dict) { @@ -3976,6 +4000,7 @@ EPDFPage_GetAnnotRaw(FPDF_DOCUMENT doc, int page_index, int index) { page_index >= pdf->GetPageCount()) { return nullptr; } + CPDF_DocumentViewScope document_view(pdf); RetainPtr const_page_dict = pdf->GetPageDictionary(page_index); @@ -4553,15 +4578,16 @@ EPDFAnnot_ExportAppearanceAsDocument(FPDF_ANNOTATION annot) { return nullptr; } - RetainPtr annot_dict = ctx->GetMutableAnnotDict(); IPDF_Page* src_page = ctx->GetPage(); CPDF_Document* src_doc = src_page ? src_page->GetDocument() : nullptr; + CPDF_DocumentViewScope document_view(src_doc); + const CPDF_Dictionary* annot_dict = ctx->GetAnnotDict(); if (!annot_dict || !src_doc) { return nullptr; } RetainPtr ap_stream = - GetAnnotAP(annot_dict.Get(), CPDF_Annot::AppearanceMode::kNormal); + GetAnnotAP(annot_dict, CPDF_Annot::AppearanceMode::kNormal); if (!ap_stream) { return nullptr; } @@ -4658,6 +4684,7 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, if (!src_doc) { return nullptr; } + CPDF_DocumentViewScope document_view(src_doc); struct AnnotInfo { RetainPtr ap_stream; @@ -4683,13 +4710,13 @@ EPDFAnnot_ExportMultipleAppearancesAsDocument(FPDF_ANNOTATION* annots, return nullptr; } - RetainPtr annot_dict = ctx->GetMutableAnnotDict(); + const CPDF_Dictionary* annot_dict = ctx->GetAnnotDict(); if (!annot_dict) { return nullptr; } RetainPtr ap_stream = - GetAnnotAP(annot_dict.Get(), CPDF_Annot::AppearanceMode::kNormal); + GetAnnotAP(annot_dict, CPDF_Annot::AppearanceMode::kNormal); if (!ap_stream) { return nullptr; } @@ -5215,10 +5242,11 @@ EPDFPage_GetAnnotByObjectNumber(FPDF_PAGE page, unsigned int obj_num) { return nullptr; } - const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return nullptr; } + const CPDF_Page* pPage = page_view.Get(); RetainPtr annots = pPage->GetAnnotsArray(); if (!annots) { diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp index 66b293dfd1..a2d06025ed 100644 --- a/fpdfsdk/fpdf_attachment.cpp +++ b/fpdfsdk/fpdf_attachment.cpp @@ -141,7 +141,8 @@ ExtractOutcome CapOutcomeToUint32(ExtractOutcome outcome) { FPDF_EXPORT int FPDF_CALLCONV FPDFDoc_GetAttachmentCount(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return 0; } @@ -152,7 +153,8 @@ FPDFDoc_GetAttachmentCount(FPDF_DOCUMENT document) { FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFDoc_AddAttachment(FPDF_DOCUMENT document, FPDF_WIDESTRING name) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return nullptr; } @@ -185,7 +187,8 @@ FPDFDoc_AddAttachment(FPDF_DOCUMENT document, FPDF_WIDESTRING name) { FPDF_EXPORT FPDF_ATTACHMENT FPDF_CALLCONV FPDFDoc_GetAttachment(FPDF_DOCUMENT document, int index) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || index < 0) { return nullptr; } @@ -207,7 +210,8 @@ EPDFDoc_GetAttachmentKey(FPDF_DOCUMENT document, int index, FPDF_WCHAR* buffer, unsigned long buflen) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || index < 0) { return 0; } @@ -229,7 +233,8 @@ EPDFDoc_GetAttachmentKey(FPDF_DOCUMENT document, FPDF_EXPORT int FPDF_CALLCONV EPDFDoc_GetAttachmentIndexByKey(FPDF_DOCUMENT document, FPDF_WIDESTRING key) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || !key) { return -1; } @@ -253,7 +258,8 @@ EPDFDoc_GetAttachmentIndexByKey(FPDF_DOCUMENT document, FPDF_WIDESTRING key) { FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFDoc_DeleteAttachment(FPDF_DOCUMENT document, int index) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc || index < 0) { return false; } @@ -384,10 +390,18 @@ FPDFAttachment_SetFile(FPDF_ATTACHMENT attachment, } CPDF_Object* pFile = CPDFObjectFromFPDFAttachment(attachment); - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!pFile || !pFile->IsDictionary() || !doc || len > INT_MAX) { return false; } + RetainPtr effective_file; + if (pFile->GetObjNum() != 0) { + effective_file = doc->GetOrParseIndirectObject(pFile->GetObjNum()); + if (effective_file) { + pFile = effective_file.Get(); + } + } // Create a dictionary for the new embedded file stream. auto pFileStreamDict = pdfium::MakeRetain(); diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index cec99ec448..e8d5ed90e1 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp @@ -401,10 +401,11 @@ FPDFDest_GetLocationInPage(FPDF_DEST dest, FPDF_EXPORT FPDF_LINK FPDF_CALLCONV FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return nullptr; } + CPDF_Page* pPage = page_view.Get(); CPDF_LinkList* pLinkList = GetLinkList(pPage); if (!pLinkList) { @@ -421,10 +422,11 @@ FPDF_EXPORT FPDF_LINK FPDF_CALLCONV FPDFLink_GetLinkAtPoint(FPDF_PAGE page, FPDF_EXPORT int FPDF_CALLCONV FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, double x, double y) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return -1; } + CPDF_Page* pPage = page_view.Get(); CPDF_LinkList* pLinkList = GetLinkList(pPage); if (!pLinkList) { @@ -443,11 +445,20 @@ FPDF_EXPORT FPDF_DEST FPDF_CALLCONV FPDFLink_GetDest(FPDF_DOCUMENT document, if (!link) { return nullptr; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); - if (!doc) { + ScopedFPDFDocumentView document_view(document); + if (!document_view) { return nullptr; } - CPDF_Link cLink(pdfium::WrapRetain(CPDFDictionaryFromFPDFLink(link))); + CPDF_Document* doc = document_view.Get(); + RetainPtr link_dict(CPDFDictionaryFromFPDFLink(link)); + if (link_dict->GetObjNum() != 0) { + RetainPtr effective = + ToDictionary(doc->GetOrParseIndirectObject(link_dict->GetObjNum())); + if (effective) { + link_dict = std::move(effective); + } + } + CPDF_Link cLink(std::move(link_dict)); FPDF_DEST dest = FPDFDestFromCPDFArray(cLink.GetDest(doc).GetArray()); if (dest) { return dest; @@ -475,10 +486,11 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_Enumerate(FPDF_PAGE page, if (!start_pos || !link_annot) { return false; } - const CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return false; } + const CPDF_Page* pPage = page_view.Get(); RetainPtr pAnnots = pPage->GetAnnotsArray(); if (!pAnnots) { return false; @@ -501,11 +513,19 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFLink_Enumerate(FPDF_PAGE page, FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV FPDFLink_GetAnnot(FPDF_PAGE page, FPDF_LINK link_annot) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + ScopedFPDFPageView page_view(page); + CPDF_Page* pPage = page_view.Get(); RetainPtr pAnnotDict(CPDFDictionaryFromFPDFLink(link_annot)); if (!pPage || !pAnnotDict) { return nullptr; } + if (pAnnotDict->GetObjNum() != 0) { + RetainPtr effective = ToDictionary( + pPage->GetDocument()->GetOrParseIndirectObject(pAnnotDict->GetObjNum())); + if (effective) { + pAnnotDict = std::move(effective); + } + } auto pAnnotContext = std::make_unique( std::move(pAnnotDict), IPDFPageFromFPDFPage(page)); diff --git a/fpdfsdk/fpdf_javascript.cpp b/fpdfsdk/fpdf_javascript.cpp index d4e6266016..666e2b5719 100644 --- a/fpdfsdk/fpdf_javascript.cpp +++ b/fpdfsdk/fpdf_javascript.cpp @@ -25,11 +25,10 @@ struct CPDF_JavaScript { namespace { RetainPtr GetNamedJavaScriptActionDictionary( - FPDF_DOCUMENT document, + CPDF_Document* doc, int index, WideString* name, std::optional* script) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); if (!doc || index < 0) { return nullptr; } @@ -57,7 +56,8 @@ RetainPtr GetNamedJavaScriptActionDictionary( FPDF_EXPORT int FPDF_CALLCONV FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return -1; } @@ -68,9 +68,11 @@ FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) { FPDF_EXPORT FPDF_JAVASCRIPT_ACTION FPDF_CALLCONV FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { + ScopedFPDFDocumentView document_view(document); WideString name; std::optional script; - if (!GetNamedJavaScriptActionDictionary(document, index, &name, &script)) { + if (!GetNamedJavaScriptActionDictionary(document_view.Get(), index, &name, + &script)) { return nullptr; } @@ -82,12 +84,15 @@ FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) { FPDF_EXPORT EPDF_ACTION_MODEL FPDF_CALLCONV EPDFDoc_GetNamedJavaScriptActionModel(FPDF_DOCUMENT document, int index) { + ScopedFPDFDocumentView document_view(document); WideString name; std::optional script; RetainPtr dictionary = - GetNamedJavaScriptActionDictionary(document, index, &name, &script); + GetNamedJavaScriptActionDictionary(document_view.Get(), index, &name, + &script); return dictionary ? epdf::MakeActionModelHandle(epdf::BuildActionModel( - CPDF_Action(std::move(dictionary)))) + CPDF_Action(std::move(dictionary)), + document_view.Get())) : nullptr; } diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp index b43d23e244..abe2cfecb7 100644 --- a/fpdfsdk/fpdf_progressive.cpp +++ b/fpdfsdk/fpdf_progressive.cpp @@ -53,10 +53,11 @@ FPDF_RenderPageBitmapWithColorScheme_Start(FPDF_BITMAP bitmap, return FPDF_RENDER_FAILED; } - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return FPDF_RENDER_FAILED; } + CPDF_Page* pPage = page_view.Get(); RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); if (!pBitmap) { @@ -134,10 +135,11 @@ FPDF_EXPORT int FPDF_CALLCONV FPDF_RenderPage_Continue(FPDF_PAGE page, return FPDF_RENDER_FAILED; } - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return FPDF_RENDER_FAILED; } + CPDF_Page* pPage = page_view.Get(); auto* context = static_cast(pPage->GetRenderContext()); diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp index 960b2aefce..a6e8376a12 100644 --- a/fpdfsdk/fpdf_text.cpp +++ b/fpdfsdk/fpdf_text.cpp @@ -41,10 +41,11 @@ CPDF_TextPage* GetTextPageForValidIndex(FPDF_TEXTPAGE text_page, int index) { } // namespace FPDF_EXPORT FPDF_TEXTPAGE FPDF_CALLCONV FPDFText_LoadPage(FPDF_PAGE page) { - CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); - if (!pPDFPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return nullptr; } + CPDF_Page* pPDFPage = page_view.Get(); CPDF_ViewerPreferences viewRef(pPDFPage->GetDocument()); auto textpage = diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp index 8f60478de6..f9c8224024 100644 --- a/fpdfsdk/fpdf_view.cpp +++ b/fpdfsdk/fpdf_view.cpp @@ -25,6 +25,7 @@ #include "core/fpdfapi/parser/cpdf_boolean.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_document_view_scope.h" #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_parser.h" @@ -1027,10 +1028,11 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_RenderPage(HDC dc, int size_y, int rotate, int flags) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return false; } + CPDF_Page* pPage = page_view.Get(); auto owned_context = std::make_unique(); CPDF_PageRenderContext* context = owned_context.get(); @@ -1152,10 +1154,11 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, int size_y, int rotate, int flags) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return; } + CPDF_Page* pPage = page_view.Get(); RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); if (!pBitmap) { @@ -1188,10 +1191,11 @@ FPDF_RenderPageBitmapWithMatrix(FPDF_BITMAP bitmap, const FS_MATRIX* matrix, const FS_RECTF* clipping, int flags) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return; } + CPDF_Page* pPage = page_view.Get(); RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); if (!pBitmap) { @@ -1244,8 +1248,10 @@ EPDF_RenderAnnotBitmap(FPDF_BITMAP bitmap, return false; } + CPDF_DocumentViewScope document_view(pPage->GetDocument()); + // Get the annotation's dictionary from the context. - RetainPtr pAnnotDict = pAnnotContext->GetMutableAnnotDict(); + const CPDF_Dictionary* pAnnotDict = pAnnotContext->GetAnnotDict(); if (!pAnnotDict) { return false; } @@ -1257,7 +1263,8 @@ EPDF_RenderAnnotBitmap(FPDF_BITMAP bitmap, } // Instantiate CPDF_Annot using its public constructor. - auto pAnnot = std::make_unique(std::move(pAnnotDict), pDoc); + auto pAnnot = std::make_unique( + pdfium::WrapRetain(const_cast(pAnnotDict)), pDoc); // ---------------------------------------------------------------- bitmaps RetainPtr pBitmap(CFXDIBitmapFromFPDFBitmap(bitmap)); @@ -1306,7 +1313,8 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, return false; } - RetainPtr pAnnotDict = pAnnotContext->GetMutableAnnotDict(); + CPDF_DocumentViewScope document_view(pPage->GetDocument()); + const CPDF_Dictionary* pAnnotDict = pAnnotContext->GetAnnotDict(); if (!pAnnotDict) { return false; } @@ -1316,7 +1324,8 @@ EPDF_RenderAnnotBitmapUnrotated(FPDF_BITMAP bitmap, return false; } - auto pAnnot = std::make_unique(std::move(pAnnotDict), pDoc); + auto pAnnot = std::make_unique( + pdfium::WrapRetain(const_cast(pAnnotDict)), pDoc); // Get the AP form for the requested mode. // Note: we skip ShouldDrawAnnotation/GenerateAPIfNeeded (private) because @@ -1394,10 +1403,11 @@ FPDF_EXPORT void FPDF_CALLCONV FPDF_RenderPageSkia(FPDF_SKIA_CANVAS canvas, return; } - CPDF_Page* cpdf_page = CPDFPageFromFPDFPage(page); - if (!cpdf_page) { + ScopedFPDFPageView page_view(page); + if (!page_view) { return; } + CPDF_Page* cpdf_page = page_view.Get(); auto owned_context = std::make_unique(); CPDF_PageRenderContext* context = owned_context.get(); @@ -2041,7 +2051,8 @@ FPDF_VIEWERREF_GetName(FPDF_DOCUMENT document, FPDF_EXPORT FPDF_DWORD FPDF_CALLCONV FPDF_CountNamedDests(FPDF_DOCUMENT document) { - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return 0; } @@ -2066,7 +2077,8 @@ FPDF_GetNamedDestByName(FPDF_DOCUMENT document, FPDF_BYTESTRING name) { return nullptr; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return nullptr; } @@ -2163,7 +2175,8 @@ FPDF_EXPORT FPDF_DEST FPDF_CALLCONV FPDF_GetNamedDest(FPDF_DOCUMENT document, return nullptr; } - CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document); + ScopedFPDFDocumentView document_view(document); + CPDF_Document* doc = document_view.Get(); if (!doc) { return nullptr; } diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp index 968f59579a..f0603e9d99 100644 --- a/fpdfsdk/fpdf_view_embeddertest.cpp +++ b/fpdfsdk/fpdf_view_embeddertest.cpp @@ -250,6 +250,33 @@ class FPDFViewEmbedderTest : public EmbedderTest { for (int annot_index = 0; annot_index < annot_count; ++annot_index) { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), annot_index)); ASSERT_TRUE(annot) << file_name << " annot " << annot_index; + + (void)FPDFAnnot_GetFlags(annot.get()); + (void)EPDFAnnot_GetBlendMode(annot.get()); + FPDF_STANDARD_FONT font = FPDF_FONT_UNKNOWN; + float font_size = 0; + unsigned int red = 0; + unsigned int green = 0; + unsigned int blue = 0; + (void)EPDFAnnot_GetDefaultAppearance( + annot.get(), &font, &font_size, &red, &green, &blue); + const int object_count = FPDFAnnot_GetObjectCount(annot.get()); + if (object_count > 0) { + EXPECT_TRUE(FPDFAnnot_GetObject(annot.get(), 0)) + << file_name << " annot " << annot_index; + } + + if (FPDFAnnot_GetSubtype(annot.get()) == FPDF_ANNOT_LINK) { + EXPECT_TRUE(FPDFAnnot_GetLink(annot.get())) + << file_name << " annot " << annot_index; + } + if (FPDFAnnot_GetSubtype(annot.get()) == FPDF_ANNOT_FILEATTACHMENT) { + EXPECT_TRUE(FPDFAnnot_GetFileAttachment(annot.get())) + << file_name << " annot " << annot_index; + } + + ScopedFPDFAnnotation linked( + FPDFAnnot_GetLinkedAnnot(annot.get(), "IRT")); } int link_pos = 0; @@ -1177,11 +1204,249 @@ TEST_F(FPDFViewEmbedderTest, OpenFreshLayerAnnotHandleDoesNotPromote) { ScopedFPDFAnnotation annot(FPDFPage_GetAnnot(page.get(), 0)); ASSERT_TRUE(annot); EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + const int object_count = FPDFAnnot_GetObjectCount(annot.get()); + EXPECT_GT(object_count, 0); + EXPECT_TRUE(FPDFAnnot_GetObject(annot.get(), 0)); + (void)EPDFAnnot_GetBlendMode(annot.get()); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); + + ScopedFPDFBitmap bitmap( + FPDFBitmap_Create(/*width=*/612, /*height=*/792, /*alpha=*/1)); + ASSERT_TRUE(bitmap); + ASSERT_TRUE(FPDFBitmap_FillRect(bitmap.get(), 0, 0, 612, 792, 0xFFFFFFFF)); + const FS_MATRIX identity = {1, 0, 0, 1, 0, 0}; + EXPECT_TRUE(EPDF_RenderAnnotBitmap(bitmap.get(), page.get(), annot.get(), + FPDF_ANNOT_APPEARANCEMODE_NORMAL, + &identity, 0)); + EXPECT_EQ(0u, EPDFLayer_GetPromotedObjectCount(layer.get())); } EPDF_ReleaseBaseDocument(base); } +TEST_F(FPDFViewEmbedderTest, + ExistingAnnotHandlesAndDeltaReplaySeeEffectiveLayerGeometry) { + FileAccessForTesting base_access("polygon_annot.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status_a = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_a( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_a)); + ASSERT_TRUE(layer_a); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status_a); + + EPDFLayerOpenStatus status_b = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer_b( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status_b)); + ASSERT_TRUE(layer_b); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status_b); + + ScopedFPDFPage writer_page(FPDF_LoadPage(layer_a.get(), 0)); + ScopedFPDFPage reader_page(FPDF_LoadPage(layer_a.get(), 0)); + ScopedFPDFPage sibling_page(FPDF_LoadPage(layer_b.get(), 0)); + ASSERT_TRUE(writer_page); + ASSERT_TRUE(reader_page); + ASSERT_TRUE(sibling_page); + + ScopedFPDFAnnotation writer(FPDFPage_GetAnnot(writer_page.get(), 0)); + ScopedFPDFAnnotation reader(FPDFPage_GetAnnot(reader_page.get(), 0)); + ScopedFPDFAnnotation sibling(FPDFPage_GetAnnot(sibling_page.get(), 0)); + ASSERT_TRUE(writer); + ASSERT_TRUE(reader); + ASSERT_TRUE(sibling); + + ScopedFPDFBitmap original_bitmap = + RenderPageWithFlags(sibling_page.get(), nullptr, FPDF_ANNOT); + ASSERT_TRUE(original_bitmap); + const std::string original_hash = HashBitmap(original_bitmap.get()); + + FS_RECTF original_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(writer.get(), &original_rect)); + const FS_RECTF moved_rect = { + 160.0f, + 440.0f, + 500.0f, + 250.0f, + }; + const FS_POINTF moved_vertices[] = { + {176.0f, 319.0f}, + {367.0f, 434.0f}, + {489.0f, 266.42f}, + }; + + ASSERT_TRUE(FPDFAnnot_SetRect(writer.get(), &moved_rect)); + ASSERT_TRUE(EPDFAnnot_SetVertices(writer.get(), moved_vertices, + std::size(moved_vertices))); + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(writer.get())); + ASSERT_TRUE(FPDFPage_GenerateContent(writer_page.get())); + + FS_RECTF observed_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(reader.get(), &observed_rect)); + EXPECT_FLOAT_EQ(moved_rect.left, observed_rect.left); + EXPECT_FLOAT_EQ(moved_rect.top, observed_rect.top); + EXPECT_FLOAT_EQ(moved_rect.right, observed_rect.right); + EXPECT_FLOAT_EQ(moved_rect.bottom, observed_rect.bottom); + + std::vector observed_vertices(std::size(moved_vertices)); + ASSERT_EQ(observed_vertices.size(), + FPDFAnnot_GetVertices(reader.get(), observed_vertices.data(), + observed_vertices.size())); + for (size_t i = 0; i < observed_vertices.size(); ++i) { + EXPECT_FLOAT_EQ(moved_vertices[i].x, observed_vertices[i].x); + EXPECT_FLOAT_EQ(moved_vertices[i].y, observed_vertices[i].y); + } + + FS_RECTF sibling_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(sibling.get(), &sibling_rect)); + EXPECT_FLOAT_EQ(original_rect.left, sibling_rect.left); + EXPECT_FLOAT_EQ(original_rect.top, sibling_rect.top); + EXPECT_FLOAT_EQ(original_rect.right, sibling_rect.right); + EXPECT_FLOAT_EQ(original_rect.bottom, sibling_rect.bottom); + + ScopedFPDFBitmap writer_bitmap = + RenderPageWithFlags(writer_page.get(), nullptr, FPDF_ANNOT); + ScopedFPDFBitmap reader_bitmap = + RenderPageWithFlags(reader_page.get(), nullptr, FPDF_ANNOT); + ScopedFPDFBitmap sibling_bitmap = + RenderPageWithFlags(sibling_page.get(), nullptr, FPDF_ANNOT); + ASSERT_TRUE(writer_bitmap); + ASSERT_TRUE(reader_bitmap); + ASSERT_TRUE(sibling_bitmap); + const std::string moved_hash = HashBitmap(writer_bitmap.get()); + EXPECT_EQ(moved_hash, HashBitmap(reader_bitmap.get())); + EXPECT_EQ(original_hash, HashBitmap(sibling_bitmap.get())); + EXPECT_NE(original_hash, moved_hash); + + ClearString(); + EPDFLayerSaveStatus save_status = EPDFLayerSaveStatus_kSaveFailed; + ASSERT_TRUE(EPDFLayer_SaveDelta(layer_a.get(), this, &save_status)); + ASSERT_EQ(EPDFLayerSaveStatus_kSuccess, save_status); + std::string delta = GetString(); + ASSERT_FALSE(delta.empty()); + + FPDF_FILEACCESS delta_access = {}; + delta_access.m_FileLen = delta.size(); + delta_access.m_GetBlock = GetBlockFromString; + delta_access.m_Param = δ + EPDFLayerOpenStatus replay_status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument replayed( + EPDFLayer_OpenLayer(base, &delta_access, nullptr, &replay_status)); + ASSERT_TRUE(replayed); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, replay_status); + + ScopedFPDFPage replayed_page(FPDF_LoadPage(replayed.get(), 0)); + ASSERT_TRUE(replayed_page); + ScopedFPDFAnnotation replayed_annot( + FPDFPage_GetAnnot(replayed_page.get(), 0)); + ASSERT_TRUE(replayed_annot); + + FS_RECTF replayed_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(replayed_annot.get(), &replayed_rect)); + EXPECT_FLOAT_EQ(moved_rect.left, replayed_rect.left); + EXPECT_FLOAT_EQ(moved_rect.top, replayed_rect.top); + EXPECT_FLOAT_EQ(moved_rect.right, replayed_rect.right); + EXPECT_FLOAT_EQ(moved_rect.bottom, replayed_rect.bottom); + + std::vector replayed_vertices(std::size(moved_vertices)); + ASSERT_EQ( + replayed_vertices.size(), + FPDFAnnot_GetVertices(replayed_annot.get(), replayed_vertices.data(), + replayed_vertices.size())); + for (size_t i = 0; i < replayed_vertices.size(); ++i) { + EXPECT_FLOAT_EQ(moved_vertices[i].x, replayed_vertices[i].x); + EXPECT_FLOAT_EQ(moved_vertices[i].y, replayed_vertices[i].y); + } + + ScopedFPDFBitmap replayed_bitmap = + RenderPageWithFlags(replayed_page.get(), nullptr, FPDF_ANNOT); + ASSERT_TRUE(replayed_bitmap); + EXPECT_EQ(moved_hash, HashBitmap(replayed_bitmap.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, + PromotedBaseAnnotReopensByObjectNumberFromEffectiveLayer) { + FileAccessForTesting base_access("polygon_annot.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + + ScopedFPDFAnnotation writer(FPDFPage_GetAnnot(page.get(), 0)); + ASSERT_TRUE(writer); + const uint32_t object_number = EPDFAnnot_GetObjectNumber(writer.get()); + ASSERT_GT(object_number, 0u); + + const FS_RECTF moved_rect = { + 160.0f, + 440.0f, + 500.0f, + 250.0f, + }; + ASSERT_TRUE(FPDFAnnot_SetRect(writer.get(), &moved_rect)); + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(writer.get())); + ASSERT_TRUE(FPDFPage_GenerateContent(page.get())); + writer.reset(); + + ScopedFPDFAnnotation reopened( + EPDFPage_GetAnnotByObjectNumber(page.get(), object_number)); + ASSERT_TRUE(reopened); + + FS_RECTF observed_rect; + ASSERT_TRUE(FPDFAnnot_GetRect(reopened.get(), &observed_rect)); + EXPECT_FLOAT_EQ(moved_rect.left, observed_rect.left); + EXPECT_FLOAT_EQ(moved_rect.top, observed_rect.top); + EXPECT_FLOAT_EQ(moved_rect.right, observed_rect.right); + EXPECT_FLOAT_EQ(moved_rect.bottom, observed_rect.bottom); + EXPECT_EQ(0, FPDFPage_GetAnnotIndex(page.get(), reopened.get())); + + EPDF_ReleaseBaseDocument(base); +} + +TEST_F(FPDFViewEmbedderTest, LinkCacheRebuildsAfterOverlayEpochChanges) { + FileAccessForTesting base_access("annots.pdf"); + EPDF_BASE_DOCUMENT base = EPDF_LoadBaseDocument(&base_access, nullptr); + ASSERT_TRUE(base); + + EPDFLayerOpenStatus status = EPDFLayerOpenStatus_kOpenFailed; + ScopedFPDFDocument layer( + EPDFLayer_OpenLayer(base, nullptr, nullptr, &status)); + ASSERT_TRUE(layer); + ASSERT_EQ(EPDFLayerOpenStatus_kSuccess, status); + + ScopedFPDFPage page(FPDF_LoadPage(layer.get(), 0)); + ASSERT_TRUE(page); + + FPDF_LINK initial = FPDFLink_GetLinkAtPoint(page.get(), 69.0, 653.0); + ASSERT_TRUE(initial); + CPDF_Dictionary* initial_dict = CPDFDictionaryFromFPDFLink(initial); + ASSERT_TRUE(initial_dict); + ASSERT_GT(initial_dict->GetObjNum(), 0u); + + CPDF_Document* layer_doc = CPDFDocumentFromFPDFDocument(layer.get()); + ASSERT_TRUE(layer_doc); + RetainPtr promoted = ToDictionary( + layer_doc->GetMutableIndirectObject(initial_dict->GetObjNum())); + ASSERT_TRUE(promoted); + promoted->SetRectFor("Rect", CFX_FloatRect(300.0f, 300.0f, 350.0f, 350.0f)); + + EXPECT_FALSE(FPDFLink_GetLinkAtPoint(page.get(), 69.0, 653.0)); + EXPECT_TRUE(FPDFLink_GetLinkAtPoint(page.get(), 325.0, 325.0)); + + layer.reset(); + EPDF_ReleaseBaseDocument(base); +} + TEST_F(FPDFViewEmbedderTest, ReadOnlyLayerWorkflowsProduceEmptyDelta) { static constexpr const char* kFiles[] = { "links_highlights_annots.pdf", diff --git a/public/epdf_action.h b/public/epdf_action.h index cc59ef6f51..726f8ea75d 100644 --- a/public/epdf_action.h +++ b/public/epdf_action.h @@ -17,14 +17,12 @@ extern "C" { // Experimental EmbedPDF Extension API. // // Detached PDF action model. A model contains one root action and its -// normalized /Next descendants. The structural fields (type, subtype, -// script, chain) are copied at build time and stay valid after the -// document is closed or mutated. Each node additionally RETAINS its action -// dictionary so the EPDFAction_GetNode{Dest,URI,FilePath,Name} payload -// getters can read payloads on demand: those getters read the CURRENT -// dictionary state, and the ones taking a FPDF_DOCUMENT require the -// originating document to still be open (they resolve named destinations -// and URI normalization through it). +// normalized /Next descendants. Type, subtype, script, chain, destination, +// URI, file path, and named-action payloads are copied at build time and stay +// valid after the document is closed or mutated. The getters that take an +// FPDF_DOCUMENT still require the originating document to be open: it +// validates destination page identity and is used to resolve a named +// destination when EPDFAction_LoadModel() had no document owner available. // // The API extracts action data only. It never executes JavaScript. typedef struct epdf_action_model_t__* EPDF_ACTION_MODEL; From 58c48b47f51612b8034101b82a4413b3f4061e14 Mon Sep 17 00:00:00 2001 From: Bob Singor Date: Wed, 29 Jul 2026 15:26:56 +0300 Subject: [PATCH 56/56] Improve annotation border style & dash handling Refactor annotation border logic to prefer the modern /BS dictionary over the legacy /Border array, provide sensible defaults (1.0f) for missing widths, and normalize return types to floats. Introduce GetExplicitBorderDashArray helper and update EPDFAnnot_GetBorderDashPatternCount, EPDFAnnot_GetBorderDashPattern, and EPDFAnnot_GetBorderStyle to correctly resolve dashed styles, widths, and ISO 32000-2 precedence rules. Add a unit test (BorderStyleResolutionUsesISOPrecedence) to verify precedence, defaults, appearance generation, and dash extraction. Update public header comments to document that dash APIs handle both /BS and /Border. --- core/fpdfdoc/cpdf_generateap.cpp | 14 +++-- fpdfsdk/fpdf_annot.cpp | 73 +++++++++++++++--------- fpdfsdk/fpdf_annot_embeddertest.cpp | 87 +++++++++++++++++++++++++++++ public/fpdf_annot.h | 7 ++- 4 files changed, 147 insertions(+), 34 deletions(-) diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp index d2be5aa2a1..a6002989d4 100644 --- a/core/fpdfdoc/cpdf_generateap.cpp +++ b/core/fpdfdoc/cpdf_generateap.cpp @@ -815,8 +815,10 @@ ByteString GetColorStringWithDefault(const CPDF_Array* color_array, float GetBorderWidth(const CPDF_Dictionary* dict) { RetainPtr border_style_dict = dict->GetDictFor("BS"); - if (border_style_dict && border_style_dict->KeyExist("W")) { - return border_style_dict->GetFloatFor("W"); + if (border_style_dict) { + return border_style_dict->KeyExist("W") + ? border_style_dict->GetFloatFor("W") + : 1.0f; } auto border_array = dict->GetArrayFor(pdfium::annotation::kBorder); @@ -824,13 +826,15 @@ float GetBorderWidth(const CPDF_Dictionary* dict) { return border_array->GetFloatAt(2); } - return 1; + return 1.0f; } RetainPtr GetDashArray(const CPDF_Dictionary* dict) { RetainPtr border_style_dict = dict->GetDictFor("BS"); - if (border_style_dict && border_style_dict->GetByteStringFor("S") == "D") { - return border_style_dict->GetArrayFor("D"); + if (border_style_dict) { + return border_style_dict->GetByteStringFor("S") == "D" + ? border_style_dict->GetArrayFor("D") + : nullptr; } RetainPtr border_array = diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp index 0b0f759284..a474427cd8 100644 --- a/fpdfsdk/fpdf_annot.cpp +++ b/fpdfsdk/fpdf_annot.cpp @@ -3109,31 +3109,40 @@ EPDFAnnot_ClearRectangleDifferences(FPDF_ANNOTATION annot) { return true; } -FPDF_EXPORT unsigned long FPDF_CALLCONV -EPDFAnnot_GetBorderDashPatternCount(FPDF_ANNOTATION annot) { - const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); - if (!pAnnotDict) { - return 0; - } +namespace { - // The dash pattern is inside the /BS dictionary. +RetainPtr GetExplicitBorderDashArray( + const CPDF_Dictionary* pAnnotDict) { RetainPtr pBSDict = pAnnotDict->GetDictFor("BS"); - if (!pBSDict) { - return 0; + if (pBSDict) { + // /BS takes precedence over /Border. A missing or unrecognised /S uses + // the solid default, so no dash pattern applies. + if (pBSDict->GetNameFor("S") != "D") { + return nullptr; + } + return pBSDict->GetArrayFor("D"); } - // The border style must be dashed. - if (pBSDict->GetNameFor("S") != "D") { - return 0; + RetainPtr pBorderArray = + pAnnotDict->GetArrayFor(pdfium::annotation::kBorder); + if (!pBorderArray || pBorderArray->size() < 4) { + return nullptr; } + return pBorderArray->GetArrayAt(3); +} - // The dash pattern is defined by the /D array. - RetainPtr pDashArray = pBSDict->GetArrayFor("D"); - if (!pDashArray) { +} // namespace + +FPDF_EXPORT unsigned long FPDF_CALLCONV +EPDFAnnot_GetBorderDashPatternCount(FPDF_ANNOTATION annot) { + const CPDF_Dictionary* pAnnotDict = GetAnnotDictFromFPDFAnnotation(annot); + if (!pAnnotDict) { return 0; } - return pDashArray->size(); + RetainPtr pDashArray = + GetExplicitBorderDashArray(pAnnotDict); + return pDashArray ? pDashArray->size() : 0; } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV @@ -3145,12 +3154,8 @@ EPDFAnnot_GetBorderDashPattern(FPDF_ANNOTATION annot, return false; } - RetainPtr pBSDict = pAnnotDict->GetDictFor("BS"); - if (!pBSDict || pBSDict->GetNameFor("S") != "D") { - return false; - } - - RetainPtr pDashArray = pBSDict->GetArrayFor("D"); + RetainPtr pDashArray = + GetExplicitBorderDashArray(pAnnotDict); if (!pDashArray || pDashArray->size() < count) { return false; } @@ -3225,15 +3230,29 @@ EPDFAnnot_GetBorderStyle(FPDF_ANNOTATION annot, float* width) { if (width) { *width = pBSDict->KeyExist("W") ? pBSDict->GetFloatFor("W") : 1.0f; } - // Use our new internal helper function and cast the result - return static_cast( - CPDF_Annot::StringToBorderStyle(pBSDict->GetNameFor("S"))); + + CPDF_Annot::BorderStyle nStyle = + CPDF_Annot::StringToBorderStyle(pBSDict->GetNameFor("S")); + if (nStyle == CPDF_Annot::BorderStyle::kUnknown) { + nStyle = CPDF_Annot::BorderStyle::kSolid; + } + return static_cast(nStyle); } + RetainPtr pBorderArray = + pAnnotDict->GetArrayFor(pdfium::annotation::kBorder); if (width) { - *width = 0; + *width = pBorderArray && pBorderArray->size() >= 3 + ? pBorderArray->GetFloatAt(2) + : 1.0f; + } + + RetainPtr pDashArray = + GetExplicitBorderDashArray(pAnnotDict); + if (pDashArray && !pDashArray->IsEmpty()) { + return FPDF_ANNOT_BS_DASHED; } - return FPDF_ANNOT_BS_UNKNOWN; + return FPDF_ANNOT_BS_SOLID; } FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp index d67f89a18d..ca5907d293 100644 --- a/fpdfsdk/fpdf_annot_embeddertest.cpp +++ b/fpdfsdk/fpdf_annot_embeddertest.cpp @@ -4987,6 +4987,93 @@ TEST_F(FPDFAnnotEmbedderTest, AnnotationBorder) { } } +TEST_F(FPDFAnnotEmbedderTest, BorderStyleResolutionUsesISOPrecedence) { + ScopedFPDFDocument doc(FPDF_CreateNewDocument()); + ASSERT_TRUE(doc); + ScopedFPDFPage page(FPDFPage_New(doc.get(), 0, 100, 100)); + ASSERT_TRUE(page); + ScopedFPDFAnnotation annot( + FPDFPage_CreateAnnot(page.get(), FPDF_ANNOT_CIRCLE)); + ASSERT_TRUE(annot); + + CPDF_AnnotContext* context = CPDFAnnotContextFromFPDFAnnotation(annot.get()); + ASSERT_TRUE(context); + RetainPtr annot_dict = context->GetMutableAnnotDict(); + ASSERT_TRUE(annot_dict); + annot_dict->RemoveFor("BS"); + annot_dict->RemoveFor(pdfium::annotation::kBorder); + + auto expect_style = [&](FPDF_ANNOT_BORDER_STYLE expected_style, + float expected_width) { + float width = -1.0f; + EXPECT_EQ(expected_style, EPDFAnnot_GetBorderStyle(annot.get(), &width)); + EXPECT_FLOAT_EQ(expected_width, width); + }; + + // ISO 32000-2, 12.5.4: if neither /BS nor /Border is present, the + // effective border is a solid 1-point line. + expect_style(FPDF_ANNOT_BS_SOLID, 1.0f); + EXPECT_EQ(0u, EPDFAnnot_GetBorderDashPatternCount(annot.get())); + + // The legacy /Border array supplies the width and optional dash pattern + // when /BS is absent. + RetainPtr border = + annot_dict->SetNewFor(pdfium::annotation::kBorder); + border->AppendNew(0); + border->AppendNew(0); + border->AppendNew(0); + expect_style(FPDF_ANNOT_BS_SOLID, 0.0f); + + RetainPtr border_dash = border->AppendNew(); + border_dash->AppendNew(3); + border_dash->AppendNew(2); + expect_style(FPDF_ANNOT_BS_DASHED, 0.0f); + ASSERT_EQ(2u, EPDFAnnot_GetBorderDashPatternCount(annot.get())); + std::array dash_values; + ASSERT_TRUE(EPDFAnnot_GetBorderDashPattern(annot.get(), dash_values.data(), + dash_values.size())); + EXPECT_FLOAT_EQ(3.0f, dash_values[0]); + EXPECT_FLOAT_EQ(2.0f, dash_values[1]); + + // /BS suppresses /Border completely. Missing /W and /S in /BS use their + // defaults (1 point and solid), rather than falling back to /Border. + RetainPtr border_style = + annot_dict->SetNewFor("BS"); + expect_style(FPDF_ANNOT_BS_SOLID, 1.0f); + EXPECT_EQ(0u, EPDFAnnot_GetBorderDashPatternCount(annot.get())); + + const FS_RECTF rect{/*left=*/10.0f, /*top=*/90.0f, /*right=*/90.0f, + /*bottom=*/10.0f}; + ASSERT_TRUE(FPDFAnnot_SetRect(annot.get(), &rect)); + ASSERT_TRUE(EPDFAnnot_GenerateAppearance(annot.get())); + ByteString appearance = GetNormalAppearanceStreamBytes(annot.get()); + EXPECT_TRUE(appearance.Find("1 w ").has_value()); + EXPECT_FALSE(appearance.Find("] 0 d").has_value()); + + // Explicit /BS values, including zero width, remain authoritative. + border_style->SetNewFor("W", 0); + border_style->SetNewFor("S", "D"); + RetainPtr bs_dash = border_style->SetNewFor("D"); + bs_dash->AppendNew(4); + bs_dash->AppendNew(1); + expect_style(FPDF_ANNOT_BS_DASHED, 0.0f); + ASSERT_EQ(2u, EPDFAnnot_GetBorderDashPatternCount(annot.get())); + ASSERT_TRUE(EPDFAnnot_GetBorderDashPattern(annot.get(), dash_values.data(), + dash_values.size())); + EXPECT_FLOAT_EQ(4.0f, dash_values[0]); + EXPECT_FLOAT_EQ(1.0f, dash_values[1]); + + // Unknown /BS styles are required to use the solid default. + border_style->SetNewFor("S", "Unknown"); + expect_style(FPDF_ANNOT_BS_SOLID, 0.0f); + EXPECT_EQ(0u, EPDFAnnot_GetBorderDashPatternCount(annot.get())); + + float invalid_width = 42.0f; + EXPECT_EQ(FPDF_ANNOT_BS_UNKNOWN, + EPDFAnnot_GetBorderStyle(nullptr, &invalid_width)); + EXPECT_FLOAT_EQ(0.0f, invalid_width); +} + TEST_F(FPDFAnnotEmbedderTest, AnnotationJavaScript) { ASSERT_TRUE(OpenDocument("annot_javascript.pdf")); ScopedPage page = LoadScopedPage(0); diff --git a/public/fpdf_annot.h b/public/fpdf_annot.h index 78117e4fec..76b0f73c8e 100644 --- a/public/fpdf_annot.h +++ b/public/fpdf_annot.h @@ -1444,7 +1444,9 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV EPDFAnnot_ClearRectangleDifferences(FPDF_ANNOTATION annot); // Experimental EmbedPDF Extension API. -// Get the number of entries in the dash pattern for a dashed border. +// Get the number of entries in the dash pattern for a dashed border. This +// function handles both the modern /BS dictionary and the legacy /Border +// array. // // annot - handle to an annotation. // @@ -1454,7 +1456,8 @@ FPDF_EXPORT unsigned long FPDF_CALLCONV EPDFAnnot_GetBorderDashPatternCount(FPDF_ANNOTATION annot); // Experimental EmbedPDF Extension API. -// Get the dash pattern for a dashed border. +// Get the dash pattern for a dashed border. This function handles both the +// modern /BS dictionary and the legacy /Border array. // // annot - handle to an annotation. // dash_array - a buffer to receive the dash pattern values.