From 02bf7189e1bc3aa7a16254561da9287a0729a856 Mon Sep 17 00:00:00 2001 From: Karl Jonathan Ward Date: Wed, 18 Aug 2010 13:20:35 +0100 Subject: [PATCH] Main.java: Specify a password to decrypt PDFs with -p. --- .classpath | 1 + build.xml | 1 + lib/args4j-2.0.11.jar | Bin 0 -> 44098 bytes src/org/crossref/pdf2xml/Main.java | 78 +++++++++++++++----- src/org/crossref/pdf2xml/TextExtractor.java | 6 +- src/org/crossref/pdf2xml/data/Text.java | 6 +- 6 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 lib/args4j-2.0.11.jar diff --git a/.classpath b/.classpath index adb06fb..998c8be 100644 --- a/.classpath +++ b/.classpath @@ -5,5 +5,6 @@ + diff --git a/build.xml b/build.xml index e17d600..94fb2d7 100644 --- a/build.xml +++ b/build.xml @@ -23,6 +23,7 @@ + diff --git a/lib/args4j-2.0.11.jar b/lib/args4j-2.0.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..76a6d4c9262840f744d5024371bfeb1f6dd8f424 GIT binary patch literal 44098 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 filenames = new ArrayList(); - private static TextExtractor parsePdf(File f) throws IOException { + private TextExtractor parsePdf(File f) throws IOException { PDDocument doc = PDDocument.load(f); + + if(doc.isEncrypted()) { + // Some documents are encrypted with the empty password. Try + // to decrypt with this password, or the one passed in on the + // command line (if any), and fail if we can't. + try { + doc.decrypt(password); // Defaults to the empty string. + } catch (CryptographyException e) { + throw new WrappedIOException("Can't decrypt document: ", e); + } catch (InvalidPasswordException e) { + throw new WrappedIOException("Document is encrypted: ", e); + } + } + PDDocumentCatalog docCat = doc.getDocumentCatalog(); PDPageNode root = docCat.getPages(); @@ -41,19 +64,36 @@ private static TextExtractor parsePdf(File f) throws IOException { return te; } - public static void main(String[] filenames) { - for (String filename : filenames) { - File inputFile = new File(filename); - TextExtractor te = null; - - try { - te = parsePdf(inputFile); - System.out.println(te.toXml()); - } catch (IOException e) { - System.err.println("Couldn't read file '" + inputFile +"'."); - System.exit(1); - } - } + private void doMain() { + for (String filename : filenames) { + File inputFile = new File(filename); + TextExtractor te = null; + + try { + te = parsePdf(inputFile); + System.out.println(te.toXml()); + } catch (IOException e) { + System.err.println("Couldn't read file '" + inputFile +"'."); + System.exit(1); + } + } + } + + public static void main(String[] args) { + Main m = new Main(); + CmdLineParser parser = new CmdLineParser(m); + + if (args.length == 0) { + System.err.println("Usage: pdf2xml [options] "); + parser.printUsage(System.err); + } else { + try { + parser.parseArgument(args); + m.doMain(); + } catch (CmdLineException e) { + parser.printUsage(System.err); + } + } } } diff --git a/src/org/crossref/pdf2xml/TextExtractor.java b/src/org/crossref/pdf2xml/TextExtractor.java index c5e7164..bb028ee 100644 --- a/src/org/crossref/pdf2xml/TextExtractor.java +++ b/src/org/crossref/pdf2xml/TextExtractor.java @@ -36,7 +36,7 @@ /** * Extract text from a PDF document with position and style information. - * This class attempts to coalease runs of text on the page; that is, + * This class attempts to coalesce runs of text on the page; that is, * * @author Karl Ward */ @@ -67,9 +67,7 @@ public void processStream(PDPage aPage, PDResources resources, protected void processTextPosition(TextPosition tp) { PDGraphicsState gs = getGraphicsState(); - - Text newT = Text.newFor(tp, gs); - currentPage.addText(newT); + currentPage.addText(Text.newFor(tp, gs)); } private void coalesceRows(Page page) { diff --git a/src/org/crossref/pdf2xml/data/Text.java b/src/org/crossref/pdf2xml/data/Text.java index 57edd68..6aaa759 100644 --- a/src/org/crossref/pdf2xml/data/Text.java +++ b/src/org/crossref/pdf2xml/data/Text.java @@ -2,6 +2,8 @@ import java.io.IOException; +import org.apache.fontbox.cmap.CMap; +import org.apache.pdfbox.encoding.Encoding; import org.apache.pdfbox.pdmodel.font.PDCIDFont; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDSimpleFont; @@ -10,7 +12,9 @@ import org.apache.pdfbox.util.TextPosition; public class Text implements Comparable { - private float x, baseline, width, height, pointSize, descent, ascent, fontSize; + + private float x, baseline, width, height, pointSize, + descent, ascent, fontSize; private String run; private PDFont font; private PDColorState strokeColor;