private void setUpParametersToOptimize() { parameters = new ExtractPagesParameters(PredefinedSetOfPages.ODD_PAGES); parameters.setExistingOutputPolicy(ExistingOutputPolicy.OVERWRITE); parameters.setCompress(true); parameters.setOptimizationPolicy(OptimizationPolicy.AUTO); parameters.setVersion(PdfVersion.VERSION_1_6); parameters.addSource(customInput("pdf/shared_resource_dic_w_fonts.pdf")); }
@Override public ExtractPagesParameters build() { ExtractPagesParameters params = new ExtractPagesParameters(); params.setCompress(isCompress()); params.setExistingOutputPolicy(existingOutput()); params.setVersion(getVersion()); params.setOutput(getOutput()); params.setOptimizationPolicy(getOptimizationPolicy()); params.discardOutline(isDiscardBookmarks()); params.addAllPageRanges(ranges); params.setOutputPrefix(getPrefix()); params.setInvertSelection(invertSelection); getInputs().forEach(params::addSource); return params; }
@Override public boolean isValid(ExtractPagesParameters value, ConstraintValidatorContext context) { if (value != null) { return value.getPredefinedSetOfPages() != PredefinedSetOfPages.NONE || !value.getPageSelection().isEmpty(); } return true; }
@Override public void execute(ExtractPagesParameters parameters) throws TaskException { int currentStep = 0; int totalSteps = parameters.getSourceList().size(); for(PdfSource<?> source : parameters.getSourceList()) { executionContext().assertTaskNotCancelled(); Set<Integer> pages = parameters.getPages(sourceDocumentHandler.getNumberOfPages()); if (pages == null || pages.isEmpty()) { throw new TaskExecutionException("No page has been selected for extraction."); extractor.setVersion(parameters.getVersion()); extractor.setCompress(parameters.isCompress()); File tmpFile = createTemporaryBuffer(parameters.getOutput()); LOG.debug("Created output temporary buffer {}", tmpFile); if (new OptimizationRuler(parameters.getOptimizationPolicy()) .apply(sourceDocumentHandler.getUnderlyingPDDocument())) { extractor.optimize(); extractor.save(tmpFile, parameters.discardOutline()); String outName = nameGenerator(parameters.getOutputPrefix()).generate( nameRequest().originalName(source.getName()).fileNumber(currentStep)); outputWriter.addOutput(file(tmpFile).name(outName)); parameters.getOutput().accept(outputWriter); LOG.debug("Pages extracted and written to {}", parameters.getOutput());
@Test public void extractPagesInvertedSelection() throws IOException { parameters = new ExtractPagesParameters(); parameters.setInvertSelection(true); parameters.addPageRange(new PageRange(7, 9)); parameters.addSource(customInput("pdf/test-pdf.pdf")); parameters.setExistingOutputPolicy(ExistingOutputPolicy.OVERWRITE); assertThat(parameters.getPages(11), is(new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 10, 11)))); testContext.directoryOutputTo(parameters); execute(parameters); testContext.assertTaskCompleted(); testContext.assertCreator().assertPages(8); }
public void execute(ExtractPagesParameters parameters) throws TaskException { File tmpFile = createTemporaryPdfBuffer(); LOG.debug("Created output temporary buffer {} ", tmpFile); LOG.debug("Opening input {} ", parameters.getSource()); reader = parameters.getSource().open(sourceOpener); Set<Integer> pages = parameters.getPages(reader.getNumberOfPages()); if (pages == null || pages.isEmpty()) { throw new TaskExecutionException("No page has been selected for extraction."); } copier = new DefaultPdfCopier(reader, tmpFile, parameters.getVersion()); copier.setCompression(parameters.isCompress()); LOG.trace("Created DefaultPdfCopier"); int currentStep = 0; for (Integer page : pages) { LOG.trace("Adding page {}", page); copier.addPage(reader, page); notifyEvent(getNotifiableTaskMetadata()).stepsCompleted(++currentStep).outOf(pages.size()); } copier.freeReader(reader); closeResources(); outputWriter.setOutput(file(tmpFile).name(parameters.getOutputName())); parameters.getOutput().accept(outputWriter); LOG.debug("Pages extracted and written to {}", parameters.getOutput()); }
@Test public void getPages() { ExtractPagesParameters victim = new ExtractPagesParameters(PredefinedSetOfPages.EVEN_PAGES); assertEquals(5, victim.getPages(10).size()); ExtractPagesParameters victim2 = new ExtractPagesParameters(); victim2.addPageRange(new PageRange(12)); assertEquals(4, victim2.getPages(15).size()); }
@Test public void testGetPageSelection() { ExtractPagesParameters victim = new ExtractPagesParameters(PredefinedSetOfPages.EVEN_PAGES); assertTrue(victim.getPageSelection().isEmpty()); ExtractPagesParameters victim2 = new ExtractPagesParameters(); victim2.addPageRange(new PageRange(12)); assertFalse(victim2.getPageSelection().isEmpty()); }
@Test public void predefinedPages_EVEN_PAGES() { ExtractPagesParameters parameters = defaultCommandLine().with("-m", "even").invokeSejdaConsole(); assertContainsAll(Arrays.asList(2, 4), parameters.getPages(5)); }
/** * Transforms {@link ExtractPagesTaskCliArguments} to {@link ExtractPagesParameters} * * @param taskCliArguments * @return populated task parameters */ @Override public ExtractPagesParameters toTaskParameters(ExtractPagesTaskCliArguments taskCliArguments) { final ExtractPagesParameters parameters; if (taskCliArguments.isPredefinedPages() && taskCliArguments.getPredefinedPages().getEnumValue() != PredefinedSetOfPages.NONE) { parameters = new ExtractPagesParameters(taskCliArguments.getPredefinedPages().getEnumValue()); } else if (taskCliArguments.isPageSelection()) { parameters = new ExtractPagesParameters(); parameters.addAllPageRanges(taskCliArguments.getPageSelection().getPageRangeSet()); } else { throw new ArgumentValidationException( "Please specify at least one option that defines pages to be extracted"); } populateAbstractParameters(parameters, taskCliArguments); populateSourceParameters(parameters, taskCliArguments); populateOutputTaskParameters(parameters, taskCliArguments); populateOutputPrefix(parameters, taskCliArguments); populateOptimizableOutputParameters(parameters, taskCliArguments); populateDiscardableOutlineParameters(parameters, taskCliArguments); return parameters; } }
@Test public void dontDiscardOutline() { ExtractPagesParameters parameters = defaultCommandLine().invokeSejdaConsole(); assertFalse(parameters.discardOutline()); } }
@Test public void testEquals() { ExtractPagesParameters eq1 = new ExtractPagesParameters(PredefinedSetOfPages.EVEN_PAGES); ExtractPagesParameters eq2 = new ExtractPagesParameters(PredefinedSetOfPages.EVEN_PAGES); ExtractPagesParameters eq3 = new ExtractPagesParameters(PredefinedSetOfPages.EVEN_PAGES); ExtractPagesParameters diff = new ExtractPagesParameters(); diff.addPageRange(new PageRange(12)); TestUtils.testEqualsAndHashCodes(eq1, eq2, eq3, diff); }
@Test public void testInvalidParameters() { ExtractPagesParameters victim = new ExtractPagesParameters(PredefinedSetOfPages.ODD_PAGES); InputStream stream = mock(InputStream.class); PdfSource<InputStream> input = PdfStreamSource.newInstanceNoPassword(stream, "name"); victim.addSource(input); TestUtils.assertInvalidParameters(victim); } }
/** * @param upperLimit * the number of pages of the document (upper limit). * @return the selected set of pages. Iteration ordering is predictable, it is the order in which elements were inserted into the {@link PageRange} set or the natural order in * case of {@link PredefinedSetOfPages}. * @see PagesSelection#getPages(int) */ @Override public Set<Integer> getPages(int upperLimit) { Set<Integer> pages = new NullSafeSet<Integer>(); if (predefinedSetOfPages != PredefinedSetOfPages.NONE) { pages = predefinedSetOfPages.getPages(upperLimit); } else { for (PageRange range : getPageSelection()) { pages.addAll(range.getPages(upperLimit)); } } if(!invertSelection) { return pages; } Set<Integer> invertedPages = new NullSafeSet<Integer>(); for(int i = 1; i <= upperLimit; i++) { if(!pages.contains(i)) { invertedPages.add(i); } } return invertedPages; }
@Test public void optimizedNo() { ExtractPagesParameters parameters = defaultCommandLine().with("-z", "no").invokeSejdaConsole(); assertEquals(OptimizationPolicy.NO, parameters.getOptimizationPolicy()); }
@Test public void testHasDefault() { when(params.getPredefinedSetOfPages()).thenReturn(PredefinedSetOfPages.EVEN_PAGES); assertTrue(victim.isValid(params, null)); }
@Override public void execute(ExtractPagesParameters parameters) throws TaskException { int currentStep = 0; int totalSteps = parameters.getSourceList().size(); for(PdfSource<?> source : parameters.getSourceList()) { executionContext().assertTaskNotCancelled(); Set<Integer> pages = parameters.getPages(sourceDocumentHandler.getNumberOfPages()); if (pages == null || pages.isEmpty()) { throw new TaskExecutionException("No page has been selected for extraction."); extractor.setVersion(parameters.getVersion()); extractor.setCompress(parameters.isCompress()); File tmpFile = createTemporaryBuffer(parameters.getOutput()); LOG.debug("Created output temporary buffer {}", tmpFile); if (new OptimizationRuler(parameters.getOptimizationPolicy()) .apply(sourceDocumentHandler.getUnderlyingPDDocument())) { extractor.optimize(); extractor.save(tmpFile, parameters.discardOutline()); String outName = nameGenerator(parameters.getOutputPrefix()).generate( nameRequest().originalName(source.getName()).fileNumber(currentStep)); outputWriter.addOutput(file(tmpFile).name(outName)); parameters.getOutput().accept(outputWriter); LOG.debug("Pages extracted and written to {}", parameters.getOutput());
@Test public void predefinedPages_ODD_PAGES() { ExtractPagesParameters parameters = defaultCommandLine().with("-m", "odd").invokeSejdaConsole(); assertContainsAll(Arrays.asList(1, 3, 5), parameters.getPages(5)); }
@Test public void discardOutline() { ExtractPagesParameters parameters = defaultCommandLine().withFlag("--discardOutline").invokeSejdaConsole(); assertTrue(parameters.discardOutline()); }
/** * @param upperLimit * the number of pages of the document (upper limit). * @return the selected set of pages. Iteration ordering is predictable, it is the order in which elements were inserted into the {@link PageRange} set or the natural order in * case of {@link PredefinedSetOfPages}. * @see PagesSelection#getPages(int) */ @Override public Set<Integer> getPages(int upperLimit) { Set<Integer> pages = new NullSafeSet<Integer>(); if (predefinedSetOfPages != PredefinedSetOfPages.NONE) { pages = predefinedSetOfPages.getPages(upperLimit); } else { for (PageRange range : getPageSelection()) { pages.addAll(range.getPages(upperLimit)); } } if(!invertSelection) { return pages; } Set<Integer> invertedPages = new NullSafeSet<Integer>(); for(int i = 1; i <= upperLimit; i++) { if(!pages.contains(i)) { invertedPages.add(i); } } return invertedPages; }