XRef write to stream

This commit is contained in:
Svetlana Kulikova
2025-02-14 11:07:27 +03:00
parent 4de7ba4e52
commit af4e0243d2
4 changed files with 15 additions and 12 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -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));
}

View File

@ -356,9 +356,7 @@ TEST_F(CPdfFileTest, SplitPdf)
LoadFromFile();
pdfFile->CreatePdf();
pdfFile->SplitPages({0, 1});
pdfFile->SplitPages({2, 5, 6, 7});
pdfFile->SaveToFile(wsDstFile);
}