2015-03-05 6 views
5

У нас есть 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"); 
     } 
    } 
} 

Единственное об этом подходе является то, что вам нужно знать имя каждого поля чтобы заполнить его.

ответ

4

В iText есть процесс, известный как «flattening», который принимает поля формы и заменяет их текстом, который содержит эти поля.

Я не использовал iText через несколько лет (и вовсе не на Android), но если вы ищете руководство или онлайн-примеры для «сглаживания», вы должны найти, как это сделать.

Смежные вопросы