diff --git a/modelimplementation/pom.xml b/modelimplementation/pom.xml new file mode 100644 index 000000000..faac69109 --- /dev/null +++ b/modelimplementation/pom.xml @@ -0,0 +1,36 @@ + + + + verapdf-library + org.verapdf + 1.0-SNAPSHOT + + 4.0.0 + + com.verapdf + modelimplementation + 1.0.0-SNAPSHOT + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + + + + org.apache.pdfbox + pdfbox + 2.0.0-SNAPSHOT + + + org.verapdf + pdfmodel + 0.0.1-SNAPSHOT + + + + \ No newline at end of file diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosArrayFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosArrayFactory.java new file mode 100644 index 000000000..1064e5ce6 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosArrayFactory.java @@ -0,0 +1,41 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSArray; +import org.verapdf.impl.pb.PBCosArray; +import org.verapdf.impl.pb.PBCosObject; +import org.verapdf.model.coslayer.CosArray; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Class for transforming COSArray of pdfbox to CosArray of abstract model. + *

+ */ +class PBCosArrayFactory implements PBCosFactory { + + /** + * Method for transforming COSArray to corresponding CosArray + */ + @Override + public CosArray generateCosObject(COSArray pdfBoxObject) { + return new PBCosArray(pdfBoxObject); + } + + /** + * Method for transforming COSArray to corresponding CosArray. Also takes into account already + * exists objects. + */ + @Override + public CosArray generateCosObject(List parents, COSArray pdfBoxObject) { + for (CosObject object : parents) + if (((PBCosObject)object).compareTo(pdfBoxObject)) + return (CosArray) object; + + CosArray array = generateCosObject(pdfBoxObject); + parents.add(array); + return array; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosBoolFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosBoolFactory.java new file mode 100644 index 000000000..99708abaa --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosBoolFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSBoolean; +import org.verapdf.model.coslayer.CosBool; +import org.verapdf.impl.pb.PBCosBool; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Class for transforming COSBoolean of pdfbox to CosBool of abstract model. + *

+ */ +class PBCosBoolFactory implements PBCosFactory { + + /** Method for transforming COSBoolean to corresponding CosBool + */ + @Override + public CosBool generateCosObject(COSBoolean pdfBoxObject) { + return new PBCosBool(pdfBoxObject); + } + + /** Method for transforming COSBoolean to corresponding CosBool. Not takes into account already + * exists objects. + */ + @Override + public CosBool generateCosObject(List parents, COSBoolean pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDictFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDictFactory.java new file mode 100644 index 000000000..b7a4275ca --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDictFactory.java @@ -0,0 +1,41 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSDictionary; +import org.verapdf.impl.pb.PBCosObject; +import org.verapdf.model.coslayer.CosDict; +import org.verapdf.impl.pb.PBCosDict; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/29/15. + *

+ * Class for transforming COSDictionary of pdfbox to CosDict of abstract model. + *

+ */ +class PBCosDictFactory implements PBCosFactory { + + /** + * Method for transforming COSDictionary to corresponding CosDict + */ + @Override + public CosDict generateCosObject(COSDictionary pdfBoxObject) { + return new PBCosDict(pdfBoxObject); + } + + /** + * Method for transforming COSDictionary to corresponding CosDict. Also takes into account already + * exists objects. + */ + @Override + public CosDict generateCosObject(List parents, COSDictionary pdfBoxObject) { + for (CosObject object : parents) + if (((PBCosObject)object).compareTo(pdfBoxObject)) + return (CosDict) object; + + CosDict dictionary = generateCosObject(pdfBoxObject); + parents.add(dictionary); + return dictionary; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDocumentFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDocumentFactory.java new file mode 100644 index 000000000..d2ecb409d --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosDocumentFactory.java @@ -0,0 +1,34 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSDocument; +import org.verapdf.impl.pb.PBCosDocument; +import org.verapdf.model.coslayer.CosDocument; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 5/4/15. + *

+ * Class for transforming COSDocument of pdf box to CosDocument of abstract model. + *

+ */ +class PBCosDocumentFactory implements PBCosFactory { + + /** + * Method for transforming COSDocument to corresponding CosDocument + */ + @Override + public CosDocument generateCosObject(COSDocument pdfBoxObject) { + return new PBCosDocument(pdfBoxObject); + } + + /** + * Method for transforming COSDocument to corresponding CosDocument. Also takes into account already + * exists objects. + */ + @Override + public CosDocument generateCosObject(List parents, COSDocument pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosFactory.java new file mode 100644 index 000000000..1f51c8d17 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosFactory.java @@ -0,0 +1,24 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSBase; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Interface which define transforming specific pdfbox object`s to specific object of + * abstract model. + *

+ */ +interface PBCosFactory { + + /** Interface of method for transforming specific S type to corresponding T type + */ + T generateCosObject(S pdfBoxObject); + + /** Interface of method for transforming specific S type to corresponding T type with parents check + */ + T generateCosObject(List parents, S pdfBoxObject); +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIndirectFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIndirectFactory.java new file mode 100644 index 000000000..ed9920018 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIndirectFactory.java @@ -0,0 +1,39 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSBase; +import org.verapdf.impl.pb.PBCosObject; +import org.verapdf.model.coslayer.CosIndirect; +import org.verapdf.impl.pb.PBCosIndirect; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/29/15. + *

+ * Class for transforming COSIndirect of pdfbox to CosInteger of abstract model. + *

+ */ +class PBCosIndirectFactory implements PBCosFactory { + // TODO : check spacings + /** Method for transforming COSObject to corresponding CosIndirect + */ + @Override + public CosIndirect generateCosObject(COSBase pdfBoxObject) { + return new PBCosIndirect(pdfBoxObject, true); + } + + /** Method for transforming COSObject to corresponding CosIndirect. Also takes into account already + * exists objects. + */ + @Override + public CosIndirect generateCosObject(List parents, COSBase pdfBoxObject) { + for (CosObject object : parents) + if (((PBCosObject)object).compareTo(pdfBoxObject)) + return (CosIndirect) object; + + CosIndirect indirect = generateCosObject(pdfBoxObject); + parents.add(indirect); + return indirect; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIntegerFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIntegerFactory.java new file mode 100644 index 000000000..a6bf85753 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosIntegerFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSInteger; +import org.verapdf.model.coslayer.CosInteger; +import org.verapdf.impl.pb.PBCosInteger; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Class for transforming COSInteger of pdfbox to CosInteger of abstract model. + *

+ */ +class PBCosIntegerFactory implements PBCosFactory { + + /** Method for transforming COSInteger to corresponding CosInteger + */ + @Override + public CosInteger generateCosObject(COSInteger pdfBoxObject) { + return new PBCosInteger(pdfBoxObject); + } + + /** Method for transforming COSInteger to corresponding CosInteger. Not takes into account already + * exists objects. + */ + @Override + public CosInteger generateCosObject(List parents, COSInteger pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNameFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNameFactory.java new file mode 100644 index 000000000..fe2802bc3 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNameFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSName; +import org.verapdf.model.coslayer.CosName; +import org.verapdf.impl.pb.PBCosName; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Class for transforming COSName of pdfbox to CosName of abstract model. + *

+ */ +class PBCosNameFactory implements PBCosFactory { + + /** Method for transforming COSName to corresponding CosName + */ + @Override + public CosName generateCosObject(COSName pdfBoxObject) { + return new PBCosName(pdfBoxObject); + } + + /** Method for transforming COSName to corresponding CosName. Not takes into account already + * exists objects. + */ + @Override + public CosName generateCosObject(List parents, COSName pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNullFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNullFactory.java new file mode 100644 index 000000000..464d5670e --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosNullFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSNull; +import org.verapdf.model.coslayer.CosNull; +import org.verapdf.impl.pb.PBCosNull; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Class for transforming COSNull of pdfbox to CosNull of abstract model. + *

+ */ +class PBCosNullFactory implements PBCosFactory { + + /** Method for transforming COSNull to corresponding CosNull + */ + @Override + public CosNull generateCosObject(COSNull pdfBoxObject) { + return PBCosNull.NULL; + } + + /** Method for transforming COSNull to corresponding CosNull. Not takes into account already + * exists objects. + */ + @Override + public CosNull generateCosObject(List parents, COSNull pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosObjectFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosObjectFactory.java new file mode 100644 index 000000000..7a1eb43c5 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosObjectFactory.java @@ -0,0 +1,39 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSBase; +import org.verapdf.model.coslayer.CosObject; +import org.verapdf.impl.pb.PBCosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Class for transforming COSBase of pdfbox to CosObject of abstract model. + * This factory describe case when object of pdfbox model is empty. + *

+ */ +class PBCosObjectFactory implements PBCosFactory { + + /** Method for transforming COSBase to corresponding CosObject + */ + @Override + public CosObject generateCosObject(COSBase pdfBoxObject) { + return new PBCosObject(pdfBoxObject); + } + + /** + * Method for transforming COSBase to corresponding CosObject. Also takes into account already + * exists objects. + */ + @Override + public CosObject generateCosObject(List parents, COSBase pdfBoxObject) { + for (CosObject object : parents) + if (((PBCosObject)object).compareTo(pdfBoxObject)) + return object; + + CosObject object = generateCosObject(pdfBoxObject); + parents.add(object); + return object; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosRealFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosRealFactory.java new file mode 100644 index 000000000..38d24a793 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosRealFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSFloat; +import org.verapdf.model.coslayer.CosObject; +import org.verapdf.model.coslayer.CosReal; +import org.verapdf.impl.pb.PBCosReal; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Class for transforming COSFloat of pdfbox to CosReal of abstract model. + *

+ */ +class PBCosRealFactory implements PBCosFactory { + + /** Method for transforming COSFloat to corresponding CosReal + */ + @Override + public CosReal generateCosObject(COSFloat pdfBoxObject) { + return new PBCosReal(pdfBoxObject); + } + + /** Method for transforming COSFloat to corresponding CosReal. Not takes into account already + * exists objects. + */ + @Override + public CosReal generateCosObject(List parents, COSFloat pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStreamFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStreamFactory.java new file mode 100644 index 000000000..864c92fa4 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStreamFactory.java @@ -0,0 +1,39 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSStream; +import org.verapdf.impl.pb.PBCosStream; +import org.verapdf.model.coslayer.CosObject; +import org.verapdf.model.coslayer.CosStream; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 5/4/15. + *

+ * Class for transforming COSStream of pdfbox to CosStream of abstract model. + *

+ */ +class PBCosStreamFactory implements PBCosFactory { + + /** Method for transforming COSStream to corresponding CosStream + */ + @Override + public CosStream generateCosObject(COSStream pdfBoxObject) { + return new PBCosStream(pdfBoxObject); + } + + /** + * Method for transforming COSStream to corresponding CosStream. Also takes into account already + * exists objects. + */ + @Override + public CosStream generateCosObject(List parents, COSStream pdfBoxObject) { + for (CosObject object : parents) + if (object.equals(pdfBoxObject)) + return (CosStream) object; + + CosStream stream = generateCosObject(pdfBoxObject); + parents.add(stream); + return stream; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStringFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStringFactory.java new file mode 100644 index 000000000..6520f6075 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosStringFactory.java @@ -0,0 +1,32 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSString; +import org.verapdf.model.coslayer.CosObject; +import org.verapdf.model.coslayer.CosString; +import org.verapdf.impl.pb.PBCosString; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Class for transforming COSString of pdfbox to CosString of abstract model. + *

+ */ +class PBCosStringFactory implements PBCosFactory { + + /** Method for transforming COSString to corresponding CosString + */ + @Override + public CosString generateCosObject(COSString pdfBoxObject) { + return new PBCosString(pdfBoxObject, pdfBoxObject.getForceHexForm()); + } + + /** Method for transforming COSString to corresponding CosString. Not takes into account already + * exists objects. + */ + @Override + public CosString generateCosObject(List parents, COSString pdfBoxObject) { + return generateCosObject(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosTrailerFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosTrailerFactory.java new file mode 100644 index 000000000..0af2b2774 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBCosTrailerFactory.java @@ -0,0 +1,40 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.COSDictionary; +import org.verapdf.impl.pb.PBCosTrailer; +import org.verapdf.model.coslayer.CosObject; +import org.verapdf.model.coslayer.CosTrailer; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 5/1/15. + *

+ * Class for transforming trailer of pdf document to CosTrailer of abstract model. + * In pdf box trailer is representing by COSDictionary and gets with specified method of COSDocument + *

+ */ +class PBCosTrailerFactory implements PBCosFactory { + + /** Method for transforming COSDictionary to corresponding CosTrailer + */ + @Override + public CosTrailer generateCosObject(COSDictionary pdfBoxObject) { + return new PBCosTrailer(pdfBoxObject); + } + + /** + * Method for transforming COSDictionary to corresponding CosTrailer. Also takes into account already + * exists objects. + */ + @Override + public CosTrailer generateCosObject(List parents, COSDictionary pdfBoxObject) { + for (CosObject object : parents) + if (object.equals(pdfBoxObject)) + return (CosTrailer) object; + + CosTrailer trailer = generateCosObject(pdfBoxObject); + parents.add(trailer); + return trailer; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/factory/cos/PBFactory.java b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBFactory.java new file mode 100644 index 000000000..2f5869198 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/factory/cos/PBFactory.java @@ -0,0 +1,96 @@ +package org.verapdf.factory.cos; + +import org.apache.pdfbox.cos.*; +import org.verapdf.model.coslayer.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Factory class for transforming objects of pdfbox to objects for abstract model. + *

+ */ +public final class PBFactory { + + private final static Map undefinedType = new HashMap(); + private final static Map definedType = new HashMap(); + + private PBFactory(){} + + /** This method transform some pdf box object to correspond object of abstract model + */ + public static CosObject generateCosObject(COSBase object) { + return generateCosObject(object, new ArrayList()); + } + + /** This method transform some pdf box object to correspond object of abstract model + * with taking into account the parents + */ + public static CosObject generateCosObject(COSBase object, List parents) { + PBCosFactory factory = undefinedType.get(object.getClass()); + return generateCosObject(object, factory, parents); + } + + /** This method transform some pdf box object to specific object of abstract model + */ + public static CosObject generateCosObject(Class type, COSBase object) { + return generateCosObject(type, object, new ArrayList()); + } + + /** This method transform some pdf box object to specific object of abstract model + * with taking into account the parents + */ + public static CosObject generateCosObject(Class type, COSBase object, List parents) { + PBCosFactory factory = definedType.get(type); + return generateCosObject(object, factory, parents); + } + + /** This method transform given pdf box object to specific CosObject + * determine by factory and taking into account the parents + */ + private static CosObject generateCosObject(COSBase object, PBCosFactory factory, List parents) { + if (factory == null) + throw new IllegalArgumentException("Unknown type of object: " + object.getClass() + ". Maybe current type" + + " not supported yet."); + + CosObject result = parents != null ? factory.generateCosObject(parents, object) : factory.generateCosObject(object); + if (result != null) + return result; + throw new IllegalArgumentException("Can`t transform PDFBOX`s object: " + object.getClass()); + } + + static { + undefinedType.put(COSBase.class, new PBCosObjectFactory()); + undefinedType.put(COSObject.class, new PBCosIndirectFactory()); + undefinedType.put(COSDictionary.class, new PBCosDictFactory()); + undefinedType.put(COSStream.class, new PBCosStreamFactory()); + undefinedType.put(COSDocument.class, new PBCosDocumentFactory()); + undefinedType.put(COSArray.class, new PBCosArrayFactory()); + undefinedType.put(COSNull.class, new PBCosNullFactory()); + undefinedType.put(COSBoolean.class, new PBCosBoolFactory()); + undefinedType.put(COSString.class, new PBCosStringFactory()); + undefinedType.put(COSFloat.class, new PBCosRealFactory()); + undefinedType.put(COSInteger.class, new PBCosIntegerFactory()); + undefinedType.put(COSName.class, new PBCosNameFactory()); + } + + static { + definedType.put(CosObject.class, new PBCosObjectFactory()); + definedType.put(CosIndirect.class, new PBCosIndirectFactory()); + definedType.put(CosDict.class, new PBCosDictFactory()); + definedType.put(CosStream.class, new PBCosStreamFactory()); + definedType.put(CosDocument.class, new PBCosDocumentFactory()); + definedType.put(CosTrailer.class, new PBCosTrailerFactory()); + definedType.put(CosArray.class, new PBCosArrayFactory()); + definedType.put(CosNull.class, new PBCosNullFactory()); + definedType.put(CosBool.class, new PBCosBoolFactory()); + definedType.put(CosString.class, new PBCosStringFactory()); + definedType.put(CosReal.class, new PBCosRealFactory()); + definedType.put(CosInteger.class, new PBCosIntegerFactory()); + definedType.put(CosName.class, new PBCosNameFactory()); + } +} \ No newline at end of file diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosArray.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosArray.java new file mode 100644 index 000000000..c27f390f5 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosArray.java @@ -0,0 +1,52 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSArray; +import org.apache.pdfbox.cos.COSBase; +import org.verapdf.factory.cos.PBFactory; +import org.verapdf.model.baselayer.Object; +import org.verapdf.model.coslayer.CosArray; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Current class is representation of CosArray interface of abstract model. + * This class is analogue of COSArray in pdfbox. + *

+ */ +public class PBCosArray extends PBCosObject implements CosArray { + + private final static String ELEMENTS = "elements"; + + public PBCosArray(COSArray array) { + super(array); + } + + /** + * Getter for array size. + * @return size of array + */ + @Override + public Integer getsize() { + return ((COSArray)baseObject).size(); + } + + @Override + public List getLinkedObjects(String s) { + if (s.equals(ELEMENTS)) + return getelements(); + throw new IllegalArgumentException("Unknown link " + s + " for " + get_type()); + } + /** + * Get all elements of array. + * @return elements of array + */ + protected List getelements() { + List list = new ArrayList<>(getsize()); + for (COSBase base : ((COSArray)baseObject)) + list.add(PBFactory.generateCosObject(base)); + return list; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosBool.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosBool.java new file mode 100644 index 000000000..534f73fbd --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosBool.java @@ -0,0 +1,25 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSBoolean; +import org.verapdf.model.coslayer.CosBool; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Current class is representation of CosBool interface of abstract model. + * This class is analogue of COSBoolean in pdfbox. + *

+ */ +public class PBCosBool extends PBCosObject implements CosBool { + + public PBCosBool(COSBoolean bool) { + super(bool); + } + + /**Get value of this object + */ + @Override + public Boolean getvalue() { + return ((COSBoolean)baseObject).getValue(); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDict.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDict.java new file mode 100644 index 000000000..aca0033ac --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDict.java @@ -0,0 +1,82 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSBase; +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSName; +import org.verapdf.factory.cos.PBFactory; +import org.verapdf.model.baselayer.Object; +import org.verapdf.model.coslayer.CosDict; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/29/15. + *

+ * Current class is representation of CosDict interface of abstract model. + * This class is analogue of COSDictionary in pdfbox. + *

+ */ +public class PBCosDict extends PBCosObject implements CosDict { + + private final static String KEYS = "keys"; + private final static String VALUES = "values"; + private final static String METADATA = "metadata"; + + public PBCosDict(COSDictionary dictionary) { + super(dictionary); + } + + /**Get number of key/value pairs in the dictionary + */ + @Override + public Integer getsize() { + return ((COSDictionary)baseObject).size(); + } + + @Override + public List getLinkedObjects(String s) { + List list; + switch (s) { + case KEYS: + list = getkeys(); + break; + case VALUES: + list = getvalues(); + break; + case METADATA: + list = getmetadata(); + break; + default: + throw new IllegalArgumentException("Unknown link " + s + " for " + get_type()); + } + + return list; + } + + /** Get all keys of the dictonary + */ + protected List getkeys() { + List list = new ArrayList<>(getsize()); + for (COSName key : ((COSDictionary)baseObject).keySet()) + list.add(PBFactory.generateCosObject(key)); + return list; + } + + /** Get all values of the dictonary + */ + protected List getvalues() { + List list = new ArrayList<>(getsize()); + for (COSBase value : ((COSDictionary)baseObject).getValues()) + list.add(PBFactory.generateCosObject(value)); + return list; + } + + /** Get XMP metadata if it is present + */ + // TODO : metadata support + protected List getmetadata() { + System.err.println("Current version not support metadata handler yet. Result is null."); + return null; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDocument.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDocument.java new file mode 100644 index 000000000..44c787650 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosDocument.java @@ -0,0 +1,102 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSBase; +import org.apache.pdfbox.cos.COSDocument; +import org.verapdf.factory.cos.PBFactory; +import org.verapdf.model.baselayer.Object; +import org.verapdf.model.coslayer.CosDocument; +import org.verapdf.model.coslayer.CosIndirect; +import org.verapdf.model.coslayer.CosTrailer; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 5/4/15. + *

+ * Low-level PDF Document object + *

+ */ +public class PBCosDocument extends PBCosObject implements CosDocument { + + private final static String TRAILER = "trailer"; + private final static String INDIRECT_OBJECTS = "indirectObjects"; + private final static String DOCUMENT = "document"; + + private Integer sizeOfDocument; + + public PBCosDocument(COSDocument baseObject) { + super(baseObject); + } + + /** Number of indirect objects in the document + */ + @Override + public Integer getnrIndirects() { + return ((COSDocument)baseObject).getObjects().size(); + } + + /** Size of the byte sequence representing the document + */ + @Override + public Integer getsize() { + return sizeOfDocument; + } + + @Override + public List getLinkedObjects(String s) { + List list; + switch (s) { + case TRAILER: + list = gettrailer(); + break; + case INDIRECT_OBJECTS: + list = getindirectObjects(); + break; + case DOCUMENT: + list = getdocument(); + break; + default: + throw new IllegalArgumentException("Unknown link " + s + " for " + get_type()); + } + + return list; + } + + /** trailer dictionary + */ + protected List gettrailer() { + List trailer = new ArrayList<>(); + trailer.add(PBFactory.generateCosObject(CosTrailer.class, ((COSDocument) baseObject).getTrailer())); + return trailer; + } + + /** all indirect objects referred from the xref table + */ + protected List getindirectObjects() { + List indirects = new ArrayList<>(); + for (COSBase object : ((COSDocument)baseObject).getObjects()) + indirects.add(PBFactory.generateCosObject(CosIndirect.class, object)); + return indirects; + } + + /** true if the second line of the document is a comment with at least 4 symbols in the code range 128-255 as required by PDF/A standard + */ + @Override + public Boolean getbinaryHeaderComplyPDFA() { + ((COSDocument)baseObject).getVersion(); + return null; + } + + /** link to the high-level PDF Document structure + */ + protected List getdocument() { + System.err.println("Trying get PDDocument from CosDocument.\r\n" + + "Current feature not supported yet. Method always return null."); + return null; + } + + public void setSizeOfDocument(Integer sizeOfDocument) { + this.sizeOfDocument = sizeOfDocument; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosIndirect.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosIndirect.java new file mode 100644 index 000000000..977138d3b --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosIndirect.java @@ -0,0 +1,73 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSBase; +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSObject; +import org.verapdf.factory.cos.PBFactory; +import org.verapdf.model.baselayer.Object; +import org.verapdf.model.coslayer.CosIndirect; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Current class is representation of CosIndirect interface of abstract model. + * This class is analogue of COSObject in pdfbox. + *

+ */ +public class PBCosIndirect extends PBCosObject implements CosIndirect { + + private final static String DIRECT_OBJECT = "directObject"; + private boolean isSpacingComplyPDFA; + + public PBCosIndirect(COSBase directObject,boolean isSpacingComplyPDFA) { + super(directObject); + this.isSpacingComplyPDFA = isSpacingComplyPDFA; + } + + @Override + public List getLinkedObjects(String s) { + List list; + switch (s) { + case DIRECT_OBJECT: + list = getdirectObject(); + break; + default: + throw new IllegalArgumentException("Unknown link " + s + " for " + get_type()); + } + + return list; + } + + /** Get the direct contents of the indirect object + */ + protected List getdirectObject() { + List list = new ArrayList<>(); + COSBase base = baseObject instanceof COSObject ? ((COSObject) baseObject).getObject() : baseObject; + list.add(PBFactory.generateCosObject(base)); + return list; + } + + /** true if the words 'obj' and 'endobj' are surrounded by the correct spacings according to PDF/A standard + */ + @Override + public Boolean getspacingComplyPDFA() { + return isSpacingComplyPDFA; + } + + @Override + public boolean compareTo(java.lang.Object o) { + boolean isEquals; + + if (o instanceof COSObject && baseObject instanceof COSDictionary) + isEquals = ((COSObject) o).getObject().equals(baseObject); + else if (o instanceof COSDictionary && baseObject instanceof COSObject) + isEquals = o.equals(((COSObject) baseObject).getObject()); + else + isEquals = super.compareTo(o); + + return isEquals; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosInteger.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosInteger.java new file mode 100644 index 000000000..56c501297 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosInteger.java @@ -0,0 +1,20 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSInteger; +import org.verapdf.model.coslayer.CosInteger; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Current class is representation of CosInteger interface of abstract model. + * All methods described in CosNumber. This class is analogue of COSInteger in pdfbox. + *

+ * + * @see org.verapdf.impl.pb.PBCosNumber + */ +public class PBCosInteger extends PBCosNumber implements CosInteger { + + public PBCosInteger(COSInteger value) { + super(value); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosName.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosName.java new file mode 100644 index 000000000..dc9a49f99 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosName.java @@ -0,0 +1,35 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSName; +import org.verapdf.model.coslayer.CosName; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Current class is representation of CosName interface of abstract model. + * This class is analogue of COSName in pdfbox. + *

+ */ +public class PBCosName extends PBCosObject implements CosName { + + public PBCosName(COSName value) { + super(value); + } + + /** Get Unicode string representation of the Name object after applying escape + * mechanism and converting to Unicode using Utf8 encoding + */ + @Override + public String getvalue() { + return ((COSName)baseObject).getName(); + } + + /** Get original length of the name before applying any escape mechanisms and encodings + */ + //TODO : update pdfbox (field in COSName and parser) for saving orig length of name + @Override + public Integer getorigLength() { + System.err.println("Length of name is not correct. Need to update classes of pdfbox."); + return ((COSName)baseObject).getName().length(); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNull.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNull.java new file mode 100644 index 000000000..b0d6cfc9d --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNull.java @@ -0,0 +1,27 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSNull; +import org.verapdf.model.coslayer.CosNull; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Current class is representation of CosNull interface of abstract model. + * This class is analogue of COSNull in pdfbox. + *

+ */ +public final class PBCosNull extends PBCosObject implements CosNull { + + /** PDF null object + */ + public final static CosNull NULL = new PBCosNull(COSNull.NULL); + + private PBCosNull(COSNull nil) { + super(nil); + } + + @Override + public boolean equals(Object o) { + return o instanceof CosNull; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNumber.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNumber.java new file mode 100644 index 000000000..c540408fc --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosNumber.java @@ -0,0 +1,45 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSNumber; +import org.verapdf.model.coslayer.CosNumber; + +import java.math.BigDecimal; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Current class is representation of CosNumber interface of abstract model. + * Methods of this class using in PBCosInteger and PBCosReal. + * This class is analogue of COSNumber in pdfbox. + *

+ * + * @see org.verapdf.impl.pb.PBCosInteger + * @see org.verapdf.impl.pb.PBCosReal + */ +public abstract class PBCosNumber extends PBCosObject implements CosNumber { + + protected PBCosNumber(COSNumber number) { + super(number); + } + + /** Get the string representing this object + */ + @Override + public String getstringValue() { + return ((COSNumber)baseObject).doubleValue() + ""; + } + + /** Get truncated integer value + */ + @Override + public Integer getintValue() { + return ((COSNumber)baseObject).intValue(); + } + + /** Get original decimal value + */ + @Override + public BigDecimal getrealValue() { + return new BigDecimal(((COSNumber)baseObject).doubleValue()); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosObject.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosObject.java new file mode 100644 index 000000000..3c640d011 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosObject.java @@ -0,0 +1,71 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSBase; +import org.verapdf.model.ModelHelper; +import org.verapdf.model.baselayer.Object; +import org.verapdf.tools.IDGenerator; +import org.verapdf.model.coslayer.CosObject; + +import java.util.List; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + *

+ * Current class is representation of CosObject interface of abstract model. + * This class is analogue of COSBase in pdfbox. + *

+ */ +public class PBCosObject implements CosObject{ + + protected COSBase baseObject; + private String id = IDGenerator.generateID(); + + public PBCosObject(COSBase baseObject) { + this.baseObject = baseObject; + } + + // TODO : wait ModelHelper realization + @Override + public List getLinkedObjects(String s) { + return null; + } + + @Override + public List getLinks() { + //return ModelHelper.getListOfLinks(get_type); + return null; + } + + @Override + public List getProperties() { + //return ModelHelper.getListOfProperties(get_type); + return null; + } + + @Override + public List getSuperTypes() { + //return ModelHelper.getListOfSuperNames(get_type); + return null; + } + + /** Get type of current object + */ + @Override + public String get_type() { + return this.getClass().getInterfaces()[0].getName(); + } + + /** Get personal id of current object + */ + @Override + public String get_id() { + return id; + } + + public boolean compareTo(java.lang.Object o) { + if (o instanceof COSBase) + return baseObject.equals(o); + else + return o instanceof CosObject && o.equals(baseObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosReal.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosReal.java new file mode 100644 index 000000000..7f8284fb6 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosReal.java @@ -0,0 +1,20 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSFloat; +import org.verapdf.model.coslayer.CosReal; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Current class is representation of CosReal interface of abstract model. + * All methods described in CosNumber. This class is analogue of COSFloat in pdfbox. + *

+ * + * @see org.verapdf.impl.pb.PBCosNumber + */ +public class PBCosReal extends PBCosNumber implements CosReal { + + public PBCosReal(COSFloat value) { + super(value); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosStream.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosStream.java new file mode 100644 index 000000000..060f3bdba --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosStream.java @@ -0,0 +1,66 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.*; +import org.verapdf.model.coslayer.CosStream; + +import java.io.IOException; + +/** + * Created by Evgeniy Muravitskiy on 5/4/15. + *

+ * PDF Stream type + *

+ */ +public class PBCosStream extends PBCosDict implements CosStream { + + public PBCosStream(COSStream stream) { + super(stream); + } + + /** length of the stream + */ + @Override + public Integer getlength() { + int length = 0; + if (((COSStream) baseObject).getItem(COSName.LENGTH) != null) + return ((COSInteger) ((COSStream) baseObject).getItem(COSName.LENGTH)).intValue(); + try { + if (((COSStream) baseObject).getUnfilteredStream() != null) + length = (((COSStream) baseObject).getUnfilteredStream()).available(); + if (((COSStream) baseObject).getFilteredStream() != null) + length += ((COSStream) baseObject).getFilteredLength(); + } catch (IOException ignore) {} + return length; + } + + /** concatenated (white space separated) names of all filters + */ + @Override + public String getfilters() { + String filters = ""; + COSBase base = ((COSStream) baseObject).getFilters(); + if (base == null) + return null; + + if (base instanceof COSName) { + filters = ((COSName)base).getName(); + } else if (base instanceof COSArray) { + for (COSBase filter : ((COSArray) base)) { + if (filter instanceof COSName) + filters += ((COSName) filter).getName() + " "; + else + throw new IllegalArgumentException("Can`t find filters for stream"); + } + } else + throw new IllegalArgumentException("Not the corresponding type for filters"); + return filters.substring(0, filters.length() - 2); + } + + /** true if the spacing around stream / endstream complies with the PDF/A requirements + */ + @Override + public Boolean getspacingComplyPDFA() { + System.err.println("Current feature not supported yet. Result is always true."); + return true; + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosString.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosString.java new file mode 100644 index 000000000..111eab65d --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosString.java @@ -0,0 +1,46 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSString; +import org.apache.pdfbox.util.Charsets; +import org.verapdf.model.coslayer.CosString; + +/** + * Created by Evgeniy Muravitskiy on 4/28/15. + *

+ * Current class is representation of CosString interface of abstract model. + * This class is analogue of COSString in pdfbox. + *

+ */ +public class PBCosString extends PBCosObject implements CosString{ + + private boolean isHex; + + public PBCosString(COSString value, boolean isHex) { + super(value); + this.isHex = isHex; + } + + /** Get Unicode string value stored in the PDF object + */ + @Override + public String getvalue() { + return ((COSString)baseObject).getString(); + } + + /** true if the string is stored in Hex format + */ + //TODO : rewrite COSString for features below. now work not correctly + @Override + public Boolean getisHex() { + return isHex; + } + + /** Get original string value of the string before applying Hex decoding + * and any encodings (but after ignoring all white spaces) + */ + @Override + public String getorigValue() { + System.err.println("Original value of string is not correct. Need to update classes of pdfbox."); + return new String(((COSString)baseObject).getBytes()); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosTrailer.java b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosTrailer.java new file mode 100644 index 000000000..666edf291 --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/impl/pb/PBCosTrailer.java @@ -0,0 +1,17 @@ +package org.verapdf.impl.pb; + +import org.apache.pdfbox.cos.COSDictionary; +import org.verapdf.model.coslayer.CosTrailer; + +/** + * Created by Evgeniy Muravitskiy on 5/1/15. + *

+ * Trailer of the document. It has the same behavior as the PBCosDict. + *

+ */ +public class PBCosTrailer extends PBCosDict implements CosTrailer { + + public PBCosTrailer(COSDictionary pdfBoxObject) { + super(pdfBoxObject); + } +} diff --git a/modelimplementation/src/main/java/org/verapdf/tools/IDGenerator.java b/modelimplementation/src/main/java/org/verapdf/tools/IDGenerator.java new file mode 100644 index 000000000..a1bacbc5d --- /dev/null +++ b/modelimplementation/src/main/java/org/verapdf/tools/IDGenerator.java @@ -0,0 +1,18 @@ +package org.verapdf.tools; + +/** + * Created by Evgeniy Muravitskiy on 4/27/15. + * + * This class specified for creating unique ID`s for every object + * from model + */ +public final class IDGenerator { + + private static Integer id = 0; + + private IDGenerator(){} + + public static String generateID() { + return "id" + id++; + } +}