diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp index fb2f8ee9e9..77ef9f4240 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp @@ -929,6 +929,37 @@ void ReadInteractiveFormsFonts(CDrawingFile* pGrFile, int nType) free(pFonts); } +bool GetFromBase64(const std::wstring& sPath, BYTE** pBuffer, int* nBufferLen) +{ + NSFile::CFileBinary oFile; + if (oFile.OpenFile(sPath)) + { + DWORD dwFileSize = oFile.GetFileSize(); + BYTE* pFileContent = new BYTE[dwFileSize]; + if (!pFileContent) + { + oFile.CloseFile(); + return false; + } + + DWORD dwReaded; + if (!oFile.ReadFile(pFileContent, dwFileSize, dwReaded)) + return false; + + *nBufferLen = NSBase64::Base64DecodeGetRequiredLength(dwFileSize); + *pBuffer = new BYTE[*nBufferLen]; + if (!(*pBuffer)) + { + RELEASEARRAYOBJECTS(pFileContent); + return false; + } + + if (!NSBase64::Base64Decode((const char*)pFileContent, dwFileSize, *pBuffer, nBufferLen)) + return false; + } + oFile.CloseFile(); + return true; +} #include "../../../../../fontengine/ApplicationFontsWorker.h" #include "../../../../../common/Directory.h" @@ -1017,14 +1048,87 @@ int main(int argc, char* argv[]) } } BYTE* pFileMerge = NULL; - if (false) + if (true) { - DWORD nFileMergeLen = 0; - if (NSFile::CFileBinary::ReadAllBytes(NSFile::GetProcessDirectory() + L"/test_merge.pdf", &pFileMerge, nFileMergeLen)) + int nBufferLen = NULL; + BYTE* pBuffer = NULL; + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/base64.txt", &pBuffer, &nBufferLen)) { - if (MergePages(pGrFile, pFileMerge, nFileMergeLen, 0, "merge") == 0) + std::vector arrPages = { 1 }; + BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen); + int nLength = READ_INT(pSplitPages); + + NSFile::CFileBinary oFile; + if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split1.pdf")) + oFile.WriteFile(pSplitPages + 4, nLength - 4); + oFile.CloseFile(); + + MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge1"); + } + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/base64.txt", &pBuffer, &nBufferLen)) + { + std::vector arrPages = { 2 }; + BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen); + int nLength = READ_INT(pSplitPages); + + NSFile::CFileBinary oFile; + if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf")) + oFile.WriteFile(pSplitPages + 4, nLength - 4); + oFile.CloseFile(); + + MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge1"); + } + + /* + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/split2.txt", &pBuffer, &nBufferLen)) + { + NSFile::CFileBinary oFile; + if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf")) + oFile.WriteFile(pBuffer, nBufferLen); + oFile.CloseFile(); + + MergePages(pGrFile, pBuffer, nBufferLen, 0, "merge2"); + } + + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/split1.txt", &pBuffer, &nBufferLen)) + { + std::vector arrPages = { 1 }; + BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen); + int nLength = READ_INT(pSplitPages); + MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge"); + } + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/split2.txt", &pBuffer, &nBufferLen)) + { + std::vector arrPages = { 2 }; + BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen); + int nLength = READ_INT(pSplitPages); + MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge"); + } + + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/merge1.txt", &pBuffer, &nBufferLen)) + { + if (MergePages(pGrFile, pBuffer, nBufferLen, 0, "merge1") == 0) RELEASEARRAYOBJECTS(pFileMerge); } + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/split.txt", &pBuffer, &nBufferLen)) + { + std::vector arrPages = { 1 }; + if (SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen) == 0) + RELEASEARRAYOBJECTS(pFileMerge); + } + + if (GetFromBase64(NSFile::GetProcessDirectory() + L"/merge2.txt", &pBuffer, &nBufferLen)) + { + if (MergePages(pGrFile, pBuffer, nBufferLen, 0, "merge2") == 0) + RELEASEARRAYOBJECTS(pFileMerge); + } + */ } // INFO diff --git a/PdfFile/OnlineOfficeBinToPdf.cpp b/PdfFile/OnlineOfficeBinToPdf.cpp index 29d1a2380e..080da23599 100644 --- a/PdfFile/OnlineOfficeBinToPdf.cpp +++ b/PdfFile/OnlineOfficeBinToPdf.cpp @@ -187,7 +187,10 @@ namespace NSOnlineOfficeBinToPdf case AddCommandType::EditPage: { if (!pPdf->EditPage(nPageNum)) - return false; + { + oReader.Skip(nLen - 9); + break; + } NSOnlineOfficeBinToPdf::ConvertBufferToRenderer(oReader.GetCurrentBuffer(), (LONG)(nLen - 9) , &oCorrector); oReader.Skip(nLen - 9); @@ -195,7 +198,11 @@ namespace NSOnlineOfficeBinToPdf } case AddCommandType::AddPage: { - pPdf->AddPage(nPageNum); + if (!pPdf->AddPage(nPageNum)) + { + oReader.Skip(nLen - 9); + break; + } NSOnlineOfficeBinToPdf::ConvertBufferToRenderer(oReader.GetCurrentBuffer(), (LONG)(nLen - 9) , &oCorrector); oReader.Skip(nLen - 9); diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index 3966c27592..d8db1946ac 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -950,6 +950,8 @@ CPdfEditor::CPdfEditor(const std::wstring& _wsSrcFile, const std::wstring& _wsPa m_nError = 1; return; } + + m_nOriginIndex = m_pReader->GetNumPages(); } bool CPdfEditor::IncrementalUpdates() { @@ -1932,7 +1934,11 @@ bool CPdfEditor::SplitPages(const int* arrPageIndex, unsigned int unLength) { pPDFDocument = m_pReader->GetPDFDocument(++nPDFIndex); if (!pPDFDocument) - break; + { + m_mObjManager.m_arrSplitAddPages.push_back(arrPageIndex[i]); + --nPDFIndex; + continue; + } nTotalPages += nPages; nPages = pPDFDocument->getNumPages(); --i; @@ -2050,6 +2056,7 @@ bool CPdfEditor::MergePages(const std::wstring& wsPath, const std::wstring& wsPr { if (m_nMode != Mode::WriteAppend && !IncrementalUpdates()) return false; + m_nOriginIndex = m_pReader->GetNumPages(); PDFDoc* pDocument = m_pReader->GetLastPDFDocument(); int nStartRefID = m_pReader->GetStartRefID(pDocument); bool bRes = SplitPages(NULL, 0, pDocument, nStartRefID); @@ -2120,6 +2127,13 @@ bool CPdfEditor::AddPage(int nPageIndex) { if (m_nMode == Mode::Unknown && !IncrementalUpdates()) return false; + if (m_nMode == Mode::WriteNew) + { + std::vector::iterator it = std::find(m_mObjManager.m_arrSplitAddPages.begin(), m_mObjManager.m_arrSplitAddPages.end(), m_nOriginIndex++); + if (it == m_mObjManager.m_arrSplitAddPages.end()) + return false; + m_mObjManager.m_arrSplitAddPages.erase(it); + } // Применение добавления страницы для writer if (!m_pWriter->AddPage(nPageIndex)) diff --git a/PdfFile/PdfEditor.h b/PdfFile/PdfEditor.h index d9ca64fcbf..b765ce0923 100644 --- a/PdfFile/PdfEditor.h +++ b/PdfFile/PdfEditor.h @@ -56,6 +56,8 @@ public: int FindObj(PdfWriter::CObjectBase* pObj); void DeleteObjTree(Object* obj, XRef* xref, int nStartRefID); + std::vector m_arrSplitAddPages; + private: std::map m_mUniqueRef; // map уникальных объектов }; @@ -114,6 +116,7 @@ private: // 1 - Split. pReader и pWriter работают с разными файлами Mode m_nMode; int m_nEditPage; + int m_nOriginIndex; }; #endif // _PDF_EDITOR_H