Сглаживание динамического PDF с помощью 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;
}

person ebruszl    schedule 30.10.2015    source источник


Ответы (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. Вы пытаетесь встроить шрифт Standard Type 1:

Эта строка не имеет смысла:

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

Times-Roman - это шрифт Standard Type 1 (раньше мы называли его шрифтом Base14); iText никогда не встраивает ни один из 14 стандартных шрифтов типа 1, определенных для PDF, поэтому параметр BaseFont.EMBEDDED будет проигнорирован.

4. Настоящая ошибка:

XFA Worker - это надстройка с закрытым исходным кодом для iTextSharp. Требуется действующий лицензионный ключ. Когда вы получаете сообщение об ошибке "Signature was corrupted", вы используете поврежденный лицензионный ключ.

Возможные причины:

  • Вы не являетесь клиентом iText Group. Вы используете ключ, который где-то нашли, и вы изменили его содержимое.
  • Вы являетесь клиентом iText Group. Вы получили ключ, но его каким-то образом подделали. В прошлом у нас была аналогичная проблема, когда клиент считывал ключ, как если бы он был закодирован в EBCDIC. Пожалуйста, свяжитесь со своим менеджером по работе с клиентами в iText Group для получения дополнительной информации.
person Bruno Lowagie    schedule 30.10.2015