68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
#include "PdfXRefTable.h"
|
|
|
|
#include "StringUtils.h"
|
|
|
|
PdfXRefTable::PdfXRefTable()
|
|
{
|
|
mSections.push_back(TableSubSection());
|
|
}
|
|
|
|
std::string PdfXRefTable::ToString()
|
|
{
|
|
std::string content;
|
|
for (const auto& section : mSections)
|
|
{
|
|
content += "xref\n" + std::to_string(section.mStartIndex) + " " + std::to_string(section.mRecords.size());
|
|
content += "\n";
|
|
for (const auto& record : section.mRecords)
|
|
{
|
|
auto offsetString = StringUtils::ToPaddedString(10, record.mOffsetBytes);
|
|
auto generationString = StringUtils::ToPaddedString(5, record.mGenerationNumber);
|
|
auto freeString = record.mIsFree ? "f" : "n";
|
|
|
|
content += offsetString + " " + generationString + " " + freeString + "\n";
|
|
}
|
|
content += "\n";
|
|
}
|
|
return content;
|
|
}
|
|
|
|
unsigned PdfXRefTable::GetNextOffset()
|
|
{
|
|
auto lastNumRecords = mSections[mSections.size() - 1].mRecords.size();
|
|
if (lastNumRecords > 0)
|
|
{
|
|
return mSections[mSections.size() - 1].mRecords[lastNumRecords -1].mOffsetBytes + mLastAddedBytes;
|
|
}
|
|
else if (mSections.size() > 1)
|
|
{
|
|
lastNumRecords = mSections[mSections.size() - 2].mRecords.size();
|
|
return mSections[mSections.size() - 2].mRecords[lastNumRecords -1].mOffsetBytes + mLastAddedBytes;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void PdfXRefTable::AddRecord(unsigned numBytes, unsigned generation, unsigned isFree)
|
|
{
|
|
XRefRecord record;
|
|
|
|
record.mOffsetBytes = GetNextOffset();
|
|
record.mGenerationNumber = generation;
|
|
record.mIsFree = isFree;
|
|
mSections[mSections.size()-1].mRecords.push_back(record);
|
|
mLastAddedBytes = numBytes;
|
|
}
|
|
|
|
unsigned PdfXRefTable::GetNumEntries()
|
|
{
|
|
unsigned count = 0;
|
|
for (const auto& section : mSections)
|
|
{
|
|
count += section.mRecords.size();
|
|
}
|
|
return count;
|
|
}
|
|
|