2021-02-08 23:07:21 +00:00
|
|
|
#include <qpdf/QPDFEFStreamObjectHelper.hh>
|
2022-02-04 21:31:31 +00:00
|
|
|
|
2021-02-08 23:07:21 +00:00
|
|
|
#include <qpdf/Pl_Count.hh>
|
|
|
|
#include <qpdf/Pl_Discard.hh>
|
|
|
|
#include <qpdf/Pl_MD5.hh>
|
|
|
|
#include <qpdf/QIntC.hh>
|
2022-09-26 19:11:27 +00:00
|
|
|
#include <qpdf/QPDF.hh>
|
2021-02-08 23:07:21 +00:00
|
|
|
#include <qpdf/QUtil.hh>
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper::QPDFEFStreamObjectHelper(QPDFObjectHandle oh) :
|
|
|
|
QPDFObjectHelper(oh),
|
|
|
|
m(new Members())
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFObjectHandle
|
|
|
|
QPDFEFStreamObjectHelper::getParam(std::string const& pkey)
|
|
|
|
{
|
|
|
|
auto params = this->oh.getDict().getKey("/Params");
|
|
|
|
if (params.isDictionary()) {
|
|
|
|
return params.getKey(pkey);
|
|
|
|
}
|
|
|
|
return QPDFObjectHandle::newNull();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
QPDFEFStreamObjectHelper::setParam(std::string const& pkey, QPDFObjectHandle const& pval)
|
|
|
|
{
|
|
|
|
auto params = this->oh.getDict().getKey("/Params");
|
|
|
|
if (!params.isDictionary()) {
|
2022-07-24 19:42:23 +00:00
|
|
|
params =
|
2022-04-30 00:21:07 +00:00
|
|
|
this->oh.getDict().replaceKeyAndGetNew("/Params", QPDFObjectHandle::newDictionary());
|
2021-02-08 23:07:21 +00:00
|
|
|
}
|
|
|
|
params.replaceKey(pkey, pval);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string
|
|
|
|
QPDFEFStreamObjectHelper::getCreationDate()
|
|
|
|
{
|
|
|
|
auto val = getParam("/CreationDate");
|
|
|
|
if (val.isString()) {
|
|
|
|
return val.getUTF8Value();
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string
|
|
|
|
QPDFEFStreamObjectHelper::getModDate()
|
|
|
|
{
|
|
|
|
auto val = getParam("/ModDate");
|
|
|
|
if (val.isString()) {
|
|
|
|
return val.getUTF8Value();
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t
|
|
|
|
QPDFEFStreamObjectHelper::getSize()
|
|
|
|
{
|
|
|
|
auto val = getParam("/Size");
|
|
|
|
if (val.isInteger()) {
|
|
|
|
return QIntC::to_size(val.getUIntValueAsUInt());
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string
|
|
|
|
QPDFEFStreamObjectHelper::getSubtype()
|
|
|
|
{
|
2021-09-09 22:05:48 +00:00
|
|
|
auto val = this->oh.getDict().getKey("/Subtype");
|
2021-02-08 23:07:21 +00:00
|
|
|
if (val.isName()) {
|
|
|
|
auto n = val.getName();
|
|
|
|
if (n.length() > 1) {
|
|
|
|
return n.substr(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string
|
|
|
|
QPDFEFStreamObjectHelper::getChecksum()
|
|
|
|
{
|
|
|
|
auto val = getParam("/CheckSum");
|
|
|
|
if (val.isString()) {
|
|
|
|
return val.getStringValue();
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper
|
2022-04-09 18:35:56 +00:00
|
|
|
QPDFEFStreamObjectHelper::createEFStream(QPDF& qpdf, std::shared_ptr<Buffer> data)
|
2021-02-08 23:07:21 +00:00
|
|
|
{
|
2022-09-26 19:11:27 +00:00
|
|
|
return newFromStream(qpdf.newStream(data));
|
2021-02-08 23:07:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper
|
|
|
|
QPDFEFStreamObjectHelper::createEFStream(QPDF& qpdf, std::string const& data)
|
|
|
|
{
|
2022-09-26 19:11:27 +00:00
|
|
|
return newFromStream(qpdf.newStream(data));
|
2021-02-08 23:07:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper
|
|
|
|
QPDFEFStreamObjectHelper::createEFStream(QPDF& qpdf, std::function<void(Pipeline*)> provider)
|
|
|
|
{
|
2022-09-26 19:11:27 +00:00
|
|
|
auto stream = qpdf.newStream();
|
2021-02-08 23:07:21 +00:00
|
|
|
stream.replaceStreamData(provider, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull());
|
|
|
|
return newFromStream(stream);
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper&
|
|
|
|
QPDFEFStreamObjectHelper::setCreationDate(std::string const& date)
|
|
|
|
{
|
|
|
|
setParam("/CreationDate", QPDFObjectHandle::newString(date));
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper&
|
|
|
|
QPDFEFStreamObjectHelper::setModDate(std::string const& date)
|
|
|
|
{
|
|
|
|
setParam("/ModDate", QPDFObjectHandle::newString(date));
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper&
|
|
|
|
QPDFEFStreamObjectHelper::setSubtype(std::string const& subtype)
|
|
|
|
{
|
2021-09-09 22:05:48 +00:00
|
|
|
this->oh.getDict().replaceKey("/Subtype", QPDFObjectHandle::newName("/" + subtype));
|
2021-02-08 23:07:21 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFEFStreamObjectHelper
|
|
|
|
QPDFEFStreamObjectHelper::newFromStream(QPDFObjectHandle stream)
|
|
|
|
{
|
|
|
|
QPDFEFStreamObjectHelper result(stream);
|
|
|
|
stream.getDict().replaceKey("/Type", QPDFObjectHandle::newName("/EmbeddedFile"));
|
|
|
|
Pl_Discard discard;
|
2022-04-30 17:52:23 +00:00
|
|
|
// The PDF spec specifies use of MD5 here and notes that it is not to be used for security. MD5
|
|
|
|
// is known to be insecure.
|
2021-02-08 23:07:21 +00:00
|
|
|
Pl_MD5 md5("EF md5", &discard);
|
|
|
|
Pl_Count count("EF size", &md5);
|
|
|
|
if (!stream.pipeStreamData(&count, nullptr, 0, qpdf_dl_all)) {
|
|
|
|
stream.warnIfPossible("unable to get stream data for new embedded file stream");
|
|
|
|
} else {
|
|
|
|
result.setParam("/Size", QPDFObjectHandle::newInteger(count.getCount()));
|
|
|
|
result.setParam(
|
|
|
|
"/CheckSum", QPDFObjectHandle::newString(QUtil::hex_decode(md5.getHexDigest())));
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|