Skip to content

Commit

Permalink
Extract page number from image src URIs
Browse files Browse the repository at this point in the history
When PDFs are included as images, optionally specify the page number
as a URI fragment in the form "page=<number>".
This follows the convention specified in RFC 3778 [1].

[1] https://tools.ietf.org/html/rfc3778
  • Loading branch information
Jakob Odersky committed Nov 6, 2017
1 parent 66e16bf commit 0d1bb7d
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -850,14 +850,16 @@ public void drawImage(FSImage fsImage, int x, int y) {
private void drawPDFAsImage(PDFAsImage image, int x, int y) {
URI uri = image.getURI();
PdfReader reader = null;
int pageNumber = 1;

try {
reader = getReader(uri);
pageNumber = PDFAsImage.pageNumberFromURI(uri);
} catch (IOException e) {
throw new XRRuntimeException("Could not load " + uri + ": " + e.getMessage(), e);
}

PdfImportedPage page = getWriter().getImportedPage(reader, 1);
PdfImportedPage page = getWriter().getImportedPage(reader, pageNumber);

AffineTransform at = AffineTransform.getTranslateInstance(x, y);
at.translate(0, image.getHeightAsFloat());
Expand All @@ -880,10 +882,10 @@ private void drawPDFAsImage(PDFAsImage image, int x, int y) {
}

public PdfReader getReader(URI uri) throws IOException {
PdfReader result = (PdfReader) _readerCache.get(uri);
PdfReader result = (PdfReader) _readerCache.get(uri.getPath());
if (result == null) {
result = new PdfReader(getSharedContext().getUserAgentCallback().getBinaryResource(uri.toString()));
_readerCache.put(uri, result);
_readerCache.put(uri.getPath(), result);
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public ImageResource getImageResource(String uriStr) {
URI uri = new URI(uriStr);
PdfReader reader = _outputDevice.getReader(uri);
PDFAsImage image = new PDFAsImage(uri);
Rectangle rect = reader.getPageSizeWithRotation(1);
Rectangle rect = reader.getPageSizeWithRotation(PDFAsImage.pageNumberFromURI(uri));
image.setInitialWidth(rect.getWidth() * _outputDevice.getDotsPerPoint());
image.setInitialHeight(rect.getHeight() * _outputDevice.getDotsPerPoint());
resource = new ImageResource(uriStr, image);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

import java.net.URI;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.xhtmlrenderer.extend.FSImage;

Expand Down Expand Up @@ -110,5 +112,17 @@ public float scaleHeight() {
public float scaleWidth() {
return _width / _unscaledWidth;
}


private static Pattern pageUriPattern = Pattern.compile("page=(\\d+)");

public static int pageNumberFromURI(URI uri) {
String fragment = uri.getFragment();
int pageNumber = 1;
Matcher pageMatcher = pageUriPattern.matcher(fragment);
if(!fragment.isEmpty() && pageMatcher.find()) {
pageNumber = Integer.parseInt(pageMatcher.group(1));
}
return pageNumber;
}

}

0 comments on commit 0d1bb7d

Please sign in to comment.