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 false
es 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.