diff --git a/install/plugin_intranda_export_adm_bsme.xml b/install/plugin_intranda_export_adm_bsme.xml index b63adef..6fa79ab 100644 --- a/install/plugin_intranda_export_adm_bsme.xml +++ b/install/plugin_intranda_export_adm_bsme.xml @@ -18,22 +18,27 @@ - $(template.Rights to Use) - $(template.Rights Details) + $(meta.AdmRightToUse) + $(meta.AdmRightDetails) Goobi - $(template.Media Type) - $(template.Media Group) - $(template.Source Organization) - $(template.Issue Frequency) - $(template.Event Name) - $(template.Event Date) - $(template.Subject) - $(template.Photographer) - $(template.Persons in Image) - $(template.Locations) - $(template.Description) - $(template.Editor in Chief) - $(template.Format) + $(meta.AdmMediaType) + $(meta.AdmMediaGroup) + $(meta.AdmSourceOrganization) + $(meta.AdmIssueFrequency) + $(meta.AdmEventName) + $(meta.AdmEventDate) + $(meta.AdmEventTime) + $(meta.Subject) + $(meta.AdmSubjectArabic) + $(meta.AdmSubjectEnglish) + $(meta.AdmPhotographer) + $(meta.AdmPersonsInImage) + $(meta.AdmEventLocations) + $(meta.Description) + $(meta.AdmEditorInChief) + $(meta.Format) + $(meta.AdmEnvelopeNumber) + $(meta.AdmBackprint) diff --git a/module-base/pom.xml b/module-base/pom.xml index fb9636c..4dd3113 100644 --- a/module-base/pom.xml +++ b/module-base/pom.xml @@ -3,7 +3,7 @@ io.goobi.workflow.plugin plugin-export-adm-bsme - 24.05 + 24.06 plugin-export-adm-bsme-base jar diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/AdmBsmeExportPlugin.java b/module-base/src/main/java/de/intranda/goobi/plugins/AdmBsmeExportPlugin.java index d030689..304c831 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/AdmBsmeExportPlugin.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/AdmBsmeExportPlugin.java @@ -10,6 +10,12 @@ import org.goobi.production.plugin.interfaces.IExportPlugin; import org.goobi.production.plugin.interfaces.IPlugin; +import de.intranda.goobi.plugins.exporters.GenericExporter; +import de.intranda.goobi.plugins.exporters.MagazineExporter; +import de.intranda.goobi.plugins.exporters.NegativeExporter; +import de.intranda.goobi.plugins.exporters.NewspaperExporter; +import de.intranda.goobi.plugins.exporters.PositiveExporter; +import de.intranda.goobi.plugins.exporters.SlideExporter; import de.sub.goobi.config.ConfigPlugins; import de.sub.goobi.export.dms.ExportDms; import de.sub.goobi.helper.Helper; @@ -106,6 +112,11 @@ public boolean startExport(Process process, String destination) NegativeExporter ex = new NegativeExporter(ConfigPlugins.getPluginConfig(title), process, prefs, dd); success = ex.startExport(); } + if ("AdmPositive".equals(topStruct.getType().getName())) { + // if it is a Negative + PositiveExporter ex = new PositiveExporter(ConfigPlugins.getPluginConfig(title), process, prefs, dd); + success = ex.startExport(); + } if ("AdmSlide".equals(topStruct.getType().getName())) { // if it is a Slide @@ -113,6 +124,12 @@ public boolean startExport(Process process, String destination) success = ex.startExport(); } + if ("AdmGeneric".equals(topStruct.getType().getName())) { + // if it is a Generic + GenericExporter ex = new GenericExporter(ConfigPlugins.getPluginConfig(title), process, prefs, dd); + success = ex.startExport(); + } + } } catch (ReadException | PreferencesException | IOException | SwapException e) { diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/exporters/GenericExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/GenericExporter.java new file mode 100644 index 0000000..b637278 --- /dev/null +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/GenericExporter.java @@ -0,0 +1,249 @@ +package de.intranda.goobi.plugins.exporters; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.configuration.XMLConfiguration; +import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; +import org.goobi.beans.JournalEntry; +import org.goobi.beans.Process; +import org.goobi.production.enums.LogType; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + +import de.intranda.goobi.plugins.AdmBsmeExportHelper; +import de.sub.goobi.helper.StorageProvider; +import de.sub.goobi.helper.StorageProviderInterface; +import de.sub.goobi.helper.VariableReplacer; +import de.sub.goobi.helper.exceptions.DAOException; +import de.sub.goobi.helper.exceptions.SwapException; +import de.unigoettingen.sub.commons.contentlib.exceptions.ImageManagerException; +import de.unigoettingen.sub.commons.contentlib.imagelib.ImageInterpreter; +import de.unigoettingen.sub.commons.contentlib.imagelib.ImageManager; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import net.xeoh.plugins.base.annotations.PluginImplementation; +import ugh.dl.DigitalDocument; +import ugh.dl.DocStruct; +import ugh.dl.Prefs; +import ugh.dl.Reference; + +@PluginImplementation +@Log4j2 +public class GenericExporter { + + private XMLConfiguration config; + private Process process; + private Prefs prefs; + private DigitalDocument dd; + private String targetFolder; + + // keep a list of all image files as they need to be renamed + private Map fileMap; + private int fileCounter; + private VariableReplacer vr; + + @Getter + private List problems; + + /** + * Constructor + * + * @param config + * @param process + * @param prefs + * @param dd + */ + public GenericExporter(XMLConfiguration config, Process process, Prefs prefs, DigitalDocument dd) { + this.config = config; + config.setExpressionEngine(new XPathExpressionEngine()); + this.process = process; + this.prefs = prefs; + this.dd = dd; + targetFolder = config.getString("targetDirectoryGeneric", "/opt/digiverso/goobi/output/"); + } + + /** + * Do the actual export for a newspaper volume + * + * @param process + * @param destination + * @return + */ + public boolean startExport() { + vr = new VariableReplacer(dd, prefs, process, null); + problems = new ArrayList<>(); + fileMap = new HashMap(); + fileCounter = 0; + log.debug("Export directory for AdmBsmeExportPlugin: " + targetFolder); + DocStruct topStruct = dd.getLogicalDocStruct(); + + // prepare xml document + Document doc = new Document(); + doc.setRootElement(new Element("image")); + + // add volume information + Element info = new Element("ImageInfo"); + doc.getRootElement().addContent(info); + String identifier = AdmBsmeExportHelper.getMetdata(topStruct, config.getString("/metadata/identifier")); + + String rightsToUse = vr.replace(config.getString("/rightsToUse")); + String rightsDetails = vr.replace(config.getString("/rightsDetails")); + String source = vr.replace(config.getString("/source")); + String mediaType = vr.replace(config.getString("/mediaType")); + // String mediaGroup = vr.replace(config.getString("/mediaGroup")); + String sourceOrganisation = vr.replace(config.getString("/sourceOrganisation")); + String eventDate = vr.replace(config.getString("/eventDate")); + String eventName = vr.replace(config.getString("/eventName")); + String subject = vr.replace(config.getString("/subject")); + String photographer = vr.replace(config.getString("/photographer")); + String personsInImage = vr.replace(config.getString("/personsInImage")); + String locations = vr.replace(config.getString("/locations")); + String description = vr.replace(config.getString("/description")); + // String editorInChief = vr.replace(config.getString("/editorInChief")); + String format = vr.replace(config.getString("/format")); + String backprint = vr.replace(config.getString("/backprint")); + + info.addContent(new Element("Rights_to_Use").setText(rightsToUse)); + info.addContent(new Element("Right_Details").setText(rightsDetails)); + info.addContent(new Element("Media_Source").setText(source)); + info.addContent(new Element("Media_Type").setText(mediaType)); + info.addContent(new Element("Publication_Name") + .setText(AdmBsmeExportHelper.getMetdata(topStruct, config.getString("/metadata/titleLabel")))); + info.addContent( + new Element("Source_Organization").setText(sourceOrganisation)); + info.addContent(new Element("Barcode").setText(identifier)); + info.addContent(new Element("Subject").setText(subject)); + info.addContent(new Element("Event_Date").setText(eventDate)); + info.addContent(new Element("Event_Name").setText(eventName)); + info.addContent(new Element("Photographer").setText(photographer)); + info.addContent(new Element("Format").setText(format)); + info.addContent(new Element("Persons_in_Image").setText(personsInImage)); + info.addContent(new Element("location").setText(locations)); + info.addContent(new Element("Description").setText(description)); + info.addContent(new Element("Backprint").setText(backprint)); + + // info.addContent(new Element("Media_Group").setText(mediaGroup)); + + // add all journal entries as technical notes + if (process.getJournal() != null) { + Element technicalNotes = new Element("Technical_Notes"); + for (JournalEntry je : process.getJournal()) { + if (je.getType() == LogType.USER) { + technicalNotes.addContent(new Element("Entry").setAttribute("date", je.getFormattedCreationDate()) + .setAttribute("type", je.getType().getTitle()) + .setText(je.getFormattedContent())); + } + } + info.addContent(technicalNotes); + } else { + info.addContent(new Element("Technical_Notes").setText("- no entry available -")); + } + + // add file information + Element files = new Element("Files"); + doc.getRootElement().addContent(files); + + List refs = topStruct.getAllToReferences("logical_physical"); + if (refs != null) { + for (Reference ref : refs) { + DocStruct page = ref.getTarget(); + String realFileName = page.getImageName(); + String realFileNameWithoutExtension = realFileName.substring(0, realFileName.indexOf(".")); + + // get the new file name for the image and reuse if created previously + String exportFileName = fileMap.get(realFileNameWithoutExtension); + if (exportFileName == null) { + String counter = String.format("%04d", ++fileCounter); + exportFileName = identifier + "-" + counter; + fileMap.put(realFileNameWithoutExtension, exportFileName); + } + + // add file element + Element master = new Element("master"); + + // add image information + try { + File realFile = new File(process.getImagesOrigDirectory(false), + realFileNameWithoutExtension + ".tif"); + try (ImageManager sourcemanager = new ImageManager(realFile.toURI())) { + ImageInterpreter si = sourcemanager.getMyInterpreter(); + + // MimeType + // master.setAttribute("Format", si.getFormatType().getFormat().getMimeType()); + master.addContent(new Element("Format").setText(si.getFormatType().getFormat().getMimeType())); + + // Unit for the resolution, always ppi + // master.setAttribute("ResolutionUnit", "PPI"); + master.addContent(new Element("ResolutionUnit").setText("PPI")); + + // Resolution + // master.setAttribute("Resolution", String.valueOf(si.getOriginalImageXResolution())); + master.addContent(new Element("Resolution").setText(String.valueOf(si.getOriginalImageXResolution()))); + + // ColorDepth + // master.setAttribute("BitDepth", String.valueOf(si.getColordepth())); + master.addContent(new Element("BitDepth").setText(String.valueOf(si.getColordepth()))); + + // bitonal, grey, "color" + // master.setAttribute("ColorSpace", si.getFormatType().getColortype().getLabel()); + master.addContent(new Element("ColorSpace").setText(si.getFormatType().getColortype().getLabel())); + + // Scanning device + master.addContent(new Element("ScanningDevice").setText(vr.replace("${process.Capturing device}"))); + + // Scanning device id + String scanningDeviceId = "- no serial number available -"; //si.getMetadata().toString(); + master.addContent(new Element("ScanningDeviceID").setText(scanningDeviceId)); + + // Width + master.addContent(new Element("Width").setText(String.valueOf(si.getOriginalImageWidth()))); + + // Height + master.addContent(new Element("Height").setText(String.valueOf(si.getOriginalImageHeight()))); + sourcemanager.close(); + } + } catch (IOException | SwapException | DAOException | ImageManagerException e) { + log.error("Error while reading image metadata", e); + return false; + } + + master.addContent(new Element("file").setText(exportFileName + ".tif")); + files.addContent(master); + files.addContent(new Element("text").setText(exportFileName + ".txt").setAttribute("Format", "text/plain")); + + } + } + + // write the xml file + XMLOutputter xmlOutputter = new XMLOutputter(); + xmlOutputter.setFormat(Format.getPrettyFormat()); + File xmlfile = new File(targetFolder + identifier + ".xml"); + try (FileOutputStream fileOutputStream = new FileOutputStream(xmlfile)) { + xmlOutputter.output(doc, fileOutputStream); + } catch (IOException e) { + log.error("Error writing the simple xml file", e); + return false; + } + + try { + // copy all important files to target folder + AdmBsmeExportHelper.copyFolderContent(process.getImagesOrigDirectory(false), "tif", fileMap, targetFolder); + StorageProviderInterface sp = StorageProvider.getInstance(); + + } catch (IOException | SwapException | DAOException e) { + log.error("Error while copying the image files to export folder", e); + return false; + } + + return true; + } + +} \ No newline at end of file diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/MagazineExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/MagazineExporter.java similarity index 99% rename from module-base/src/main/java/de/intranda/goobi/plugins/MagazineExporter.java rename to module-base/src/main/java/de/intranda/goobi/plugins/exporters/MagazineExporter.java index 70024d0..2877fd5 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/MagazineExporter.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/MagazineExporter.java @@ -1,4 +1,4 @@ -package de.intranda.goobi.plugins; +package de.intranda.goobi.plugins.exporters; import java.io.File; import java.io.FileOutputStream; @@ -21,6 +21,8 @@ import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import de.intranda.goobi.plugins.AdmBsmeExportHelper; +import de.intranda.goobi.plugins.PdfIssue; import de.sub.goobi.helper.StorageProvider; import de.sub.goobi.helper.StorageProviderInterface; import de.sub.goobi.helper.VariableReplacer; diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/NegativeExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NegativeExporter.java similarity index 96% rename from module-base/src/main/java/de/intranda/goobi/plugins/NegativeExporter.java rename to module-base/src/main/java/de/intranda/goobi/plugins/exporters/NegativeExporter.java index c96d0dc..c97f282 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/NegativeExporter.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NegativeExporter.java @@ -1,4 +1,4 @@ -package de.intranda.goobi.plugins; +package de.intranda.goobi.plugins.exporters; import java.io.File; import java.io.FileOutputStream; @@ -18,6 +18,7 @@ import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import de.intranda.goobi.plugins.AdmBsmeExportHelper; import de.sub.goobi.helper.StorageProvider; import de.sub.goobi.helper.StorageProviderInterface; import de.sub.goobi.helper.VariableReplacer; @@ -97,7 +98,7 @@ public boolean startExport() { String rightsDetails = vr.replace(config.getString("/rightsDetails")); String source = vr.replace(config.getString("/source")); String mediaType = vr.replace(config.getString("/mediaType")); - String mediaGroup = vr.replace(config.getString("/mediaGroup")); + //String mediaGroup = vr.replace(config.getString("/mediaGroup")); String sourceOrganisation = vr.replace(config.getString("/sourceOrganisation")); String eventDate = vr.replace(config.getString("/eventDate")); String eventName = vr.replace(config.getString("/eventName")); @@ -108,12 +109,14 @@ public boolean startExport() { String description = vr.replace(config.getString("/description")); String editorInChief = vr.replace(config.getString("/editorInChief")); String format = vr.replace(config.getString("/format")); + String envelopeNumber = vr.replace(config.getString("/envelopeNumber")); info.addContent(new Element("Rights_to_Use").setText(rightsToUse)); info.addContent(new Element("Right_Details").setText(rightsDetails)); info.addContent(new Element("Media_Source").setText(source)); - info.addContent(new Element("Media_type").setText(mediaType)); + info.addContent(new Element("Media_Type").setText(mediaType)); info.addContent(new Element("Envelope_Barcode").setText(identifier)); + info.addContent(new Element("Envelope_Number").setText(envelopeNumber)); info.addContent(new Element("Publication_Name") .setText(AdmBsmeExportHelper.getMetdata(topStruct, config.getString("/metadata/titleLabel")))); info.addContent( diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/NewspaperExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperExporter.java similarity index 99% rename from module-base/src/main/java/de/intranda/goobi/plugins/NewspaperExporter.java rename to module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperExporter.java index dc82852..c1288c0 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/NewspaperExporter.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperExporter.java @@ -1,4 +1,4 @@ -package de.intranda.goobi.plugins; +package de.intranda.goobi.plugins.exporters; import java.io.File; import java.io.FileOutputStream; @@ -20,6 +20,8 @@ import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import de.intranda.goobi.plugins.AdmBsmeExportHelper; +import de.intranda.goobi.plugins.PdfIssue; import de.sub.goobi.helper.Helper; import de.sub.goobi.helper.StorageProvider; import de.sub.goobi.helper.VariableReplacer; diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/NewspaperMetsCreator.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperMetsCreator.java similarity index 99% rename from module-base/src/main/java/de/intranda/goobi/plugins/NewspaperMetsCreator.java rename to module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperMetsCreator.java index 545960b..a405414 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/NewspaperMetsCreator.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/NewspaperMetsCreator.java @@ -1,4 +1,4 @@ -package de.intranda.goobi.plugins; +package de.intranda.goobi.plugins.exporters; import java.io.FileOutputStream; import java.io.IOException; @@ -23,6 +23,7 @@ import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import de.intranda.goobi.plugins.AdmBsmeExportHelper; import de.sub.goobi.helper.StorageProvider; import de.sub.goobi.helper.VariableReplacer; import de.sub.goobi.helper.XmlTools; diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/exporters/PositiveExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/PositiveExporter.java new file mode 100644 index 0000000..971333b --- /dev/null +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/PositiveExporter.java @@ -0,0 +1,275 @@ +package de.intranda.goobi.plugins.exporters; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.configuration.XMLConfiguration; +import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; +import org.goobi.beans.JournalEntry; +import org.goobi.beans.Process; +import org.goobi.production.enums.LogType; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + +import de.intranda.goobi.plugins.AdmBsmeExportHelper; +import de.sub.goobi.helper.StorageProvider; +import de.sub.goobi.helper.VariableReplacer; +import de.sub.goobi.helper.exceptions.DAOException; +import de.sub.goobi.helper.exceptions.SwapException; +import de.unigoettingen.sub.commons.contentlib.exceptions.ImageManagerException; +import de.unigoettingen.sub.commons.contentlib.imagelib.ImageInterpreter; +import de.unigoettingen.sub.commons.contentlib.imagelib.ImageManager; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import net.xeoh.plugins.base.annotations.PluginImplementation; +import ugh.dl.DigitalDocument; +import ugh.dl.DocStruct; +import ugh.dl.Prefs; +import ugh.dl.Reference; + +@PluginImplementation +@Log4j2 +public class PositiveExporter { + + private XMLConfiguration config; + private Process process; + private Prefs prefs; + private DigitalDocument dd; + private String targetFolder; + + // keep a list of all image files as they need to be renamed + private Map fileMap; + private int fileCounter; + private VariableReplacer vr; + + @Getter + private List problems; + + /** + * Constructor + * + * @param config + * @param process + * @param prefs + * @param dd + */ + public PositiveExporter(XMLConfiguration config, Process process, Prefs prefs, DigitalDocument dd) { + this.config = config; + config.setExpressionEngine(new XPathExpressionEngine()); + this.process = process; + this.prefs = prefs; + this.dd = dd; + targetFolder = config.getString("targetDirectoryPositives", "/opt/digiverso/goobi/output/"); + } + + /** + * Do the actual export for a newspaper volume + * + * @param process + * @param destination + * @return + */ + public boolean startExport() { + vr = new VariableReplacer(dd, prefs, process, null); + problems = new ArrayList<>(); + fileMap = new HashMap(); + fileCounter = 0; + log.debug("Export directory for AdmBsmeExportPlugin: " + targetFolder); + DocStruct topStruct = dd.getLogicalDocStruct(); + + // prepare process information + Element info = new Element("envelopeInfo"); + String identifier = AdmBsmeExportHelper.getMetdata(topStruct, config.getString("/metadata/identifier")); + + String rightsToUse = vr.replace(config.getString("/rightsToUse")); + String rightsDetails = vr.replace(config.getString("/rightsDetails")); + String source = vr.replace(config.getString("/source")); + String mediaType = vr.replace(config.getString("/mediaType")); + //String mediaGroup = vr.replace(config.getString("/mediaGroup")); + String sourceOrganisation = vr.replace(config.getString("/sourceOrganisation")); + String eventDate = vr.replace(config.getString("/eventDate")); + String eventName = vr.replace(config.getString("/eventName")); + String subject = vr.replace(config.getString("/subject")); + String photographer = vr.replace(config.getString("/photographer")); + String personsInImage = vr.replace(config.getString("/personsInImage")); + String locations = vr.replace(config.getString("/locations")); + String description = vr.replace(config.getString("/description")); + String editorInChief = vr.replace(config.getString("/editorInChief")); + //String format = vr.replace(config.getString("/format")); + String envelopeNumber = vr.replace(config.getString("/envelopeNumber")); + String backprint = vr.replace(config.getString("/backprint")); + + info.addContent(new Element("Rights_to_Use").setText(rightsToUse)); + info.addContent(new Element("Right_Details").setText(rightsDetails)); + info.addContent(new Element("Media_Source").setText(source)); + info.addContent(new Element("Media_Type").setText(mediaType)); + info.addContent(new Element("Envelope_Barcode").setText(identifier)); + info.addContent(new Element("Envelope_Number").setText(envelopeNumber)); + info.addContent(new Element("Publication_Name") + .setText(AdmBsmeExportHelper.getMetdata(topStruct, config.getString("/metadata/titleLabel")))); + info.addContent( + new Element("Source_Organization").setText(sourceOrganisation)); + info.addContent(new Element("Event_Date").setText(eventDate)); + info.addContent(new Element("Event_Name").setText(eventName)); + info.addContent(new Element("Subject").setText(subject)); + info.addContent(new Element("Photographer").setText(photographer)); + info.addContent(new Element("Persons_in_Image").setText(personsInImage)); + info.addContent(new Element("Editor_in_Chief").setText(editorInChief)); + info.addContent(new Element("location").setText(locations)); + info.addContent(new Element("Description").setText(description)); + + // info.addContent(new Element("Media_Group").setText(mediaGroup)); + + // add all journal entries as technical notes + if (process.getJournal() != null) { + Element technicalNotes = new Element("Technical_Notes"); + for (JournalEntry je : process.getJournal()) { + if (je.getType() == LogType.USER) { + technicalNotes.addContent(new Element("Entry").setAttribute("date", je.getFormattedCreationDate()) + .setAttribute("type", je.getType().getTitle()) + .setText(je.getFormattedContent())); + } + } + info.addContent(technicalNotes); + } else { + info.addContent(new Element("Technical_Notes").setText("- no entry available -")); + } + + List refs = topStruct.getAllToReferences("logical_physical"); + if (refs != null) { + + // EACH IMAGE - START + for (Reference ref : refs) { + + // prepare xml document + Document doc = new Document(); + doc.setRootElement(new Element("Envelope")); + info.detach(); + doc.getRootElement().addContent(info); + + // add file information + Element files = new Element("Images"); + doc.getRootElement().addContent(files); + + // Image details + DocStruct page = ref.getTarget(); + String realFileName = page.getImageName(); + String realFileNameWithoutExtension = realFileName.substring(0, realFileName.indexOf(".")); + + // get the new file name for the image and reuse if created previously + String exportFileName = fileMap.get(realFileNameWithoutExtension); + if (exportFileName == null) { + String counter = String.format("%03d", ++fileCounter); + exportFileName = identifier + "-" + counter; + fileMap.put(realFileNameWithoutExtension, exportFileName); + } + + // add file element + Element file = new Element("Image"); + file.setAttribute("id", String.format("%03d", fileCounter)); + file.addContent(new Element("Barcode").setText(identifier + "-" + String.format("%03d", fileCounter))); + file.addContent(new Element("Backprint").setText(backprint)); + Element master = new Element("master"); + + // add image information + try { + File realFile = new File(process.getImagesOrigDirectory(false), + realFileNameWithoutExtension + ".tif"); + try (ImageManager sourcemanager = new ImageManager(realFile.toURI())) { + ImageInterpreter si = sourcemanager.getMyInterpreter(); + + // MimeType + // master.setAttribute("Format", si.getFormatType().getFormat().getMimeType()); + master.addContent(new Element("Format").setText(si.getFormatType().getFormat().getMimeType())); + + // Unit for the resolution, always ppi + // master.setAttribute("ResolutionUnit", "PPI"); + master.addContent(new Element("ResolutionUnit").setText("PPI")); + + // Resolution + // master.setAttribute("Resolution", String.valueOf(si.getOriginalImageXResolution())); + master.addContent(new Element("Resolution").setText(String.valueOf(si.getOriginalImageXResolution()))); + + // ColorDepth + // master.setAttribute("BitDepth", String.valueOf(si.getColordepth())); + master.addContent(new Element("BitDepth").setText(String.valueOf(si.getColordepth()))); + + // bitonal, grey, "color" + // master.setAttribute("ColorSpace", si.getFormatType().getColortype().getLabel()); + master.addContent(new Element("ColorSpace").setText(si.getFormatType().getColortype().getLabel())); + + // Scanning device + master.addContent(new Element("ScanningDevice").setText(vr.replace("${process.Capturing device}"))); + + // Scanning device id + String scanningDeviceId = "- no serial number available -"; //si.getMetadata().toString(); + master.addContent(new Element("ScanningDeviceID").setText(scanningDeviceId)); + + // Width + master.addContent(new Element("Width").setText(String.valueOf(si.getOriginalImageWidth()))); + + // Height + master.addContent(new Element("Height").setText(String.valueOf(si.getOriginalImageHeight()))); + sourcemanager.close(); + } + } catch (IOException | SwapException | DAOException | ImageManagerException e) { + log.error("Error while reading image metadata", e); + return false; + } + + master.addContent(new Element("file").setText(exportFileName + ".tif")); + file.addContent(master); + + try { + // copy image file to target folder + Path in = Paths.get(process.getImagesOrigDirectory(false), realFileNameWithoutExtension + ".tif"); + Path out = Paths.get(targetFolder, exportFileName + ".tif"); + StorageProvider.getInstance().copyFile(in, out); + + // copy plaintext file to target folder and add it to xml + Path ocrPlaintextPath = Paths.get(process.getOcrTxtDirectory(), realFileNameWithoutExtension + ".txt"); + if (StorageProvider.getInstance().isFileExists(ocrPlaintextPath)) { + file.addContent(new Element("text").setText(exportFileName + ".txt").setAttribute("Format", "text/plain")); + out = Paths.get(targetFolder, exportFileName + ".txt"); + StorageProvider.getInstance().copyFile(ocrPlaintextPath, out); + } else { + file.addContent(new Element("text").setAttribute("Format", "text/plain")); + } + + } catch (IOException | SwapException | DAOException e) { + log.error("Error while copying the image and ocr files to export folder", e); + return false; + } + + files.addContent(file); + + // write the xml file + XMLOutputter xmlOutputter = new XMLOutputter(); + xmlOutputter.setFormat(Format.getPrettyFormat()); + + File xmlfile = new File(targetFolder + identifier + "-" + String.format("%03d", fileCounter) + ".xml"); + try (FileOutputStream fileOutputStream = new FileOutputStream(xmlfile)) { + xmlOutputter.output(doc, fileOutputStream); + } catch (IOException e) { + log.error("Error writing the simple xml file", e); + return false; + } + + } + // EACH IMAGE - END + + } + + return true; + } + +} \ No newline at end of file diff --git a/module-base/src/main/java/de/intranda/goobi/plugins/SlideExporter.java b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/SlideExporter.java similarity index 96% rename from module-base/src/main/java/de/intranda/goobi/plugins/SlideExporter.java rename to module-base/src/main/java/de/intranda/goobi/plugins/exporters/SlideExporter.java index 4c5b7d1..92964a3 100644 --- a/module-base/src/main/java/de/intranda/goobi/plugins/SlideExporter.java +++ b/module-base/src/main/java/de/intranda/goobi/plugins/exporters/SlideExporter.java @@ -1,4 +1,4 @@ -package de.intranda.goobi.plugins; +package de.intranda.goobi.plugins.exporters; import java.io.File; import java.io.FileOutputStream; @@ -18,6 +18,7 @@ import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import de.intranda.goobi.plugins.AdmBsmeExportHelper; import de.sub.goobi.helper.StorageProvider; import de.sub.goobi.helper.StorageProviderInterface; import de.sub.goobi.helper.VariableReplacer; @@ -101,7 +102,8 @@ public boolean startExport() { String sourceOrganisation = vr.replace(config.getString("/sourceOrganisation")); String eventDate = vr.replace(config.getString("/eventDate")); String eventName = vr.replace(config.getString("/eventName")); - String subject = vr.replace(config.getString("/subject")); + String subjectEng = vr.replace(config.getString("/subjectEnglish")); + String subjectAra = vr.replace(config.getString("/subjectArabic")); String photographer = vr.replace(config.getString("/photographer")); String personsInImage = vr.replace(config.getString("/personsInImage")); String locations = vr.replace(config.getString("/locations")); @@ -120,6 +122,8 @@ public boolean startExport() { info.addContent(new Element("Barcode").setText(identifier)); info.addContent(new Element("Event_Date").setText(eventDate)); info.addContent(new Element("Event_Name").setText(eventName)); + info.addContent(new Element("Subject_ENG").setText(subjectEng)); + info.addContent(new Element("Subject_ARA").setText(subjectAra)); info.addContent(new Element("Photographer").setText(photographer)); info.addContent(new Element("Format").setText(format)); info.addContent(new Element("Persons_in_Image").setText(personsInImage)); @@ -128,7 +132,6 @@ public boolean startExport() { // info.addContent(new Element("Editor_in_Chief").setText(editorInChief)); // info.addContent(new Element("Media_Group").setText(mediaGroup)); - // info.addContent(new Element("Subject").setText(subject)); // add all journal entries as technical notes if (process.getJournal() != null) { diff --git a/pom.xml b/pom.xml index 3601dc5..5920a35 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ io.goobi.workflow workflow-base - 24.05 + 24.06 io.goobi.workflow.plugin