2012-10-30 68 views
3

我需要使預先填充的PDF/XFA表單爲只讀(如在沒有輸入的情況下,如文本,複選框,單選按鈕等可以更改它們的值)。使用iText檢測動態XFA

對於常規AcroForms PDF和靜態XFA表單,我可以通過在PdfStamper實例上調用setFormFlattening(true)來完成此操作。對於動態XFA表單,我必須將XDP的field節點的access屬性設置爲readOnly

問題是,如何檢測表單是否爲dynamic XFA? isXfaPresent不區分靜態或動態XFA表單,因此沒有用處。

+0

@Bruno很抱歉的文字混亂,感謝在iText的你所有的努力!如果您很快看到CCAP的許可證定價估算值,請給我們一個好的價格! ;) –

+0

我沒有回答銷售要求,但我向歐洲的銷售人員發送了一條消息(假設您位於歐洲)。 –

+0

@布魯諾其實,我在美國。再次感謝您在iText上的辛勤工作(我熟悉您爲什麼去商業化的故事)。 –

回答

3

iText免費言論自由,不像免費啤酒那樣自由。請閱讀http://lowagie.com/bumodels瞭解更多關於我們嘗試過的商業模式的信息,以避免從MPL/LGPL切換到AGPL。

Q1:做動態XFA表單只讀

那是想都不用想與最新版本的iText的,但在您使用的過時的版本不支持。請閱讀http://lowagie.com/itext2,瞭解爲什麼您不應該使用iText 4.2.0(據我所知甚至不是正式版本;我知道,因爲我對每一個iText版本負責)。也許你在談論iTextSharp。

Q2:扁平化的動態XFA形成

如果要扁平化動態XFA表單,你有兩個選擇:要麼使用的Adobe的LiveCycle ES(這將花費你一隻胳膊和一條腿),或使用iText的XFA Worker(這是一款比F/OSS iText更加便宜的閉源產品)。考慮到這款產品的成本和人工小時數,我認爲你不會找到像免費啤酒一樣免費的解決方案。我一個人不知道這樣的產品。

Q3:如何找出是否

這是在我的書解釋的形式XFA是動態的,「iText的在行動 - 第二版。」你已經有一半的解決方案。條件1:isXfaPresent()需要返回true。條件2:getFields()需要有一個空的密鑰集。在本例中請參閱方法readFieldnames()

+1

額外信息:**使得只讀** = PDF仍然充當XML的容器。你所做的就是改變設置。具有技術技能的人可以撤消這種變化。 **展平** =從PDF中刪除所有XML語法並將其轉換爲PDF語法。所有的交互性都失去了。該表格不再是一個表格,而是一個平面PDF。 –

+0

只是關於iText版本的說明 - 你說得對,它不是一個真正的發佈版本;我最初發現它基於[這個答案](http://stackoverflow.com/a/4544513/215168)。由於它不是一個發佈的版本,我知道它可能存在最近iText版本中修復的錯誤。 –

+0

我熟悉你已經添加到iText的XML Worker;我們已經在某個項目上確實需要這些功能,這也是我要求我的經理探索iText許可證的原因。這很棒!只是一個建議 - 我已經簽署了對β名單(http://itextpdf.com/themes/betalist.php)前一段時間,但從來沒有得到的功能得到了軋製成的iText 5.3.3電子郵件通知。也許你想發送一個名單讓人們知道? –

2

爲了增加布魯諾的答案,並提供C#示例代碼:

PdfReader reader = new PdfReader(filePath); 
XfaForm xfa = new XfaForm(reader); 

//Check if PDF file contains Dynamic XFA data 
if (xfa != null && xfa.XfaPresent && xfa.Reader.AcroFields.Fields.Keys.Count == 0) 
{ 
    MessageBox.Show("This PDF contains Dynamic XFA data."); 
}