Это самый сложный сценарий, который я могу себе представить: у меня есть файл PDF, созданный с помощью Ilustrator и модифицированный Acrobat, чтобы иметь AcroFields (AcroForm), который я собираюсь заполнить данными с помощью этого Java-кода, в результате чего Файл PDF с данными в полях изменяется с добавлением документа.
Фактически в этом случае я динамически генерирую фон, который добавляется в PDF, который также динамически генерируется с Документом с неизвестным количеством данных или страниц.
Я использую JBoss, и этот код находится в JSP-файле (должен работать на любом веб-сервере JSP).
Примечание: если вы используете IExplorer, вы должны отправить HTTP-форму с методом POST, чтобы иметь возможность загрузить файл. Если нет, вы увидите код PDF на экране. Этого не происходит в Chrome или Firefox.
<%@ page import="java.io.*, com.lowagie.text.*, com.lowagie.text.pdf.*" %><%
response.setContentType("application/download");
response.setHeader("Content-disposition","attachment;filename=listaPrecios.pdf");
// -------- FIRST THE PDF WITH THE INFO ----------
String str = "";
// lots of words
for(int i = 0; i < 800; i++) str += "Hello" + i + " ";
// the document
Document doc = new Document(PageSize.A4, 25, 25, 200, 70);
ByteArrayOutputStream streamDoc = new ByteArrayOutputStream();
PdfWriter.getInstance(doc, streamDoc);
// lets start filling with info
doc.open();
doc.add(new Paragraph(str));
doc.close();
// the beauty of this is the PDF will have all the pages it needs
PdfReader frente = new PdfReader(streamDoc.toByteArray());
PdfStamper stamperDoc = new PdfStamper(frente, response.getOutputStream());
// -------- THE BACKGROUND PDF FILE -------
// in JBoss the file has to be in webinf/classes to be readed this way
PdfReader fondo = new PdfReader("listaPrecios.pdf");
ByteArrayOutputStream streamFondo = new ByteArrayOutputStream();
PdfStamper stamperFondo = new PdfStamper(fondo, streamFondo);
// the acroform
AcroFields form = stamperFondo.getAcroFields();
// the fields
form.setField("nombre","Avicultura");
form.setField("descripcion","Esto describe para que sirve la lista ");
stamperFondo.setFormFlattening(true);
stamperFondo.close();
// our background is ready
PdfReader fondoEstampado = new PdfReader(streamFondo.toByteArray());
// ---- ADDING THE BACKGROUND TO EACH DATA PAGE ---------
PdfImportedPage pagina = stamperDoc.getImportedPage(fondoEstampado,1);
int n = frente.getNumberOfPages();
PdfContentByte background;
for (int i = 1; i <= n; i++) {
background = stamperDoc.getUnderContent(i);
background.addTemplate(pagina, 0, 0);
}
// after this everithing will be written in response.getOutputStream()
stamperDoc.close();
%>
Существует еще одно решение намного проще и решает вашу проблему. Это зависит от количества текста, который вы хотите добавить.
// read the file
PdfReader fondo = new PdfReader("listaPrecios.pdf");
PdfStamper stamper = new PdfStamper(fondo, response.getOutputStream());
PdfContentByte content = stamper.getOverContent(1);
// add text
ColumnText ct = new ColumnText(content);
// this are the coordinates where you want to add text
// if the text does not fit inside it will be cropped
ct.setSimpleColumn(50,500,500,50);
ct.setText(new Phrase(str, titulo1));
ct.go();
Спасибо за это. Если вы не хотите ограничивать его только A4, вы можете добавить document.setPageSize (reader.getPageSize (1)); – Dittimon
Когда я использовал этот метод, PDF вышел наружу. Поэтому я пошел с ответом Марка Сторьера и использовал PdfStamper. –
Это работает отлично, но страницы с acrofields не копируются с ними в cb.addTemplate (страница, 0,0). Acrofields недоступны в выпуске pdf – Vicky