Parent Opt with pair string

This commit is contained in:
Svetlana Kulikova
2025-03-11 14:52:17 +03:00
parent 3a8601c354
commit adea12d9f7
6 changed files with 80 additions and 9 deletions

View File

@ -1104,6 +1104,17 @@ bool CWidgetsInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafil
for (int i = 0; i < n; ++i)
pParent->arrV.push_back(pReader->ReadString());
}
if (nFlags & (1 << 6))
{
int n = pReader->ReadInt();
pParent->arrOpt.reserve(n);
for (int i = 0; i < n; ++i)
{
std::wstring s1 = pReader->ReadString();
std::wstring s2 = pReader->ReadString();
pParent->arrOpt.push_back(std::make_pair(s1, s2));
}
}
if (nFlags & (1 << 7))
pParent->nFieldFlag = pReader->ReadInt();
m_arrParents.push_back(pParent);

View File

@ -574,6 +574,7 @@ public:
std::wstring sDV;
std::vector<int> arrI;
std::vector<std::wstring> arrV;
std::vector< std::pair<std::wstring, std::wstring> > arrOpt;
};
CWidgetsInfo();

View File

@ -571,9 +571,16 @@ CFile.prototype["getInteractiveFormsInfo"] = function()
if (flags & (1 << 6))
{
let n = reader.readInt();
rec["Opt"] = [];
rec["opt"] = [];
for (let i = 0; i < n; ++i)
rec["Opt"].push(reader.readString());
{
let opt1 = reader.readString();
let opt2 = reader.readString();
if (opt1 == "")
rec["opt"].push(opt2);
else
rec["opt"].push([opt2, opt1]);
}
}
if (flags & (1 << 7))
{

View File

@ -2716,6 +2716,31 @@ HRESULT CPdfWriter::EditWidgetParents(NSFonts::IApplicationFonts* pAppFonts, CWi
}
}
}
if (nFlags & (1 << 6))
{
PdfWriter::CArrayObject* pArray = new PdfWriter::CArrayObject();
pParentObj->Add("Opt", pArray);
for (const std::pair<std::wstring, std::wstring>& PV : pParent->arrOpt)
{
if (PV.first.empty())
{
std::string sValue = U_TO_UTF8(PV.second);
pArray->Add(new PdfWriter::CStringObject(sValue.c_str(), true));
}
else
{
PdfWriter::CArrayObject* pArray2 = new PdfWriter::CArrayObject();
pArray->Add(pArray2);
std::string sValue = U_TO_UTF8(PV.first);
pArray2->Add(new PdfWriter::CStringObject(sValue.c_str(), true));
sValue = U_TO_UTF8(PV.second);
pArray2->Add(new PdfWriter::CStringObject(sValue.c_str(), true));
}
}
}
if (nFlags & (1 << 7))
pParentObj->Add("Ff", pParent->nFieldFlag);
}

View File

@ -2664,17 +2664,41 @@ void CAnnots::getParents(XRef* xref, Object* oFieldRef)
for (int j = 0; j < nOptLength; ++j)
{
Object oOptJ;
if (!oOpt.arrayGet(j, &oOptJ) || !oOptJ.isString())
if (!oOpt.arrayGet(j, &oOptJ) || !(oOptJ.isString() || oOptJ.isArray()))
{
oOptJ.free();
continue;
}
TextString* s = new TextString(oOptJ.getString());
pAnnotParent->arrOpt.push_back(NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength()));
delete s;
std::string sOpt1, sOpt2;
if (oOptJ.isArray() && oOptJ.arrayGetLength() > 1)
{
Object oOptJ2;
if (oOptJ.arrayGet(0, &oOptJ2)->isString())
{
TextString* s = new TextString(oOptJ2.getString());
sOpt1 = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength());
delete s;
}
oOptJ2.free();
if (oOptJ.arrayGet(1, &oOptJ2)->isString())
{
TextString* s = new TextString(oOptJ2.getString());
sOpt2 = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength());
delete s;
}
oOptJ2.free();
}
else if (oOptJ.isString())
{
TextString* s = new TextString(oOptJ.getString());
sOpt2 = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength());
delete s;
}
pAnnotParent->arrOpt.push_back(std::make_pair(sOpt1, sOpt2));
oOptJ.free();
}
if (!pAnnotParent->arrOpt.empty())
pAnnotParent->unFlags |= (1 << 6);
}
@ -3644,9 +3668,12 @@ void CAnnots::CAnnotParent::ToWASM(NSWasm::CData& oRes)
}
if (unFlags & (1 << 6))
{
oRes.AddInt((unsigned int)arrOpt.size());
oRes.AddInt(arrOpt.size());
for (int i = 0; i < arrOpt.size(); ++i)
oRes.WriteString(arrOpt[i]);
{
oRes.WriteString(arrOpt[i].first);
oRes.WriteString(arrOpt[i].second);
}
}
if (unFlags & (1 << 7))
oRes.AddInt(unFieldFlag);

View File

@ -615,7 +615,7 @@ private:
unsigned int unRefNumParent; // Номер ссылки на объект родителя
std::vector<int> arrI;
std::vector<std::string> arrV;
std::vector<std::string> arrOpt;
std::vector< std::pair<std::string, std::string> > arrOpt;
std::string sT;
std::string sV;
std::string sDV;