documentHandler.savePDDocument(tmpFile); String outName = nameGenerator(parameters.getOutputPrefix()) .generate(nameRequest().originalName(input.source.getName()).fileNumber(currentStep)); outputWriter.addOutput(file(tmpFile).name(outName)); } finally {
/** * @param request * parameters used to generate the name. It cannot be null. * @return generates a new name from the given request */ public String generate(NameGenerationRequest request) { if (request == null) { throw new IllegalArgumentException("Unable to generate a name for a null request."); } String result = toSafeFilename(prefixTypesChain.process(prefix, preProcessRequest(request))); String osName = System.getProperty("os.name").toLowerCase(); if(osName.contains("win") || osName.contains("mac")) { // char based max length result = shortenFilenameCharLength(result, 255); } else { // bytes based max length result = shortenFilenameBytesLength(result, 255, StandardCharsets.UTF_8); } return result; }
/** * @param prefix * @return a new instance of a NameGenerator */ public static NameGenerator nameGenerator(String prefix) { return new NameGenerator(prefix); }
private String shortenFilenameBytesLength(String input) { return NameGenerator.shortenFilenameBytesLength(input, 255, StandardCharsets.UTF_8); }
@Test public void shortenFilenameCharLength() { String shorter = NameGenerator.shortenFilenameCharLength(largeFilename, 255); assertThat(shorter, endsWith("aวaวa.pdf")); assertThat(shorter, startsWith("aวaว")); assertThat(shorter.length(), is(255)); } }
@Test(expected = IllegalArgumentException.class) public void testNullRequest() { String prefix = "BLA_"; nameGenerator(prefix).generate(null); }
/** * @param request * parameters used to generate the name. It cannot be null. * @return generates a new name from the given request */ public String generate(NameGenerationRequest request) { if (request == null) { throw new IllegalArgumentException("Unable to generate a name for a null request."); } String result = toSafeFilename(prefixTypesChain.process(prefix, preProcessRequest(request))); String osName = System.getProperty("os.name").toLowerCase(); if(osName.contains("win") || osName.contains("mac")) { // char based max length result = shortenFilenameCharLength(result, 255); } else { // bytes based max length result = shortenFilenameBytesLength(result, 255, StandardCharsets.UTF_8); } return result; }
/** * @param prefix * @return a new instance of a NameGenerator */ public static NameGenerator nameGenerator(String prefix) { return new NameGenerator(prefix); }
@Test public void testInvalidCharacters() { String generatedFilename = nameGenerator("Invalid_\\").generate(nameRequest("pdf")); assertEquals(generatedFilename, "Invalid_.pdf"); }
@Test public void testMaxFilenameSize() { String generatedFilename = nameGenerator("BLA_[TEXT]").generate(nameRequest("pdf").text(repeat('a', 300))); assertEquals(255, generatedFilename.length()); assertThat(generatedFilename, endsWith("aaa.pdf")); }
@Test public void testMaxFilenameSizeUnicode() { String generatedFilename = nameGenerator("compressed_").generate(nameRequest("pdf").originalName(repeat("aว", 300))); assertThat(generatedFilename.length(), is(lessThan(256))); assertThat(generatedFilename, endsWith(".pdf")); assertThat(generatedFilename, startsWith("compressed_aวaว")); }
@Test public void testSimplePrefix() { String prefix = "BLA_"; String originalName = "Original"; String expected = "BLA_Original.pdf"; assertEquals(expected, nameGenerator(prefix).generate(nameRequest().originalName(originalName))); }
@Test public void testComplexPrefixNoSubstitution() { String prefix = "BLA_[CURRENTPAGE###]_[BASENAME]"; String originalName = "Original"; String expected = "BLA_[CURRENTPAGE###]_Original.pdf"; assertEquals(expected, nameGenerator(prefix).generate(nameRequest().originalName(originalName))); }
@Test public void testMaxFilenameSizeSanitized() { String generatedFilename = nameGenerator("B|LA_[TEXT]").generate(nameRequest("pdf").text(repeat('a', 300))); assertEquals(255, generatedFilename.length()); assertThat(generatedFilename, endsWith("aaa.pdf")); assertThat(generatedFilename, startsWith("BLA_aaa")); }
@Test public void testFullComplexPrefix() { String prefix = "BLA_[CURRENTPAGE###]_[BASENAME]"; String originalName = "Original"; String expected = "BLA_002_Original.pdf"; assertEquals(expected, nameGenerator(prefix).generate(nameRequest().page(Integer.valueOf("2")).originalName(originalName))); }
@Test public void testSimplePrefixWithPage() { String prefix = "BLA_"; String originalName = "Original"; String expected = "1_BLA_Original.pdf"; assertEquals(expected, nameGenerator(prefix).generate(nameRequest().page(Integer.valueOf(1)).originalName(originalName))); }
@Test public void testDollarSignInFilename() { String generatedFilename = nameGenerator("[CURRENTPAGE]-[BASENAME]") .generate(nameRequest("pdf").page(99).originalName("My file 6-04-2015 $1234-56")); assertEquals(generatedFilename, "99-My file 6-04-2015 $1234-56.pdf"); }
private PdfCopier open(int page, int outputDocumentsCounter) throws TaskException { File tmpFile = createTemporaryPdfBuffer(); LOG.debug("Created output temporary buffer {}", tmpFile); PdfCopier pdfCopier = openCopier(reader, tmpFile, parameters.getVersion()); pdfCopier.setCompression(parameters.isCompress()); String outName = nameGenerator(parameters.getOutputPrefix()).generate( enrichNameGenerationRequest(nameRequest().page(page).originalName(parameters.getSource().getName()) .fileNumber(outputDocumentsCounter))); outputWriter.addOutput(file(tmpFile).name(outName)); outlineSubsetProvider.startPage(page); return pdfCopier; }
public void execute(ViewerPreferencesParameters parameters) throws TaskException { int currentStep = 0; for (PdfSource<?> source : parameters.getSourceList()) { currentStep++; LOG.debug("Opening {} ", source); reader = source.open(sourceOpener); File tmpFile = createTemporaryPdfBuffer(); LOG.debug("Created output temporary buffer {} ", tmpFile); stamperHandler = new PdfStamperHandler(reader, tmpFile, parameters.getVersion()); stamperHandler.setCompressionOnStamper(parameters.isCompress()); stamperHandler.setCreatorOnStamper(reader); // set mode and layout stamperHandler.setViewerPreferencesOnStamper(preferences); // set other preferences for (Entry<PdfName, PdfObject> entry : configuredPreferences.entrySet()) { stamperHandler.addViewerPreferenceOnStamper(entry.getKey(), entry.getValue()); } nullSafeClosePdfReader(reader); nullSafeCloseQuietly(stamperHandler); String outName = nameGenerator(parameters.getOutputPrefix()).generate( nameRequest().originalName(source.getName()).fileNumber(currentStep)); outputWriter.addOutput(file(tmpFile).name(outName)); notifyEvent(getNotifiableTaskMetadata()).stepsCompleted(currentStep).outOf(totalSteps); } parameters.getOutput().accept(outputWriter); LOG.debug("Viewer preferences set on input documents and written to {}", parameters.getOutput()); }
@Override public void execute(EncryptParameters parameters) throws TaskException { int currentStep = 0; for (PdfSource<?> source : parameters.getSourceList()) { executionContext().assertTaskNotCancelled(); currentStep++; LOG.debug("Opening {}", source); try { documentHandler = source.open(documentLoader); documentHandler.setCreatorOnPDDocument(); File tmpFile = createTemporaryBuffer(parameters.getOutput()); LOG.debug("Created output on temporary buffer {}", tmpFile); documentHandler.setVersionOnPDDocument(parameters.getVersion()); documentHandler.setCompress(parameters.isCompress()); documentHandler.savePDDocument(tmpFile, security); String outName = nameGenerator(parameters.getOutputPrefix()) .generate(nameRequest().originalName(source.getName()).fileNumber(currentStep)); outputWriter.addOutput(file(tmpFile).name(outName)); } finally { nullSafeCloseQuietly(documentHandler); } notifyEvent(executionContext().notifiableTaskMetadata()).stepsCompleted(currentStep).outOf(totalSteps); } parameters.getOutput().accept(outputWriter); LOG.debug("Input documents encrypted using {}, standard security handler revision {} and written to {}", security.encryption, security.encryption.revision.revisionNumber, parameters.getOutput()); LOG.debug("Permissions: {}", parameters.getPermissions().stream().map(PdfAccessPermission::getFriendlyName) .collect(Collectors.joining(", "))); }