Merge two or multiple PDF files into a single file in Java

Merging PDFs in Java is a critical requirement for document-intensive applications, from consolidating financial reports to automating archival systems. However, developers face significant challenges in preserving formatting integrity or managing resource efficiency across diverse PDF sources. Spire.PDF for Java provides a robust and straightforward solution to streamline the PDF merging task.

This comprehensive guide explores how to combine PDFs in Java, complete with practical examples to merge multiple files, selected pages, or stream-based merging.


Setting Up the Java PDF Merge Library

Why Choose Spire.PDF for Java?

  • No External Dependencies: Pure Java implementation.
  • Rich Features: Merge, split, encrypt, and annotate PDFs.
  • Cross-Platform: Works on Windows, Linux, and macOS.

Installation

Before using Spire.PDF for Java, you need to add it to your project.

Option 1: Maven

Add the repository and dependency to pom.xml:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>11.11.11</version>
    </dependency>
</dependencies>

Option 2: Manual JAR

Download the JAR from the E-iceblue website and add it to your project's build path.


Merge Multiple PDF Files in Java​

This example is ideal when you want to merge two or more PDF documents entirely. It’s simple, straightforward, and perfect for batch processing.

How It Works:​

  • Define File Paths: Create an array of strings containing the full paths to the source PDFs.​
  • Merge Files: The mergeFiles() method takes the array of paths, combines the PDFs, and returns a PdfDocumentBase object representing the merged file.​
  • Save the Result: The merged PDF is saved to a new file using the save() method.​

Java code to combine PDFs:

import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfDocumentBase;

public class MergePdfs {
    public static void main(String[] args) {

        // Get the paths of the PDF documents to be merged 
        String[] files = new String[] {"sample-1.pdf", "sample-2.pdf", "sample-3.pdf"};

        // Merge these PDF documents
        PdfDocumentBase pdf = PdfDocument.mergeFiles(files);

        // Save the merged PDF file
        pdf.save("MergePDF.pdf", FileFormat.PDF);
    }
}

Best For:​

  • Merging entire PDFs stored locally.​
  • Simple batch operations where no page selection is needed.

Result: Combine three PDF files (a total of 10 pages) into one PDF file.

Merge multiple PDF files into a single PDF

Merging PDFs often results in large file sizes. To reduce the size, refer to: Compress PDF Files in Java.

Merge Specific Pages from Multiple PDFs in Java

Sometimes, you may only want to merge specific pages from different PDFs (e.g., pages 1-3 from File A and pages 2-5 from File B). This example gives you granular control over which pages to include from each source PDF.

How It Works:​

  • Load PDFs: Load each source PDF into a PdfDocument object and store them in an array.​
  • Create a New PDF: A blank PDF document is initialized to serve as the container for merged pages.​
  • Insert Specific Pages:​
    • insertPage(): Insert a specified page into the new PDF.​
    • insertPageRange(): Inserts a range of pages into the new PDF.
  • Save the Result: The merged PDF is saved using the saveToFile() method.​

Java code to combine selected PDF pages:

import com.spire.pdf.PdfDocument;

public class MergeSelectedPages {

    public static void main(String[] args) {

        // Get the paths of the PDF documents to be merged
        String[] files = new String[] {"sample-1.pdf", "sample-2.pdf", "sample-3.pdf"};

        // Create an array of PdfDocument
        PdfDocument[] pdfs = new PdfDocument[files.length];

        // Loop through the documents
        for (int i = 0; i < files.length; i++)
        {
            // Load a specific document
            pdfs[i] = new PdfDocument(files[i]);
        }

        // Create a new PDF document
        PdfDocument pdf = new PdfDocument();

        // Insert the selected pages from different PDFs to the new PDF
        pdf.insertPage(pdfs[0], 0);
        pdf.insertPageRange(pdfs[1], 1,3);
        pdf.insertPage(pdfs[2], 0);

        // Save the merged PDF
        pdf.saveToFile("MergePdfPages.pdf");
    }
}

Best For:​

  • Creating custom PDFs with selected pages (e.g., extracting key sections from reports).​
  • Scenarios where you need to exclude irrelevant pages from source documents.

Result: Combine selected pages from three separate PDF files into a new PDF

