Saltar al contenido

Cómo obtener el tamaño de página del documento pdf iText 7

El tutorial o código que hallarás en este artículo es la resolución más eficiente y efectiva que encontramos a esta inquietud o dilema.

Solución:

En breve

El problema se debe a que su código accede a páginas que iText ya ha vaciado de la memoria al archivo de destino. Puede indicarle a iText que no descarte las páginas antes de tiempo usando el parámetro de tres Document constructor y establecer el immediateFlush parámetro a falsees decir, reemplazando

try (Document document = new Document(pdf)) {

por

try (Document document = new Document(pdf, pdf.getDefaultPageSize(), false)) {

Algunas explicaciones

iText está diseñado para usarse en contextos en los que se pueden generar archivos PDF enormes (o muchos archivos PDF al mismo tiempo) sin requerir una gran cantidad de memoria correspondiente. Reduce el consumo de memoria escribiendo partes terminadas del PDF en su destino de salida y eliminándolas de la memoria. En particular, cuando se crean documentos de varias páginas, generalmente solo la página actual y la anterior permanecen en la memoria, mientras que las páginas anteriores se vacían y tienen el contenido del objeto de página restante establecido en null.

Entonces, cuando eventualmente itera sobre todas las páginas de su PDF, todas menos las más recientes no tienen sus MediaBox más entradas, así que obtienes un NullPointerException al intentar acceder al tamaño de la página.

Para casos de uso como el suyo en los que el vaciado anticipado no es apropiado, iText ofrece la bandera utilizada anteriormente para evitar que las páginas se vacíen antes de tiempo.

Como un aparte…

… si se pregunta por qué su pregunta no ha sido respondida antes: publicó un código gigantesco que ni siquiera se pudo ejecutar para reproducir el problema ya que no proporcionó un JSON string Para el data parámetro. Por lo tanto, para poder reproducir el problema, tuve que reducir su código al núcleo esencial que reproduce el problema:

public void createPdf(String dest) throws IOException 

    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    try (Document document = new Document(pdf)) 

        document.setMargins(120, 36, 120, 36);

        document.add(new Paragraph("some content"));
        document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        document.add(new Paragraph("some more content"));
        document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        document.add(new Paragraph("still more content"));

        for (int i = 1; i <= document.getPdfDocument().getNumberOfPages(); i++) 

            System.out.println("PAGINA DEL PDF" + i);
            try 
                Rectangle pageSize = document.getPdfDocument().getPage(i).getPageSize();
                // Rectangle pageSize = document.getPdfDocument().getPage(i).getMediaBox();
                System.out.println("RECTANGLE....." + pageSize);
             catch (Exception e) 
                // TODO: handle exception
                System.out.println("EXCEPCION RECTANGULO..." + e);
            
        
    

Si lo hubiera hecho usted mismo, su pregunta se habría respondido mucho antes.

Si posees algún inconveniente y disposición de beneficiar nuestro división te evocamos realizar una anotación y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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