ITextSharp/Pdftk: поместите изображение Base64 из Интернета в PDF как псевдоподпись

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

Мне не удалось найти другие примеры в Интернете, поэтому я спрашиваю Stack.

Мое приложение использует .net С#.

Любые советы о том, как начать?


person MizAkita    schedule 14.05.2015    source источник
comment
Base64 — это просто способ представления двоичных данных, такой же, как ASCII, UTF8, ZIP и т. д., так что это не так уж важно. Вашей задачей будет превратить эти данные либо в изображение на основе файла, либо в объект .Net Image. В противном случае у вас есть два шага: создать PDF и подписать PDF, верно? Для начала, хорошо ли вы разбираетесь в шаге создания PDF или вам нужна помощь?   -  person Chris Haas    schedule 14.05.2015
comment
Я могу сохранить pdf в файл ... но как поставить печать, вот что сбивает с толку. Используя MemoryStream, он без проблем сохраняет папку загрузки моего сервера ( response.BinaryWrite(contents) ), однако повторное открытие, а затем печать с изображением в itextsharp - вот где я потерялся.   -  person MizAkita    schedule 14.05.2015
comment
Я действительно не понимаю, что вы хотите сделать. Итак, у вас есть PDF-файл, и вы хотите что-то на нем поставить. Пока все хорошо, пока ничего сложного. Но какое отношение имеют base64 и signature к этой задаче? Хотите поставить подпись? Что за подпись? Изображение рукописного? Или продвинутый или квалифицированный? А почему base64?   -  person mkl    schedule 14.05.2015
comment
Я хочу поставить подпись изображения base64 на определенное место в PDF-файле после его рендеринга ... или до. что проще всего.   -  person MizAkita    schedule 14.05.2015
comment
Что такое подпись изображения base64?   -  person mkl    schedule 15.05.2015
comment
это изображение из подписи на холсте... оно сохраняется как изображение base64.   -  person MizAkita    schedule 15.05.2015
comment
А, по сути просто образ. @kuujinbo продемонстрировал приемы.   -  person mkl    schedule 16.05.2015


Ответы (1)


Как упомянул @mkl, вопрос сбивает с толку, особенно заголовок - обычно base64 и подпись не идут вместе. Думаете, вы хотите поместить изображение base64 из Интернета в PDF в качестве псевдоподписи?! ?!

Быстрый рабочий пример для начала:

static void Main(string[] args)
{
    string currentDir = AppDomain.CurrentDomain.BaseDirectory;
    // 'INPUT' => already rendered pdf in iText
    PdfReader reader = new PdfReader(INPUT);
    string outputFile = Path.Combine(currentDir, OUTPUT);
    using (var stream = new FileStream(outputFile, FileMode.Create)) 
    {
        using (PdfStamper stamper = new PdfStamper(reader, stream))
        {
            AcroFields form = stamper.AcroFields;
            var fldPosition = form.GetFieldPositions("lname")[0];
            Rectangle rectangle = fldPosition.position;
            string base64Image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
            Regex regex = new Regex(@"^data:image/(?<mediaType>[^;]+);base64,(?<data>.*)");
            Match match = regex.Match(base64Image);
            Image image = Image.GetInstance(
                Convert.FromBase64String(match.Groups["data"].Value)
            );
            // best fit if image bigger than form field
            if (image.Height > rectangle.Height || image.Width > rectangle.Width)
            {
                image.ScaleAbsolute(rectangle);
            }
            // form field top left - change parameters as needed to set different position 
            image.SetAbsolutePosition(rectangle.Left + 2, rectangle.Top - 2);
            stamper.GetOverContent(fldPosition.page).AddImage(image);
        }
    }
}

Если вы не работаете с шаблоном формы PDF, (AcroFields во фрагменте кода) явно задайте абсолютную позицию и масштабируйте изображение по мере необходимости.

person kuujinbo    schedule 15.05.2015
comment
Ты жжешь! Это сработало отлично! Единственное, это позиционирование... Оно отображается внизу страницы слева. Во всяком случае, чтобы позиционировать его абсолютным? - person MizAkita; 16.05.2015
comment
@MizAkita — обновлен фрагмент кода, чтобы он располагался слева вверху, а не внизу слева. Чтобы изменить абсолютную позицию изображения, измените два параметра, переданных в image.SetAbsolutePosition(), как указано в предпоследней строке. - person kuujinbo; 16.05.2015