From a19264f0402b9f42b45e18a9d5bd0614eff33906 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 6 Sep 2025 14:03:12 +0100 Subject: [PATCH] Refactor `QPDFFormFieldObjectHelper`: replace `getKey` with operator[], utilize `Dictionary` and `Name` for improved clarity and consistency, and streamline `/Resources` and `/Font` handling. --- libqpdf/QPDFFormFieldObjectHelper.cc | 50 ++++++++++++++++++++++++-------------------------- qpdf/qpdf.testcov | 1 - 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/libqpdf/QPDFFormFieldObjectHelper.cc b/libqpdf/QPDFFormFieldObjectHelper.cc index 8eb69f0..85a426a 100644 --- a/libqpdf/QPDFFormFieldObjectHelper.cc +++ b/libqpdf/QPDFFormFieldObjectHelper.cc @@ -744,17 +744,18 @@ QPDFFormFieldObjectHelper::generateTextAppearance(QPDFAnnotationObjectHelper& ao { QPDFObjectHandle AS = aoh.getAppearanceStream("/N"); if (AS.null()) { - QTC::TC("qpdf", "QPDFFormFieldObjectHelper create AS from scratch"); QPDFObjectHandle::Rectangle rect = aoh.getRect(); QPDFObjectHandle::Rectangle bbox(0, 0, rect.urx - rect.llx, rect.ury - rect.lly); - QPDFObjectHandle dict = QPDFObjectHandle::parse( - "<< /Resources << /ProcSet [ /PDF /Text ] >> /Type /XObject /Subtype /Form >>"); - dict.replaceKey("/BBox", QPDFObjectHandle::newFromRectangle(bbox)); + auto dict = Dictionary( + {{"/BBox", QPDFObjectHandle::newFromRectangle(bbox)}, + {"/Resources", Dictionary({{"/ProcSet", Array({Name("/PDF"), Name("/Text")})}})}, + {"/Type", Name("/XObject")}, + {"/Subtype", Name("/Form")}}); AS = QPDFObjectHandle::newStream(oh().getOwningQPDF(), "/Tx BMC\nEMC\n"); AS.replaceDict(dict); - QPDFObjectHandle AP = aoh.getAppearanceDictionary(); - if (AP.null()) { - aoh.getObjectHandle().replaceKey("/AP", QPDFObjectHandle::newDictionary()); + Dictionary AP = aoh.getAppearanceDictionary(); + if (!AP) { + aoh.getObjectHandle().replaceKey("/AP", Dictionary::empty()); AP = aoh.getAppearanceDictionary(); } AP.replaceKey("/N", AS); @@ -777,7 +778,7 @@ QPDFFormFieldObjectHelper::generateTextAppearance(QPDFAnnotationObjectHelper& ao std::string DA = getDefaultAppearance(); std::string V = getValueAsString(); std::vector opt; - if (isChoice() && ((getFlags() & ff_ch_combo) == 0)) { + if (isChoice() && (getFlags() & ff_ch_combo) == 0) { opt = getChoices(); } @@ -792,29 +793,26 @@ QPDFFormFieldObjectHelper::generateTextAppearance(QPDFAnnotationObjectHelper& ao std::string font_name = tff.getFontName(); if (!font_name.empty()) { // See if the font is encoded with something we know about. - QPDFObjectHandle resources = AS.getDict().getKey("/Resources"); - QPDFObjectHandle font = getFontFromResource(resources, font_name); - bool found_font_in_dr = false; + Dictionary resources = AS.getDict()["/Resources"]; + Dictionary font = getFontFromResource(resources, font_name); if (!font) { - QPDFObjectHandle dr = getDefaultResources(); - font = getFontFromResource(dr, font_name); - found_font_in_dr = font.isDictionary(); - } - if (found_font_in_dr && resources.isDictionary()) { - if (resources.isIndirect()) { - resources = resources.getQPDF().makeIndirectObject(resources.shallowCopy()); - AS.getDict().replaceKey("/Resources", resources); + font = getFontFromResource(getDefaultResources(), font_name); + if (resources) { + if (resources.indirect()) { + resources = resources.qpdf()->makeIndirectObject(resources.copy()); + AS.getDict().replaceKey("/Resources", resources); + } + // Use mergeResources to force /Font to be local + QPDFObjectHandle res = resources; + res.mergeResources(Dictionary({{"/Font", Dictionary::empty()}})); + res.getKey("/Font").replaceKey(font_name, font); } - // Use mergeResources to force /Font to be local - resources.mergeResources("<< /Font << >> >>"_qpdf); - resources.getKey("/Font").replaceKey(font_name, font); } - if (font.isDictionary() && font.getKey("/Encoding").isName()) { - std::string encoding = font.getKey("/Encoding").getName(); - if (encoding == "/WinAnsiEncoding") { + if (Name Encoding = font["/Encoding"]) { + if (Encoding == "/WinAnsiEncoding") { encoder = &QUtil::utf8_to_win_ansi; - } else if (encoding == "/MacRomanEncoding") { + } else if (Encoding == "/MacRomanEncoding") { encoder = &QUtil::utf8_to_mac_roman; } } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 4fff849..930cfec 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -366,7 +366,6 @@ QPDFJob bytes fallback warning 0 QPDFJob invalid utf-8 in auto 0 QPDFJob input password hex-bytes 0 QPDFPageDocumentHelper ignore annotation with no appearance 0 -QPDFFormFieldObjectHelper create AS from scratch 0 QPDFFormFieldObjectHelper replaced BMC at EOF 0 QPDFFormFieldObjectHelper fallback Tf 0 QPDFPageObjectHelper copy shared attribute 1 -- libgit2 0.21.4