com.itextpdf.kernel.utils.PdfMerger Maven / Gradle / Ivy
/*
This file is part of the iText (R) project.
Copyright (c) 1998-2023 iText Group NV
Authors: Bruno Lowagie, Paulo Soares, et al.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License version 3
as published by the Free Software Foundation with the addition of the
following permission added to Section 15 as permitted in Section 7(a):
FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
ITEXT GROUP. ITEXT GROUP DISCLAIMS THE WARRANTY OF NON INFRINGEMENT
OF THIRD PARTY RIGHTS
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 http://www.gnu.org/licenses or write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA, 02110-1301 USA, or download the license from the following URL:
http://itextpdf.com/terms-of-use/
The interactive user interfaces in modified source and object code versions
of this program must display Appropriate Legal Notices, as required under
Section 5 of the GNU Affero General Public License.
In accordance with Section 7(b) of the GNU Affero General Public License,
a covered work must retain the producer line in every PDF that is created
or manipulated using iText.
You can be released from the requirements of the license by purchasing
a commercial license. Buying such a license is mandatory as soon as you
develop commercial activities involving the iText software without
disclosing the source code of your own applications.
These activities include: offering paid services to customers as an ASP,
serving PDFs on the fly in a web application, shipping iText with a closed
source product.
For more information, please contact iText Software Corp. at this
address: [email protected]
*/
package com.itextpdf.kernel.utils;
import com.itextpdf.kernel.pdf.PdfDocument;
import java.util.ArrayList;
import java.util.List;
public class PdfMerger {
private PdfDocument pdfDocument;
private boolean closeSrcDocuments;
private boolean mergeTags;
private boolean mergeOutlines;
/**
* 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()}
*/
public PdfMerger(PdfDocument pdfDocument, boolean mergeTags, boolean mergeOutlines) {
this.pdfDocument = pdfDocument;
this.mergeTags = mergeTags;
this.mergeOutlines = mergeOutlines;
}
/**
* 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.closeSrcDocuments = 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) {
if (mergeTags && from.isTagged()) {
pdfDocument.setTagged();
}
if (mergeOutlines && from.hasOutlines()) {
pdfDocument.initializeOutlines();
}
from.copyPagesTo(pages, pdfDocument);
if (closeSrcDocuments) {
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();
}
}