You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2018/08/20 17:08:19 UTC
svn commit: r1838439 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
Author: lehmi
Date: Mon Aug 20 17:08:19 2018
New Revision: 1838439
URL: http://svn.apache.org/viewvc?rev=1838439&view=rev
Log:
PDFBOX-4295: don't create imtermediate streams when merging files
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1838439&r1=1838438&r2=1838439&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java Mon Aug 20 17:08:19 2018
@@ -81,8 +81,7 @@ public class PDFMergerUtility
*/
private static final Log LOG = LogFactory.getLog(PDFMergerUtility.class);
- private final List<InputStream> sources;
- private final List<FileInputStream> fileInputStreams;
+ private final List<Object> sources;
private String destinationFileName;
private OutputStream destinationStream;
private boolean ignoreAcroFormErrors = false;
@@ -137,7 +136,6 @@ public class PDFMergerUtility
public PDFMergerUtility()
{
sources = new ArrayList<>();
- fileInputStreams = new ArrayList<>();
}
/**
@@ -267,7 +265,6 @@ public class PDFMergerUtility
{
FileInputStream stream = new FileInputStream(source);
sources.add(stream);
- fileInputStreams.add(stream);
}
/**
@@ -324,36 +321,44 @@ public class PDFMergerUtility
}
}
- private void optimizedMergeDocuments(MemoryUsageSetting memUsageSetting, List<InputStream> sourceDocuments) throws IOException
+ private void optimizedMergeDocuments(MemoryUsageSetting memUsageSetting,
+ List<Object> sourceDocuments) throws IOException
{
try (PDDocument destination = new PDDocument(memUsageSetting))
{
PDFCloneUtility cloner = new PDFCloneUtility(destination);
- for (InputStream sourceInputStream : sources)
+ for (Object sourceObject : sources)
{
- try (PDDocument sourceDoc = PDDocument.load(sourceInputStream, memUsageSetting))
+ PDDocument sourceDoc = null;
+ if (sourceObject instanceof File)
{
- for (PDPage page : sourceDoc.getPages())
+ sourceDoc = PDDocument.load((File) sourceObject, memUsageSetting);
+ }
+ else
+ {
+ sourceDoc = PDDocument.load((InputStream) sourceObject, memUsageSetting);
+ }
+ for (PDPage page : sourceDoc.getPages())
+ {
+ PDPage newPage = new PDPage(
+ (COSDictionary) cloner.cloneForNewDocument(page.getCOSObject()));
+ newPage.setCropBox(page.getCropBox());
+ newPage.setMediaBox(page.getMediaBox());
+ newPage.setRotation(page.getRotation());
+ PDResources resources = page.getResources();
+ if (resources != null)
+ {
+ // this is smart enough to just create references for resources that are used on multiple pages
+ newPage.setResources(new PDResources(
+ (COSDictionary) cloner.cloneForNewDocument(resources)));
+ }
+ else
{
- PDPage newPage = new PDPage((COSDictionary) cloner.cloneForNewDocument(page.getCOSObject()));
- newPage.setCropBox(page.getCropBox());
- newPage.setMediaBox(page.getMediaBox());
- newPage.setRotation(page.getRotation());
- PDResources resources = page.getResources();
- if (resources != null)
- {
- // this is smart enough to just create references for resources that are used on multiple pages
- newPage.setResources(new PDResources((COSDictionary) cloner.cloneForNewDocument(resources)));
- }
- else
- {
- newPage.setResources(new PDResources());
- }
- destination.addPage(newPage);
+ newPage.setResources(new PDResources());
}
- sourceDoc.close();
+ destination.addPage(newPage);
}
- sourceInputStream.close();
+ sourceDoc.close();
}
if (destinationStream == null)
@@ -393,9 +398,18 @@ public class PDFMergerUtility
MemoryUsageSetting.setupMainMemoryOnly();
try (PDDocument destination = new PDDocument(partitionedMemSetting))
{
- for (InputStream sourceInputStream : sources)
+ for (Object sourceObject : sources)
{
- PDDocument sourceDoc = PDDocument.load(sourceInputStream, partitionedMemSetting);
+ PDDocument sourceDoc = null;
+ if (sourceObject instanceof File)
+ {
+ sourceDoc = PDDocument.load((File) sourceObject, partitionedMemSetting);
+ }
+ else
+ {
+ sourceDoc = PDDocument.load((InputStream) sourceObject,
+ partitionedMemSetting);
+ }
tobeclosed.add(sourceDoc);
appendDocument(destination, sourceDoc);
}
@@ -425,11 +439,6 @@ public class PDFMergerUtility
{
IOUtils.closeAndLogException(doc, LOG, "PDDocument", null);
}
-
- for (FileInputStream stream : fileInputStreams)
- {
- IOUtils.closeAndLogException(stream, LOG, "FileInputStream", null);
- }
}
}
}