From 4ddd90a6727ed1d2b1ee2d79faf313a876de9be4 Mon Sep 17 00:00:00 2001 From: Johannes Manner Date: Fri, 23 Feb 2018 17:16:09 +0100 Subject: [PATCH] Refactor dublin core utility (#3756) * Refactored dublin core utility The tool is now implemented as a console application with a read-evaluate-print cycle. * CLI -xmp integration Integrated the xmp functionality in the CLI infrastructure * CLI - shutdown after using console application System.exit() because Platform.exit() does not work in this case. * Update changelog.md --- CHANGELOG.md | 2 + .../org/jabref/cli/ArgumentProcessor.java | 5 + src/main/java/org/jabref/cli/JabRefCLI.java | 9 + src/main/java/org/jabref/cli/XMPUtilMain.java | 176 ------------------ src/main/java/org/jabref/cli/XmpUtilMain.java | 129 +++++++++++++ 5 files changed, 145 insertions(+), 176 deletions(-) delete mode 100644 src/main/java/org/jabref/cli/XMPUtilMain.java create mode 100644 src/main/java/org/jabref/cli/XmpUtilMain.java diff --git a/CHANGELOG.md b/CHANGELOG.md index fd1931b39e3..d4c42cba149 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ The new default removes the linked file from the entry instead of deleting the f - The magnifier icon at the search shows the [search mode](https://help.jabref.org/en/Search#search-modes) again. [#3535](https://github.com/JabRef/jabref/issues/3535) - We added a new cleanup operation that replaces ligatures with their expanded form. [#3613](https://github.com/JabRef/jabref/issues/3613) - Pressing ESC while searching will clear the search field and select the first entry, if available, in the table. [koppor#293](https://github.com/koppor/jabref/issues/293) +- We changed the metadata reading and writing. DublinCore is now the only metadata format, JabRef supports. (https://github.com/JabRef/jabref/pull/3710) +- We added another CLI functionality for reading and writing metadata to pdfs. (see https://github.com/JabRef/jabref/pull/3756 and see http://help.jabref.org/en/CommandLine) ### Fixed - We fixed several performance problems with the management of journal abbreviations [#3323](https://github.com/JabRef/jabref/issues/3323) diff --git a/src/main/java/org/jabref/cli/ArgumentProcessor.java b/src/main/java/org/jabref/cli/ArgumentProcessor.java index b5579040cbe..cd4e96ce523 100644 --- a/src/main/java/org/jabref/cli/ArgumentProcessor.java +++ b/src/main/java/org/jabref/cli/ArgumentProcessor.java @@ -223,6 +223,11 @@ private List processArguments() { doAuxImport(loaded); } + if (cli.isXmpFacilities()) { + XmpUtilMain.executeXmpConsoleApplicaton(); + System.exit(0); + } + return loaded; } diff --git a/src/main/java/org/jabref/cli/JabRefCLI.java b/src/main/java/org/jabref/cli/JabRefCLI.java index f427c8e0dbb..e6585516889 100644 --- a/src/main/java/org/jabref/cli/JabRefCLI.java +++ b/src/main/java/org/jabref/cli/JabRefCLI.java @@ -140,6 +140,10 @@ public String getExportMatches() { return cl.getOptionValue("exportMatches"); } + public boolean isXmpFacilities() { + return cl.hasOption("readAndWriteXmpMetadata"); + } + public boolean isGenerateBibtexKeys() { return cl.hasOption("generateBibtexKeys"); } public boolean isAutomaticallySetFileLinks() { return cl.hasOption("automaticallySetFileLinks"); } @@ -232,6 +236,11 @@ private Options getOptions() { desc(Localization.lang("Automatically set file links")). build()); + options.addOption(Option.builder("xmp"). + longOpt("readAndWriteXmpMetadata"). + desc("Read and write xmp metadata from/to pdf files"). + build()); + return options; } diff --git a/src/main/java/org/jabref/cli/XMPUtilMain.java b/src/main/java/org/jabref/cli/XMPUtilMain.java deleted file mode 100644 index 430c49541bd..00000000000 --- a/src/main/java/org/jabref/cli/XMPUtilMain.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.jabref.cli; - -import java.io.FileReader; -import java.io.IOException; -import java.io.StringWriter; -import java.nio.file.Paths; -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -import javax.xml.transform.TransformerException; - -import org.jabref.Globals; -import org.jabref.logic.bibtex.BibEntryWriter; -import org.jabref.logic.bibtex.LatexFieldFormatter; -import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.fileformat.BibtexParser; -import org.jabref.logic.xmp.XmpPreferences; -import org.jabref.logic.xmp.XmpUtilReader; -import org.jabref.logic.xmp.XmpUtilWriter; -import org.jabref.model.database.BibDatabaseMode; -import org.jabref.model.entry.BibEntry; -import org.jabref.preferences.JabRefPreferences; - -import org.apache.xmpbox.XMPMetadata; -import org.apache.xmpbox.xml.XmpSerializer; - -public class XMPUtilMain { - - private XMPUtilMain() { - } - - /** - * Command-line tool for working with XMP-data. - * - * Read or write XMP-metadata from or to pdf file. - * - * Usage: - *
- *
Read from PDF and print as bibtex:
- *
xmpUtil PDF
- *
Read from PDF and print raw XMP:
- *
xmpUtil -x PDF
- *
Write the entry in BIB given by KEY to the PDF:
- *
xmpUtil KEY BIB PDF
- *
Write all entries in BIB to the PDF:
- *
xmpUtil BIB PDF
- *
- * - * @param args - * Command line strings passed to utility. - * @throws IOException - * If any of the given files could not be read or written. - * @throws TransformerException - * If the given BibEntry is malformed. - */ - public static void main(String[] args) throws IOException, TransformerException { - - // Don't forget to initialize the preferences - if (Globals.prefs == null) { - Globals.prefs = JabRefPreferences.getInstance(); - } - - XmpPreferences xmpPreferences = Globals.prefs.getXMPPreferences(); - ImportFormatPreferences importFormatPreferences = Globals.prefs.getImportFormatPreferences(); - - int argsLength = args.length; - if (argsLength == 0) { - usage(); - } else if (argsLength == 1) { - if (args[0].endsWith(".pdf")) { - // Read from pdf and write as BibTex - List l = XmpUtilReader.readXmp(args[0], xmpPreferences); - - BibEntryWriter bibtexEntryWriter = new BibEntryWriter( - new LatexFieldFormatter(Globals.prefs.getLatexFieldFormatterPreferences()), false); - - for (BibEntry entry : l) { - StringWriter sw = new StringWriter(); - bibtexEntryWriter.write(entry, sw, BibDatabaseMode.BIBTEX); - System.out.println(sw.getBuffer()); - } - - } else if (args[0].endsWith(".bib")) { - // Read from BIB and write as XMP - try (FileReader fr = new FileReader(args[0])) { - ParserResult result = new BibtexParser(importFormatPreferences, Globals.getFileUpdateMonitor()).parse(fr); - Collection entries = result.getDatabase().getEntries(); - - if (entries.isEmpty()) { - System.err.println("Could not find BibEntry in " + args[0]); - } - } - } else { - usage(); - } - } else if (argsLength == 2) { - if ("-x".equals(args[0]) && args[1].endsWith(".pdf")) { - // Read from pdf and write as BibTex - List meta = XmpUtilReader.readRawXmp(Paths.get(args[1])); - - if (!meta.isEmpty()) { - XmpSerializer serializer = new XmpSerializer(); - serializer.serialize(meta.get(0), System.out, true); - } else { - System.err.println("The given pdf does not contain any XMP-metadata."); - } - return; - } - - if (args[0].endsWith(".bib") && args[1].endsWith(".pdf")) { - try (FileReader reader = new FileReader(args[0])) { - ParserResult result = new BibtexParser(importFormatPreferences, Globals.getFileUpdateMonitor()).parse(reader); - - List entries = result.getDatabase().getEntries(); - - if (entries.isEmpty()) { - System.err.println("Could not find BibEntry in " + args[0]); - } else { - XmpUtilWriter.writeXmp(Paths.get(args[1]), entries, result.getDatabase(), xmpPreferences); - System.out.println("XMP written."); - } - } - return; - } - - usage(); - } else if (argsLength == 3) { - if (!args[1].endsWith(".bib") && !args[2].endsWith(".pdf")) { - usage(); - return; - } - - try (FileReader reader = new FileReader(args[1])) { - ParserResult result = new BibtexParser(importFormatPreferences, Globals.getFileUpdateMonitor()).parse(reader); - - Optional bibEntry = result.getDatabase().getEntryByKey(args[0]); - - if (bibEntry.isPresent()) { - XmpUtilWriter.writeXmp(Paths.get(args[2]), bibEntry.get(), result.getDatabase(), xmpPreferences); - - System.out.println("XMP written."); - } else { - System.err.println("Could not find BibEntry " + args[0] + " in " + args[0]); - } - } - } else { - usage(); - } - } - - /** - * Print usage information for the command line tool xmpUtil. - * - * @see XMPUtilMain#main(String[]) - */ - private static void usage() { - System.out.println("Read or write XMP-metadata from or to pdf file."); - System.out.println(""); - System.out.println("Usage:"); - System.out.println("Read from PDF and print as bibtex:"); - System.out.println(" xmpUtil "); - System.out.println("Read from PDF and print raw XMP:"); - System.out.println(" xmpUtil -x "); - System.out - .println("Write the entry in given by to the PDF:"); - System.out.println(" xmpUtil "); - System.out.println("Write all entries in to the PDF:"); - System.out.println(" xmpUtil "); - System.out.println(""); - System.out - .println("To report bugs visit https://issues.jabref.org"); - } - -} diff --git a/src/main/java/org/jabref/cli/XmpUtilMain.java b/src/main/java/org/jabref/cli/XmpUtilMain.java new file mode 100644 index 00000000000..5ff5ffc6a0d --- /dev/null +++ b/src/main/java/org/jabref/cli/XmpUtilMain.java @@ -0,0 +1,129 @@ +package org.jabref.cli; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.nio.file.Paths; +import java.util.List; + +import javax.xml.transform.TransformerException; + +import org.jabref.Globals; +import org.jabref.logic.bibtex.BibEntryWriter; +import org.jabref.logic.bibtex.LatexFieldFormatter; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParserResult; +import org.jabref.logic.importer.fileformat.BibtexParser; +import org.jabref.logic.xmp.XmpPreferences; +import org.jabref.logic.xmp.XmpUtilReader; +import org.jabref.logic.xmp.XmpUtilWriter; +import org.jabref.model.database.BibDatabaseMode; +import org.jabref.model.entry.BibEntry; +import org.jabref.preferences.JabRefPreferences; + +public class XmpUtilMain { + + private static XmpPreferences xmpPreferences; + private static ImportFormatPreferences importFormatPreferences; + + private XmpUtilMain() { + } + + /** + * Reads metadata from pdf and print all included bib entries to the console. + * + * @param filename Filename of the pdf file (.pdf) + */ + private static void readPdfAndPrintBib(String filename) throws IOException { + if (filename.endsWith(".pdf")) { + List entryList = XmpUtilReader.readXmp(filename, xmpPreferences); + + BibEntryWriter bibtexEntryWriter = new BibEntryWriter( + new LatexFieldFormatter(Globals.prefs.getLatexFieldFormatterPreferences()), false); + + for (BibEntry entry : entryList) { + StringWriter writer = new StringWriter(); + bibtexEntryWriter.write(entry, writer, BibDatabaseMode.BIBTEX); + System.out.println(writer.getBuffer()); + } + } else { + System.err.println("Insert a file path (.pdf)"); + } + } + + /** + * Writes all entries included in the bib file to the metadata section of the pdf file. + * + * @param bibFile Filename of the bib file (.bib) + * @param pdfFile Filename of the pdf file (.pdf) + */ + private static void writeBibFileToPdfMetadata(String bibFile, String pdfFile) throws FileNotFoundException, IOException, TransformerException { + if (bibFile.endsWith(".bib") && pdfFile.endsWith(".pdf")) { + try (FileReader reader = new FileReader(bibFile)) { + ParserResult result = new BibtexParser(importFormatPreferences, Globals.getFileUpdateMonitor()).parse(reader); + XmpUtilWriter.writeXmp(Paths.get(pdfFile), result.getDatabase().getEntries(), result.getDatabase(), xmpPreferences); + System.out.println("Metadata sucessfully written to Pdf."); + } + } else { + System.err.println("Insert correct file paths (.bib and .pdf)"); + } + } + + /** + * Print usage information for the console tool xmpUtil. + */ + private static void printMenu() { + System.out.println("---------------------Menu-----------------------"); + System.out.println("(0) Exit"); + System.out.println("(1) Read metadata from PDF and print as bibtex"); + System.out.println("(2) Write entries in bib file to Pdf metadata"); + System.out.println(" To report bugs visit https://issues.jabref.org"); + System.out.println("-------------------------------------------------"); + System.out.print("Choose an option: "); + } + + /** + * The tool is implemented as a console application with a read-evaluate-print cycle. + */ + public static void executeXmpConsoleApplicaton() { + if (Globals.prefs == null) { + Globals.prefs = JabRefPreferences.getInstance(); + } + + xmpPreferences = Globals.prefs.getXMPPreferences(); + importFormatPreferences = Globals.prefs.getImportFormatPreferences(); + + BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); + + int option = -1; + while (option != 0) { + try { + XmpUtilMain.printMenu(); + option = Integer.parseInt(consoleReader.readLine()); + + if (option == 0) { + break; + } else if (option == 1) { + System.out.print("Insert your filename (.pdf): "); + String filename = consoleReader.readLine().trim(); + XmpUtilMain.readPdfAndPrintBib(filename); + } else if (option == 2) { + System.out.print("Insert your filename (.bib): "); + String bibFile = consoleReader.readLine().trim(); + System.out.print("Insert your filename (.pdf): "); + String pdfFile = consoleReader.readLine().trim(); + XmpUtilMain.writeBibFileToPdfMetadata(bibFile, pdfFile); + } + } catch (IOException | TransformerException e) { + System.err.println(e.getMessage()); + } + } + } + + public static void main(String[] args) { + XmpUtilMain.executeXmpConsoleApplicaton(); + } +}