iTextSharp + FileStream = Повреждение файл PDF

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

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();

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

Спасибо, Norbert

8
задан Norbert 2 February 2010 в 09:04
поделиться

3 ответа

I Думаю, ваша проблема заключалась в том, что вы неправильно добавляли контент в свой 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);
    }
}
29
ответ дан 3 November 2019 в 13:09
поделиться

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

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

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

myMemoryStream.Seek(0, SeekOrigin.Begin);
0
ответ дан 3 November 2019 в 13:09
поделиться

Попробуйте дважды проверить свой код, который манипулирует PDF с помощью ITEXT. Убедитесь, что вы вызываете соответствующий метод EndText ни одного объекта PDFContentbyte и убедитесь, что вы звоните MyDocument.close () перед записью файла на диск. Это все, что у меня были проблемы с в прошлом при создании PDFS с помощью iTextSharp.

0
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

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