diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js index 81b3d20fff..7e9b0859db 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js @@ -544,6 +544,17 @@ if (flags & (1 << 20)) rec["AA"][AAType]["URI"] = reader.readString(); } + else if (SType == "Hide") + { + if (flags & (1 << 20)) + { + rec["AA"][AAType]["Hide"]["H"] = flags & (1 << 21); + let m = reader.readInt(); + rec["AA"][AAType]["Hide"]["T"] = []; + for (let j = 0; j < m; ++j) + rec["AA"][AAType]["Hide"]["T"].push(reader.readString()); + } + } } } diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp index 9f99d3990c..b96443846b 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp @@ -578,39 +578,55 @@ int main(int argc, char* argv[]) i += nPathLength; } } - else if (sType == "GoTo") - { - if (nFlags & (1 << 20)) - { - nPathLength = READ_INT(pWidgets + i); - i += 4; - std::cout << "GoTo " << std::string((char*)(pWidgets + i), nPathLength) << " "; - i += nPathLength; - nPathLength = READ_INT(pWidgets + i); - i += 4; - std::cout << "Y " << (double)nPathLength / 100.0 << ", "; - } - } - else if (sType == "Named") - { - if (nFlags & (1 << 20)) - { - nPathLength = READ_INT(pWidgets + i); - i += 4; - std::cout << "Named " << std::string((char*)(pWidgets + i), nPathLength) << ", "; - i += nPathLength; - } - } - else if (sType == "URI") - { - if (nFlags & (1 << 20)) - { - nPathLength = READ_INT(pWidgets + i); - i += 4; - std::cout << "URL " << std::string((char*)(pWidgets + i), nPathLength) << ", "; - i += nPathLength; - } - } + else if (sType == "GoTo") + { + if (nFlags & (1 << 20)) + { + nPathLength = READ_INT(pWidgets + i); + i += 4; + std::cout << "GoTo " << std::string((char*)(pWidgets + i), nPathLength) << " "; + i += nPathLength; + nPathLength = READ_INT(pWidgets + i); + i += 4; + std::cout << "Y " << (double)nPathLength / 100.0 << ", "; + } + } + else if (sType == "Named") + { + if (nFlags & (1 << 20)) + { + nPathLength = READ_INT(pWidgets + i); + i += 4; + std::cout << "Named " << std::string((char*)(pWidgets + i), nPathLength) << ", "; + i += nPathLength; + } + } + else if (sType == "URI") + { + if (nFlags & (1 << 20)) + { + nPathLength = READ_INT(pWidgets + i); + i += 4; + std::cout << "URL " << std::string((char*)(pWidgets + i), nPathLength) << ", "; + i += nPathLength; + } + } + else if (sType == "Hide") + { + if (nFlags & (1 << 20)) + { + std::cout << "Hide flag " << (nFlags & (1 << 21)) << ", "; + int nHideLength = READ_INT(pWidgets + i); + i += 4; + for (int j = 0; j < nHideLength; ++j) + { + nPathLength = READ_INT(pWidgets + i); + i += 4; + std::cout << std::to_string(j) << " THide " << std::string((char*)(pWidgets + i), nPathLength) << ", "; + i += nPathLength; + } + } + } } } std::cout << std::endl; diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index a57de42f75..1369c85372 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -1262,6 +1262,52 @@ oObj.free();\ // Скрытие аннотаций case actionHide: { + // 21 - Hide + nFlags |= (1 << 20); + // 22 - Hide flag + if (((LinkHide*)oAct)->getHideFlag()) + nFlags |= (1 << 21); + Object* oHideObj = ((LinkHide*)oAct)->getFields(); + int nHide = 1, k = 0; + if (oHideObj->isArray()) + nHide = oHideObj->arrayGetLength(); + oRes.AddInt(nHide); + Object oHide; + oHideObj->copy(&oHide); + do + { + if (oHideObj->isArray()) + { + oHide.free(); + oHideObj->arrayGetNF(k, &oHide); + } + if (oHide.isString()) + { + TextString* s = new TextString(oHide.getString()); + std::string sStr = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength()); + oRes.WriteString((BYTE*)sStr.c_str(), (unsigned int)sStr.length()); + delete s; + } + else if (oHide.isRef()) + { + for (int m = 0; m < nNum; ++m) + { + AcroFormField* pSField = pAcroForms->getField(i); + Object oSFieldRef; + if (pSField->getFieldRef(&oSFieldRef) && oSFieldRef.isRef() && oSFieldRef.getRefGen() == oHide.getRefGen() && oSFieldRef.getRefNum() == oHide.getRefNum()) + { + int nLengthName; + Unicode* uName = pSField->getName(&nLengthName); + std::string sTName = NSStringExt::CConverter::GetUtf8FromUTF32(uName, nLengthName); + oRes.WriteString((BYTE*)sTName.c_str(), (unsigned int)sTName.length()); + gfree(uName); + break; + } + } + } + k++; + } while (k < nHide); + oHide.free(); break; } // Неизвестное действие