From af4e0243d28d5a4461908b1bf2565bcff5680efa Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 14 Feb 2025 11:07:27 +0300 Subject: [PATCH] XRef write to stream --- .../pro/js/wasm/src/drawingfile_test.cpp | 4 ++-- PdfFile/SrcWriter/Document.cpp | 2 +- PdfFile/SrcWriter/Objects.cpp | 17 +++++++++++------ PdfFile/test/test.cpp | 4 +--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp index e36f48cd53..99aa6ec245 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp @@ -1090,7 +1090,7 @@ int main(int argc, char* argv[]) } // GLYPHS - if (true && nPagesCount > 0) + if (false && nPagesCount > 0) { BYTE* pGlyphs = GetGlyphs(pGrFile, nTestPage); nLength = READ_INT(pGlyphs); @@ -1165,7 +1165,7 @@ int main(int argc, char* argv[]) } // INTERACTIVE FORMS - if (false) + if (true) { ReadInteractiveFormsFonts(pGrFile, 1); ReadInteractiveFormsFonts(pGrFile, 2); diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index a43a02705a..1c744d2f7f 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -266,7 +266,7 @@ namespace PdfWriter PrepareEncryption(); } - m_pXref->WriteToStream(pStream, pEncrypt); + m_pXref->WriteToStream(pStream, pEncrypt, true); } bool CDocument::SaveNewWithPassword(CXref* pXref, CXref* _pXref, const std::wstring& wsPath, const std::wstring& wsOwnerPassword, const std::wstring& wsUserPassword, CDictObject* pTrailer) { diff --git a/PdfFile/SrcWriter/Objects.cpp b/PdfFile/SrcWriter/Objects.cpp index 0f1d98eefc..3d1f2ddced 100644 --- a/PdfFile/SrcWriter/Objects.cpp +++ b/PdfFile/SrcWriter/Objects.cpp @@ -927,10 +927,18 @@ namespace PdfWriter pTrailer->Add("Size", unMaxObjId + 1); if (m_pPrev && pPrev->m_unAddr) pTrailer->Add("Prev", pPrev->m_unAddr); + int nStreamOffset = pStream->Tell(); + int nOffsetSize = 1; + if (nStreamOffset > 1 << 24) + nOffsetSize = 4; + else if (nStreamOffset > 1 << 16) + nOffsetSize = 3; + else if (nStreamOffset > 1 << 8) + nOffsetSize = 2; CArrayObject* pW = new CArrayObject(); pTrailer->Add("W", pW); pW->Add(1); - pW->Add(4); + pW->Add(nOffsetSize); pW->Add(2); CArrayObject* pIndex = new CArrayObject(); pTrailer->Add("Index", pIndex); @@ -963,7 +971,6 @@ namespace PdfWriter // Записываем поток pXref = out; - int nStreamOffset = pStream->Tell(); pXref->m_unAddr = nStreamOffset; CStream* pTrailerStream = new CMemoryStream(); unsigned int unEntries = 0, unEntriesSize = 0; @@ -990,10 +997,8 @@ namespace PdfWriter pTrailerStream->WriteChar('\000'); else if (pEntry->nEntryType == IN_USE_ENTRY) pTrailerStream->WriteChar('\001'); - pTrailerStream->WriteChar((unsigned char)(pEntry->unByteOffset >> 24)); - pTrailerStream->WriteChar((unsigned char)(pEntry->unByteOffset >> 16)); - pTrailerStream->WriteChar((unsigned char)(pEntry->unByteOffset >> 8)); - pTrailerStream->WriteChar((unsigned char)(pEntry->unByteOffset)); + for (int i = 0; i < nOffsetSize; ++i) + pTrailerStream->WriteChar((pEntry->unByteOffset >> (8 * i)) & 0xFF); pTrailerStream->WriteChar((unsigned char)(pEntry->unGenNo >> 8)); pTrailerStream->WriteChar((unsigned char)(pEntry->unGenNo)); } diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index 181711fd2e..407fad324a 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -356,9 +356,7 @@ TEST_F(CPdfFileTest, SplitPdf) LoadFromFile(); - pdfFile->CreatePdf(); - - pdfFile->SplitPages({0, 1}); + pdfFile->SplitPages({2, 5, 6, 7}); pdfFile->SaveToFile(wsDstFile); }