46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
#include "qpdf_resource_resolver.hpp"
|
|
|
|
namespace pdfengine::qpdf_layer {
|
|
|
|
QpdfResourceResolver::QpdfResourceResolver(QPDFObjectHandle resourcesDict)
|
|
: resourcesDict_(resourcesDict) {}
|
|
|
|
ResolvedXObject QpdfResourceResolver::resolveXObject(const std::string& name) {
|
|
ResolvedXObject resolved;
|
|
resolved.type = XObjectType::Unknown;
|
|
|
|
if (!resourcesDict_.isDictionary()) return resolved;
|
|
|
|
if (!resourcesDict_.hasKey("/XObject")) return resolved;
|
|
|
|
QPDFObjectHandle xobjectDict = resourcesDict_.getKey("/XObject");
|
|
if (!xobjectDict.isDictionary()) return resolved;
|
|
|
|
std::string key = name;
|
|
if (!key.empty() && key[0] != '/') {
|
|
key = "/" + key;
|
|
}
|
|
|
|
if (!xobjectDict.hasKey(key)) return resolved;
|
|
|
|
QPDFObjectHandle xobj = xobjectDict.getKey(key);
|
|
if (!xobj.isStream()) return resolved;
|
|
|
|
QPDFObjectHandle streamDict = xobj.getDict();
|
|
if (streamDict.hasKey("/Subtype")) {
|
|
std::string subtype = streamDict.getKey("/Subtype").getName();
|
|
if (subtype == "/Image") {
|
|
resolved.type = XObjectType::Image;
|
|
} else if (subtype == "/Form") {
|
|
resolved.type = XObjectType::Form;
|
|
} else if (subtype == "/Pattern") {
|
|
resolved.type = XObjectType::Pattern;
|
|
}
|
|
}
|
|
|
|
resolved.object = xobj;
|
|
return resolved;
|
|
}
|
|
|
|
}
|