Estoy escribiendo un programa en Java que imprime archivos PDF de Bingo Cards. Cada página es una carta. Para hacerlo más fácil, creé una plantilla de archivo PDF con acrofields, de modo que el programa solo necesitará crear una copia de esta plantilla, llenar los acrofields con números y luego aplanarlos. A partir de ahora, puedo crear 1 tarjeta de bingo. Quiero tener varias páginas (por lo tanto, varias tarjetas) en un archivo PDF. Pero no tengo una idea de cómo hacer esto. Lo que leí es que un PDFStamper está asociado a un único objeto PDFReader. ¿Hay alguna manera de que pueda hacer esto sin recurrir a la creación de múltiples archivos PDF y combinarlos en uno (lo hice la última vez y encontré realmente lento) Gracias de antemano!Itext - ¿Cómo clonar páginas con acrofields?
Respuesta
Me tomó un tiempo resolver esto. No es la forma más eficiente de código, pero esto es esencialmente lo que hace:
- crear un documento
- para cada página (s) con un acrofield:
- copiar la plantilla
- rellenar el formulario
- aplanar la forma
- añadir la página
Aquí está mi aplicación que se puede tratar y modificar para adaptarse a sus necesidades: Método
private void createPdf() throws Exception {
Document doc = new Document();
PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
doc.open();
PdfReader reader;
PdfStamper stamper;
AcroFields form;
ByteArrayOutputStream baos;
for(int i = 0; i < getTotalPages(); i++) {
copyPdf(i);
reader = new PdfReader(String.format("%d%s", i, "template.pdf"));
baos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, baos);
form = stamper.getAcroFields();
//methods to fill forms
stamper.setFormFlattening(true);
stamper.close();
reader = new PdfReader(baos.toByteArray());
copy.addPage(copy.getImportedPage(reader, 1));
}
doc.close();
}
private void copyPdf(int currentPage) throws Exception {
PdfReader reader = new PdfReader("timesheet.pdf");
Document doc = new Document();
File file = new File(String.format("%d%s", currentPage, "template.pdf"));
file.deleteOnExit();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file));
stamper.close();
}
El copyPdf() crea archivos temporales que se utilizan para permitir el rellenado de formularios sin afectar a todo el documento. Si encuentra una manera más eficiente de hacerlo, hágamelo saber.
Además, he encontrado que en Mac Intel Based vs Windows Computer, la Mac completa esto mucho más rápido.
Si no se opone a la obtención de un libro de referencia para iText, recomendaría "iText in Action, Second Edition" de Bruno Lowagie. Es un gran libro y muy útil.
lo tanto, aquí está el código sin necesidad de utilizar el método "copyPdf" de Zach, como sugirieron Marcos Storer y MAXarT:
private void createPdf() throws Exception {
Document doc = new Document();
PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
doc.open();
PdfReader mainReader = new PdfReader("timesheet.pdf");
PdfReader reader;
PdfStamper stamper;
AcroFields form;
ByteArrayOutputStream baos;
for(int i = 0; i < getTotalPages(); i++) {
reader = new PdfReader(mainReader);
baos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, baos);
AcroFields form = stamper.getAcroFields();
//methods to fill forms
stamper.setFormFlattening(true);
stamper.close();
reader = new PdfReader(baos.toByteArray());
copy.addPage(copy.getImportedPage(reader, 1));
}
doc.close();
}
- 1. Cómo crear un PDF con varias páginas desde un objeto Graphics con Java e itext
- 2. ExceptionConverter: java.io.IOException: el documento no tiene páginas. estoy usando iText
- 3. Itext incrusta fuente en un PDF
- 4. Lectura de anotaciones en PDF con iText
- 5. Lea el pdf usando iText
- 6. Paisaje y retrato para pdf con Flying Saucer/iText
- 7. Número de páginas de Pdf con Java
- 8. PHPExcel clonar .xlsm con macros
- 9. ¿Qué fuentes predeterminadas se incluyen con iText?
- 10. iText agregar nueva página
- 11. Repita el encabezado PdfPTable en todas las páginas de continuación usando iText
- 12. Cómo clonar un InputStream?
- 13. Cómo clonar ImageData?
- 14. Cómo clonar() StringBuilder
- 15. Cómo clonar un iterador?
- 16. Cómo clonar imagen?
- 17. iText Image Resize
- 18. ¿Cómo establecer un color personalizado en itext?
- 19. iText: ¿Funcionan los márgenes?
- 20. Variables en páginas jsp con páginas "incluidas"
- 21. Cómo clonar el objeto js?
- 22. Cómo clonar usuario en Oracle
- 23. Gráficos vectoriales en iText PDF
- 24. iText, caracteres Unicode y Java
- 25. iText - agregar contenido a archivo PDF
- 26. ¿Cómo puedo clonar una solución .NET?
- 27. ¿Cómo puedo clonar una vista?
- 28. Cómo clonar una Imagen Buffered
- 29. Cómo clonar objetos en NHibernate?
- 30. Separador de línea en iText?
+1 para la sugerencia libro – oers
1 exactamente lo que necesito! ¡Gracias! Solo una nota, 'doc' en copyPdf no se usa :) – Jairo
No debe necesitar 'copyPdf()' en absoluto. Y aunque lo hicieras, esa es una forma tremendamente ineficiente de copiar un archivo (que pasa a ser un PDF) de A a B. Incluso podrías usar el mismo 'PdfReader' para todas tus instancias diferentes de' PdfStamper', pero es probable que revele errores. * Estarás * casi seguro * bien usando varios lectores en el mismo archivo. –