Skip to content

Commit

Permalink
Merge pull request #138 from TAMULib/137-fedora-multipage-pdf-present…
Browse files Browse the repository at this point in the history
…ation-manifests

Implement multipage pdf support for fedora
  • Loading branch information
wwelling authored Nov 16, 2023
2 parents 664b2eb + e0d6a21 commit 13302d3
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 58 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>edu.tamu</groupId>
<artifactId>ir-iiif-service</artifactId>
<version>0.6.0-RC2</version>
<version>0.6.0-RC3</version>

<name>IR IIIF Service</name>

Expand Down
29 changes: 29 additions & 0 deletions src/main/java/edu/tamu/iiif/service/AbstractManifestService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.annotation.PostConstruct;

Expand All @@ -43,10 +44,12 @@
import de.digitalcollections.iiif.presentation.model.api.v2.Image;
import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource;
import de.digitalcollections.iiif.presentation.model.api.v2.Metadata;
import de.digitalcollections.iiif.presentation.model.api.v2.PropertyValue;
import de.digitalcollections.iiif.presentation.model.api.v2.Sequence;
import de.digitalcollections.iiif.presentation.model.api.v2.Service;
import de.digitalcollections.iiif.presentation.model.api.v2.Thumbnail;
import de.digitalcollections.iiif.presentation.model.impl.jackson.v2.IiifPresentationApiObjectMapper;
import de.digitalcollections.iiif.presentation.model.impl.v2.CanvasImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.ImageImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.ImageResourceImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.MetadataImpl;
Expand Down Expand Up @@ -332,6 +335,32 @@ protected Optional<Thumbnail> getThumbnail(List<Sequence> sequences) throws URIS
return optionalThumbnail;
}

protected Canvas getCanvasPage(Canvas canvas, int page) {
String id = canvas.getId().toString() + "?page=" + page;
PropertyValue label = new PropertyValueSimpleImpl(canvas.getLabel().getFirstValue() + "?page=" + page);
Canvas canvasPage = new CanvasImpl(id, label, canvas.getHeight(), canvas.getWidth());
canvasPage.setImages(canvas.getImages().stream().map(i -> {
Image image = new ImageImpl(i.getId().toString().replace("/info.json", ";" + page + "/info.json"));
ImageResource ir = i.getResource();
ImageResource imageResource = new ImageResourceImpl(ir.getId().toString().replace("/full/full/0/default.jpg", ";" + page + "/full/full/0/default.jpg"));
imageResource.setFormat(ir.getFormat());
imageResource.setHeight(ir.getHeight());
imageResource.setWidth(ir.getWidth());
List<Service> services = ir.getServices().stream().map(s -> {
Service service = new ServiceImpl(s.getId().toString() + ";" + page);
service.setLabel(s.getLabel());
service.setContext(s.getContext());
service.setProfile(s.getProfile());
return service;
}).collect(Collectors.toList());
imageResource.setServices(services);
image.setResource(imageResource);
image.setOn(i.getOn());
return image;
}).collect(Collectors.toList()));
return canvasPage;
}

