All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itextpdf.kernel.utils.PdfMerger Maven / Gradle / Ivy

There is a newer version: 9.0.0
Show newest version
/*
    This file is part of the iText (R) project.
    Copyright (c) 1998-2024 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(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy