Skip to content

Commit ff177b5

Browse files
PdfMerger: move copying logic to addPages
DEVSIX-593
1 parent 29a042c commit ff177b5

File tree

2 files changed

+50
-82
lines changed

2 files changed

+50
-82
lines changed

kernel/src/main/java/com/itextpdf/kernel/utils/PdfMerger.java

Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ This file is part of the iText (R) project.
4444
*/
4545
package com.itextpdf.kernel.utils;
4646

47-
import com.itextpdf.kernel.PdfException;
4847
import com.itextpdf.kernel.pdf.PdfDocument;
4948

5049
import java.util.ArrayList;
@@ -54,7 +53,7 @@ This file is part of the iText (R) project.
5453
public class PdfMerger {
5554

5655
private PdfDocument pdfDocument;
57-
private List<AddedPages> pagesToCopy = new ArrayList<>();
56+
private boolean closeSrcDocuments;
5857

5958
/**
6059
* This class is used to merge a number of existing documents into one;
@@ -65,69 +64,57 @@ public PdfMerger(PdfDocument pdfDocument){
6564
}
6665

6766
/**
68-
* This method adds pages from the source document to the List of pages which will be merged.
67+
* If set to <i>true</i> then passed to the <i>{@code PdfMerger#merge}</i> method source documents will be closed immediately after merging
68+
* specified pages into current document. If <i>false</i> - PdfDocuments are left open. Default value - <i>false</i>.
69+
* @param closeSourceDocuments should be true to close pdf documents in merge method.
70+
* @return this {@code PdfMerger} instance.
71+
*/
72+
public PdfMerger setCloseSourceDocuments(boolean closeSourceDocuments) {
73+
this.closeSrcDocuments = closeSourceDocuments;
74+
return this;
75+
}
76+
77+
/**
78+
* This method merges pages from the source document to the current one.
79+
* <br/><br/>
80+
* If <i>closeSourceDocuments</i> flag is set to <i>true</i> (see {@link #setCloseSourceDocuments(boolean)}),
81+
* passed {@code PdfDocument} will be closed after pages are merged.
6982
* @param from - document, from which pages will be copied.
7083
* @param fromPage - start page in the range of pages to be copied.
7184
* @param toPage - end page in the range to be copied.
72-
* @throws PdfException
85+
* @return this {@code PdfMerger} instance.
7386
*/
74-
public void addPages(PdfDocument from, int fromPage, int toPage) {
87+
public PdfMerger merge(PdfDocument from, int fromPage, int toPage) {
88+
List<Integer> pages = new ArrayList<>(toPage - fromPage);
7589
for (int pageNum = fromPage; pageNum <= toPage; pageNum++){
76-
enqueuePageToCopy(from, pageNum);
90+
pages.add(pageNum);
7791
}
92+
return merge(from, pages);
7893
}
7994

8095
/**
81-
* This method adds pages from the source document to the List of pages which will be merged.
96+
* This method merges pages from the source document to the current one.
97+
* <br/><br/>
98+
* If <i>closeSourceDocuments</i> flag is set to <i>true</i> (see {@link #setCloseSourceDocuments(boolean)}),
99+
* passed {@code PdfDocument} will be closed after pages are merged.
82100
* @param from - document, from which pages will be copied.
83101
* @param pages - List of numbers of pages which will be copied.
84-
* @throws PdfException
102+
* @return this {@code PdfMerger} instance.
85103
*/
86-
public void addPages(PdfDocument from, List<Integer> pages) {
87-
for (Integer pageNum : pages){
88-
enqueuePageToCopy(from, pageNum);
104+
public PdfMerger merge(PdfDocument from, List<Integer> pages) {
105+
from.copyPagesTo(pages, pdfDocument);
106+
if (closeSrcDocuments) {
107+
from.close();
89108
}
109+
return this;
90110
}
91111

92112
/**
93-
* This method gets all pages from the List of pages to be copied and merges them into one document.
94-
* @throws PdfException
113+
* Closes the current document. It is a complete equivalent of calling {@code PdfDocument#close} on the PdfDocument
114+
* passed to the constructor of this PdfMerger instance. This means that it is enough to call <i>close</i> either on
115+
* passed PdfDocument or on this PdfMerger instance, but there is no need to call them both.
95116
*/
96-
public void merge() {
97-
for (AddedPages addedPages : pagesToCopy) {
98-
addedPages.from.copyPagesTo(addedPages.pagesToCopy, pdfDocument );
99-
}
100-
}
101-
102-
/**
103-
* This method adds to the List of pages to be copied with given page.
104-
* Pages are stored along with their documents.
105-
* If last added page belongs to the same document as the new one, new page is added to the previous {@code AddedPages} instance.
106-
* @param from - document, from which pages will be copied.
107-
* @param pageNum - number of page to be copied.
108-
* @throws PdfException
109-
*/
110-
private void enqueuePageToCopy(PdfDocument from, int pageNum) {
111-
if (!pagesToCopy.isEmpty()) {
112-
AddedPages lastAddedPagesEntry = pagesToCopy.get(pagesToCopy.size() - 1);
113-
if (lastAddedPagesEntry.from == from) {
114-
lastAddedPagesEntry.pagesToCopy.add(pageNum);
115-
} else {
116-
pagesToCopy.add(new AddedPages(from, pageNum));
117-
}
118-
} else {
119-
pagesToCopy.add(new AddedPages(from, pageNum));
120-
}
121-
}
122-
123-
static class AddedPages {
124-
public AddedPages(PdfDocument from, int pageNum) {
125-
this.from = from;
126-
this.pagesToCopy = new ArrayList<>();
127-
this.pagesToCopy.add(pageNum);
128-
}
129-
130-
PdfDocument from;
131-
List<Integer> pagesToCopy;
117+
public void close() {
118+
pdfDocument.close();
132119
}
133120
}

kernel/src/test/java/com/itextpdf/kernel/utils/PdfMergerTest.java

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,12 @@ public void mergeDocumentTest01() throws IOException, InterruptedException {
5353
PdfDocument pdfDoc2 = new PdfDocument(reader2);
5454
PdfDocument pdfDoc3 = new PdfDocument(writer1);
5555

56-
PdfMerger merger = new PdfMerger(pdfDoc3);
57-
merger.addPages(pdfDoc, 1, 1);
58-
merger.addPages(pdfDoc1, 1, 1);
56+
PdfMerger merger = new PdfMerger(pdfDoc3).setCloseSourceDocuments(true);
57+
merger.merge(pdfDoc, 1, 1);
58+
merger.merge(pdfDoc1, 1, 1);
5959

60-
merger.addPages(pdfDoc2, 1, 1);
60+
merger.merge(pdfDoc2, 1, 1);
6161

62-
merger.merge();
63-
64-
pdfDoc.close();
65-
pdfDoc1.close();
66-
pdfDoc2.close();
6762
pdfDoc3.close();
6863

6964
CompareTool compareTool = new CompareTool();
@@ -90,18 +85,10 @@ public void mergeDocumentTest02() throws IOException, InterruptedException {
9085
PdfDocument pdfDoc1 = new PdfDocument(reader1);
9186
PdfDocument pdfDoc2 = new PdfDocument(reader2);
9287
PdfDocument pdfDoc3 = new PdfDocument(writer1);
93-
PdfMerger merger = new PdfMerger(pdfDoc3);
94-
95-
merger.addPages(pdfDoc, 1, 1);
96-
merger.addPages(pdfDoc1, 1, 1);
97-
merger.addPages(pdfDoc2, 1, 1);
88+
PdfMerger merger = new PdfMerger(pdfDoc3).setCloseSourceDocuments(true);
9889

99-
merger.merge();
90+
merger.merge(pdfDoc, 1, 1).merge(pdfDoc1, 1, 1).merge(pdfDoc2, 1, 1).close();
10091

101-
pdfDoc.close();
102-
pdfDoc1.close();
103-
pdfDoc2.close();
104-
pdfDoc3.close();
10592
CompareTool compareTool = new CompareTool();
10693
String errorMessage = compareTool.compareByContent(resultFile, sourceFolder + "cmp_mergedResult02.pdf", destinationFolder, "diff_");
10794
if (errorMessage != null) {
@@ -128,15 +115,13 @@ public void mergeDocumentTest03() throws IOException, InterruptedException, Par
128115
PdfDocument pdfDoc3 = new PdfDocument(writer1);
129116
pdfDoc3.setTagged();
130117

131-
PdfMerger merger = new PdfMerger(pdfDoc3);
132-
merger.addPages(pdfDoc, 2, 2);
133-
merger.addPages(pdfDoc1, 7, 8);
134-
135-
merger.merge();
118+
new PdfMerger(pdfDoc3)
119+
.merge(pdfDoc, 2, 2)
120+
.merge(pdfDoc1, 7, 8)
121+
.close();
136122

137123
pdfDoc.close();
138124
pdfDoc1.close();
139-
pdfDoc3.close();
140125

141126
CompareTool compareTool = new CompareTool();
142127
String errorMessage = "";
@@ -169,25 +154,21 @@ public void mergeDocumentTest04() throws IOException, InterruptedException, Par
169154
PdfDocument pdfDoc3 = new PdfDocument(writer1);
170155
pdfDoc3.setTagged();
171156

172-
PdfMerger merger = new PdfMerger(pdfDoc3);
157+
PdfMerger merger = new PdfMerger(pdfDoc3).setCloseSourceDocuments(true);
173158
List<Integer> pages = new ArrayList<>();
174159
pages.add(3);
175160
pages.add(2);
176161
pages.add(1);
177-
merger.addPages(pdfDoc, pages);
162+
merger.merge(pdfDoc, pages);
178163

179164
List<Integer> pages1 = new ArrayList<>();
180165
pages1.add(5);
181166
pages1.add(9);
182167
pages1.add(4);
183168
pages1.add(3);
184-
merger.addPages(pdfDoc1, pages1);
185-
186-
merger.merge();
169+
merger.merge(pdfDoc1, pages1);
187170

188-
pdfDoc.close();
189-
pdfDoc1.close();
190-
pdfDoc3.close();
171+
merger.close();
191172

192173
CompareTool compareTool = new CompareTool();
193174
String errorMessage = "";

0 commit comments

Comments
 (0)