private String getResourceId(String url) throws URISyntaxException {
String id;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,18 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.NodeIterator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;

import de.digitalcollections.iiif.presentation.model.api.v2.Canvas;
import de.digitalcollections.iiif.presentation.model.api.v2.Image;
import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource;
import de.digitalcollections.iiif.presentation.model.api.v2.PropertyValue;
import de.digitalcollections.iiif.presentation.model.api.v2.Sequence;
import de.digitalcollections.iiif.presentation.model.api.v2.Service;
import de.digitalcollections.iiif.presentation.model.impl.v2.CanvasImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.ImageImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.ImageResourceImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.PropertyValueSimpleImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.SequenceImpl;
import de.digitalcollections.iiif.presentation.model.impl.v2.ServiceImpl;
import edu.tamu.iiif.config.model.AbstractIiifConfig;
import edu.tamu.iiif.config.model.DSpaceRdfIiifConfig;
import edu.tamu.iiif.controller.ManifestRequest;
Expand Down Expand Up @@ -207,32 +200,6 @@ private List<Canvas> getCanvases(ManifestRequest request, RdfResource rdfResourc
return canvases;
}

private Canvas getCanvasPage(Canvas canvas, int page) {
String id = canvas.getId().toString() + "?page=" + page;
PropertyValue label = new PropertyValueSimpleImpl(canvas.getLabel().getFirstValue() + "?page=" + page);
Canvas canvasPage = new CanvasImpl(id, label, canvas.getHeight(), canvas.getWidth());
canvasPage.setImages(canvas.getImages().stream().map(i -> {
Image image = new ImageImpl(i.getId().toString().replace("/info.json", ";" + page + "/info.json"));
ImageResource ir = i.getResource();
ImageResource imageResource = new ImageResourceImpl(ir.getId().toString().replace("/full/full/0/default.jpg", ";" + page + "/full/full/0/default.jpg"));
imageResource.setFormat(ir.getFormat());
imageResource.setHeight(ir.getHeight());
imageResource.setWidth(ir.getWidth());
List<Service> services = ir.getServices().stream().map(s -> {
Service service = new ServiceImpl(s.getId().toString() + ";" + page);
service.setLabel(s.getLabel());
service.setContext(s.getContext());
service.setProfile(s.getProfile());
return service;
}).collect(Collectors.toList());
imageResource.setServices(services);
image.setResource(imageResource);
image.setOn(i.getOn());
return image;
}).collect(Collectors.toList()));
return canvasPage;
}

private RdfCanvas getDSpaceRdfCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws URISyntaxException, URISyntaxException {
String uri = rdfResource.getResource().getURI();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@
import java.util.List;
import java.util.Optional;

import com.fasterxml.jackson.core.JsonProcessingException;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.NodeIterator;
import org.apache.jena.rdf.model.RDFNode;
Expand All @@ -38,6 +36,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;

import com.fasterxml.jackson.core.JsonProcessingException;

import de.digitalcollections.iiif.presentation.model.api.v2.Canvas;
import de.digitalcollections.iiif.presentation.model.api.v2.ImageResource;
import de.digitalcollections.iiif.presentation.model.api.v2.Metadata;
Expand All @@ -49,6 +49,7 @@
import edu.tamu.iiif.config.model.FedoraPcdmIiifConfig;
import edu.tamu.iiif.controller.ManifestRequest;
import edu.tamu.iiif.exception.NotFoundException;
import edu.tamu.iiif.model.CanvasWithInfo;
import edu.tamu.iiif.model.OptionalImageWithInfo;
import edu.tamu.iiif.model.rdf.RdfCanvas;
import edu.tamu.iiif.model.rdf.RdfOrderedResource;
Expand All @@ -70,23 +71,21 @@ protected Sequence generateSequence(ManifestRequest request, RdfResource rdfReso
return sequence;
}

protected Canvas generateCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws IOException, URISyntaxException {
protected CanvasWithInfo generateCanvas(ManifestRequest request, RdfResource rdfResource, int page) throws IOException, URISyntaxException {
String parameterizedId = RdfModelUtility.getParameterizedId(rdfResource.getResource().getURI(), request);
PropertyValueSimpleImpl label = getLabel(rdfResource);

RdfCanvas rdfCanvas = getFedoraRdfCanvas(request, rdfResource, page);

Canvas canvas = new CanvasImpl(getFedoraIiifCanvasUri(parameterizedId), label, rdfCanvas.getHeight(), rdfCanvas.getWidth());

canvas.setImages(rdfCanvas.getImages());

List<Metadata> metadata = getMetadata(rdfResource);

if (!metadata.isEmpty()) {
canvas.setMetadata(metadata);
}
if (rdfCanvas.getImagesInfo().isEmpty()) {
return CanvasWithInfo.of(canvas, Optional.empty());
}

return canvas;
return CanvasWithInfo.of(canvas, rdfCanvas.getImagesInfo().get(0));
}

protected URI getFedoraIiifCollectionUri(String url) throws URISyntaxException {
Expand Down Expand Up @@ -190,14 +189,12 @@ private URI getFedoraIiifUri(String url, String type) throws URISyntaxException

private List<Canvas> getCanvases(ManifestRequest request, RdfResource rdfResource) throws IOException, URISyntaxException {
List<Canvas> canvases = new ArrayList<Canvas>();

Optional<String> firstId = findObject(rdfResource.getModel(), IANA_FIRST_PREDICATE);
Optional<String> lastId = findObject(rdfResource.getModel(), IANA_LAST_PREDICATE);
if (firstId.isPresent() && lastId.isPresent()) {
Resource firstResource = rdfResource.getModel().getResource(firstId.get());
generateOrderedCanvases(request, new RdfOrderedResource(rdfResource.getModel(), firstResource, firstId.get(), lastId.get()), canvases);
}

if (canvases.isEmpty()) {
NodeIterator nodes = rdfResource.getNodesOfPropertyWithId(PCDM_HAS_MEMBER_PREDICATE);
while (nodes.hasNext()) {
Expand All @@ -208,18 +205,22 @@ private List<Canvas> getCanvases(ManifestRequest request, RdfResource rdfResourc
RdfResource fileRdfResource = new RdfResource(fileModel, node.toString());

if (fileRdfResource.getResourceById(PCDM_HAS_FILE_PREDICATE) != null) {
Canvas canvas = generateCanvas(request, fileRdfResource, 0);
if (canvas.getImages().size() > 0) {
canvases.add(canvas);
CanvasWithInfo canvas = generateCanvas(request, fileRdfResource, 0);
if (canvas.getCanvas().getImages().size() > 0) {
canvases.add(canvas.getCanvas());
}
}
}
}

if (canvases.isEmpty() && rdfResource.getResourceById(PCDM_HAS_FILE_PREDICATE) != null) {
Canvas canvas = generateCanvas(request, rdfResource, 0);
if (canvas.getImages().size() > 0) {
canvases.add(canvas);
CanvasWithInfo canvasWithInfo = generateCanvas(request, rdfResource, 0);
if (canvasWithInfo.getCanvasInfo().isPresent() && canvasWithInfo.getCanvasInfo().get().has("page_count")) {
int pageCount = canvasWithInfo.getCanvasInfo().get().at("/page_count").asInt();
for (int page = 1; page <= pageCount; ++page) {
canvases.add(getCanvasPage(canvasWithInfo.getCanvas(), page));
}
} else if (canvasWithInfo.getCanvas().getImages().size() > 0) {
canvases.add(canvasWithInfo.getCanvas());
}
}

Expand All @@ -240,9 +241,9 @@ private void generateOrderedCanvases(ManifestRequest request, RdfOrderedResource

Model orderedModel = getFedoraRdfModel(id.get());

Canvas canvas = generateCanvas(request, new RdfResource(orderedModel, id.get()), 0);
if (canvas.getImages().size() > 0) {
canvases.add(canvas);
CanvasWithInfo canvasWithInfo = generateCanvas(request, new RdfResource(orderedModel, id.get()), 0);
if (canvasWithInfo.getCanvas().getImages().size() > 0) {
canvases.add(canvasWithInfo.getCanvas());
}

Optional<String> nextId = findObject(model, IANA_NEXT_PREDICATE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

import org.springframework.stereotype.Service;

import de.digitalcollections.iiif.presentation.model.api.v2.Canvas;
import edu.tamu.iiif.controller.ManifestRequest;
import edu.tamu.iiif.model.CanvasWithInfo;
import edu.tamu.iiif.model.ManifestType;
import edu.tamu.iiif.model.rdf.RdfResource;

Expand All @@ -18,8 +18,8 @@ public class FedoraPcdmCanvasManifestService extends AbstractFedoraPcdmManifestS
public String generateManifest(ManifestRequest request) throws IOException, URISyntaxException {
String context = request.getContext();
RdfResource rdfResource = getRdfResourceByContextPath(context);
Canvas canvas = generateCanvas(request, rdfResource, 0);
return mapper.writeValueAsString(canvas);
CanvasWithInfo canvasWithInfo = generateCanvas(request, rdfResource, 0);
return mapper.writeValueAsString(canvasWithInfo.getCanvas());
}

@Override
Expand Down

0 comments on commit 13302d3

Please sign in to comment.