У нас есть PDF с некоторыми полями, чтобы собрать некоторые данные, и я должен программно его использовать iText на Android, добавив текст в эти позиции. Я думал о разных способах достижения этого, и в каждом из них мало успеха.iText Android - добавление текста в существующий PDF
Примечание: для большинства моих тестов я использую версию iText (iTextG 5.5.4) для Android и Samsung Galaxy Note 10.1 2014 (Android 4.4).
Подход, который я взял с самого начала, состоял в том, чтобы «нарисовать» текст по заданным координатам для данной страницы. У этого есть некоторые проблемы с управлением полями (я должен знать длину строк, и было бы трудно разместить каждый текст в точной координате pdf). Но самое главное, производительность процесса очень медленная в некоторых устройствах/OSVersions (отлично работает в Nexus 5 с 5.0.2, но занимает несколько минут с 5 Мб Pdf на заметке 10.1).
pdfReader = new PdfReader(is); document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); pdfCopy = new PdfCopy(document, baos); document.open(); PdfImportedPage page; PdfCopy.PageStamp stamp; for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) { page = pdfCopy.getImportedPage(pdfReader, i); // First page = 1 stamp = pdfCopy.createPageStamp(page); for (int i=0; i<10; i++) { int posX = i*50; int posY = i*100; Phrase phrase = new Phrase("Example text", FontFactory.getFont(FontFactory.HELVETICA, 12, BaseColor.RED)); ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, posX, posY, 0); } stamp.alterContents(); pdfCopy.addPage(page); }
Мы хотя и добавляем «поля форм» вместо рисования. Таким образом, я могу настроить TextField и не управлять самими текстами. Однако окончательный PDF-файл не должен содержать никаких аннотаций, поэтому мне нужно будет скопировать его в новый Pdf без аннотаций и с этими «полями форм». У меня нет примера этого, потому что я не смог этого сделать, я даже не знаю, возможно ли это/стоит.
Третий вариант - получить Pdf с уже добавленными «полями форм», поэтому мне нужно заполнить их. Тем не менее я все еще нужно создать новый Pdf со всеми этими полями и без аннотации ...
Я хотел бы знать, что является лучшим способом в производительности, чтобы сделать этот процесс, и любая помощь о достижении этой цели , Я действительно новичок с iText, и любая помощь будет действительно оценена.
Спасибо!
EDIT
В конце концов я использовал третий вариант: в формате PDF с редактируемыми полями, которые мы заполняем, а затем мы используем «уплощение», чтобы создать нередактируемую PDF со всеми текстами уже там.
Код выглядит следующим образом:
pdfReader = new PdfReader(is);
FileOutputStream fios = new FileOutputStream(outPdf);
PdfStamper pdfStamper = new PdfStamper(pdfReader, fios);
//Filling the PDF (It's totally necessary that the PDF has Form fields)
fillPDF(pdfStamper);
//Setting the PDF to uneditable format
pdfStamper.setFormFlattening(true);
pdfStamper.close();
и метод для заполнения формы:
public static void fillPDF(PdfStamper stamper) throws IOException, DocumentException{
//Getting the Form fields from the PDF
AcroFields form = stamper.getAcroFields();
Set<String> fields = form.getFields().keySet();
for(String field : fields){
form.setField("name", "Ernesto");
form.setField("surname", "Lage");
}
}
}
Единственное об этом подходе является то, что вам нужно знать имя каждого поля чтобы заполнить его.