Вопрос по filestream, pdf, memorystream, itextsharp, c# – iTextSharp + FileStream = Поврежденный файл PDF

8

Я пытаюсь создать 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();

Где ошибка, которую я делаю?

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

вам нужен этот MemoryStream? Вы закрыли этот myDocument перед записью в FileStream? Rubens Farias

Ваш Ответ

5   ответов
0

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

0
documentobject.Close();
using (FileStream fs = System.IO.File.Create(path)){                        
    Memorystreamobject.WriteTo(fs);
}         
4

У меня была похожая проблема. Мой файл загружен, но размер файла будет 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);
}
@Azsgy Ответ отредактирован. Спасибо за предложение. Oluwasayo Babalola
Этот ответ можно улучшить, объяснив, почему это устраняет проблему и в чем была ошибка. Azsgy
0

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

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

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

myMemoryStream.Seek(0, SeekOrigin.Begin);
Вы пытались смыть поток? matt
Следующее тоже не сработало:Document myDocument = new Document(); PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, new FileStream(path, FileMode.Create)); myDocument.Open(); // Content ... myDocument.Close();  Поврежденный файл ... :( Norbert
29

Я думаю, что ваша проблема заключалась в том, что вы неправильно добавляли контент в свой 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);
    }
}

Похожие вопросы