diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc index 935c0a1..e5dca43 100644 --- a/libqpdf/QPDF_encryption.cc +++ b/libqpdf/QPDF_encryption.cc @@ -664,7 +664,7 @@ QPDF::EncryptionParameters::initialize(QPDF& qpdf) std::string id1; auto id_obj = trailer.getKey("/ID"); - if (!id_obj.isArray() || id_obj.getArrayNItems() != 2 || !id_obj.getArrayItem(0).isString()) { + if (id_obj.size() != 2 || !id_obj.getArrayItem(0).isString()) { // Treating a missing ID as the empty string enables qpdf to decrypt some invalid encrypted // files with no /ID that poppler can read but Adobe Reader can't. qpdf.warn(qpdf.damagedPDF("trailer", "invalid /ID in trailer dictionary")); @@ -961,19 +961,21 @@ QPDF::decryptStream( } else if ( stream_dict.getKey("/DecodeParms").isArray() && stream_dict.getKey("/Filter").isArray()) { - QPDFObjectHandle filter = stream_dict.getKey("/Filter"); - QPDFObjectHandle decode = stream_dict.getKey("/DecodeParms"); - if (filter.getArrayNItems() == decode.getArrayNItems()) { - for (int i = 0; i < filter.getArrayNItems(); ++i) { - if (filter.getArrayItem(i).isNameAndEquals("/Crypt")) { - QPDFObjectHandle crypt_params = decode.getArrayItem(i); + auto filter = stream_dict.getKey("/Filter"); + auto decode = stream_dict.getKey("/DecodeParms"); + if (filter.size() == decode.size()) { + int i = 0; + for (auto const& item: filter.as_array()) { + if (item.isNameAndEquals("/Crypt")) { + auto crypt_params = decode.getArrayItem(i); if (crypt_params.isDictionary() && crypt_params.getKey("/Name").isName()) { - QTC::TC("qpdf", "QPDF_encrypt crypt array"); method = encp->interpretCF(crypt_params.getKey("/Name")); method_source = "stream's Crypt decode parameters (array)"; } + break; } + ++i; } } } diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc index 2dc21fc..c0f5585 100644 --- a/libqpdf/QPDF_linearization.cc +++ b/libqpdf/QPDF_linearization.cc @@ -174,14 +174,13 @@ QPDF::readLinearizationData() } // Hint table array: offset length [ offset length ] - size_t n_H_items = toS(H.getArrayNItems()); - if (!((n_H_items == 2) || (n_H_items == 4))) { + size_t n_H_items = H.size(); + if (!(n_H_items == 2 || n_H_items == 4)) { throw damagedPDF("linearization dictionary", "H has the wrong number of items"); } std::vector H_items; - for (size_t i = 0; i < n_H_items; ++i) { - QPDFObjectHandle oh(H.getArrayItem(toI(i))); + for (auto const& oh: H.as_array()) { if (oh.isInteger()) { H_items.push_back(oh.getIntValueAsInt()); } else { diff --git a/libqpdf/QPDF_objects.cc b/libqpdf/QPDF_objects.cc index ecae23d..168c1c8 100644 --- a/libqpdf/QPDF_objects.cc +++ b/libqpdf/QPDF_objects.cc @@ -782,7 +782,7 @@ std::pair> QPDF::processXRefW(QPDFObjectHandle& dict, std::function damaged) { auto W_obj = dict.getKey("/W"); - if (!(W_obj.isArray() && (W_obj.getArrayNItems() >= 3) && W_obj.getArrayItem(0).isInteger() && + if (!(W_obj.size() >= 3 && W_obj.getArrayItem(0).isInteger() && W_obj.getArrayItem(1).isInteger() && W_obj.getArrayItem(2).isInteger())) { throw damaged("Cross-reference stream does not have a proper /W key"); } diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc index 757a013..b3564ef 100644 --- a/libqpdf/QPDF_pages.cc +++ b/libqpdf/QPDF_pages.cc @@ -313,7 +313,7 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos) newpage.replaceKey("/Parent", pages); kids.insertItem(pos, newpage); - int npages = kids.getArrayNItems(); + int npages = static_cast(kids.size()); pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); m->all_pages.insert(m->all_pages.begin() + pos, newpage); for (int i = pos + 1; i < npages; ++i) { @@ -337,7 +337,7 @@ QPDF::removePage(QPDFObjectHandle page) QPDFObjectHandle kids = pages.getKey("/Kids"); kids.eraseItem(pos); - int npages = kids.getArrayNItems(); + int npages = static_cast(kids.size()); pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); m->all_pages.erase(m->all_pages.begin() + pos); m->pageobj_to_pages_pos.erase(page.getObjGen()); diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 754eaff..e39e04f 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -237,7 +237,6 @@ QPDFWriter remove ADBE 0 QPDFWriter remove existing Extensions 0 QPDFWriter preserve ADBE 0 QPDF_encryption skip 0x28 0 -QPDF_encrypt crypt array 0 QPDF_encryption CFM AESV3 0 qpdf-c called qpdf_get_pdf_extension_level 0 qpdf-c called qpdf_set_r5_encryption_parameters 0