Author: msahyoun Date: Mon Dec 7 08:36:42 2020 New Revision: 1884177 URL: http://svn.apache.org/viewvc?rev=1884177&view=rev Log: PDFBOX-2602: use picocli for command line parsing
Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ImageToPDF.java Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ImageToPDF.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ImageToPDF.java?rev=1884177&r1=1884176&r2=1884177&view=diff ============================================================================== --- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ImageToPDF.java (original) +++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ImageToPDF.java Mon Dec 7 08:36:42 2020 @@ -16,118 +16,108 @@ */ package org.apache.pdfbox.tools; +import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.io.PrintStream; +import java.util.concurrent.Callable; + import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + /** - * Creates a PDF document from images. - * + * Create a PDF document from images. */ -public final class ImageToPDF +@Command(name = "ImageToPDF", description = "Create a PDF document from images.") +public final class ImageToPDF implements Callable<Integer> { private PDRectangle mediaBox = PDRectangle.LETTER; - private boolean landscape = false; + + // Expected for CLI app to write to System.out/Sytem.err + @SuppressWarnings("squid:S106") + private static final PrintStream SYSERR = System.err; + + @Option(names = "-autoOrientation", description = "set orientation depending of image proportion") private boolean autoOrientation = false; + + @Option(names = "-landscape", description = "set orientation to landscape") + private boolean landscape = false; + + @Option(names = "-pageSize", description = "the page size to use: Letter, Legal, A0, A1, A2, A3, A4, A5, A6 (default: ${DEFAULT-VALUE})") + private String pageSize = "Letter"; + + @Option(names = "-resize", description = "resize to page size") private boolean resize = false; - private ImageToPDF() - { - } + @Parameters(paramLabel = "image-file", arity="1", description = "the image files to convert.") + private File[] infiles; - public static void main(String[] args) throws IOException + @Parameters(paramLabel = "outputfile", index = "1", description = "the generated PDF file.") + private File outfile; + + @Option(names = {"-h", "--help"}, usageHelp = true, description = "display this help message") + boolean usageHelpRequested; + + public static void main(String[] args) { // suppress the Dock icon on OS X System.setProperty("apple.awt.UIElement", "true"); - ImageToPDF app = new ImageToPDF(); + int exitCode = new CommandLine(new ImageToPDF()).execute(args); + System.exit(exitCode); + } - if (args.length < 2) + public Integer call() + { + if (outfile.getName().endsWith(".pdf")) { - app.usage(); + SYSERR.println("Last argument must be the destination .pdf file"); + return 1; } - List<String> imageFilenames = new ArrayList<>(); - String pdfPath = args[args.length - 1]; - - if (!pdfPath.endsWith(".pdf")) - { - System.err.println("Last argument must be the destination .pdf file"); - System.exit(1); - } - for (int i = 0; i < args.length - 1; i++) - { - if (args[i].startsWith("-")) - { - switch (args[i]) - { - case "-resize": - // will be modified to something more flexible - app.resize = true; - break; - case "-landscape": - app.setLandscape(true); - break; - case "-autoOrientation": - app.setAutoOrientation(true); - break; - case "-pageSize": - i++; - PDRectangle rectangle = createRectangle(args[i]); - if (rectangle == null) - { - throw new IOException("Unknown argument: " + args[i]); - } - app.setMediaBox(rectangle); - break; - default: - throw new IOException("Unknown argument: " + args[i]); - } - } - else - { - imageFilenames.add(args[i]); - } - } + setMediaBox(createRectangle(pageSize)); try (PDDocument doc = new PDDocument()) { - app.createPDFFromImages(doc, imageFilenames); - doc.save(pdfPath); - } - } - - void createPDFFromImages(PDDocument doc, List<String> imageFilenames) throws IOException - { - for (String imageFileName : imageFilenames) - { - PDImageXObject pdImage = PDImageXObject.createFromFile(imageFileName, doc); - - PDRectangle actualMediaBox = mediaBox; - if ((autoOrientation && pdImage.getWidth() > pdImage.getHeight()) || landscape) + for (File imageFile : infiles) { - actualMediaBox = new PDRectangle(mediaBox.getHeight(), mediaBox.getWidth()); - } - PDPage page = new PDPage(actualMediaBox); - doc.addPage(page); + PDImageXObject pdImage = PDImageXObject.createFromFile(imageFile.getAbsolutePath(), doc); - try (PDPageContentStream contents = new PDPageContentStream(doc, page)) - { - if (resize) + PDRectangle actualMediaBox = mediaBox; + if ((autoOrientation && pdImage.getWidth() > pdImage.getHeight()) || landscape) { - contents.drawImage(pdImage, 0, 0, actualMediaBox.getWidth(), actualMediaBox.getHeight()); + actualMediaBox = new PDRectangle(mediaBox.getHeight(), mediaBox.getWidth()); } - else + PDPage page = new PDPage(actualMediaBox); + doc.addPage(page); + + try (PDPageContentStream contents = new PDPageContentStream(doc, page)) { - contents.drawImage(pdImage, 0, 0, pdImage.getWidth(), pdImage.getHeight()); + if (resize) + { + contents.drawImage(pdImage, 0, 0, actualMediaBox.getWidth(), actualMediaBox.getHeight()); + } + else + { + contents.drawImage(pdImage, 0, 0, pdImage.getWidth(), pdImage.getHeight()); + } } } + doc.save(outfile); + } + catch (IOException ioe) + { + SYSERR.println( "Error extracting test for document: " + ioe.getMessage()); + return 4; } + return 0; } private static PDRectangle createRectangle(String paperSize) @@ -170,7 +160,8 @@ public final class ImageToPDF } else { - return null; + // return default if wron size was specified + return PDRectangle.LETTER; } } @@ -187,7 +178,7 @@ public final class ImageToPDF /** * Sets page size of produced PDF. * - * @param mediaBox + * @param mediaBox the media box of the PDF document. */ public void setMediaBox(PDRectangle mediaBox) { @@ -207,7 +198,7 @@ public final class ImageToPDF /** * Sets paper orientation. * - * @param landscape + * @param landscape use landscape orientation. */ public void setLandscape(boolean landscape) { @@ -235,29 +226,4 @@ public final class ImageToPDF { this.autoOrientation = autoOrientation; } - - /** - * This will print out a message telling how to use this example. - */ - private void usage() - { - StringBuilder message = new StringBuilder(); - message.append("Usage: jar -jar pdfbox-app-x.y.z.jar ImageToPDF [options] <image-file>..<image-file> <output-file>\n"); - message.append("\nOptions:\n"); - message.append(" -resize : resize to page size\n"); - message.append(" -pageSize <pageSize> : Letter (default)\n"); - message.append(" Legal\n"); - message.append(" A0\n"); - message.append(" A1\n"); - message.append(" A2\n"); - message.append(" A3\n"); - message.append(" A4\n"); - message.append(" A5\n"); - message.append(" A6\n"); - message.append(" -landscape : sets orientation to landscape\n"); - message.append(" -autoOrientation : sets orientation depending of image proportion\n"); - - System.err.println(message.toString()); - System.exit(1); - } }