/* * Created on 27 giu 2016 * Copyright 2015 by Andrea Vacondio (andrea.vacondio@gmail.com). * This file is part of Sejda. * * Sejda 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. * * Sejda 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 Sejda. If not, see <http://www.gnu.org/licenses/>. */ package org.sejda.impl.sambox.component.split; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Arrays; import org.junit.Test; import org.sejda.io.SeekableSources; import org.sejda.sambox.cos.COSName; import org.sejda.sambox.input.PDFParser; import org.sejda.sambox.pdmodel.PDDocument; import org.sejda.sambox.pdmodel.PDPage; import org.sejda.sambox.pdmodel.interactive.action.PDActionGoTo; import org.sejda.sambox.pdmodel.interactive.annotation.PDAnnotation; import org.sejda.sambox.pdmodel.interactive.annotation.PDAnnotationLink; import org.sejda.sambox.pdmodel.interactive.documentnavigation.destination.PDDestination; import org.sejda.sambox.pdmodel.interactive.pagenavigation.PDThreadBead; /** * @author Andrea Vacondio * */ public class PageCopierTest { @Test public void existingPage() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/shared_resource_dic_w_images.pdf")))) { PDPage page = document.getPage(0); PDPage copy = new PageCopier(false).copyOf(page); PDPage optimizedCopy = new PageCopier(true).copyOf(page); assertEquals(page.getMediaBox(), copy.getMediaBox()); assertEquals(page.getCropBox(), copy.getCropBox()); assertEquals(page.getRotation(), copy.getRotation()); assertEquals(page.getResources(), copy.getResources()); assertNotEquals(page.getResources(), optimizedCopy.getResources()); } } @Test public void discardBeads() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/shared_resource_dic_w_images.pdf")))) { PDPage page = document.getPage(0); page.setThreadBeads(Arrays.asList(new PDThreadBead())); assertFalse(page.getThreadBeads().isEmpty()); PDPage copy = new PageCopier(false).copyOf(page); assertTrue(copy.getThreadBeads().isEmpty()); } } @Test public void removesParentAndPopup() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/popup_annotation.pdf")))) { PDPage page = document.getPage(0); PDPage copy = new PageCopier(false).copyOf(page); copy.getAnnotations().stream().map(PDAnnotation::getCOSObject).forEach(d -> { assertFalse(d.containsKey(COSName.PARENT)); assertFalse(d.containsKey(COSName.getPDFName("Popup"))); }); } } @Test public void pageWithAnnots() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/forms/simple_form_with_full_dic.pdf")))) { PDPage page = document.getPage(0); PDPage copy = new PageCopier(false).copyOf(page); assertEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), page.getCOSObject().getDictionaryObject(COSName.ANNOTS)); assertNotEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), copy.getCOSObject().getDictionaryObject(COSName.ANNOTS)); copy.getAnnotations().stream().map(PDAnnotation::getCOSObject).forEach(d -> { assertFalse(d.containsKey(COSName.P)); assertFalse(d.containsKey(COSName.DEST)); }); } } @Test public void removeActionWithDestination() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/forms/simple_form_with_full_dic.pdf")))) { PDPage page = document.getPage(0); PDAnnotationLink link = new PDAnnotationLink(); PDActionGoTo action = new PDActionGoTo(); action.setDestination(PDDestination.create(COSName.C)); link.setAction(action); page.setAnnotations(Arrays.asList(link)); PDPage copy = new PageCopier(false).copyOf(page); assertEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), page.getCOSObject().getDictionaryObject(COSName.ANNOTS)); assertNotEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), copy.getCOSObject().getDictionaryObject(COSName.ANNOTS)); copy.getAnnotations().stream().map(PDAnnotation::getCOSObject).forEach(d -> { assertFalse(d.containsKey(COSName.P)); assertFalse(d.containsKey(COSName.DEST)); assertFalse(d.containsKey(COSName.A)); }); } } @Test public void doesntRemoveActionWithoutDestination() throws IOException { try (PDDocument document = PDFParser.parse(SeekableSources.inMemorySeekableSourceFrom( getClass().getClassLoader().getResourceAsStream("pdf/forms/simple_form_with_full_dic.pdf")))) { PDPage page = document.getPage(0); PDAnnotationLink link = new PDAnnotationLink(); PDActionGoTo action = new PDActionGoTo(); link.setAction(action); page.setAnnotations(Arrays.asList(link)); PDPage copy = new PageCopier(false).copyOf(page); assertEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), page.getCOSObject().getDictionaryObject(COSName.ANNOTS)); assertNotEquals(page.getCOSObject().getDictionaryObject(COSName.ANNOTS), copy.getCOSObject().getDictionaryObject(COSName.ANNOTS)); copy.getAnnotations().stream().map(PDAnnotation::getCOSObject).forEach(d -> { assertFalse(d.containsKey(COSName.P)); assertFalse(d.containsKey(COSName.DEST)); assertTrue(d.containsKey(COSName.A)); }); } } }