diff --git a/examples/pdf-create.cc b/examples/pdf-create.cc index 44405d38..199584fe 100644 --- a/examples/pdf-create.cc +++ b/examples/pdf-create.cc @@ -290,15 +290,14 @@ static void check(char const* filename, QPDFObjectHandle color_space = image_dict.getKey("/ColorSpace"); QPDFObjectHandle filter = image_dict.getKey("/Filter"); bool this_errors = false; - if (! (filter.isName() && (filter.getName() == desired_filter))) + if (! filter.isNameAndEquals(desired_filter)) { this_errors = errors = true; std::cout << "page " << pageno << ": expected filter " << desired_filter << "; actual filter = " << filter.unparse() << std::endl; } - if (! (color_space.isName() && - (color_space.getName() == desired_color_space))) + if (! color_space.isNameAndEquals(desired_color_space)) { this_errors = errors = true; std::cout << "page " << pageno << ": expected color space " diff --git a/examples/pdf-invert-images.cc b/examples/pdf-invert-images.cc index bb8541e3..b410bca5 100644 --- a/examples/pdf-invert-images.cc +++ b/examples/pdf-invert-images.cc @@ -167,9 +167,8 @@ int main(int argc, char* argv[]) // keys to determine the image type. if (image.pipeStreamData(0, qpdf_ef_compress, qpdf_dl_all) && - color_space.isName() && + color_space.isNameAndEquals("/DeviceGray") && bits_per_component.isInteger() && - (color_space.getName() == "/DeviceGray") && (bits_per_component.getIntValue() == 8)) { inv->registerImage(image, p); diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index b90c213e..7f6f7801 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1100,10 +1100,7 @@ QPDF::read_xrefStream(qpdf_offset_t xref_offset) { // ignore -- report error below } - if (xref_obj.isInitialized() && - xref_obj.isStream() && - xref_obj.getDict().getKey("/Type").isName() && - xref_obj.getDict().getKey("/Type").getName() == "/XRef") + if (xref_obj.isStreamOfType("/XRef")) { QTC::TC("qpdf", "QPDF found xref stream"); found = true; @@ -2202,8 +2199,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) this->m->obj_cache[stream_og].end_after_space; QPDFObjectHandle dict = obj_stream.getDict(); - if (! (dict.getKey("/Type").isName() && - dict.getKey("/Type").getName() == "/ObjStm")) + if (! dict.isDictionaryOfType("/ObjStm")) { QTC::TC("qpdf", "QPDF ERR object stream with wrong type"); warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), @@ -2849,13 +2845,10 @@ QPDF::getCompressibleObjGens() { QTC::TC("qpdf", "QPDF exclude encryption dictionary"); } - else if ((! obj.isStream()) && - (! (obj.isDictionary() && + else if (! (obj.isStream() || + (obj.isDictionaryOfType("/Sig") && obj.hasKey("/ByteRange") && - obj.hasKey("/Contents") && - obj.hasKey("/Type") && - obj.getKey("/Type").isName() && - obj.getKey("/Type").getName() == "/Sig"))) + obj.hasKey("/Contents")))) { result.push_back(og); } diff --git a/libqpdf/QPDFAcroFormDocumentHelper.cc b/libqpdf/QPDFAcroFormDocumentHelper.cc index ad6efc70..c3ade76c 100644 --- a/libqpdf/QPDFAcroFormDocumentHelper.cc +++ b/libqpdf/QPDFAcroFormDocumentHelper.cc @@ -280,9 +280,7 @@ QPDFAcroFormDocumentHelper::getFieldForAnnotation(QPDFAnnotationObjectHelper h) { QPDFObjectHandle oh = h.getObjectHandle(); QPDFFormFieldObjectHelper result(QPDFObjectHandle::newNull()); - if (! (oh.isDictionary() && - oh.getKey("/Subtype").isName() && - (oh.getKey("/Subtype").getName() == "/Widget"))) + if (! oh.isDictionaryOfType("", "/Widget")) { return result; } diff --git a/libqpdf/QPDFFileSpecObjectHelper.cc b/libqpdf/QPDFFileSpecObjectHelper.cc index ad422d2b..b3df5e22 100644 --- a/libqpdf/QPDFFileSpecObjectHelper.cc +++ b/libqpdf/QPDFFileSpecObjectHelper.cc @@ -15,8 +15,7 @@ QPDFFileSpecObjectHelper::QPDFFileSpecObjectHelper( oh.warnIfPossible("Embedded file object is not a dictionary"); return; } - auto type = oh.getKey("/Type"); - if (! (type.isName() && (type.getName() == "/Filespec"))) + if (! oh.isDictionaryOfType("/Filespec")) { oh.warnIfPossible("Embedded file object's type is not /Filespec"); } diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 2713eb95..f8d52a7b 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1055,23 +1055,9 @@ QPDFObjectHandle::getDictAsMap() bool QPDFObjectHandle::isOrHasName(std::string const& value) { - if (isName() && (getName() == value)) - { - return true; - } - else if (isArray()) - { - int n = getArrayNItems(); - for (int i = 0; i < n; ++i) - { - QPDFObjectHandle item = getArrayItem(0); - if (item.isName() && (item.getName() == value)) - { - return true; - } - } - } - return false; + return isNameAndEquals(value) || + (isArray() && (getArrayNItems() > 0) && + getArrayItem(0).isNameAndEquals(value)); } void @@ -2520,8 +2506,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, } if (!contents_string.empty() && dict.count("/Type") && - dict["/Type"].isName() && - dict["/Type"].getName() == "/Sig" && + dict["/Type"].isNameAndEquals("/Sig") && dict.count("/ByteRange") && dict.count("/Contents") && dict["/Contents"].isString()) @@ -3237,7 +3222,7 @@ QPDFObjectHandle::isPageObject() if (this->hasKey("/Type")) { QPDFObjectHandle type = this->getKey("/Type"); - if (type.isName() && (type.getName() == "/Page")) + if (type.isNameAndEquals("/Page")) { return true; } @@ -3263,39 +3248,22 @@ QPDFObjectHandle::isPagesObject() } // getAllPages repairs /Type when traversing the page tree. getOwningQPDF()->getAllPages(); - return (this->isDictionary() && - this->hasKey("/Type") && - this->getKey("/Type").isName() && - this->getKey("/Type").getName() == "/Pages"); + return isDictionaryOfType("/Pages"); } bool QPDFObjectHandle::isFormXObject() { - if (! this->isStream()) - { - return false; - } - QPDFObjectHandle dict = this->getDict(); - return (dict.getKey("/Type").isName() && - ("/XObject" == dict.getKey("/Type").getName()) && - dict.getKey("/Subtype").isName() && - ("/Form" == dict.getKey("/Subtype").getName())); + return isStreamOfType("/XObject", "/Form"); } bool QPDFObjectHandle::isImage(bool exclude_imagemask) { - if (! this->isStream()) - { - return false; - } - QPDFObjectHandle dict = this->getDict(); - return (dict.hasKey("/Subtype") && - (dict.getKey("/Subtype").getName() == "/Image") && + return (isStreamOfType("", "/Image") && ((! exclude_imagemask) || - (! (dict.getKey("/ImageMask").isBool() && - dict.getKey("/ImageMask").getBoolValue())))); + (! (getDict().getKey("/ImageMask").isBool() && + getDict().getKey("/ImageMask").getBoolValue())))); } void diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index 7f7e6bea..ca543471 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -558,10 +558,7 @@ QPDFPageObjectHelper::getAnnotations(std::string const& only_subtype) for (int i = 0; i < nannots; ++i) { QPDFObjectHandle annot = annots.getArrayItem(i); - if (only_subtype.empty() || - (annot.isDictionary() && - annot.getKey("/Subtype").isName() && - (only_subtype == annot.getKey("/Subtype").getName()))) + if (annot.isDictionaryOfType("", only_subtype)) { result.push_back(QPDFAnnotationObjectHelper(annot)); } diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 23beee32..e7fb9ad6 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -1241,9 +1241,7 @@ QPDFWriter::enqueueObject(QPDFObjectHandle object) " another file."); } - if (this->m->qdf_mode && - object.isStream() && object.getDict().getKey("/Type").isName() && - (object.getDict().getKey("/Type").getName() == "/XRef")) + if (this->m->qdf_mode && object.isStreamOfType("/XRef")) { // As a special case, do not output any extraneous XRef // streams in QDF mode. Doing so will confuse fix-qdf, @@ -1474,8 +1472,7 @@ QPDFWriter::willFilterStream(QPDFObjectHandle stream, QPDFObjGen old_og = stream.getObjGen(); QPDFObjectHandle stream_dict = stream.getDict(); - if (stream_dict.getKey("/Type").isName() && - (stream_dict.getKey("/Type").getName() == "/Metadata")) + if (stream_dict.isDictionaryOfType("/Metadata")) { is_metadata = true; } @@ -1691,11 +1688,8 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, QTC::TC("qpdf", "QPDFWriter preserve Extensions"); QPDFObjectHandle adbe = extensions.getKey("/ADBE"); if (adbe.isDictionary() && - adbe.hasKey("/BaseVersion") && - adbe.getKey("/BaseVersion").isName() && - (adbe.getKey("/BaseVersion").getName() == - "/" + this->m->final_pdf_version) && - adbe.hasKey("/ExtensionLevel") && + adbe.getKey("/BaseVersion").isNameAndEquals( + "/" + this->m->final_pdf_version) && adbe.getKey("/ExtensionLevel").isInteger() && (adbe.getKey("/ExtensionLevel").getIntValue() == this->m->final_extension_level)) @@ -1764,7 +1758,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, for (int i = 0; i < filter.getArrayNItems(); ++i) { QPDFObjectHandle item = filter.getArrayItem(i); - if (item.isName() && item.getName() == "/Crypt") + if (item.isNameAndEquals("/Crypt")) { idx = i; break; @@ -1802,9 +1796,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, writeString(QPDF_Name::normalizeName(key)); writeString(" "); if (key == "/Contents" && - object.hasKey("/Type") && - object.getKey("/Type").isName() && - object.getKey("/Type").getName() == "/Sig" && + object.isDictionaryOfType("/Sig") && object.hasKey("/ByteRange")) { QTC::TC("qpdf", "QPDFWriter no encryption sig contents"); diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 14659008..3047f5a5 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -35,10 +35,8 @@ class SF_Crypt: public QPDFStreamFilter for (auto const& key: decode_parms.getKeys()) { if (((key == "/Type") || (key == "/Name")) && - (decode_parms.getKey("/Type").isNull() || - (decode_parms.getKey("/Type").isName() && - (decode_parms.getKey("/Type").getName() == - "/CryptFilterDecodeParms")))) + ((! decode_parms.hasKey("/Type")) || + decode_parms.isDictionaryOfType("/CryptFilterDecodeParms"))) { // we handle this in decryptStream } diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc index 2ff48df9..9607a598 100644 --- a/libqpdf/QPDF_encryption.cc +++ b/libqpdf/QPDF_encryption.cc @@ -1262,9 +1262,7 @@ QPDF::decryptStream(PointerHolder encp, { QPDFObjectHandle decode_parms = stream_dict.getKey("/DecodeParms"); - if (decode_parms.getKey("/Type").isName() && - (decode_parms.getKey("/Type").getName() == - "/CryptFilterDecodeParms")) + if (decode_parms.isDictionaryOfType("/CryptFilterDecodeParms")) { QTC::TC("qpdf", "QPDF_encryption stream crypt filter"); method = interpretCF(encp, decode_parms.getKey("/Name")); @@ -1280,8 +1278,7 @@ QPDF::decryptStream(PointerHolder encp, { for (int i = 0; i < filter.getArrayNItems(); ++i) { - if (filter.getArrayItem(i).isName() && - (filter.getArrayItem(i).getName() == "/Crypt")) + if (filter.getArrayItem(i).isNameAndEquals("/Crypt")) { QPDFObjectHandle crypt_params = decode.getArrayItem(i); diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc index 5d8056b2..ae85e36c 100644 --- a/libqpdf/QPDF_optimization.cc +++ b/libqpdf/QPDF_optimization.cc @@ -382,17 +382,13 @@ QPDF::updateObjectMapsInternal( bool is_page_node = false; - if (oh.isDictionary() && oh.hasKey("/Type")) + if (oh.isDictionaryOfType("/Page")) { - std::string type = oh.getKey("/Type").getName(); - if (type == "/Page") - { - is_page_node = true; - if (! top) - { - return; - } - } + is_page_node = true; + if (! top) + { + return; + } } if (oh.isIndirect()) diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc index eeb13029..2a1b798f 100644 --- a/libqpdf/QPDF_pages.cc +++ b/libqpdf/QPDF_pages.cc @@ -139,8 +139,7 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_node, result.push_back(cur_node); } - QPDFObjectHandle type_key = cur_node.getKey("/Type"); - if (! (type_key.isName() && (type_key.getName() == wanted_type))) + if (! cur_node.isDictionaryOfType(wanted_type)) { warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), "page tree node",