diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index b6433c67cd..c70773878e 100644 --- a/DesktopEditor/doctrenderer/drawingfile.h +++ b/DesktopEditor/doctrenderer/drawingfile.h @@ -295,6 +295,12 @@ public: return ((CPdfFile*)m_pFile)->MergePages(data, size, nMaxID, sPrefixForm); return false; } + bool UnmergePages() + { + if (m_nType == 0) + return ((CPdfFile*)m_pFile)->UnmergePages(); + return false; + } BYTE* GetGlyphs(int nPageIndex) { diff --git a/DesktopEditor/graphics/pro/js/drawingfile.json b/DesktopEditor/graphics/pro/js/drawingfile.json index efd27ff4eb..aa16b7cd1f 100644 --- a/DesktopEditor/graphics/pro/js/drawingfile.json +++ b/DesktopEditor/graphics/pro/js/drawingfile.json @@ -53,6 +53,7 @@ "_ScanPage", "_SplitPages", "_MergePages", + "_UnmergePages", "_GetImageBase64", "_GetImageBase64Len", "_GetImageBase64Ptr", diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js index f18e773cf4..642dc0d451 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js @@ -176,6 +176,10 @@ CFile.prototype["MergePages"] = function(arrayBuffer, maxID, prefixForm) { return this._MergePages(arrayBuffer, maxID, prefixForm); }; +CFile.prototype["UndoMergePages"] = function() +{ + return this._UndoMergePages(); +}; // INFO DOCUMENT CFile.prototype.getInfo = function() diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js index f3d5fd70bb..1c793c5492 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js @@ -162,6 +162,17 @@ CFile.prototype._MergePages = function(buffer, maxID, prefixForm) return bRes == 1; }; +CFile.prototype._UndoMergePages = function() +{ + let bRes = Module["_UnmergePages"](this.nativeFile); + if (bRes == 1) + { + let str = this.stream.pop(); + Module["_free"](str); + } + return bRes == 1; +}; + // FONTS CFile.prototype._isNeedCMap = function() { diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp index 7d8b199539..3337e609a8 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp @@ -185,6 +185,10 @@ WASM_EXPORT int MergePages(CDrawingFile* pFile, BYTE* data, LONG size, int nMaxI { return pFile->MergePages(data, size, nMaxID, sPrefixForm) ? 1 : 0; } +WASM_EXPORT int UnmergePages(CDrawingFile* pFile) +{ + return pFile->UnmergePages() ? 1 : 0; +} WASM_EXPORT void* GetImageBase64(CDrawingFile* pFile, int rId) { diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp index 0728a890c9..6ec6f8b4de 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp @@ -993,7 +993,7 @@ int main(int argc, char* argv[]) // SPLIT & MERGE BYTE* pSplitPages = NULL; - if (false) + if (true) { std::vector arrPages = { 0 }; for (int i = 0; i < 3; i++) @@ -1010,11 +1010,14 @@ int main(int argc, char* argv[]) if (MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge") == 0) RELEASEARRAYOBJECTS(pSplitPages); + + if (!UnmergePages(pGrFile)) + std::cout << "error" << std::endl; } } } BYTE* pFileMerge = NULL; - if (true) + if (false) { DWORD nFileMergeLen = 0; if (NSFile::CFileBinary::ReadAllBytes(NSFile::GetProcessDirectory() + L"/test_merge.pdf", &pFileMerge, nFileMergeLen)) diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index a214c48cf0..6359e7c922 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -618,10 +618,22 @@ HRESULT _ChangePassword(const std::wstring& wsPath, const std::wstring& wsPasswo } case objString: { - TextString* s = new TextString(oTemp.getString()); - std::string sValue = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength()); - pObj = new PdfWriter::CStringObject(sValue.c_str()); - delete s; + GString* str = oTemp.getString(); + if (str->isBinary()) + { + int nLength = str->getLength(); + BYTE* arrId = new BYTE[nLength]; + for (int nIndex = 0; nIndex < nLength; ++nIndex) + arrId[nIndex] = str->getChar(nIndex); + pObj = new PdfWriter::CBinaryObject(arrId, nLength, false); + } + else + { + TextString* s = new TextString(str); + std::string sValue = NSStringExt::CConverter::GetUtf8FromUTF32(s->getUnicode(), s->getLength()); + pObj = new PdfWriter::CStringObject(sValue.c_str(), !s->isPDFDocEncoding()); + delete s; + } break; } case objName: diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index b63f38e503..25012f6c1a 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -341,6 +341,12 @@ bool CPdfFile::MergePages(BYTE* data, DWORD length, int nMaxID, const std::strin return false; return m_pInternal->pReader->MergePages(data, length, L"", nMaxID, sPrefixForm) && (m_pInternal->pReader->GetError() == 0); } +bool CPdfFile::UnmergePages() +{ + if (!m_pInternal->pReader) + return false; + return m_pInternal->pReader->UnmergePages(); +} int CPdfFile::GetRotate(int nPageIndex) { if (!m_pInternal->pReader) diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index 8187bfdbea..5ac8c1624e 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -128,6 +128,7 @@ public: bool ValidMetaData(); bool MergePages(BYTE* data, DWORD length, int nMaxID = 0, const std::string& sPrefixForm = ""); + bool UnmergePages(); int GetRotate(int nPageIndex); int GetMaxRefID(); BYTE* GetWidgets(); diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index 3ba5a28968..42e178872e 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -643,6 +643,15 @@ bool CPdfReader::MergePages(const std::wstring& wsFile, const std::wstring& wsPa return true; } +bool CPdfReader::UnmergePages() +{ + if (m_vPDFContext.size() < 1) + return false; + CPdfReaderContext* pPDFContext = m_vPDFContext.back(); + delete pPDFContext; + m_vPDFContext.pop_back(); + return true; +} void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* pbBreak) { PDFDoc* pDoc = NULL; diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index e02874cc50..a95d43f3d3 100644 --- a/PdfFile/PdfReader.h +++ b/PdfFile/PdfReader.h @@ -79,6 +79,7 @@ public: bool ValidMetaData(); bool MergePages(BYTE* pData, DWORD nLength, const std::wstring& wsPassword = L"", int nMaxID = 0, const std::string& sPrefixForm = ""); bool MergePages(const std::wstring& wsFile, const std::wstring& wsPassword = L"", int nMaxID = 0, const std::string& sPrefixForm = ""); + bool UnmergePages(); void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); std::wstring GetInfo();