Заполнение шаблона PDF

Пример заполнения PDF-шаблона и формирование нового документа с помощью библиотеки iTextSharp.

/// <summary>
/// Расширение класса <see cref="PdfReader"/>.
/// </summary>
public static class PdfReaderExtension
{
    /// <summary>
    /// Получение всех шрифтов формы.
    /// </summary>
    /// <param name="reader">Объект чтения из шаблона PDF.</param>
    /// <returns>
    /// Метод возвращает список всех шрифтов формы.
    /// </returns>
    public static PdfDictionary GetFormFonts(this PdfReader reader)
    {
        var acroForm = (PdfDictionary)PdfReader
            .GetPdfObject(reader.Catalog.Get(PdfName.ACROFORM));            
        var dr = acroForm.GetAsDict(PdfName.DR);
        return dr.GetAsDict(PdfName.FONT);
    }
}
/// <summary>
/// Расширение класса <see cref="AcroFields"/>.
/// </summary>
public static class AcroFieldsExtension
{
    /// <summary>
    /// Установка значения текстового поля с использованием шрифта, 
    /// определенного для этого поля или первого подходящего шрифта, 
    /// при невозможности использования шрифта поля..
    /// </summary>
    /// <param name="form">Объект формы.</param>
    /// <param name="reader">Объект чтения из шаблона PDF.</param>
    /// <param name="fonts">Список всех шрифтов формы.</param>
    /// <param name="fieldName">Имя поля формы.</param>
    /// <param name="value">Значение поля формы.</param>
    public static void SetFieldWithFont(this AcroFields form, 
        PdfReader reader, PdfDictionary fonts, string fieldName, 
        string value)
    {
        var fontName = FindFieldFontName(reader, fieldName);
        if (!string.IsNullOrWhiteSpace(fontName))
        {
            var font = FindFontInFontDict(fonts, fontName);
            if (font != null)
                form.SetFieldProperty(fieldName, "textfont", font, null);
        }
        form.SetField(fieldName, value);
    }


    private static string FindFieldFontName(PdfReader reader, 
        string fieldName)
    {
        var merged = reader.AcroFields.GetFieldItem(fieldName).GetMerged(0);
        var da = merged.GetAsString(PdfName.DA);
        return da?.ToString();
    }


    private static BaseFont FindFontInFontDict(PdfDictionary fontDict, 
        string sourceFieldFontName)
    {
        var fieldFontName = fontDict.Keys
            .FirstOrDefault(f => 
                sourceFieldFontName.StartsWith(f.ToString()));
        var iRef = (PRIndirectReference)fontDict
            .GetAsIndirectObject(fieldFontName);
        var font = iRef != null ? BaseFont.CreateFont(iRef) : null;
        if (!string.IsNullOrWhiteSpace(font?.Encoding))
            return font;
        foreach (var fontName in fontDict.Keys)
        {
            iRef = (PRIndirectReference)fontDict
                .GetAsIndirectObject(fontName);
            font = iRef != null ? BaseFont.CreateFont(iRef) : null;
            if (!string.IsNullOrWhiteSpace(font?.Encoding))
                return font;
        }
        return null;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var pdfTemplate = @"tmp.pdf";

        var pdfFile = @"result.pdf";

        using (var templateReader = new PdfReader(pdfTemplate))
        {
            using (var resultStamper = new PdfStamper(templateReader, 
                new FileStream(pdfFile, FileMode.Create)))
            {
                // Получаем ссылку на форму с полями.
                var form = resultStamper.AcroFields;
                // Получаем все шрифты формы.
                var fonts = templateReader.GetFormFonts();

                // Установка значений полей формы.
                form.SetFieldWithFont(templateReader, fonts, 
                    "LastName", "Петров");
                form.SetFieldWithFont(templateReader, fonts, 
                    "FormerLastName", "Иванов");
                form.SetField("Embassyconsulate", "On");

                // Установка запрета на редактирование полей.
                resultStamper.FormFlattening = true;

                resultStamper.Close();
            }
            templateReader.Close();
        }
    }
}

Исходный код

About the author

Добавить комментарий

Сказать спасибо

Способ платежа:

Подписаться на обновления

Укажите свой e-mail чтобы получать уведомления о новых статьях.

Присоединиться к еще 2 подписчикам