Bugfixing of unite tool

This commit is contained in:
Jakub Melka
2020-11-01 15:00:36 +01:00
parent 5d5973772a
commit d17715b17e
4 changed files with 593 additions and 76 deletions

View File

@@ -757,6 +757,47 @@ void PDFDocumentBuilder::setObject(PDFObjectReference reference, PDFObject objec
m_storage.setObject(reference, qMove(object));
}
void PDFDocumentBuilder::createDocumentParts(const std::vector<size_t>& parts)
{
PDFObjectReference root = createDocumentPartRoot();
std::vector<PDFObjectReference> pages = getPages();
PDFObjectFactory objectFactory;
objectFactory.beginDictionary();
objectFactory.beginDictionaryItem("DParts");
objectFactory.beginArray();
size_t start = 0;
for (std::size_t count : parts)
{
if (count == 0)
{
continue;
}
auto itStart = std::next(pages.cbegin(), start);
auto itEnd = std::next(itStart, count);
PDFObjectReference item = createDocumentPartItem(*itStart, *std::prev(itEnd), root);
for (auto it = itStart; it != itEnd; ++it)
{
setPageDocumentPart(*it, item);
}
objectFactory.beginArray();
objectFactory << item;
objectFactory.endArray();
start += count;
}
objectFactory.endArray();
objectFactory.endDictionaryItem();
objectFactory.endDictionary();
mergeTo(root, objectFactory.takeObject());
}
void PDFDocumentBuilder::appendTo(PDFObjectReference reference, PDFObject object)
{
m_storage.setObject(reference, PDFObjectManipulator::merge(m_storage.getObject(reference), qMove(object), PDFObjectManipulator::ConcatenateArrays));
@@ -2850,6 +2891,68 @@ PDFObjectReference PDFDocumentBuilder::createCatalogPageTreeRoot()
}
PDFObjectReference PDFDocumentBuilder::createDocumentPartItem(PDFObjectReference startPage,
PDFObjectReference endPage,
PDFObjectReference parent)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPart");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Parent");
objectBuilder << parent;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Start");
objectBuilder << startPage;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("End");
objectBuilder << endPage;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference documentPart = addObject(objectBuilder.takeObject());
return documentPart;
}
PDFObjectReference PDFDocumentBuilder::createDocumentPartRoot()
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPart");
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference rootNodeReference = addObject(objectBuilder.takeObject());
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPartRoot");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("DPartRootNode");
objectBuilder << rootNodeReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference documentPartReference = addObject(objectBuilder.takeObject());
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Parent");
objectBuilder << documentPartReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedRootNode = objectBuilder.takeObject();
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("DPartRoot");
objectBuilder << documentPartReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(rootNodeReference, updatedRootNode);
mergeTo(getCatalogReference(), updatedCatalog);
return rootNodeReference;
}
PDFObject PDFDocumentBuilder::createTrailerDictionary(PDFObjectReference catalog)
{
PDFObjectFactory objectBuilder;
@@ -3123,6 +3226,34 @@ void PDFDocumentBuilder::setAnnotationTitle(PDFObjectReference annotation,
}
void PDFDocumentBuilder::setCatalogAcroForm(PDFObjectReference acroForm)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("AcroForm");
objectBuilder << acroForm;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("OCProperties");
objectBuilder << ocProperties;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
void PDFDocumentBuilder::setDocumentAuthor(QString author)
{
PDFObjectFactory objectBuilder;
@@ -3288,6 +3419,21 @@ void PDFDocumentBuilder::setLanguage(QString language)
}
void PDFDocumentBuilder::setPageDocumentPart(PDFObjectReference page,
PDFObjectReference documentPart)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("DPart");
objectBuilder << documentPart;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPage = objectBuilder.takeObject();
mergeTo(page, updatedPage);
}
void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
{
PDFObjectFactory objectBuilder;
@@ -3312,20 +3458,6 @@ void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
}
void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("OCProperties");
objectBuilder << ocProperties;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
/* END GENERATED CODE */
} // namespace pdf

View File

@@ -348,6 +348,12 @@ public:
/// \param object Object to be set
void setObject(PDFObjectReference reference, PDFObject object);
/// Creates document parts from given pages. Pages must be flattened
/// by function \p flattenPageTree. \sa flattenPageTree. Each document
/// part has certain page size, sum of \p parts must equal to page count.
/// \param parts Parts (page count of each document part)
void createDocumentParts(const std::vector<size_t>& parts);
/* START GENERATED CODE */
/// Appends a new page after last page.
@@ -863,6 +869,19 @@ public:
PDFObjectReference createCatalogPageTreeRoot();
/// Creates document part item (for certain range of pages).
/// \param startPage First page of page range.
/// \param endPage Last page of page range.
/// \param parent Parent node (must be a reference to parent node).
PDFObjectReference createDocumentPartItem(PDFObjectReference startPage,
PDFObjectReference endPage,
PDFObjectReference parent);
/// Creates document part root node (and setups catalog object).
PDFObjectReference createDocumentPartRoot();
/// This function is used to create a new trailer dictionary, when blank document is created. Do not
/// call this function manually.
/// \param catalog Reference to document catalog
@@ -970,6 +989,16 @@ public:
QString title);
/// Set AcroForm to catalog.
/// \param acroForm Reference to AcroForm object.
void setCatalogAcroForm(PDFObjectReference acroForm);
/// Set optional content properties to catalog.
/// \param ocProperties Reference to catalog optional content properties.
void setCatalogOptionalContentProperties(PDFObjectReference ocProperties);
/// Set document author.
/// \param author Author
void setDocumentAuthor(QString author);
@@ -1040,17 +1069,19 @@ public:
void setLanguage(QString language);
/// Sets document part to page.
/// \param page Page
/// \param documentPart Document part
void setPageDocumentPart(PDFObjectReference page,
PDFObjectReference documentPart);
/// This function is used to update trailer dictionary. Must be called each time the final document is
/// being built.
/// \param objectCount Number of objects (including empty ones)
void updateTrailerDictionary(PDFInteger objectCount);
/// Set optional content properties to catalog.
/// \param ocProperties Reference to catalog optional content properties.
void setCatalogOptionalContentProperties(PDFObjectReference ocProperties);
/* END GENERATED CODE */
private: