2013-04-17 27 views
6

Próbuję wypełnić PDF za pomocą ekranów, jestem w stanie idealnie dodać dane ciągów, ale problemy z dodawaniem obrazów do ekranów. To jest mój kod na dodawanie danych ciągów ..Dodaj obraz do acrofield w iText?

File f = new File("F:/Test/Agreement.pdf"); 
    InputStream sourceTemplatePDFUrlStream = new BufferedInputStream(new FileInputStream(f)); 
    File destinationFile = new File("F:/Test/ag1.pdf"); 

    PdfReader reader = new PdfReader(sourceTemplatePDFUrlStream); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
      destinationFile)); 

    AcroFields form = stamper.getAcroFields(); 
    Image img = Image.getInstance("E:/signature/signature.png"); 
    Set fields = form.getFields().keySet(); 

    Hashtable val = new Hashtable(); 
    val.put("name", "xxx"); 
    val.put("city_street_zip", "xxx"+"     "+"xxx"+"    "+"xxx"); 
    val.put("chck_1", "Yes"); 
    val.put("chck_2", "No"); 
    val.put("chck_3", "Yes"); 
    val.put("street_address", "xxx"); 
    val.put("account_num", "1234"); 



    Enumeration enumeration = val.keys(); 

    // iterate through Hashtable val keys Enumeration 
    while (enumeration.hasMoreElements()) { 
     String nextElement = (String) enumeration.nextElement(); 
     String nextElementValue = (String) val.get(nextElement); 
     //System.out.println(nextElement + ":=================fillData===================:" + nextElementValue); 
     form.setField(nextElement, nextElementValue); 
    } 

    //Form flattening makes the form non-editable and saveable with the 
    //form val filled in 
    stamper.setFormFlattening(true); 

    stamper.close(); 
+0

pokazać nam swój kod –

+0

@VigneshVino edytowane mój kod question..included –

+0

Twój ślad stosu pomoże mi zrozumieć u'r WYDANIE –

Odpowiedz

11

„Oficjalna” sposobem, aby to zrobić, to mieć pole przycisku jako zastępczy dla obrazu i zastąpić „ikonę” przycisku, jak opisano w my book:

PushbuttonField ad = form.getNewPushbuttonFromField(imageFieldName); 
ad.setLayout(PushbuttonField.LAYOUT_ICON_ONLY); 
ad.setProportionalIcon(true); 
ad.setImage(Image.getInstance("E:/signature/signature.png")); 
form.replacePushbuttonField("advertisement", ad.getField()); 

Aby uzyskać pełną próbkę kodu, patrz ReplaceIcon.java.

OŚWIADCZENIE: Jestem oryginalnym twórcą iText i autorem książek "iText in Action".

+1

Dzięki za odpowiedź !! Bardzo miło jest otrzymać odpowiedź od Ciebie :) –

+8

Podoba mi się koncepcja StackOverflow. Dlatego dołączyłem do zeszłego roku. Próbuję odpowiadać na kilka pytań dziennie (chociaż nie zawsze mam czas). –

+0

form.getNewPushbuttonFromField (imageFieldName) zwraca dla mnie wartość null – Simon

0

Można spróbować dodać ten z kodem do dodawania obrazu

PdfContentByte content = stamper.getOverContent(reader.getNumberOfPages()); 
Image image = Image.getInstance(new URL("E:/signature/signature.png")); 
image.setAbsolutePosition(450,650); 
image.scaleAbsolute(200,200); 
content.addImage(image); 
reader.close(); 
return output.toByteArray(); 
5

Poniżej rozwiązanie działało:

public static void addImage(PdfStamper stamper,AcroFields form,String field,String fieldValue){ 
    try{ 
     System.out.println("Field "+field); 
    java.util.List<AcroFields.FieldPosition> photograph = form.getFieldPositions(field); 
    if(photograph!=null && photograph.size()>0){ 
    Rectangle rect= photograph.get(0).position; 
    //if(StringUtils.isNotBlank(fieldValue)){ 
    Image img = Image.getInstance(fieldValue); 
    img.scaleToFit(rect.getWidth(), rect.getHeight()); 
    img.setBorder(2); 
    img.setAbsolutePosition(
    photograph.get(0).position.getLeft() + (rect.getWidth() - img.getScaledWidth()) 
    , photograph.get(0).position.getTop() - (rect.getHeight())); 
    PdfContentByte cb = stamper.getOverContent((int)photograph.get(0).page); 
    cb.addImage(img); 
    //} 
    } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 

nazywając powyższa metoda:

addImage(stamper, form, "CustomerSign", "E:/signature/signature.png"); 

gdzie CustomerSign jest AcroField

+0

pomocny, dzięki @Anil –