Open PDFs from in-memory data in Java

This guide explains how to open a PDF document from an in-memory data provider.

PdfDocument expects a DataProvider to read from. To open a file from application memory, you must extend the InputStreamDataProvider, which has an openInputStream method returning an object of type InputStream(opens in a new tab) to provide the data.

This example creates a ResourceDataProvider that extends the InputStreamDataProvider to provide an InputStream from a local asset with a string name:

private static class ResourceDataProvider extends InputStreamDataProvider {
@NotNull
private String assetFilename;
// Constructs a resource data provider.
// @param assetFilename The name of the asset file.
ResourceDataProvider(@NotNull final String assetFilename) {
this.assetFilename = assetFilename;
}
// `openInputStream` must be overridden to provide the data stream.
// Here we also check the resource exists and throw if not.
@NotNull
@Override
protected InputStream openInputStream() throws Exception {
InputStream resource = getClass().getClassLoader().getResourceAsStream(assetFilename);
if (resource == null) throw new FileNotFoundException("Unable to find resource " + assetFilename);
return resource;
}
@Override
public long getSize() {
try {
return openInputStream().available();
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public @Nullable String getTitle() {
return assetFilename;
}
}

You can use ResourceDataProvider to open a PDF document in your project asset folder:

PdfDocument document = PdfDocument.open(new ResourceDataProvider("documentInAssets.pdf"));