You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2018/08/23 17:53:44 UTC
svn commit: r1838745 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
Author: tilman
Date: Thu Aug 23 17:53:44 2018
New Revision: 1838745
URL: http://svn.apache.org/viewvc?rev=1838745&view=rev
Log:
PDFBOX-4298: touch only pages that will be overlayed; refactor; improve javadoc
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java?rev=1838745&r1=1838744&r2=1838745&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Overlay.java Thu Aug 23 17:53:44 2018
@@ -94,8 +94,9 @@ public class Overlay
/**
* This will add overlays to a documents.
*
- * @param specificPageOverlayFile map of overlay files for specific pages
- *
+ * @param specificPageOverlayFile map of overlay files for specific pages.
+ * The page numbers are 1-based.
+ *
* @return the resulting pdf, which has to be saved and closed be the caller
*
* @throws IOException if something went wrong
@@ -330,33 +331,39 @@ public class Overlay
private void processPages(PDDocument document) throws IOException
{
- int pageCount = 0;
+ int pageCounter = 0;
for (PDPage page : document.getPages())
{
+ pageCounter++;
COSDictionary pageDictionary = page.getCOSObject();
- COSBase contents = pageDictionary.getDictionaryObject(COSName.CONTENTS);
- COSArray contentArray = new COSArray();
+ COSBase originalContent = pageDictionary.getDictionaryObject(COSName.CONTENTS);
+ COSArray newContentArray = new COSArray();
+ LayoutPage layoutPage = getLayoutPage(pageCounter, document.getNumberOfPages());
+ if (layoutPage == null)
+ {
+ continue;
+ }
switch (position)
{
- case FOREGROUND:
- // save state
- contentArray.add(createStream("q\n"));
- addOriginalContent(contents, contentArray);
- // restore state
- contentArray.add(createStream("Q\n"));
- // overlay content
- overlayPage(contentArray, page, pageCount + 1, document.getNumberOfPages());
- break;
- case BACKGROUND:
- // overlay content
- overlayPage(contentArray, page, pageCount + 1, document.getNumberOfPages());
- addOriginalContent(contents, contentArray);
- break;
- default:
- throw new IOException("Unknown type of position:" + position);
+ case FOREGROUND:
+ // save state
+ newContentArray.add(createStream("q\n"));
+ addOriginalContent(originalContent, newContentArray);
+ // restore state
+ newContentArray.add(createStream("Q\n"));
+ // overlay content last
+ overlayPage(page, layoutPage, newContentArray);
+ break;
+ case BACKGROUND:
+ // overlay content first
+ overlayPage(page, layoutPage, newContentArray);
+
+ addOriginalContent(originalContent, newContentArray);
+ break;
+ default:
+ throw new IOException("Unknown type of position:" + position);
}
- pageDictionary.setItem(COSName.CONTENTS, contentArray);
- pageCount++;
+ pageDictionary.setItem(COSName.CONTENTS, newContentArray);
}
}
@@ -377,9 +384,22 @@ public class Overlay
}
}
- private void overlayPage(COSArray array, PDPage page, int pageNumber, int numberOfPages)
+ private void overlayPage(PDPage page, LayoutPage layoutPage, COSArray array)
throws IOException
{
+ PDResources resources = page.getResources();
+ if (resources == null)
+ {
+ resources = new PDResources();
+ page.setResources(resources);
+ }
+ COSName xObjectId = createOverlayXObject(page, layoutPage,
+ layoutPage.overlayContentStream);
+ array.add(createOverlayStream(page, layoutPage, xObjectId));
+ }
+
+ private LayoutPage getLayoutPage(int pageNumber, int numberOfPages)
+ {
LayoutPage layoutPage = null;
if (!useAllOverlayPages && specificPageOverlayPage.containsKey(pageNumber))
{
@@ -410,18 +430,7 @@ public class Overlay
int usePageNum = (pageNumber -1 ) % numberOfOverlayPages;
layoutPage = specificPageOverlayPage.get(usePageNum);
}
- if (layoutPage != null)
- {
- PDResources resources = page.getResources();
- if (resources == null)
- {
- resources = new PDResources();
- page.setResources(resources);
- }
- COSName xObjectId = createOverlayXObject(page, layoutPage,
- layoutPage.overlayContentStream);
- array.add(createOverlayStream(page, layoutPage, xObjectId));
- }
+ return layoutPage;
}
private COSName createOverlayXObject(PDPage page, LayoutPage layoutPage, COSStream contentStream)