0

テンプレートpdfファイルからpdfを作成するためにitextsharpを使用しています。ただし、新しい pdf ファイルは動的 pdf のように作成されます。このファイルを静的pdfファイルに変換したいので、xfaworkerを使ってみました。itextsharp.licensekey.dll から「署名が壊れています」というエラーが表示されます。動的PDFを平坦化するためにxfaworkerまたは別のdllを使用するにはどうすればよいですか?

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;
}
4

1 に答える 1

1

問題を解決したい場合は、次のエラーを修正することから始める必要があります。

1. XFA フォームに入力するコードではなく、AcroForms に入力するコードを使用しています。

動的な 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、フォームがなくなるため、コードの 2 番目の部分が機能しなくなります。

3. Standard Type 1 フォントを埋め込もうとしている場合:

この行は意味がありません:

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

Times-Roman は Standard Type 1 フォントです (昔はこれを Base14 フォントと呼んでいました)。iText は、PDF 用に定義された 14 の標準 Type 1 フォントを一切埋め込まないため、このパラメーターBaseFont.EMBEDDEDは無視されます。

4. 本当のエラー:

XFA Worker は、iTextSharp のクローズド ソース アドオンです。有効なライセンス キーが必要です。というエラーが表示された"Signature was corrupted"場合は、破損したライセンス キーを使用しています。

考えられる原因:

  • あなたは iText Group の顧客ではありません。どこかで見つけたキーを使用していて、その内容の一部を変更しました。
  • あなたは iText Group の顧客です。鍵を受け取りましたが、どういうわけか改ざんされました。過去に、お客様が鍵を EBCDIC でエンコードされているかのように読み取っていたという同様の問題がありました。詳細については、iText Group のアカウント マネージャーにお問い合わせください。
于 2015-10-30T14:40:25.050 に答える