2013-04-17 40 views
6

Tôi đang cố gắng điền vào PDF bằng cách sử dụng acrofields, tôi có thể thêm dữ liệu chuỗi hoàn hảo, nhưng có vấn đề trong việc thêm hình ảnh vào acrofields. Đây là mã của tôi để thêm dữ liệu chuỗi ..Thêm hình ảnh vào acrofield trong 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

cho chúng ta thấy mã của bạn –

+0

@VigneshVino sửa đang question..included tôi –

+0

stack trace của bạn sẽ giúp tôi hiểu vấn đề u'r –

Trả lời

11

Các "chính thức" cách để làm điều này, là phải có một lĩnh vực Nút như giữ chỗ cho hình ảnh, và để thay thế cho "biểu tượng" của nút như mô tả trong 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()); 

Xem ReplaceIcon.java để có mẫu mã đầy đủ.

TUYÊN BỐ TỪ CHỐI: Tôi là nhà phát triển ban đầu của iText và là tác giả của sách "iText in Action".

+1

Cảm ơn bạn đã trả lời !! Rất vui khi được trả lời từ bạn :) –

+8

Tôi thích khái niệm StackOverflow. Đó là lý do tôi tham gia năm ngoái. Tôi cố gắng trả lời một vài câu hỏi mỗi ngày (mặc dù tôi không luôn có thời gian). –

+0

form.getNewPushbuttonFromField (imageFieldName) trả về null cho tôi – Simon

0

Bạn có thể thử thêm này với mã của bạn để thêm hình ảnh

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

Các giải pháp sau đây làm việc:

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

gọi phương pháp trên:

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

nơi CustomerSign được AcroField

+0

hữu ích, nhờ @Anil –

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