com.itextpdf.kernel.utils.PdfMerger Maven / Gradle / Ivy
/*
This file is part of the iText (R) project.
Copyright (c) 1998-2023 Apryse Group NV
Authors: Apryse Software.
This program is offered under a commercial and under the AGPL license.
For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below.
AGPL licensing:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package com.itextpdf.kernel.utils;
import com.itextpdf.kernel.pdf.IPdfPageExtraCopier;
import com.itextpdf.kernel.pdf.PdfDocument;
import java.util.ArrayList;
import java.util.List;
public class PdfMerger {
private PdfDocument pdfDocument;
private PdfMergerProperties properties;
/**
* This class is used to merge a number of existing documents into one. By default, if source document
* contains tags and outlines, they will be also copied to the destination document.
*
* @param pdfDocument the document into which source documents will be merged
*/
public PdfMerger(PdfDocument pdfDocument) {
this(pdfDocument, true, true);
}
/**
* This class is used to merge a number of existing documents into one.
*
* @param pdfDocument the document into which source documents will be merged
* @param mergeTags if true, then tags from the source document are copied even if destination document is not set as
* tagged. Note, that if false, tag structure is still could be copied if the destination document
* is explicitly marked as tagged with {@link PdfDocument#setTagged()}
* @param mergeOutlines if true, then outlines from the source document are copied even if in destination document
* outlines are not initialized. Note, that if false, outlines are still could be copied if the
* destination document outlines were explicitly initialized with {@link PdfDocument#initializeOutlines()}
*
* @deprecated use PdfMerger(PdfDocument, PdfMergerProperties)
constructor
*/
@Deprecated
public PdfMerger(PdfDocument pdfDocument, boolean mergeTags, boolean mergeOutlines) {
this.pdfDocument = pdfDocument;
this.properties = new PdfMergerProperties();
this.properties.setMergeTags(mergeTags).setMergeOutlines(mergeOutlines);
}
/**
* This class is used to merge a number of existing documents into one.
*
* @param pdfDocument the document into which source documents will be merged
* @param properties properties for the created PdfMerger
*/
public PdfMerger(PdfDocument pdfDocument, PdfMergerProperties properties) {
this.pdfDocument = pdfDocument;
this.properties = properties != null ? properties : new PdfMergerProperties();
}
/**
* If set to true then passed to the {@code PdfMerger#merge} method source documents will be closed
* immediately after merging specified pages into current document. If false - PdfDocuments are left open.
* Default value - false.
*
* @param closeSourceDocuments should be true to close pdf documents in merge method
* @return this {@code PdfMerger} instance
*/
public PdfMerger setCloseSourceDocuments(boolean closeSourceDocuments) {
this.properties.setCloseSrcDocuments(closeSourceDocuments);
return this;
}
/**
* This method merges pages from the source document to the current one.
*
* If closeSourceDocuments flag is set to true (see {@link #setCloseSourceDocuments(boolean)}),
* passed {@code PdfDocument} will be closed after pages are merged.
*
* See also {@link com.itextpdf.kernel.pdf.PdfDocument#copyPagesTo}.
*
* @param from - document, from which pages will be copied
* @param fromPage - start page in the range of pages to be copied
* @param toPage - end (inclusive) page in the range to be copied
* @return this {@code PdfMerger} instance
*/
public PdfMerger merge(PdfDocument from, int fromPage, int toPage) {
List pages = new ArrayList<>(toPage - fromPage);
for (int pageNum = fromPage; pageNum <= toPage; pageNum++){
pages.add(pageNum);
}
return merge(from, pages);
}
/**
* This method merges pages from the source document to the current one.
*
* If closeSourceDocuments flag is set to true (see {@link #setCloseSourceDocuments(boolean)}),
* passed {@code PdfDocument} will be closed after pages are merged.
*
* See also {@link com.itextpdf.kernel.pdf.PdfDocument#copyPagesTo}.
*
* @param from - document, from which pages will be copied
* @param pages - List of numbers of pages which will be copied
* @return this {@code PdfMerger} instance
*/
public PdfMerger merge(PdfDocument from, List pages) {
return merge(from, pages, null);
}
/**
* This method merges pages from the source document to the current one.
*
* If closeSourceDocuments flag is set to true (see {@link #setCloseSourceDocuments(boolean)}),
* passed {@code PdfDocument} will be closed after pages are merged.
*
* See also {@link com.itextpdf.kernel.pdf.PdfDocument#copyPagesTo}.
*
* @param from - document, from which pages will be copied
* @param pages - List of numbers of pages which will be copied
* @param copier - a copier which bears a special copy logic. May be null.
* It is recommended to use the same instance of {@link IPdfPageExtraCopier}
* for the same output document.
* @return this {@code PdfMerger} instance
*/
public PdfMerger merge(PdfDocument from, List pages, IPdfPageExtraCopier copier) {
if (properties.isMergeTags() && from.isTagged()) {
pdfDocument.setTagged();
}
if (properties.isMergeOutlines() && from.hasOutlines()) {
pdfDocument.initializeOutlines();
}
if (properties.isMergeScripts()) {
PdfScriptMerger.mergeScripts(from, this.pdfDocument);
}
from.copyPagesTo(pages, pdfDocument, copier);
if (properties.isCloseSrcDocuments()) {
from.close();
}
return this;
}
/**
* Closes the current document.
*
* It is a complete equivalent of calling {@code PdfDocument#close} on the PdfDocument
* passed to the constructor of this PdfMerger instance. This means that it is enough to call
* close either on passed PdfDocument or on this PdfMerger instance, but there is no need
* to call them both.
*/
public void close() {
pdfDocument.close();
}
}