2015-03-05 18 views
5

chúng tôi có một PDF với một số trường để thu thập một số dữ liệu và tôi phải điền nó theo chương trình với iText trên Android bằng cách thêm một số văn bản vào các vị trí đó. Tôi đã suy nghĩ về những cách khác nhau để đạt được điều này, với ít thành công trong mỗi một.iText Android - Thêm văn bản vào PDF hiện có

Lưu ý: Tôi đang sử dụng phiên bản Android của iText (iTextG 5.5.4) và Samsung Galaxy Note 10.1 2014 (Android 4.4) cho hầu hết các thử nghiệm của tôi.

  • Cách tiếp cận tôi lấy từ đầu là "vẽ" văn bản trên một tọa độ nhất định, cho một trang nhất định. Điều này có một số vấn đề với việc quản lý các lĩnh vực (tôi phải nhận thức được chiều dài của các chuỗi, và nó có thể được khó khăn để vị trí mỗi văn bản trong tọa độ chính xác của pdf). Nhưng quan trọng nhất, hiệu suất của quá trình này thực sự chậm trong một số thiết bị/OSVersions (nó hoạt động tốt trong Nexus 5 với 5.0.2, nhưng phải mất vài phút với Pdf 5MB trên Note 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); 
        } 
    
  • Chúng tôi mặc dù thêm "trường biểu mẫu" thay vì vẽ. Bằng cách đó tôi có thể cấu hình một TextField và tránh quản lý các văn bản bản thân mình. Tuy nhiên, PDF cuối cùng không có bất kỳ chú thích nào, vì vậy tôi sẽ cần phải sao chép nó vào một tệp Pdf mới không có chú thích và với các trường "biểu mẫu" được vẽ. Tôi không có một ví dụ về điều này bởi vì tôi đã không thể thực hiện điều này, tôi thậm chí không biết nếu điều này là có thể/đáng giá.

  • Tùy chọn thứ ba sẽ là nhận Pdf với "trường biểu mẫu" đã được thêm vào, theo cách đó tôi chỉ phải điền vào chúng. Tuy nhiên, tôi vẫn cần tạo một Pdf mới với tất cả các trường đó và không có chú thích ...

Tôi muốn biết cách tốt nhất để thực hiện quy trình này là gì và bất kỳ trợ giúp nào về việc đạt được nó . Tôi thực sự là newbie với iText và bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Cảm ơn!

EDIT

Cuối cùng tôi đã sử dụng tùy chọn thứ ba: một PDF với các lĩnh vực có thể chỉnh sửa chúng ta điền vào, và sau đó chúng tôi sử dụng "làm phẳng" để tạo PDF không thể chỉnh sửa với tất cả các văn bản đã có.

Mã này là như sau:

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(); 

và phương pháp để điền vào các hình thức:

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"); 
     } 
    } 
} 

Điều duy nhất về phương pháp này là bạn cần phải biết tên của từng lĩnh vực trong để điền vào nó.

Trả lời

4

Có một quy trình trong iText được gọi là 'làm phẳng', có các trường biểu mẫu và thay thế chúng bằng văn bản chứa các trường.

Tôi chưa sử dụng iText trong vài năm (và hoàn toàn không phải trên Android), nhưng nếu bạn tìm kiếm các ví dụ thủ công hoặc trực tuyến để 'làm phẳng', bạn nên tìm cách thực hiện.

Các vấn đề liên quan