2015-05-14 118 views
2

我已經編寫了一個應用程序,用於以編程方式從數據庫中填寫PDF模板中的表單並將結果保存到磁盤。除了不按預期方式呈現的多行文本字段之外,所有內容都正常工作。它們應該是頂部,左邊對齊,線條之間沒有間隙。iTextSharp中多行文本表單域的對齊問題

結果我得到的是在這裏: enter image description here

然而,當我點擊進入使用任何PDF閱讀器表單字段,字段是否自行解決到什麼我期望的那樣。見: enter image description here

我使用的代碼是漂亮的鍋爐板的東西。

  PdfStamper stamper = new PdfStamper(reader, ms, '\0', false); 

      AcroFields form = stamper.AcroFields; 
      List<DocumentField> fields = GetData(id); 
      foreach (DocumentField field in fields) 
      { 
       form.SetField(field.FieldName, field.Value); 
      } 

      stamper.FormFlattening = true; 
      stamper.Close(); 
      reader.Close(); 

我正在使用System.Environment.NewLine添加carraige退貨。有誰知道什麼可能會導致這種行爲和解決方案,使左上角沒有大的差距對齊。謝謝。

更新與溶液

予移除的字段並重新添加它,它表現爲預期。實際上問題似乎是我使用的是一種名爲「Cambria」的字體,如果將字段設置爲使用該字體,則返回該行爲。

+1

*問題在於我使用的是一種名爲'Cambria'的字體* - 某些字體包含的信息會使程序認爲它的字形比實際大得多。也許這是這裏的問題。 – mkl

+1

[在這個問題](http://stackoverflow.com/a/16584687/1729265)坎布里亞也有一個高度問題。 – mkl

回答

3

請看看MultiLineField這是寫的測試您的指控。在這個例子中,我們創建一個最簡單的多行文本字段的表單:

Rectangle rect = new Rectangle(36, 720, 144, 806); 
TextField tf = new TextField(writer, rect, "text"); 
tf.setOptions(TextField.MULTILINE); 
writer.addAnnotation(tf.getTextField()); 

然後我們填寫和扁平這種形式是這樣的:

public void createPdf(String filename) throws DocumentException, IOException { 
    PdfReader reader = new PdfReader(createForm()); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename)); 
    AcroFields form = stamper.getAcroFields(); 
    form.setField("text", "A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street"); 
    stamper.setFormFlattening(true); 
    stamper.close(); 
} 

拿在String的密切關注:

"A B C D E F\nG H I J K L M N\nO P Q R S T U\r\nV W X Y Z\n\nAlphabet street" 

我介紹一些換行符(\n),甚至回車/新行序列(\r\n)。這些引入了一條新線。只有當我介紹了一個以上的換行符(\n\n),一個額外的缺口介紹:

enter image description here

有,爲什麼你的代碼具有不同的三種可能原因:

  1. 您的形式是不同的。關於您的文本字段有一些非常具體的內容。如果是這樣,請分享您的表格進行檢查。 [更新:正如評論中提到的那樣,文本字段確實有些特別之處;更新字段解決了問題。]
  2. 您正在添加太多換行符。也許「21 High Street」已經跟着換行了。也許你的系統上的換行符有些奇怪。請注意,這是PDF:它與操作系統無關,只需使用/n就足夠了。
  3. 也許你正在使用iText的非官方版本。對於我們(iText集團)來說,這是非常令人沮喪的,但是有些人發現有必要創建包含代碼的代碼,而這些代碼並不像官方iText的行爲方式。確保您使用的是iText的正版副本。

無論如何:您在示例中共享的屏幕截圖與您的代碼不匹配。在您的代碼中,您有:

stamper.FormFlattening = true; 

這與您的屏幕截圖顯示交互性不一致。這是唯一可能的,如果你有:

stamper.FormFlattening = false; 

或如果此行不存在。

+0

謝謝。我會看一下。 stamper.FormFlattening被設置爲false,所以我實際上可以看到在該字段中放置了什麼(因此代碼中的不一致)。 – Steve

+0

嗨布魯諾,我已經找出了問題所在。我刪除了該字段並重新添加,並且其行爲與預期相同。實際上問題似乎是我使用的是一種名爲「Cambria」的字體,如果將字段設置爲使用該字體,則返回該行爲。 – Steve

+0

所以我的第一個猜測(選項1.你的表單是不同的)是正確的。感謝您的反饋! –

0

我發現,如果您使PDF上的文本框和asp.net上的文本框形成相同的字體,它會修復該格式。在asp.net文本框中沒有粗體。

+0

這與ASP .NET文本框無關。該表單是一個PDF格式的表格,其值是動態生成的。 – Steve