2015-05-14 3 views
2

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

Я не имел никакого успеха с поиском других примеров в Интернете, поэтому я прошу Stack.

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

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

+1

Base64 - это всего лишь способ представления двоичных данных, таких как ASCII, UTF8, ZIP и т. Д., Поэтому это не так уж важно. Будет вашей задачей превратить эти данные в образ на основе файлов или объект .Net 'Image'. В противном случае у вас есть два шага, создайте PDF и подпишите PDF, не так ли? Для начала, хорошо ли вы с шагом создания PDF или вам нужна помощь в этом? –

+0

Я могу сохранить PDF в файл ... но как штамповать это то, что вводит в заблуждение. Используя MemoryStream, он сохраняет исходную папку с сервером без проблем (response.BinaryWrite (содержимое)), однако - повторное открытие, а затем штампование с изображением в itextsharp - там, где я потерял. – MizAkita

+0

Я действительно не понимаю, что вы хотите сделать. Хорошо, у вас есть PDF-файл и вы хотите что-то штамповать. Пока что так хорошо, ничего сложного пока. Но в каком отношении это * base64 * и * signature * к этой задаче? Вы хотите штамповать подпись? Какая подпись? Изображение рукописного? Или продвинутый или квалифицированный? И почему * base64 *? – mkl

ответ

2

Как @mkl упомянутый вопрос является запутанным, особенно заголовок - обычно base64 и signature не идут вместе. Угадав, что вы хотите разместить base64 image from web в 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 в фрагменте кода) явно установить абсолютное положение и масштаб изображения по мере необходимости.

+0

Вы рок! Это сработало отлично! Единственное, что позиционирует ... Он отображается в нижней части страницы слева. В любом случае, чтобы он был абсолютным? – MizAkita

+2

@MizAkita - обновленный фрагмент кода для позиции в левом верхнем углу, а не внизу слева. Чтобы изменить абсолютное положение изображения, измените два параметра, переданных в image.SetAbsolutePosition(), как прокомментированы в секундах до последней строки. – kuujinbo