Combine specified pages from different PDFs into a new PDF file

Merge PDF Files by Streams in Java

In applications where PDFs are stored as streams (e.g., PDFs from network streams, in-memory data, or temporary files), Spire.PDF supports merging without saving files to disk.

How It Works:​

  • Create Input Streams: The FileInputStream objects read the raw byte data of each PDF file.​
  • Merge Streams: The mergeFiles() method accepts an array of streams, merges them, and returns a PdfDocumentBase object.​
  • Save and Clean Up: The merged PDF is saved, and all streams and documents are closed to free system resources (critical for preventing leaks).​

Java code to merge PDFs via streams:

import com.spire.pdf.*;
import java.io.*;

public class mergePdfsByStream {
    public static void main(String[] args) throws IOException {
        // Create FileInputStream objects for each PDF document file
        FileInputStream stream1 = new FileInputStream(new File("Template_1.pdf"));
        FileInputStream stream2 = new FileInputStream(new File("Template_2.pdf"));
        FileInputStream stream3 = new FileInputStream(new File("Template_3.pdf"));

        // Initialize an array of InputStream objects containing the file input streams
        InputStream[] streams = new FileInputStream[]{stream1, stream2, stream3};

        // Merge the input streams into a single PdfDocumentBase object
        PdfDocumentBase pdf = PdfDocument.mergeFiles(streams);

        // Save the merged PDF file
        pdf.save("MergePdfsByStream.pdf", FileFormat.PDF);

        // Releases system resources used by the merged document
        pdf.close();
        pdf.dispose();

        // Closes all input streams to free up resources
        stream1.close();
        stream2.close();
        stream3.close();
    }
}

Best For:​

  • Merging PDFs from non-file sources (e.g., network downloads, in-memory generation).​
  • Environments where direct file path access is restricted.

Conclusion

Spire.PDF for Java simplifies complex PDF merging tasks through its intuitive, user-friendly API. Whether you need to merge entire documents, create custom page sequences, or combine PDFs from stream sources, these examples enable efficient PDF merging in Java to address diverse document processing requirements.

To explore more features (e.g., encrypting merged PDFs, adding bookmarks), refer to the official documentation.


Frequently Asked Questions (FAQs)

Q1: Why do merged PDFs show "Evaluation Warning" watermarks?

A: The commercial version adds watermarks. Solutions:

Q2: How do I control the order of pages in the merged PDF?

A: The order of pages in the merged PDF is determined by the order of input files (or streams) and the pages you select. For example:

  • In full-document merging, files in the input array are merged in the order they appear.
  • In selective page merging, use insertPage() or insertPageRange() in the sequence you want pages to appear.

Q3: Can I merge password-protected PDFs?

A: Yes. Spire.PDF for Java supports merging encrypted PDFs, but you must provide the password when loading the file. Use the overloaded loadFromFile() method with the password parameter:

PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("sample.pdf", "userPassword"); // Decrypt with password

Q4: How to merge scanned/image-based PDFs?

A: Spire.PDF handles image-PDFs like regular PDFs, but file sizes may increase significantly.

Published in Document Operation

Visual guide of Generate PDF in Java

PDF is a cornerstone for document sharing across diverse platforms. In Java development, the ability to generate PDF in Java efficiently is a common requirement for applications ranging from invoicing systems to report generators. Among the myriad libraries available, Spire.PDF for Java stands out as a robust solution. This comprehensive guide explores how to use this powerful Java library to create PDF files from scratch, from templates or from HTML.

Getting Started with Spire.PDF for Java

Spire.PDF for Java is a robust library simplifies PDF generation in Java without Adobe dependencies. Key features:

  • Cross-Platform Support: Runs seamlessly on Windows, Linux, and macOS.
  • Rich Content Creation: Add text, images, tables, lists, and barcodes.
  • Advanced Security: Apply passwords, digital signatures, and permission controls.
  • Easy Integration: Works seamlessly with Java SE and EE environments.

Setup & Installation

To start creating PDF in Java, you first need to add Spire.PDF for Java to your project. You can download the JAR files from the E-iceblue website or add it as a Maven dependency:


<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>11.11.11</version>
    </dependency>
</dependencies>

Background: The Coordinate System

