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