簡體   English   中英

使用iTextSharp展平動態pdf

[英]Flatten dynamic pdf using iTextSharp

我正在使用itextsharp從模板pdf文件創建pdf。 但是會創建新的pdf文件,就像動態pdf。 我想將此文件轉換為靜態pdf文件,因此我嘗試使用xfaworker 我從itextsharp.licensekey.dll收到“簽名已損壞”錯誤。 如何使用xfaworker或其他dll來展平動態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.您正在使用代碼填充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);

Times-Roman是Standard Type 1字體(在過去,我們將其稱為Base14字體)。 iText從不嵌入為PDF定義的14種Standard Type 1字體中的任何一種,因此將忽略參數BaseFont.EMBEDDED

4.真正的錯誤:

XFA Worker是iTextSharp的開源附件。 它需要一個有效的許可證密鑰。 當出現錯誤消息"Signature was corrupted" ,說明您使用的許可證密鑰已損壞。

可能的原因:

  • 您不是iText Group的客戶。 您正在使用在某處找到的密鑰,並且更改了其中的某些內容。
  • 您是iText Group的客戶。 您收到了一把鑰匙,但是以某種方式被篡改了。 過去,我們遇到過類似的問題,即客戶正在讀取密鑰,就像它是用EBCDIC編碼一樣。 請與您的iText Group客戶經理聯系以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM