2015-10-30 73 views
0

我使用itextsharp從模板pdf文件創建pdf。但新的PDF文件被創建爲動態PDF格式。我想將這個文件轉換爲靜態的pdf文件,所以我試圖使用xfaworker。我從itextsharp.licensekey.dll得到「Signature was corrupted」錯誤。我怎樣才能使用xfaworker或其他dll的flatten動態pdf?使用iTextSharp平展動態pdf

public string Create(FaxPDFModel model, MemoryStream ms) 
{ 
    string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
    UriBuilder uri = new UriBuilder(codeBase); 
    string templatePath = Path.GetDirectoryName(Uri.UnescapeDataString(uri.Path)); 
    PdfReader pdfTemplate = new PdfReader(Path.Combine(Path.Combine(templatePath, "Docs"), "fax_template.pdf")); 
    PdfStamper stamper = new PdfStamper(pdfTemplate, ms); 
    stamper.Writer.CloseStream = false; 
    BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "ISO-8859-9", BaseFont.EMBEDDED); 
    var acroFields = stamper.AcroFields; 
    acroFields.GenerateAppearances = true; 
    stamper.FormFlattening = true; 
    acroFields.AddSubstitutionFont(bf); 
    acroFields.SetField("Name", "Mutabakat test"); 
    acroFields.SetField("Title", "DANIŞMANLIK"); 
    acroFields.SetField("Department", "test"); 
    acroFields.SetField("Phone", "0 (212) 555 55 55"); 
    stamper.Close(); 

    string path = Path.Combine(Path.Combine(templatePath, "Docs"), System.Guid.NewGuid().ToString()); 
    string pdfPath = path + ".pdf"; 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create)); 
    XFAFlattener xfaf = new XFAFlattener(document, writer); 
    ms.Position = 0; 
    xfaf.Flatten(new PdfReader(ms)); 
    document.Close(); 
    return pdfPath; 
} 

回答

1

如果你想解決你的問題,你將不得不通過固定以下錯誤啓動:

1.您正在使用代碼來填充AcroForms而不是代碼來填充XFA表單:

如果您有一個動態的XFA表單,您的PDF將充當XML的容器。此表單不會以鍵值對的形式期待數據。該表單需要以XML格式存儲數據。

不能使用此代碼:

var acroFields = stamper.AcroFields; 
acroFields.AddSubstitutionFont(bf); 
acroFields.SetField("Name", "Mutabakat test"); 
acroFields.SetField("Title", "DANIŞMANLIK"); 
acroFields.SetField("Department", "test"); 
acroFields.SetField("Phone", "0 (212) 555 55 55"); 

此代碼期待您的形式是AcroForm。您需要填寫表格這樣的:

AcroFields form = stamper.AcroFields; 
XfaForm xfa = form.Xfa; 
xfa.FillXfaForm(new FileStream(xml, FileMode.Open)); 

在這個片段xml指的是存儲爲XML數據。

2.您嘗試壓扁表格前壓平形式:

我看到你的代碼的第一部分,這條線:

stamper.FormFlattening = true; 

這一行,刪除所有交互從你的PDF。在關閉stamper對象後,您不再有表單,因此代碼的第二部分將無法工作。

3.您正在試圖嵌入一個標準的Type 1字體:

此行沒有任何意義:

BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "ISO-8859-9", BaseFont.EMBEDDED); 

時報羅馬是一個標準的Type 1字體(在過去,我們稱之爲Base14字體); iText從未嵌入任何爲PDF定義的14種標準類型1字體,因此參數BaseFont.EMBEDDED將被忽略。

4.真實誤差:

XFA工人爲iTextSharp的封閉源插件。它需要一個有效的許可證密鑰。當您收到錯誤消息"Signature was corrupted"時,表示您使用的是損壞的許可證密鑰。

可能的原因:

  • 你不是iText的集團客戶。您正在使用您在某處找到的密鑰,並且您更改了其中的一些內容。
  • 您是iText集團的客戶。你收到了鑰匙,但不知何故,它被篡改了。過去,我們遇到了類似的問題,即客戶正在閱讀密鑰,就好像它是用EBCDIC編碼的。請聯繫iText集團的客戶經理了解更多信息。