2010-12-10 21 views
6

Tôi không chắc chắn rằng điều này là có thể nhưng tôi đã tìm thấy nó sẽ đáng để hỏi. Tôi đã tìm ra cách để thiết lập phông chữ của một formfield bằng cách sử dụng phương pháp pdfstamper và acrofields nhưng tôi thực sự muốn có thể thiết lập phông chữ của các phần khác nhau của văn bản trong cùng một lĩnh vực. Dưới đây là cách tôi đang đặt phông chữ của các trường biểu mẫu hiện tại:Đặt các phần khác nhau của một trường biểu mẫu để có phông chữ khác nhau bằng cách sử dụng iTextSharp

  // Use iTextSharp PDF Reader, to get the fields and send to the 
      //Stamper to set the fields in the document 
      PdfReader pdfReader = new PdfReader(fileName); 

      // Initialize Stamper (ms is a MemoryStream object) 
      PdfStamper pdfStamper = new PdfStamper(pdfReader, ms); 

      // Get Reference to PDF Document Fields 
      AcroFields pdfFormFields = pdfStamper.AcroFields; 

      //create a bold font 
      iTextSharp.text.Font bold = FontFactory.GetFont(FontFactory.COURIER, 8f, iTextSharp.text.Font.BOLD); 

      //set the field to bold 
      pdfFormFields.SetFieldProperty(nameOfField, "textfont", bold.BaseFont, null); 

      //set the text of the form field 
      pdfFormFields.SetField(nameOfField, "This: Will Be Displayed In The Field"); 

      // Set the flattening flag to false, so the document can continue to be edited 
      pdfStamper.FormFlattening = true; 

      // close the pdf stamper 
      pdfStamper.Close(); 

Điều tôi muốn có thể làm khi tôi đặt văn bản ở trên được đặt là "This:" in đậm và rời khỏi " Sẽ được hiển thị trong trường "không được in đậm. Tôi không chắc chắn điều này là thực sự có thể nhưng tôi figured nó là giá trị yêu cầu bởi vì nó thực sự sẽ hữu ích trong những gì tôi đang làm việc trên.

Cảm ơn trước!

Trả lời

8

Có, kinda. Các trường PDF có thể có một giá trị văn bản phong phú (kể từ acrobat 6/pdf1.5) cùng với một giá trị thông thường.

Giá trị thông thường sử dụng phông chữ được xác định trong các lần xuất hiện mặc định ... một phông chữ duy nhất.

Định dạng giá trị phong phú (mà iText không hỗ trợ trực tiếp, ít nhất là chưa), được mô tả trong chương 12.7.3.4 của PDF Reference. <b>, <i>, <p> và một vài thuộc tính văn bản css2. Nó đòi hỏi một với các thuộc tính khác nhau.

Để bật các giá trị phong phú, bạn phải đặt bit 26 của cờ trường (PdfName.FF) cho trường văn bản. PdfFormField không có một "setRichValue", nhưng chúng từ điển, vì vậy bạn có thể chỉ:

myPdfFormField.put(PdfName.RV, new PdfString(richTextValue)); 

Nếu bạn đang cố gắng để thêm văn bản phong phú cho một lĩnh vực đang tồn tại mà không đã hỗ trợ nó:

AcroFields fields = stamper.getAcroFields(); 

AcroFields.Item fldItem = fields.getFieldItem(fldName); 
PdfDictionary mergedDict = item.getMerged(0); 
int flagVal = mergedDict.getAsNumber(PdfName.FF).intValue(); 
flagVal |= (1 << 26); 

int writeFlags = AcroFields.Item.WRITE_MERGED | AcroFields.Item.WRITE_VALUE; 
fldItem.writeToAll(PdfName.FF, new PdfNumber(flagVal), writeFlags); 
fldItem.writeToAll(PdfName.RV, new PdfString(richTextValue), writeFlags); 

Tôi đang thực sự thêm hỗ trợ văn bản có dạng thức vào iText (không sắc nét) khi tôi nhập thông báo này. Hoan hô cho những người đóng góp trên SO. Paulo là tốt về việc giữ iTextSharp trong đồng bộ gần đây, vì vậy đó không phải là một vấn đề. Phiên bản thân tiếp theo nên có tính năng này ... vì vậy bạn có thể viết:

myPdfFormField.setFieldFlags(PdfFormField.FF_RICHTEXT); 
myPdfFormField.setRichValue(richTextValue); 

hoặc

// note that this will fail unless the rich flag is set 
acroFields.setFieldRichValue(richTextValue); 

Chú ý: thế hệ xuất hiện iText đã không được cập nhật, chỉ cần phía giá trị của mọi thứ. Điều đó sẽ mất nhiều công sức hơn. Vì vậy, bạn sẽ muốn acroFields.setGenerateAppearances(false) hoặc có JS đặt lại giá trị trường khi biểu mẫu được mở để buộc Acrobat/Reader xây dựng giao diện cho bạn.

+0

Phân biệt giữa văn bản trong biểu mẫu trường ở đâu? Làm thế nào để nó biết để thiết lập này: để một phông chữ khác nhau? – Jake

+0

@Jake Nếu bạn truy cập Tham chiếu PDF được liên kết trong câu trả lời của tôi, mục 12.7.4.3, bạn sẽ thấy mô tả đầy đủ về những gì được cho phép. Về cơ bản nó là một tập con của HTML. –

0

Tôi mất một chút thời gian để tìm hiểu sau khi richtextfield không hoạt động theo cách được giả sử với acrofields và hầu hết các trường hợp là pdf không thể chỉnh sửa được với các phông chữ khác nhau khi chạy.

Tôi đã tìm cách thiết lập các phông chữ khác nhau trong các dòng sản phẩm và giá trị truyền và chỉnh sửa khi chạy với itextsharp và tôi nghĩ nó sẽ hữu ích cho người khác.

  1. Tạo pdf với trường văn bản trong PDF1.pdf (Tôi hy vọng bạn biết cách tạo trường bằng pdf) ví dụ:, txtComments Chuyển đến phần thuộc tính và Đặt thuộc tính thành richtext, Mulitiline

  2. Định dạng nội dung văn bản bằng từ hoặc pdf bằng cách thêm phông chữ và màu sắc. Nếu được thực hiện bằng lời, hãy sao chép và dán nội dung vào trường pdf - txtcomments.

    Lưu ý: Nếu bạn muốn thêm nội dung động. Đặt tham số “{0}” vào trường txtComment trong pdf. sử dụng phương thức định dạng chuỗi, bạn có thể đặt giá trị cho nó.Điều này được hiển thị trong mã bên dưới.

     e.g., "Set different parts of a form field to have different fonts using {0}" 
    
  3. Thêm đoạn mã sau vào một nút (điều này là không cụ thể) sự kiện bằng cách tham khảo trong itextsharp.dll 5.4.2


Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-disposition","attachment; filename=your.pdf"); 
PdfReader reader = new PdfReader(@"C:\test\pdf1.pdf"); 
PdfStamper stamp = new PdfStamper(reader, Response.OutputStream); 
AcroFields field = pdfStamp.AcroFields; 
string comments = field .GetFieldRichValue("txtcomments"); 
string Name = "Test1"; 
string value = string.Format(comments,Name); 
field.SetField("txtComment", value); 
field.GenerateAppearances = false;//Pdf knows what to do; 
stamp.FormFlattening = false;//available for edit at run time 
stamp.FreeTextFlattening = true; 
stamp.Close(); 
reader.Close() 

Hope this helps.

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