/*
* Copyright 2012 by Eduard Weissmann (edi.weissmann@gmail.com).
*
* This file is part of the Sejda source code
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sejda.core.service;
import static org.sejda.model.pdf.TextStampPattern.dateNow;
import java.io.IOException;
import org.junit.Ignore;
import org.junit.Test;
import org.sejda.model.HorizontalAlign;
import org.sejda.model.VerticalAlign;
import org.sejda.model.output.ExistingOutputPolicy;
import org.sejda.model.parameter.SetHeaderFooterParameters;
import org.sejda.model.pdf.PdfVersion;
import org.sejda.model.pdf.StandardType1Font;
import org.sejda.model.pdf.numbering.BatesSequence;
import org.sejda.model.pdf.page.PageRange;
import org.sejda.model.pdf.page.PredefinedSetOfPages;
import org.sejda.sambox.pdmodel.PDPage;
/**
* @author Eduard Weissmann
*
*/
@Ignore
public abstract class SetHeaderFooterTaskTest extends BaseTaskTest<SetHeaderFooterParameters> {
private SetHeaderFooterParameters parameters;
private SetHeaderFooterParameters basicNoSources() throws IOException {
SetHeaderFooterParameters parameters = new SetHeaderFooterParameters();
parameters.setBatesSequence(new BatesSequence());
parameters.addPageRange(new PageRange(1));
parameters.setPattern("[DATE] [PAGE_OF_TOTAL] - Exhibit [FILE_NUMBER] - Case ACME Inc - [BATES_NUMBER]");
parameters.setCompress(true);
parameters.setVersion(PdfVersion.VERSION_1_6);
parameters.setFont(StandardType1Font.CURIER_BOLD_OBLIQUE);
parameters.setExistingOutputPolicy(ExistingOutputPolicy.OVERWRITE);
parameters.setHorizontalAlign(HorizontalAlign.LEFT);
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
parameters.setFontSize(7d);
parameters.setOutputPrefix("test_file[FILENUMBER]");
testContext.directoryOutputTo(parameters);
return parameters;
}
private SetHeaderFooterParameters basicWithSources() throws IOException {
SetHeaderFooterParameters parameters = basicNoSources();
parameters.addSource(customInput("pdf/test_file.pdf"));
parameters.addSource(customInput("pdf/test_file.pdf"));
return parameters;
}
@Test
public void testUnicodeCharacters() throws Exception {
parameters = basicWithSources();
parameters.setPattern("Does UTF-8 partially work? Mirëdita grüß Gott dobrý večer góðan dag Καλώς Ορίσατε");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0),
"Does UTF-8 partially work? Mirëdita grüß Gott dobrý večer góðan dag Καλώς Ορίσατε");
});
}
@Test
public void testThaiCharacters() throws Exception {
parameters = basicWithSources();
parameters.setPattern("นี่คือการทดสอบ");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "นี่คือการทดสอบ");
});
}
@Test
public void testLabelWithMixedFonts() throws Exception {
parameters = basicWithSources();
parameters.setPattern("Bam - นี่คือการทดสอบ - Some english text after");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "Bam - นี่คือการทดสอบ - Some english text after");
});
}
@Test
public void testUnsupportedUnicodeCharacters() throws Exception {
parameters = basicWithSources();
parameters.setPattern("Some unsupported unicode \uFE0F characters");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
testContext.expectTaskWillProduceWarnings();
execute(parameters);
testContext.assertTaskCompleted();
testContext.forEachPdfOutput(d -> {
assertFooterHasText(d.getPage(0),
"Some unsupported unicode characters");
});
testContext.assertTaskWarning("Unsupported characters (\\U+FE0F) were removed: 'Some unsupported ...'");
}
@Test
public void testPageRange() throws Exception {
parameters = basicWithSources();
parameters.getPageRanges().clear();
parameters.addPageRange(new PageRange(2));
parameters.setPattern("Test footer");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "");
assertFooterHasText(d.getPage(1), "Test footer");
assertFooterHasText(d.getPage(2), "Test footer");
});
}
@Test
public void testEvenPages() throws Exception {
parameters = new SetHeaderFooterParameters();
parameters.setPredefinedSetOfPages(PredefinedSetOfPages.EVEN_PAGES);
parameters.addSource(customInput("pdf/test_file.pdf"));
parameters.setPattern("Page [PAGE_ARABIC]");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
parameters.setOutputPrefix("test_file[FILENUMBER]");
testContext.directoryOutputTo(parameters);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "");
assertFooterHasText(d.getPage(1), "Page 2");
assertFooterHasText(d.getPage(2), "");
assertFooterHasText(d.getPage(3), "Page 4");
});
}
@Test
public void testMultiplePageRanges() throws Exception {
parameters = new SetHeaderFooterParameters();
parameters.addSource(customInput("pdf/test_file.pdf"));
parameters.addPageRange(new PageRange(1, 2));
parameters.addPageRange(new PageRange(4, 5));
parameters.setPattern("Page [PAGE_ARABIC]");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
parameters.setOutputPrefix("test_file[FILENUMBER]");
testContext.directoryOutputTo(parameters);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "Page 1");
assertFooterHasText(d.getPage(1), "Page 2");
assertFooterHasText(d.getPage(2), "");
assertFooterHasText(d.getPage(3), "Page 4");
});
}
@Test
public void testWithScaling() throws Exception {
parameters = basicNoSources();
parameters.setAddMargins(true);
parameters.addSource(customInput("pdf/no_margins_test_file.pdf"));
parameters.setPattern("Test footer");
parameters.setFontSize(15);
parameters.setVerticalAlign(VerticalAlign.TOP);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertHeaderHasText(d.getPage(0), "Test footer");
});
}
@Test
public void testLogicalPage() throws Exception {
parameters = basicWithSources();
parameters.setPattern("Page [PAGE_ARABIC]");
parameters.setPageCountStartFrom(12);
parameters.getPageRanges().clear();
parameters.addPageRange(new PageRange(2));
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "");
assertFooterHasText(d.getPage(1), "Page 12");
assertFooterHasText(d.getPage(2), "Page 13");
assertFooterHasText(d.getPage(3), "Page 14");
});
}
@Test
public void testLogicalPageOddPagesOnly() throws Exception {
parameters = basicWithSources();
parameters.setPattern("Page [PAGE_ARABIC]");
parameters.setPageCountStartFrom(6);
parameters.setPredefinedSetOfPages(PredefinedSetOfPages.EVEN_PAGES);
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "");
assertFooterHasText(d.getPage(1), "Page 6");
assertFooterHasText(d.getPage(2), "");
assertFooterHasText(d.getPage(3), "Page 8");
});
}
@Test
public void testDocumentWithRotatedPagesHeader() throws Exception {
parameters = basicNoSources();
parameters.addSource(customInput("pdf/rotated_pages.pdf"));
parameters.setPattern("[PAGE_ARABIC]");
parameters.setVerticalAlign(VerticalAlign.TOP);
parameters.setHorizontalAlign(HorizontalAlign.CENTER);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertHeaderHasText(d.getPage(0), "1");
assertHeaderHasText(d.getPage(1), "2");
assertHeaderHasText(d.getPage(2), "3");
assertHeaderHasText(d.getPage(3), "4");
assertHeaderHasText(d.getPage(4), "5");
});
}
@Test
public void testDocumentWithRotatedPagesFooter() throws Exception {
parameters = basicNoSources();
parameters.addSource(customInput("pdf/rotated_pages.pdf"));
parameters.setPattern("[PAGE_ARABIC]");
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
parameters.setHorizontalAlign(HorizontalAlign.LEFT);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "1");
assertFooterHasText(d.getPage(1), "2");
assertFooterHasText(d.getPage(2), "3");
assertFooterHasText(d.getPage(3), "4");
assertFooterHasText(d.getPage(4), "5");
});
}
@Test
public void testBatesAndFileSequence() throws Exception {
parameters = basicWithSources();
parameters.setVerticalAlign(VerticalAlign.BOTTOM);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(1), dateNow() + " 2 of 4 - Exhibit 1 - Case ACME Inc - 000002");
assertFooterHasText(d.getPage(2), dateNow() + " 3 of 4 - Exhibit 1 - Case ACME Inc - 000003");
}).forPdfOutput("test_file2.pdf", d -> {
assertFooterHasText(d.getPage(0), dateNow() + " 1 of 4 - Exhibit 2 - Case ACME Inc - 000005");
});
}
@Test
public void testWriteHeader() throws Exception {
parameters = basicWithSources();
parameters.setVerticalAlign(VerticalAlign.TOP);
parameters.setPattern("Page [PAGE_ROMAN] [PAGE_ARABIC] [BASE_NAME]");
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertHeaderHasText(d.getPage(2), "Page III 3 test_file1");
});
}
@Test
public void testEncryptedFile() throws Exception {
parameters = basicNoSources();
parameters.addSource(encryptedInput());
execute(parameters);
testContext.assertTaskCompleted();
testContext.assertOutputSize(1);
}
@Test
public void testNoBatesSeq() throws Exception {
parameters = basicWithSources();
parameters.setBatesSequence(null);
execute(parameters);
testContext.assertTaskCompleted();
testContext.assertOutputSize(2);
}
@Test
public void testConfigurableBatesSeq() throws Exception {
parameters = basicWithSources();
parameters.setPattern("[BATES_NUMBER]");
parameters.setBatesSequence(new BatesSequence(1000, 5, 10));
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "0000001000");
assertFooterHasText(d.getPage(1), "0000001005");
});
}
@Test
public void testStrippingControlCharacters() throws Exception {
parameters = basicWithSources();
parameters.setPattern("\tWith \rControl \n\nChars\t\n\r");
parameters.setFont(StandardType1Font.HELVETICA);
execute(parameters);
testContext.assertTaskCompleted();
testContext.forPdfOutput("test_file1.pdf", d -> {
assertFooterHasText(d.getPage(0), "With Control Chars");
});
}
@Test
public void testFileCounterStartFrom() throws Exception {
SetHeaderFooterParameters parameters = basicNoSources();
parameters.addSource(customInput("pdf/test_file.pdf", "a.pdf"));
parameters.addSource(customInput("pdf/test_file.pdf", "b.pdf"));
parameters.setFileCountStartFrom(10);
parameters.setPattern("Foo");
parameters.setOutputPrefix("[FILENUMBER]-[BASENAME]");
execute(parameters);
testContext.assertTaskCompleted();
testContext.assertOutputContainsFilenames("10-a.pdf", "11-b.pdf");
}
protected abstract void assertFooterHasText(PDPage page, String expectedText);
protected abstract void assertHeaderHasText(PDPage page, String expectedText);
}