Reducir el contenido de un PDF usando Java

Programa para reducir el contenido de un documento PDF. Se requiere el archivo jar externo para importar en el programa. A continuación se muestra la implementación de la misma.

Acercarse:

1. Cree un archivo PDF vacío.

  • Asigne la ruta del PDF vacío a una variable de string.
  • Importe PdfWriter desde el paquete com.itextpdf.kernel.pdf . (PdfWriter nos permite escribir contenido en nuestro archivo PDF)
  • PdfWriter acepta una variable de string como parámetro que representa el destino del PDF.
  • Inicialice el objeto PdfWriter pasando la ruta del archivo PDF.

2. Cree un documento que represente el archivo PDF vacío.

  • Importe PdfDocument desde el paquete com.itextpdf.kernel.pdf . (PdfDocument se usa para representar el pdf en código. Este último se puede usar para agregar o modificar varias funciones, como fuente, imágenes, etcétera)
  • PdfDocument acepta un objeto PdfWriter o PdfReader como su parámetro.
  • Inicialice PdfDocument pasando el objeto PdfWriter.
     

3. Repita los pasos anteriores para el PDF original.

  • Asigne la ruta del PDF original a una variable de string.
  • Importe PdfReader desde el paquete com.itextpdf.kernel.pdf . (PdfReader nos permite leer el contenido de nuestro archivo PDF)
  • Pase la ruta del PDF original al constructor de PdfReader.
  • Inicialice PdfDocument pasando el objeto PdfReader.

4. Obtenga el tamaño de la página del PDF original.

  • Importe PdfPage desde el paquete com.itextpdf.kernel.pdf . (PdfPage representa una página particular en un PDF)
  • Importe Rectangle desde el paquete com.itextpdf.kernel.geom .
  • El método getPage(int pageNumber) presente en la clase PdfDocument t devuelve un objeto PdfPage de la página específica especificada.
  • El método getPageSize() presente en la clase PdfPage devuelve un objeto Rectangle del objeto PdfPage en particular.

5. Obtenga el tamaño de la página del PDF vacío.

  • No es posible obtener el tamaño de página de un PDF vacío.
  • Entonces, para obtener el tamaño, agregamos una nueva página al PDF vacío usando el método addNewPage() presente en la clase PdfDocument. Los métodos addNewPage() devuelven un objeto PdfPage.
  • El método getPageSize() presente en la clase PdfPage devuelve un objeto Rectangle del objeto PdfPage en particular.

6. Crear la versión reducida de la página original.

  • Importe AffineTransform desde el paquete com.itextpdf.kernel.geom .
  • El nuevo ancho escalado se puede calcular usando (emptyPageWidth/originalPageWidth)/2.
  • La nueva altura escalada se puede calcular usando (emptyPageHeight/originalPageHeight)/2.
  • El método estático getScaleInstance(doble ancho, doble altura) presente en la clase AffineTransform devuelve un objeto AffineTransform con ancho y alto escalados.

7. Agregue la versión reducida de la página original al PDF vacío.

  • Importe PdfCanvas desde el paquete com.itextpdf.kernel.pdf.canvas .
  • Inicialice el objeto PdfCanvas pasando la página vacía como parámetro.
  • Agregue la array creada anteriormente con tamaños reducidos al lienzo vacío.
  • Copie el contenido de la página original usando el método copyAsFormXObject(PdfDocument shrunkenDocument) (devuelve aPdfFormXObject) presente en la clase PdfPage.
  • Agregue la página copiada al lienzo usando el método addXObject(PdfXObject xObject, float x, float y).

8. Cree el Documento.

  • Importe el documento desde el paquete com.itextpdf.layout .
  • Se crea un objeto Documento para hacer una versión legible del PDF.
  • Uno de los constructores de la clase Document acepta el objeto PdfDocument como sus parámetros.
  • Inicialice el objeto Documento pasando shrunkenDocument como su parámetro.
  • El documento se cierra después de crear el objeto para evitar pérdidas de memoria.  
     

Nota: Requiere tarro externo (Descarga haciendo clic aquí).

A continuación se muestra la implementación de la reducción de PDF:

Java

// Java program to shrink the contents of a PDF
  
// Importing the necessary libraries required
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.geom.AffineTransform;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Document;
public class Main {
  
    public static void main(String[] args)
    {
  
        // Try catch block is used to handle File Exceptions
        try {
            // Destination of the empty PDF
            String shrunkenPath = "/home/mayur/newGFG.pdf";
            // Creating PDF writer object
            PdfWriter pdfWriter
                = new PdfWriter(shrunkenPath);
            // Creating a PdfDocument object for empty pdf
            PdfDocument shrunkenDocument
                = new PdfDocument(pdfWriter);
  
            // Destination of the original PDF
            String originalPath = "/home/mayur/GFG.pdf";
            // Creating PDF reader object
            PdfReader pdfReader
                = new PdfReader(originalPath);
            // Creating a PdfDocument object for original
            // pdf
            PdfDocument originalDocument
                = new PdfDocument(pdfReader);
  
            // Opening the first page of the original PDF
            PdfPage orignalPage
                = originalDocument.getPage(1);
            // Getting the height and width of the original
            // PDF
            Rectangle originalPDFSizes
                = orignalPage.getPageSize();
  
            // Adding a new page to the empty PDF
            PdfPage emptyPage
                = shrunkenDocument.addNewPage();
            // Getting the height and width of the empty PDF
            Rectangle emptyPDFsizes
                = emptyPage.getPageSize();
  
            // Scaling down the original Pdf page
            double width = emptyPDFsizes.getWidth()
                           / originalPDFSizes.getWidth();
            double height = emptyPDFsizes.getHeight()
                            / originalPDFSizes.getHeight();
            // Calculating the new width and height
            double newWidth = width / 2;
            double newHeight = height / 2;
            // Creating a matrix with new width and new
            // height
            AffineTransform affineTransform
                = AffineTransform.getScaleInstance(
                    newWidth, newHeight);
  
            // Creating an empty canvas
            PdfCanvas canvas = new PdfCanvas(emptyPage);
            // Adding the matrix created to the empty canvas
            canvas.concatMatrix(affineTransform);
  
            // Copying the content from the original PDF
            PdfFormXObject pageCopy
                = orignalPage.copyAsFormXObject(
                    shrunkenDocument);
            // Adding the copied page to the canvas
            canvas.addXObject(pageCopy, (float)newWidth,
                              (float)newHeight);
  
            // Creating a Document object to make the PDF
            // readable
            Document doc = new Document(shrunkenDocument);
  
            // Closing the documents to prevent memory leaks
            doc.close();
            originalDocument.close();
            System.out.println(
                "Shrunken PDF successfully created");
        }
        // Catching any unwanted Exceptions
        catch (Exception e) {
            System.err.println(e);
        }
    }
}

Antes de la ejecución:

PDF originales

Después de la ejecución:

PDF después de que el contenido se haya reducido

Publicación traducida automáticamente

Artículo escrito por coder_srinivas y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *