2016-04-13 10 views
1

Я хочу добавить штамп в PDF-файл, где файл для штампа сам по себе является PDF-файлом. Вот мой код:Пытаясь добавить штамп PDF с помощью iTextSharp, «Байт-массив не является признанным форматом изображения»

void addImage(string inputPath,string imagePath,string outputPath,int pageNumber) 
{ 
    Stream inputImageStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read); 
    PdfReader pdfReader = new PdfReader(inputPath); 
    PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create)); 
    PdfContentByte pdfContentByte = pdfStamper.GetOverContent(pageNumber); 
    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(inputImageStream); 
    image.SetAbsolutePosition(100, 100); 
    pdfContentByte.AddImage(image); 
} 

void addImageTest() 
{ 
    string sourceFile = @"C:\somefolder\source.pdf"; 
    string stampFile = @"C:\somefolder\stamp.pdf"; 
    string destFile = @"C:\somefolder\destination.pdf"; 
    addImage(sourceFile, stampFile, destFile, 1); 
    return; 
} 

На призыв к GetInstance(), я получаю это исключение:

The byte array is not a recognized imageformat. 

Обновление: глядя на the source code for GetInstance(), я вижу, что он работает с GIF, TIFF, JPEG, PNG , WMF и BMP, но не PDF. Поэтому, мне кажется, мне нужно выяснить, как использовать PDF как образ. Есть идеи?

+1

Вы были * не * смотрели на официальный источник iTextSharp, но на то, что вилки. Официальный источник можно найти по адресу http://github.com/itext/itextsharp. Кроме того, вы используете версию, возраст которой несколько лет. –

ответ

2

PDF - это формат документа, а не формат изображения, поэтому Image.GetInstance() не принимает PDF-байты. Это не означает, что нет обходного пути.

PDF-документ может быть прочитан PdfReader объекта:

PdfReader reader = new PdfReader(src); 

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

PdfImportedPage page = writer.GetImportedPage(reader, 1); 

В строке выше , writer - это экземпляр создаваемого документа PdfWriter. Метод GetImportedPage копирует ресурсы, необходимые для page, в новый файл. Ресурсами могут быть шрифты, изображения, ...

PdfImportedPage распространяется PdfTemplate. PdfTemplate - класс, используемый для Форма XObject. Растровые изображения сохраняются как внешние объекты, называемые Изображение XObjects. Векторные данные (например, WMF, импортированная страница PDF, поток синтаксиса PDF) хранятся как Форма XObjects.

Теперь у вас есть две разные опции: PdfTemplate (или PdfImportedPage) с именем page.

  1. вы можете использовать AddTemplate() метод: writer.DirectContent.AddTemplate(page, x, y);
  2. вы можете обернуть PdfTemplate внутри Image объекта: iTextSharp.text.Image Img = iTextSharp.text.Image.GetInstance(page);

Обратите внимание, что, какой бы вариант вы ни выбрали, PDF никогда не будет преобразован в растровое изображение. Он будет добавлен в виде векторных данных.

Update:

В вашем случае, вы должны заменить writer так:

  • pdfStamper.GetImportedPage(reader, 1);
  • pdfStamper.GetOverContent(pageNumber).AddTemplate(page, x, y);

Мои примеры были сделаны в том случае, вы создаете PDF с нуля.

+0

Это позволяет мне добавлять PDF-файл, но я бы хотел добавить его как обычный штамп, чтобы его можно было выбрать, перетащить по странице и удалить. Это использование 'AddTemplate()' похоже, добавляет его как статический контент - я что-то упускаю? – sigil

+1

Вы можете использовать шаблон как внешний вид аннотации к марке. Дайте мне знать, если это не сработает для вас. См. Http://developers.itextpdf.com/question/how-add-printable-or-non-printable-bitmap-stamp-pdf –

+0

Я следую примеру itextpdf.com, но 'app.AddImage (stampImg)' бросает исключение: «Изображение должно иметь абсолютное позиционирование». – sigil

 Смежные вопросы

  • Нет связанных вопросов^_^