DEV Community

FullStackJava
FullStackJava

Posted on

Enhancing PDF Interactivity: Adding Rich Media Files with Spring Boot

Adding rich media files (such as images, audio, or video) to PDFs can significantly enhance the interactivity and information content of your documents. With Spring Boot, you can leverage libraries like Apache PDFBox to manipulate PDFs. Below, I'll provide a detailed guide on how to add rich media files to PDFs using Spring Boot and Apache PDFBox.

Step-by-Step Guide

1. Set Up Your Spring Boot Project

First, create a new Spring Boot project. You can use Spring Initializr to generate the base project setup. Include the necessary dependencies, especially the Apache PDFBox library.

  • Maven Configuration (pom.xml):
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.24</version>
    </dependency>
    <!-- Add other dependencies as needed -->
</dependencies>
Enter fullscreen mode Exit fullscreen mode

2. Create a Service for PDF Manipulation

Create a service class that will handle the PDF creation and manipulation.

  • PDFService.java:
package com.example.pdfservice;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import org.springframework.stereotype.Service;

@Service
public class PDFService {

    public void createPDFWithRichMedia(String outputFilePath, String mediaFilePath) throws IOException {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);

        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.beginText();
        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
        contentStream.newLineAtOffset(50, 700);
        contentStream.showText("Hello, this PDF contains rich media!");
        contentStream.endText();
        contentStream.close();

        addAttachment(document, page, mediaFilePath);

        document.save(outputFilePath);
        document.close();
    }

    private void addAttachment(PDDocument document, PDPage page, String mediaFilePath) throws IOException {
        PDAnnotationFileAttachment attachment = new PDAnnotationFileAttachment();
        attachment.setRectangle(new PDRectangle(50, 550, 100, 100));
        attachment.setContents("Media file");

        PDComplexFileSpecification fs = new PDComplexFileSpecification();
        fs.setFile(mediaFilePath);
        fs.setFileUnicode(mediaFilePath);
        fs.setEmbeddedFile(getEmbeddedFile(document, mediaFilePath));
        attachment.setFile(fs);

        page.getAnnotations().add(attachment);
    }

    private PDEmbeddedFile getEmbeddedFile(PDDocument document, String mediaFilePath) throws IOException {
        File mediaFile = new File(mediaFilePath);
        PDEmbeddedFile embeddedFile = new PDEmbeddedFile(document, Files.newInputStream(mediaFile.toPath()));

        embeddedFile.setSubtype("application/octet-stream");
        embeddedFile.setSize((int) mediaFile.length());
        embeddedFile.setCreationDate(new GregorianCalendar());

        return embeddedFile;
    }
}
Enter fullscreen mode Exit fullscreen mode

3. Create a Controller to Handle Requests

Create a REST controller that will allow you to trigger the PDF creation via an HTTP request.

  • PDFController.java:
package com.example.pdfservice;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class PDFController {

    @Autowired
    private PDFService pdfService;

    @GetMapping("/create-pdf")
    public String createPDF(@RequestParam String outputFilePath, @RequestParam String mediaFilePath) {
        try {
            pdfService.createPDFWithRichMedia(outputFilePath, mediaFilePath);
            return "PDF created successfully!";
        } catch (IOException e) {
            e.printStackTrace();
            return "Error creating PDF: " + e.getMessage();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

4. Run the Application

Run your Spring Boot application. You can now create a PDF with rich media by making an HTTP GET request to the /create-pdf endpoint, providing the paths for the output PDF and the media file as query parameters.

For example:

http://localhost:8080/create-pdf?outputFilePath=/path/to/output.pdf&mediaFilePath=/path/to/mediafile.mp4
Enter fullscreen mode Exit fullscreen mode

Explanation

  • Setting Up Dependencies: We include the Apache PDFBox library for PDF manipulation.
  • PDFService: This service contains the logic to create a PDF and embed a media file.
    • createPDFWithRichMedia method creates a PDF document, adds a text annotation, and calls addAttachment to embed the media file.
    • addAttachment method creates an attachment annotation and associates it with the media file.
    • getEmbeddedFile method prepares the media file to be embedded into the PDF.
  • PDFController: This controller exposes an endpoint to trigger the PDF creation process.

Conclusion

By following this guide, you can create PDFs with rich media content using Spring Boot and Apache PDFBox. This approach allows you to enhance the interactivity and value of your documents, providing users with a richer experience. As always, ensure that the paths and dependencies are correctly configured and handle exceptions appropriately in a production environment.

Top comments (0)