In Spire.PDF for Java, the coordinate system defines the positioning of elements (text, images, shapes) on a PDF page. Here’s the key concepts:

  • Origin Point (0,0): The origin of the coordinate system is located at the top-left corner of the content area.
  • X-axis: Extends horizontally from the left to the right.
  • Y-axis: Extends vertically from the top downward.

Coordinate system in Spire.PDF for Java


Generate a Basic PDF in Java

Let’s start with a simple example of creating a PDF document with text. Spire.PDF for Java provides two methods to draw text on a PDF page:

  • PdfCanvas.drawString(): Draws single-line text at exact coordinates. Best for headings, labels, or short text snippets.
  • PdfTextWidget.draw(): Manages multi-line text with automatic word wrapping and line breaks. Best for paragraphs, long content, paginated text.

Here's the Jave code to create PDF:

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

public class CreatePdfDocument {

    public static void main(String[] args) {

        // Create a PdfDocument object
        PdfDocument pdf = new PdfDocument();

        // Add a page with specified size and margin
        PdfPageBase page = pdf.getPages().add(PdfPageSize.A4, new PdfMargins(35f));

        // Specify page content
        String titleText = "Spire.PDF for Java";
        String paraText = "Spire.PDF for Java is a PDF API that enables Java applications to read, write and save PDF documents. " +
                "Using this Java PDF component, developers and programmers can implement rich capabilities to" +
                "create PDF files from scratch or process existing PDF documents entirely on Java applications (J2SE and J2EE). " +
                "Spire.PDF for Java is a totally independent Java PDF library. " +
                "It does not require Adobe Acrobat or any other 3rd party software/library installed on system.";

        // Create solid brushes
        PdfSolidBrush titleBrush = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
        PdfSolidBrush paraBrush = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));

        // Create true type fonts
        PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Times New Roman",Font.BOLD,18));
        PdfTrueTypeFont paraFont = new PdfTrueTypeFont(new Font("Times New Roman",Font.PLAIN,12));

        // Set the text alignment via PdfStringFormat class
        PdfStringFormat format = new PdfStringFormat();
        format.setAlignment(PdfTextAlignment.Center);

        // Draw title on the page
        page.getCanvas().drawString(titleText, titleFont, titleBrush, new Point2D.Float((float)page.getClientSize().getWidth()/2, 40),format);

        // Create a PdfTextWidget object to hold the paragraph content
        PdfTextWidget widget = new PdfTextWidget(paraText, paraFont, paraBrush);

        // Create a rectangle where the paragraph content will be placed
        Rectangle2D.Float rect = new Rectangle2D.Float(0, 70, (float)page.getClientSize().getWidth(),(float)page.getClientSize().getHeight());

        // Set the PdfLayoutType to Paginate to make the content paginated automatically
        PdfTextLayout layout = new PdfTextLayout();
        layout.setLayout(PdfLayoutType.Paginate);

        // Draw paragraph text on the page
        widget.draw(page, rect, layout);

        // Save the PDF file
        pdf.saveToFile("CreatePdfDocument.pdf");
        pdf.dispose();
    }
}

The code creates a PDF with a centered title and a paragraph that automatically paginates if it exceeds the page height.

The generated PDF file:

Create a simple PDF file with text and formatting.

Beyond simple text, you can also add other elements to PDF, such as:

Add Images to PDF

Add images (JPG, PNG, etc.) at specified locations on a PDF page:

//Load an image
PdfImage image = PdfImage.fromFile("image.jpg");

//Specify the width and height of the image area on the page
float width = image.getWidth() * 0.50f;
float height = image.getHeight() * 0.50f;

//Draw the image at a specified location on the page
page.getCanvas().drawImage(image, 100f, 60f, width, height);

Add Tables to PDF

Organize data with tables, a useful feature when you generate PDF reports:

//Create a PdfTable object
PdfTable table = new PdfTable();

//Define data
String[] data = {"ID;Name;Department;Position",
        "1; David; IT; Manager",
        "3; Julia; HR; Manager",
        "4; Sophie; Marketing; Manager",
        "7; Wickey; Marketing; Sales Rep",
        "9; Wayne; HR; HR Supervisor",
        "11; Mia; Dev; Developer"};
