From 5a09a4e6120003e4adbf28827d0471b5ede6f2d5 Mon Sep 17 00:00:00 2001 From: "W.S. Hager" Date: Thu, 8 Jan 2015 18:34:01 +0100 Subject: [PATCH 1/5] updated clj-ds dep from http://mvnrepository.com/artifact/com.github.krukow/clj-ds/0.0.4 --- pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 73cc0b1..ef43e01 100644 --- a/pom.xml +++ b/pom.xml @@ -55,11 +55,10 @@ provided - com.trifork - clj_ds - 0.0.1 - provided - + com.github.krukow + clj-ds + 0.0.4 + From b36f859bef5080f831f9f27793a41d04f202358d Mon Sep 17 00:00:00 2001 From: "W.S. Hager" Date: Thu, 8 Jan 2015 18:34:21 +0100 Subject: [PATCH 2/5] added pdf metadata functions --- .../exist/pdf/ExistExpathPdfModule.java | 7 +- .../metadata/GetContentMetadataFunction.java | 137 ++++++++++++++++++ .../metadata/SetContentMetadataFunction.java | 107 ++++++++++++++ 3 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java create mode 100644 pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java diff --git a/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java b/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java index dcd3bd7..5e2e12d 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java +++ b/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java @@ -28,7 +28,8 @@ import org.exist.xquery.FunctionDef; import org.expath.exist.pdf.formControls.GetTextFieldsFunction; import org.expath.exist.pdf.formControls.SetTextFieldsFunction; - +import org.expath.exist.pdf.metadata.GetContentMetadataFunction; +import org.expath.exist.pdf.metadata.SetContentMetadataFunction; import ro.kuberam.libs.java.pdf.ModuleDescription; /** @@ -45,7 +46,9 @@ public class ExistExpathPdfModule extends AbstractInternalModule { private final static FunctionDef[] functions = { new FunctionDef(GetTextFieldsFunction.signature, GetTextFieldsFunction.class), - new FunctionDef(SetTextFieldsFunction.signature, SetTextFieldsFunction.class) }; + new FunctionDef(SetTextFieldsFunction.signature, SetTextFieldsFunction.class), + new FunctionDef(GetContentMetadataFunction.signature, GetContentMetadataFunction.class), + new FunctionDef(SetContentMetadataFunction.signature, SetContentMetadataFunction.class)}; public ExistExpathPdfModule(Map> parameters) throws Exception { super(functions, parameters); diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java new file mode 100644 index 0000000..4e1a050 --- /dev/null +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2011 Claudius Teodorescu + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * $Id$ + */ + +package org.expath.exist.pdf.metadata; + +/** + * Implements the pdf:get-text-fields() function for eXist. + * + * @author Claudius Teodorescu + */ + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.io.input.CloseShieldInputStream; + +import org.apache.log4j.Logger; +import org.exist.dom.QName; +import org.exist.memtree.DocumentBuilderReceiver; +import org.exist.memtree.MemTreeBuilder; +import org.exist.xquery.BasicFunction; +import org.exist.xquery.Cardinality; +import org.exist.xquery.FunctionSignature; +import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryContext; +import org.exist.xquery.functions.map.MapType; +import org.exist.xquery.value.Base64BinaryValueType; +import org.exist.xquery.value.BinaryValue; +import org.exist.xquery.value.BinaryValueFromInputStream; +import org.exist.xquery.value.FunctionParameterSequenceType; +import org.exist.xquery.value.FunctionReturnSequenceType; +import org.exist.xquery.value.Sequence; +import org.exist.xquery.value.SequenceType; +import org.exist.xquery.value.StringValue; +import org.exist.xquery.value.Type; +import org.exist.xquery.value.ValueSequence; +import org.exist.xquery.value.NodeValue; +import org.expath.exist.pdf.ExistExpathPdfModule; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import ro.kuberam.libs.java.pdf.metadata.Metadata; + +public class GetContentMetadataFunction extends BasicFunction { + + private final static Logger log = Logger.getLogger(GetContentMetadataFunction.class); + + public final static FunctionSignature signature = new FunctionSignature(new QName("get-content-metadata", + ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), + "Get the XMP metadata from a PDF contents.", + new SequenceType[] { new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") }, + new FunctionReturnSequenceType(Type.NODE, Cardinality.ZERO_OR_ONE, + "an XML document containing XMP metadata.")); + + public GetContentMetadataFunction(XQueryContext context, FunctionSignature signature) { + super(context, signature); + } + + @Override + public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { + + Sequence result = new ValueSequence(); + + StreamResult resultAsStreamResult = null; + + try { + byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); + BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + new ByteArrayInputStream(binary)); + resultAsStreamResult = Metadata.run(data.getInputStream()); + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } + + ByteArrayInputStream resultDocAsInputStream = null; + try { + resultDocAsInputStream = new ByteArrayInputStream(resultAsStreamResult.getWriter().toString() + .getBytes("UTF-8")); + } catch (UnsupportedEncodingException ex) { + throw new XPathException(ex.getMessage()); + } + + XMLReader reader = null; + + context.pushDocumentContext(); + try { + InputSource src = new InputSource(new CloseShieldInputStream(resultDocAsInputStream)); + + reader = context.getBroker().getBrokerPool().getParserPool().borrowXMLReader(); + MemTreeBuilder builder = context.getDocumentBuilder(); + DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder, true); + reader.setContentHandler(receiver); + reader.parse(src); + Document doc = receiver.getDocument(); + + result = (NodeValue) doc; + } catch (SAXException saxe) { + // do nothing, we will default to trying to return a string below + } catch (IOException ioe) { + // do nothing, we will default to trying to return a string below + } finally { + context.popDocumentContext(); + + if (reader != null) { + context.getBroker().getBrokerPool().getParserPool().returnXMLReader(reader); + } + } + + return result; + } +} \ No newline at end of file diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java new file mode 100644 index 0000000..cf55c1b --- /dev/null +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2011 Claudius Teodorescu + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * $Id$ + */ + +package org.expath.exist.pdf.metadata; + +/** + * Implements the pdf:set-text-fields() function for eXist. + * + * @author Claudius Teodorescu + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; +import org.exist.dom.QName; +import org.exist.xquery.BasicFunction; +import org.exist.xquery.Cardinality; +import org.exist.xquery.FunctionSignature; +import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryContext; +import org.exist.xquery.functions.map.AbstractMapType; +import org.exist.xquery.value.AtomicValue; +import org.exist.xquery.value.Base64BinaryValueType; +import org.exist.xquery.value.BinaryValue; +import org.exist.xquery.value.BinaryValueFromInputStream; +import org.exist.xquery.value.FunctionParameterSequenceType; +import org.exist.xquery.value.FunctionReturnSequenceType; +import org.exist.xquery.value.Sequence; +import org.exist.xquery.value.SequenceType; +import org.exist.xquery.value.Type; +import org.exist.xquery.value.ValueSequence; +import org.expath.exist.pdf.ExistExpathPdfModule; + +import org.exist.storage.serializers.Serializer; +import org.exist.validation.internal.node.NodeInputStream; +import org.exist.xquery.value.NodeValue; + +import ro.kuberam.libs.java.pdf.metadata.Metadata; + +public class SetContentMetadataFunction extends BasicFunction { + + private final static Logger log = Logger.getLogger(SetContentMetadataFunction.class); + + public final static FunctionSignature signature = new FunctionSignature(new QName("set-content-metadata", + ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), + "Set the XMP metadata of a PDF contents.", new SequenceType[] { + new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "the PDF contents where to set the metadata to."), + new FunctionParameterSequenceType("text-fields", Type.NODE, Cardinality.ZERO_OR_ONE, + "the information sets about the text fields, namely a map containing pairs of fully qualified name" + + "and value for each text field to be set.") }, + new FunctionReturnSequenceType(Type.BASE64_BINARY, Cardinality.ZERO_OR_MORE, + "A new PDF file with the new metadata inserted.")); + + public SetContentMetadataFunction(XQueryContext context, FunctionSignature signature) { + super(context, signature); + } + + @Override + public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { + byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); + Serializer serializer = context.getBroker().getSerializer(); + NodeValue inputNode = (NodeValue) args[1].itemAt(0); + InputStream inputNodeStream = new NodeInputStream(serializer, inputNode); + + Sequence result = new ValueSequence(); + + ByteArrayOutputStream resultAsStreamResult = new ByteArrayOutputStream(); + + try { + BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + new ByteArrayInputStream(binary)); + + resultAsStreamResult = Metadata.run(data.getInputStream(), inputNodeStream); + + result.add(BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + new ByteArrayInputStream(resultAsStreamResult.toByteArray()))); + + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } + + return result; + } +} \ No newline at end of file From 30dd7c35e0c389731d23ee13eeabbbe8a44e11ac Mon Sep 17 00:00:00 2001 From: "W.S. Hager" Date: Fri, 9 Jan 2015 00:19:41 +0100 Subject: [PATCH 3/5] use ModuleUtils to get xml from string --- .../metadata/GetContentMetadataFunction.java | 39 +++---------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java index 4e1a050..dbb412e 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java @@ -32,12 +32,9 @@ import javax.xml.transform.stream.StreamResult; -import org.apache.commons.io.input.CloseShieldInputStream; - import org.apache.log4j.Logger; import org.exist.dom.QName; -import org.exist.memtree.DocumentBuilderReceiver; -import org.exist.memtree.MemTreeBuilder; +import org.exist.xquery.modules.ModuleUtils; import org.exist.xquery.BasicFunction; import org.exist.xquery.Cardinality; import org.exist.xquery.FunctionSignature; @@ -87,51 +84,25 @@ public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathExce Sequence result = new ValueSequence(); - StreamResult resultAsStreamResult = null; + //StreamResult resultAsStreamResult = null; + String resultAsString = null; try { byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), new ByteArrayInputStream(binary)); - resultAsStreamResult = Metadata.run(data.getInputStream()); + resultAsString = Metadata.run(data.getInputStream()); } catch (Exception ex) { throw new XPathException(ex.getMessage()); } - ByteArrayInputStream resultDocAsInputStream = null; - try { - resultDocAsInputStream = new ByteArrayInputStream(resultAsStreamResult.getWriter().toString() - .getBytes("UTF-8")); - } catch (UnsupportedEncodingException ex) { - throw new XPathException(ex.getMessage()); - } - - XMLReader reader = null; - - context.pushDocumentContext(); try { - InputSource src = new InputSource(new CloseShieldInputStream(resultDocAsInputStream)); - - reader = context.getBroker().getBrokerPool().getParserPool().borrowXMLReader(); - MemTreeBuilder builder = context.getDocumentBuilder(); - DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder, true); - reader.setContentHandler(receiver); - reader.parse(src); - Document doc = receiver.getDocument(); - - result = (NodeValue) doc; + result = (NodeValue) ModuleUtils.stringToXML(context,resultAsString); } catch (SAXException saxe) { // do nothing, we will default to trying to return a string below } catch (IOException ioe) { // do nothing, we will default to trying to return a string below - } finally { - context.popDocumentContext(); - - if (reader != null) { - context.getBroker().getBrokerPool().getParserPool().returnXMLReader(reader); - } } - return result; } } \ No newline at end of file From c8b41898d397029c9e4b9d1a1c9c461db97c9322 Mon Sep 17 00:00:00 2001 From: whager Date: Tue, 13 Jan 2015 12:23:07 +0100 Subject: [PATCH 4/5] added signature for infodoc metadata --- .../metadata/GetContentMetadataFunction.java | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java index dbb412e..b44f99f 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java @@ -21,9 +21,9 @@ package org.expath.exist.pdf.metadata; /** - * Implements the pdf:get-text-fields() function for eXist. + * Implements the get-content-metadata() function for eXist. * - * @author Claudius Teodorescu + * @author W.S. Hager */ import java.io.ByteArrayInputStream; @@ -67,13 +67,24 @@ public class GetContentMetadataFunction extends BasicFunction { private final static Logger log = Logger.getLogger(GetContentMetadataFunction.class); - public final static FunctionSignature signature = new FunctionSignature(new QName("get-content-metadata", + public final static FunctionSignature signatures[] = { + new FunctionSignature(new QName("get-content-metadata", ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), "Get the XMP metadata from a PDF contents.", new SequenceType[] { new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") }, new FunctionReturnSequenceType(Type.NODE, Cardinality.ZERO_OR_ONE, - "an XML document containing XMP metadata.")); + "an XML document containing XMP metadata.")), + new FunctionSignature(new QName("get-content-metadata", + ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), + "Get document information metadata attributes from a PDF contents.", + new SequenceType[] { new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") }, + new SequenceType[] { new FunctionParameterSequenceType("properties", Type.STRING, + Cardinality.ONE_OR_MORE, "List of properties to retrieve.") }, + new FunctionReturnSequenceType(Type.STRING, Cardinality.ONE_OR_MORE, + "a map containing document information metadata.")) + }; public GetContentMetadataFunction(XQueryContext context, FunctionSignature signature) { super(context, signature); @@ -84,25 +95,32 @@ public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathExce Sequence result = new ValueSequence(); - //StreamResult resultAsStreamResult = null; String resultAsString = null; try { byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), new ByteArrayInputStream(binary)); - resultAsString = Metadata.run(data.getInputStream()); } catch (Exception ex) { throw new XPathException(ex.getMessage()); } - - try { - result = (NodeValue) ModuleUtils.stringToXML(context,resultAsString); - } catch (SAXException saxe) { - // do nothing, we will default to trying to return a string below - } catch (IOException ioe) { - // do nothing, we will default to trying to return a string below + if (args.length == 1) { + try { + resultAsString = Metadata.get-content-xmp(data.getInputStream()); + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } + try { + result = (NodeValue) ModuleUtils.stringToXML(context,resultAsString); + } catch (SAXException saxe) { + // do nothing, we will default to trying to return a string below + } catch (IOException ioe) { + // do nothing, we will default to trying to return a string below + } + } else if (args.length == 2) { + } + return result; } } \ No newline at end of file From b9abfe76645de24b022b95ab5d5ffceba1eccdc3 Mon Sep 17 00:00:00 2001 From: whager Date: Tue, 13 Jan 2015 16:25:17 +0100 Subject: [PATCH 5/5] added additional signatures for setting/getting document information metadata --- .../exist/pdf/ExistExpathPdfModule.java | 6 +- .../metadata/GetContentMetadataFunction.java | 54 ++++++++---- .../metadata/SetContentMetadataFunction.java | 82 +++++++++++++------ 3 files changed, 100 insertions(+), 42 deletions(-) diff --git a/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java b/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java index 5452495..e405306 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java +++ b/pdf/src/main/java/org/expath/exist/pdf/ExistExpathPdfModule.java @@ -49,8 +49,10 @@ public class ExistExpathPdfModule extends AbstractInternalModule { private final static FunctionDef[] functions = { new FunctionDef(GetTextFieldsFunction.signature, GetTextFieldsFunction.class), new FunctionDef(SetTextFieldsFunction.signature, SetTextFieldsFunction.class), - new FunctionDef(GetContentMetadataFunction.signature, GetContentMetadataFunction.class), - new FunctionDef(SetContentMetadataFunction.signature, SetContentMetadataFunction.class), + new FunctionDef(GetContentMetadataFunction.signatures[0], GetContentMetadataFunction.class), + new FunctionDef(GetContentMetadataFunction.signatures[1], GetContentMetadataFunction.class), + new FunctionDef(SetContentMetadataFunction.signatures[0], SetContentMetadataFunction.class), + new FunctionDef(SetContentMetadataFunction.signatures[1], SetContentMetadataFunction.class), new FunctionDef(StampFunction.signatures[0], StampFunction.class), new FunctionDef(StampFunction.signatures[1], StampFunction.class) }; diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java index b44f99f..6b75819 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/GetContentMetadataFunction.java @@ -29,6 +29,11 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.TimeZone; +import java.text.SimpleDateFormat; +import java.text.DateFormat; import javax.xml.transform.stream.StreamResult; @@ -67,23 +72,29 @@ public class GetContentMetadataFunction extends BasicFunction { private final static Logger log = Logger.getLogger(GetContentMetadataFunction.class); - public final static FunctionSignature signatures[] = { + public final static FunctionSignature signatures[] = { new FunctionSignature(new QName("get-content-metadata", ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), "Get the XMP metadata from a PDF contents.", - new SequenceType[] { new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, - Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") }, + new SequenceType[] { + new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") + }, new FunctionReturnSequenceType(Type.NODE, Cardinality.ZERO_OR_ONE, - "an XML document containing XMP metadata.")), + "an XML document containing XMP metadata.") + ), new FunctionSignature(new QName("get-content-metadata", ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), "Get document information metadata attributes from a PDF contents.", - new SequenceType[] { new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, - Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from.") }, - new SequenceType[] { new FunctionParameterSequenceType("properties", Type.STRING, - Cardinality.ONE_OR_MORE, "List of properties to retrieve.") }, - new FunctionReturnSequenceType(Type.STRING, Cardinality.ONE_OR_MORE, - "a map containing document information metadata.")) + new SequenceType[] { + new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "PDF contents where to get the metadata from."), + new FunctionParameterSequenceType("properties", Type.STRING, + Cardinality.ZERO_OR_MORE, "List of properties to retrieve.") + }, + new FunctionReturnSequenceType(Type.STRING, Cardinality.ZERO_OR_MORE, + "a map containing document information metadata.") + ) }; public GetContentMetadataFunction(XQueryContext context, FunctionSignature signature) { @@ -94,19 +105,18 @@ public GetContentMetadataFunction(XQueryContext context, FunctionSignature signa public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { Sequence result = new ValueSequence(); - - String resultAsString = null; - + BinaryValue data = null; try { byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); - BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), new ByteArrayInputStream(binary)); } catch (Exception ex) { throw new XPathException(ex.getMessage()); } if (args.length == 1) { + String resultAsString = null; try { - resultAsString = Metadata.get-content-xmp(data.getInputStream()); + resultAsString = Metadata.getDocumentXMP(data.getInputStream()); } catch (Exception ex) { throw new XPathException(ex.getMessage()); } @@ -118,7 +128,19 @@ public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathExce // do nothing, we will default to trying to return a string below } } else if (args.length == 2) { - + ArrayList resultAsStringList = new ArrayList(); + ArrayList properties = new ArrayList(); + for(int i = 0; i < args[1].getItemCount(); i++) { + properties.add(args[1].itemAt(i).toString()); + } + try { + resultAsStringList = Metadata.getDocumentInfo(data.getInputStream(),properties); + for (String val : resultAsStringList) { + result.add(new StringValue(val)); + } + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } } return result; diff --git a/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java b/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java index cf55c1b..daee599 100644 --- a/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java +++ b/pdf/src/main/java/org/expath/exist/pdf/metadata/SetContentMetadataFunction.java @@ -21,17 +21,15 @@ package org.expath.exist.pdf.metadata; /** - * Implements the pdf:set-text-fields() function for eXist. + * Implements the pdf:set-content-metadata() function for eXist. * - * @author Claudius Teodorescu + * @author W.S. Hager */ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; +import java.util.ArrayList; import org.apache.log4j.Logger; import org.exist.dom.QName; @@ -63,17 +61,33 @@ public class SetContentMetadataFunction extends BasicFunction { private final static Logger log = Logger.getLogger(SetContentMetadataFunction.class); - public final static FunctionSignature signature = new FunctionSignature(new QName("set-content-metadata", + public final static FunctionSignature signatures[] = { + new FunctionSignature(new QName("set-content-metadata", ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), "Set the XMP metadata of a PDF contents.", new SequenceType[] { - new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, - Cardinality.ZERO_OR_ONE, "the PDF contents where to set the metadata to."), - new FunctionParameterSequenceType("text-fields", Type.NODE, Cardinality.ZERO_OR_ONE, - "the information sets about the text fields, namely a map containing pairs of fully qualified name" - + "and value for each text field to be set.") }, + new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "the PDF contents where to set the metadata to."), + new FunctionParameterSequenceType("metadata", Type.NODE, Cardinality.ZERO_OR_ONE, + "A XML document node in XMP format") + }, new FunctionReturnSequenceType(Type.BASE64_BINARY, Cardinality.ZERO_OR_MORE, - "A new PDF file with the new metadata inserted.")); - + "A new PDF file with the new metadata inserted.") + ), + new FunctionSignature(new QName("set-content-metadata", + ExistExpathPdfModule.NAMESPACE_URI, ExistExpathPdfModule.PREFIX), + "Set the document info metadata of a PDF contents.", new SequenceType[] { + new FunctionParameterSequenceType("contents", Type.BASE64_BINARY, + Cardinality.ZERO_OR_ONE, "the PDF contents where to set the metadata to."), + new FunctionParameterSequenceType("properties", Type.STRING, Cardinality.ZERO_OR_MORE, + "The property to update"), + new FunctionParameterSequenceType("values", Type.STRING, Cardinality.ZERO_OR_MORE, + "The new value") + }, + new FunctionReturnSequenceType(Type.BASE64_BINARY, Cardinality.ZERO_OR_MORE, + "A new PDF file with the new metadata inserted.") + ) + }; + public SetContentMetadataFunction(XQueryContext context, FunctionSignature signature) { super(context, signature); } @@ -81,26 +95,46 @@ public SetContentMetadataFunction(XQueryContext context, FunctionSignature signa @Override public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { byte[] binary = (byte[]) ((BinaryValue) args[0].itemAt(0)).toJavaObject(byte[].class); - Serializer serializer = context.getBroker().getSerializer(); - NodeValue inputNode = (NodeValue) args[1].itemAt(0); - InputStream inputNodeStream = new NodeInputStream(serializer, inputNode); Sequence result = new ValueSequence(); ByteArrayOutputStream resultAsStreamResult = new ByteArrayOutputStream(); - + BinaryValue data = null; + try { - BinaryValue data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + data = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), new ByteArrayInputStream(binary)); - - resultAsStreamResult = Metadata.run(data.getInputStream(), inputNodeStream); - - result.add(BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), - new ByteArrayInputStream(resultAsStreamResult.toByteArray()))); - } catch (Exception ex) { throw new XPathException(ex.getMessage()); } + + if(args.length == 2) { + Serializer serializer = context.getBroker().getSerializer(); + NodeValue inputNode = (NodeValue) args[1].itemAt(0); + InputStream inputNodeStream = new NodeInputStream(serializer, inputNode); + try { + resultAsStreamResult = Metadata.setDocumentXMP(data.getInputStream(), inputNodeStream); + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } + } else if(args.length == 3) { + ArrayList properties = new ArrayList(); + ArrayList values = new ArrayList(); + for(int i = 0; i < args[1].getItemCount(); i++) { + properties.add(args[1].itemAt(i).toString()); + } + for(int i = 0; i < args[2].getItemCount(); i++) { + values.add(args[2].itemAt(i).toString()); + } + try { + resultAsStreamResult = Metadata.setDocumentInfo(data.getInputStream(), properties, values); + } catch (Exception ex) { + throw new XPathException(ex.getMessage()); + } + } + + result.add(BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), + new ByteArrayInputStream(resultAsStreamResult.toByteArray()))); return result; }