Add pages to PDF files on Android

With Nutrient, there are four ways to add a page to a document:

  1. Add a blank page programmatically

  2. Add a new page programmatically from Android Canvas

  3. Take a page from a different document and insert it as a new page programmatically

  4. Interactively with the user interface

Adding a blank page

To create a new page in an existing document, first open the PdfDocument and then use the PdfProcessor to insert a new page:

private fun createDocumentWithNewPages(document: PdfDocument) {
    val outputFile = context.filesDir.resolve("${document.uid}-new-page.pdf")
    val task = PdfProcessorTask.fromDocument(document)

    // Create a yellow A5 page with a line pattern as the first page.
    task.addNewPage(
        NewPage.patternPage(NewPage.PAGE_SIZE_A5, PagePattern.LINES_7MM).backgroundColor(Color.rgb(241, 236, 121)).build(),
        0)

    // Create an A0 page with an image as the second page.
    val bitmap = BitmapFactory.decodeStream(context.assets.open("inline-media/images/cover.jpg"))
    task.addNewPage(
        NewPage.emptyPage(NewPage.PAGE_SIZE_A0).withPageItem(PageImage(bitmap, PagePosition.CENTER)).build(),
        1)

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile)
}
private void createDocumentWithNewPages(final @NonNull PdfDocument document) throws IOException {
    final File outputFile = new File(context.getFilesDir(), document.getUid() + "-new-page.pdf");
    final PdfProcessorTask task = PdfProcessorTask.fromDocument(document);

    // Create a yellow A5 page with a line pattern as the first page.
    task.addNewPage(
        NewPage.patternPage(NewPage.PAGE_SIZE_A5, PagePattern.LINES_7MM)
            .backgroundColor(Color.rgb(241, 236, 121))
            .build(),
        0);

    // Create an A0 page with an image as the second page.
    final Bitmap bitmap = BitmapFactory.decodeStream(context.getAssets().open("inline-media/images/cover.jpg"));
    task.addNewPage(
        NewPage.emptyPage(NewPage.PAGE_SIZE_A0)
            .withPageItem(new PageImage(bitmap, PagePosition.CENTER))
            .build(),
        1);

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile);
}

Adding a page from the Android canvas

As of Nutrient Android SDK 4.6, PdfProcessor supports a new API for page creation, exposing a method with a callback, NewPage.Builder#fromCanvas(Context, Size, OnDrawCanvasCallback), which hands over the canvas used for drawing calls:

private fun createNewDocumentFromCanvas(context: Context) {
    val outputFile = File(context.getFilesDir(), "new-document.pdf")

    // Create a canvas based on an A4 page.
    val pageCanvas = NewPage.fromCanvas(context, NewPage.PAGE_SIZE_A4) { canvas ->
        val paint = Paint()
        paint.style = Paint.Style.STROKE
        val path = Path()
        path.cubicTo(0f, 0f, 100f, 300f, 400f, 300f)
        canvas.drawPath(path, paint)
    }.build()

    // Create a new processor task, passing in the new page definition.
    val task = PdfProcessorTask.newPage(pageCanvas)

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile)
}
private void createNewDocumentFromCanvas(Context context) {
    final File outputFile = new File(context.getFilesDir(), "new-document.pdf");

    // Create a canvas based on an A4 page.
    final NewPage pageCanvas = NewPage.fromCanvas(context, NewPage.PAGE_SIZE_A4, canvas -> {
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        Path path = new Path();
        path.cubicTo(0f, 0f, 100f, 300f, 400f, 300f);
        canvas.drawPath(path, paint);
    }).build();

    // Create a new processor task, passing in the new page definition.
    final PdfProcessorTask task = PdfProcessorTask.newPage(pageCanvas);

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile);
}
Information

Check out DocumentFromCanvasExample in the Catalog app. This showcases how to create a document from scratch by drawing on canvas.

Inserting a page from another document

PdfProcessor also allows you to insert a single page into another document using NewPage.fromPage():

private fun createDocumentWithNewPages(document: PdfDocument) {
    val outputFile = context.filesDir.resolve("${document.uid}-new-page.pdf")
    val task = PdfProcessorTask.fromDocument(document)

    // The third page is cloned from the last page of the document.
    task.addNewPage(
        NewPage.fromPage(document, document.pageCount - 1).build(),
        2)

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile)
}
private void createDocumentWithNewPages(final @NonNull PdfDocument document) throws IOException {
    final File outputFile = new File(context.getFilesDir(), document.getUid() + "-new-page.pdf");
    final PdfProcessorTask task = PdfProcessorTask.fromDocument(document);

    // The third page is cloned from the last page of the document.
    task.addNewPage(
        NewPage.fromPage(document, document.getPageCount() - 1)
            .rotation(90)
            .build(),
        2);

    // Start document processing.
    PdfProcessor.processDocument(task, outputFile);
}

Using the user interface

The Document Editor component offers a convenient UI for inserting blank pages or pages with predefined patterns into existing documents — this is perfect for adding new pages for more scratch space for drawing or adding textual notes.

While in editing mode, you can press the floating action button to add a new page. By default, tapping this will display the new page dialog, allowing you to configure the new page (various page patterns, background colors, page sizes, and landscape or portrait orientation).