Как я могу вставить изображение с помощью iTextSharp в существующий PDF-файл?

У меня есть PDF-файл, и я могу использовать FdFWriter для ввода в текстовые поля. Это работает хорошо. Теперь у меня есть изображение. Я прочитал документацию и просмотрел множество примеров, но все они создают новые документы и вставляют изображение. Я хочу взять существующий PDF-файл и вставить изображение либо в поле изображения, либо в виде значка кнопки. Я пробовал, но это повредило документ.

Мне нужно взять существующий документ и поместить на него изображение. Я не хочу открывать, читать, заменять и удалять оригинал. Этот оригинал изменяется, и имя «оригинал» в данном контексте означает только исходный файл. Есть много таких PDF-файлов, для которых требуется изображение.

Спасибо за любую помощь.

Изменить - я очень благодарен за приведенный ниже код. Он отлично работает, но для меня проблема в том, что существующий PDF-файл имеет цифровые подписи. Когда документ копируется таким образом (в result.pdf), эти подписи, хотя и присутствуют, имеют другое количество байтов или другой элемент, который поврежден. Это означает, что подписи, отображаемые в файле result.pdf, имеют рядом с ними значок, указывающий на «недействительную подпись».

В случае, если это имеет значение, я использую планшет для подписи Topaz для создания своих подписей, который имеет собственную безопасность. Простое копирование PDF-файла не повредит его, но приведенный ниже процесс повредит.

Я пытаюсь поместить изображение в существующий документ, а не его копию, что в данном случае имеет значение.

Также под подписью я подразумеваю рукописные, а не пин-коды.

Еще раз спасибо.

РЕДАКТИРОВАТЬ - Можно ли для этого использовать PdfSignatureAppearance?

РЕДАКТИРОВАТЬ - похоже, я могу это сделать с помощью:

var stamper = new PdfStamper (читатель, outputPdfStream, '1', true);

Ответов (4)

Решение

Если вы хотите изменить содержимое существующего файла PDF и добавить дополнительное содержимое, такое как водяные знаки, номера страниц, дополнительные заголовки, PdfStamper - это то, что вам нужно. Я успешно использовал следующий код для вставки изображения в существующий файл PDF в заданную абсолютную позицию:

using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

class Program
{
    static void Main(string[] args)
    {
        using (Stream inputPdfStream = new FileStream("input.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
        using (Stream inputImageStream = new FileStream("some_image.jpg", FileMode.Open, FileAccess.Read, FileShare.Read))
        using (Stream outputPdfStream = new FileStream("result.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
        {
            var reader = new PdfReader(inputPdfStream);
            var stamper = new PdfStamper(reader, outputPdfStream);
            var pdfContentByte = stamper.GetOverContent(1);

            Image image = Image.GetInstance(inputImageStream);
            image.SetAbsolutePosition(100, 100);
            pdfContentByte.AddImage(image);
            stamper.Close();
        }
    }
}

Когда вы вставляете изображение, у вас есть возможность изменить его размер. Вы можете взглянуть на матрицу преобразования в документации iTextSharp.

Я мог бы решить свою проблему, просто добавив следующие строки в свой код подписи, чтобы добавить изображение

 var image = iTextSharp.text.Image.GetInstance(@"C:\Users\sushil\Documents\sansign.jpg");
appearance.Acro6Layers = true;
appearance.SignatureGraphic = image;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;

Поскольку я подписывал документ видимой цифровой подписью, теперь у меня могут одновременно отображаться свойства изображения и цифровой подписи.

pdftk может это сделать. Это не библиотека, но вы можете легко вызвать ее из своего кода как .exe.

Смотрите stamp и background команды: http://www.pdflabs.com/docs/pdftk-man-page/

ref: Как выполнить слияние писем поверх PDF?

Вот аналогичный пример, в котором я вставляю изображение на страницу с помощью штампа:

Сообщение списка рассылки Gmane iTex