tutorial libreria leer exportar example editar descargar crear con java swing pdf itext

java - libreria - Componente oscilante iText a más de una página



leer pdf con itext java (2)

Utiliza el JPanel solo para crear los gráficos (para pintar en g2d ), no tiene nada que ver con su problema per se.

Como las imágenes no tienen límites de envolvente "naturales" (como palabras o párrafos), debe hacerlo usted mismo. Divida la imagen, es decir, cree varias imágenes manuales en límites útiles (según el contenido, probablemente tenga que adaptar el método de paint ) y colóquelas en páginas separadas.

Tengo un jpanel que tendrá una altura bastante grande que quiero pintar en un pdf, algo así como 2-3 páginas, a veces incluso más. Mi problema es que no pasará a la página siguiente, simplemente intentará insertar todo en la primera página y cuando la página finalice, no pasará a la siguiente. Busqué un poco, intenté todo lo que pude descubrir, nada. ¿Cómo puedo hacer eso? ¿Cómo puedo decirle a iText que necesita comenzar una página nueva y continuar con el jpanel allí? Aquí está mi código:

try { Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C://HelloWorld.pdf")); document.open(); jPanel1.addNotify(); jPanel1.validate(); PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate(600, 840); Graphics2D g2d = tp.createGraphics(595, 840); g2d.translate(4, 4); g2d.scale(0.708, 0.8); jPanel1.paint(g2d); cb.addTemplate(tp, 0, 0); g2d.dispose(); document.close(); } catch (DocumentException ex) { } catch (FileNotFoundException ex) { }


Puede crear una plantilla lo suficientemente grande y dibujar todo el contenido de JPanel a esa plantilla. A continuación, agrega esta única plantilla a diferentes páginas de PDF utilizando diferentes desplazamientos y, en consecuencia, muestra diferentes secciones de la plantilla en las páginas individuales.

Por ejemplo, en el caso de un panel de muestra (3 páginas de alto)

class MyPanel extends JPanel { public MyPanel(Rectangle baseSize) { setBorder(BorderFactory.createLineBorder(Color.black)); this.baseSize = baseSize; } public Dimension getPreferredSize() { return new Dimension((int)baseSize.getWidth(), ((int)baseSize.getHeight()) * 3); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("Page 1", 10, 20); g.drawRoundRect(5, 5, (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15); g.drawString("Page 2", 10, 20 + (int)baseSize.getHeight()); g.drawRoundRect(5, 5 + (int)baseSize.getHeight(), (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15); g.drawString("Page 3", 10, 20 + 2 * (int)baseSize.getHeight()); g.drawRoundRect(5, 5 + 2 * (int)baseSize.getHeight(), (int)baseSize.getWidth() - 10, (int)baseSize.getHeight() - 10, 15, 15); } final Rectangle baseSize; }

puede difundir la información en múltiples pges de PDF como este:

public void test() throws FileNotFoundException, DocumentException { MyPanel panel = new MyPanel(PageSize.A4); panel.setSize(panel.getPreferredSize()); Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("target/test-outputs/big-panel.pdf")); document.open(); panel.addNotify(); panel.validate(); PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate(panel.getWidth(), panel.getHeight()); Graphics2D g2d = new PdfGraphics2D(tp, panel.getWidth(), panel.getHeight()); panel.paint(g2d); g2d.dispose(); cb.addTemplate(tp, 0, -2 * PageSize.A4.getHeight()); document.newPage(); cb.addTemplate(tp, 0, -PageSize.A4.getHeight()); document.newPage(); cb.addTemplate(tp, 0, 0); document.newPage(); cb.addTemplate(tp, 0.3333f, 0, 0, 0.3333f, PageSize.A4.getWidth() / 3, 0); document.close(); }

Como puede ver, algunas partes del panel se pueden mostrar como páginas individuales; o todo el panel se puede mostrar en una página reducida. Por supuesto, también podría mostrar pequeñas secciones del panel ampliadas. O rotado O ...