String[][] dataSource = new String[data.length][];
for (int i = 0; i < data.length; i++) {
    dataSource[i] = data[i].split("[;]", -1);
}

//Set data as the table data
table.setDataSource(dataSource);

//Set the first row as header row
table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
table.getStyle().setHeaderRowCount(1);

//Show header(the header is hidden by default)
table.getStyle().setShowHeader(true);

//Draw table on the page
table.draw(page, new Point2D.Float(0, 30));

Refer to: Create Tables in PDF in Java


Create PDF from Template in Java

This Java code demonstrates how to generate a PDF by dynamically replacing placeholders in a pre-designed PDF template. Common use cases include generating emails, reports, invoice or contracts.

import com.spire.pdf.*;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

public class GeneratePdfFromTemplate
    {
        public static void main(String[] args)
        {

            // Create a PdfDocument object
            PdfDocument pdf = new PdfDocument();

            // Load a template
            pdf.loadFromFile("PdfTemplate.pdf");

            // Create a PdfTextReplaceOptions object
            PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();

            // Specify the replace options
            textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
            textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));

            // Get the first page
            PdfPageBase page = pdf.getPages().get(0);

            // Create a PdfTextReplacer object based on the page
            PdfTextReplacer textReplacer = new PdfTextReplacer(page);

            // Set replace options
            textReplacer.setOptions(textReplaceOptions);

            // Specify the placeholder-value pairs in a map
            Map<String, String> replacements = new HashMap<>();
            replacements.put("{name}", "John Smith");
            replacements.put("{date}", "2023-10-05");
            replacements.put("{number}", "ID0001265");
            replacements.put("{address}", "123 Northwest Freeway, Houston, Texas USA 77040");

            // Iterate over the map to replace each placeholder
            for (Map.Entry<String, String> entry : replacements.entrySet())
            {
                textReplacer.replaceAllText(entry.getKey(), entry.getValue());
            }

            // Save the result PDF
            pdf.saveToFile("GeneratePDFromTemplate.pdf");
            pdf.dispose();
        }
    }

Explanation:

Here are some core components for the template-based PDF generation:

  • PdfTextReplaceOptions: Defines how replacements are performed (case-insensitive, whole words).
  • PdfTextReplacer: Represents the text replacement in a PDF page.
  • replaceAllText(): Replaces all occurrences of old text (a placeholder like "{name}") with new text (e.g., "John Smith").

Output:

Generate a PDF from a template.


Bonus: Generate PDF from HTML in Java

Spire.PDF for Java also provides intuitive APIs to convert web URLs, local HTML files, or raw HTML strings to PDF files. For a comprehensive implementation guide, refer to:

Convert HTML to PDF in Java – URLs and HTML Strings/ Files

By mastering the HTML to PDF conversion, Java developers can automate invoice/report generation from web templates, or archive web pages as searchable PDFs.


Conclusion

Spire.PDF for Java provides an efficient way to generate PDF in Java—whether creating basic documents, generating PDFs from HTML or templates. By following the examples in this article, you can quickly integrate professional PDF creation in your Java projects.

Explore Full Features: Spire.PDF for Java Online Documentation


Frequently Asked Questions (FAQs)

Q1: Is Spire.PDF for Java free?

A: Spire.PDF for Java offers both commercial and free versions (with limitations). You can request a trial license to test the commercial version without any restrictions.

Q2: Does it support non-English languages (e.g., Chinese, Japanese)?

A: Yes, use the font that supports the target language. For example:

// To display Chinese text, use a font like "SimSun" or "Microsoft YaHei"
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("SimSun", Font.PLAIN, 12));

// To display Japanese text, use a font like "MS Gothic" or "Yu Gothic"
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("MS Gothic", Font.PLAIN, 12));

Q3: How to secure PDFs with passwords?

A: Set open/permission passwords:

// Create a password-based security policy with open and permission passwords
PdfSecurityPolicy securityPolicy = new PdfPasswordSecurityPolicy("openPwd", "permissionPwd");

// Set the encryption algorithm to AES 256-bit
securityPolicy.setEncryptionAlgorithm(PdfEncryptionAlgorithm.AES_256);

// Encrypt the PDF file
pdf.encrypt(securityPolicy);
Published in Document Operation
Page 3 of 3