iTextSharp + FileStream = Поврежденный файл PDF - PullRequest
8 голосов
/ 02 февраля 2010

Я пытаюсь создать PDF-файл с помощью iTextSharp. Моя попытка записать содержимое pdf в MemoryStream, чтобы я мог записать результат как в файл, так и в большой двоичный объект базы данных. Файл создается, имеет размер около 21 КБ и выглядит как PDF-файл при открытии с Notepad ++. Но мой просмотрщик PDF говорит, что он урезан. Вот небольшой фрагмент кода (только попытка записи в файл, а не в базу данных):

Document myDocument = new Document();
MemoryStream myMemoryStream = new MemoryStream();
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);
myDocument.Open();
// Content of the pdf gets inserted here
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf"))
{
    myMemoryStream.WriteTo(fs);
}
myMemoryStream.Close();

Где я совершаю ошибку?

Спасибо, Норберт

Ответы [ 5 ]

29 голосов
/ 02 февраля 2010

Я думаю, что ваша проблема заключалась в том, что вы неправильно добавляли контент в свой PDF. Это делается с помощью метода Document.Add (), и вы заканчиваете, вызывая Document.Close ().

Однако, когда вы вызываете Document.Close (), ваш MemoryStream также закрывается, поэтому вы не сможете записать его в свой FileStream, как у вас. Вы можете обойти это, сохраняя содержимое вашего MemoryStream в байтовом массиве.

У меня работает следующий фрагмент кода:

using (MemoryStream myMemoryStream = new MemoryStream()) {
    Document myDocument = new Document();
    PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);

    myDocument.Open();

    // Add to content to your PDF here...
    myDocument.Add(new Paragraph("I hope this works for you."));

    // We're done adding stuff to our PDF.
    myDocument.Close();

    byte[] content = myMemoryStream.ToArray();

    // Write out PDF from memory stream.
    using (FileStream fs = File.Create("aTestFile.pdf")) {
        fs.Write(content, 0, (int)content.Length);
    }
}
4 голосов
/ 28 марта 2018

У меня была похожая проблема. Мой файл загружен, но размер файла будет 13 байт. Я решил проблему, когда использовал двоичный модуль записи для записи моего файла

byte[] bytes = new byte[0];
//pass in your API response into the bytes initialized

using (StreamWriter streamWriter = new StreamWriter(FilePath, true))
{
   BinaryWriter binaryWriter = new BinaryWriter(streamWriter.BaseStream);
   binaryWriter.Write(bytes);
}
0 голосов
/ 05 апреля 2017
documentobject.Close();
using (FileStream fs = System.IO.File.Create(path)){                        
    Memorystreamobject.WriteTo(fs);
}         
0 голосов
/ 02 февраля 2010

Попробуйте дважды проверить свой код, который манипулирует PDF с помощью iText. Убедитесь, что вы вызываете соответствующий метод EndText любого объекта PdfContentByte, и убедитесь, что вы вызываете myDocument.Close () перед записью файла на диск. Это те вещи, с которыми у меня были проблемы в прошлом при создании PDF-файлов с помощью iTextSharp.

0 голосов
/ 02 февраля 2010

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

Если это работает, чем отличаются файлы (по размеру и двоичному представлению)?

Просто предположение, но вы пытались найти начало потока памяти перед записью?

myMemoryStream.Seek(0, SeekOrigin.Begin);
...