Вопрос по itextsharp, memorystream – iTextSharp - Создать новый документ как байт []

2

Есть небольшой метод, который идет в базу данных и получает документ PDF из столбца varbinary, а затем добавляет в него данные. Я хотел бы добавить код, чтобы, если этот документ (канцелярские принадлежности компании) не был найден, то новый пустой документ был создан и возвращен. Метод может вернуть либо Byte [], либо Stream.

Проблема в том, что переменнаябайт» в предложении else - ноль.

Любые идеи, чтоS не так?

private Byte[] GetBasePDF(Int32 AttachmentID)
{
    Byte[] bytes = null;
    DataTable dt =  ServiceFactory
        .GetService().Attachments_Get(AttachmentID, null, null);

    if (dt != null && dt.Rows.Count > 0)
    {
        bytes = (Byte[])dt.Rows[0]["Data"];
    }
    else
    {
        // Create a new blank PDF document and return it as Byte[]
        ITST.Document doc = 
           new ITST.Document(ITST.PageSize.A4, 50f, 50f, 25f, 25f);
        MemoryStream ms = new MemoryStream();

        PdfCopy copy = new PdfCopy(doc, ms);
        ms.Position = 0;

        bytes = ms.ToArray();

    }

    return bytes;
}

Ваш Ответ

2   ответа
4

Вы пытаетесь использоватьPdfCopy но это'Предназначен для существующих документов, а не для новых. Вам просто нужно создатьпустой» использование документовPdfWriter а такжеDocument, iText выигралПозволяет вам создать пустой документ на 100%, но код ниже, по сути, делает это, просто добавляя пробел.

private static Byte[] CreateEmptyDocument() {
    using (var ms = new System.IO.MemoryStream()) {
        using (var doc = new Document()) {
            using (var writer = PdfWriter.GetInstance(doc, ms)) {
                doc.Open();
                doc.Add(new Paragraph(" "));
                doc.Close();
            }
        }
        return ms.ToArray();
    }
}
@ DaveЯ изменил оператор возврата на .GetBuffer () - Скорее всего, это означает, что у вас есть PDF плюс несколько завершающих байтов (которые могут быть или не быть 0) в возвращаемомByte[], Не хорошая идея; В то время как Acrobat Reader часто открывает такие документы, не выполняя нагрузку, это противоречит спецификациям, и некоторые программы могут отклонять ваши PDF-файлы. mkl
Спасибо, это работает, хотя я изменил оператор return на .GetBuffer (); Dave
1

Я думаю, вам может понадобиться

bytes = ms.GetBuffer();

не

bytes = ms.ToArray();
Спасибо Крис Хаас, приятно узнать о GetBuffer (). michaelrp
Ааа, нене вижу вашего комментария о неиспользовании .GetBuffer до тех пор, пока я не отвечу. Dave
GetBuffer почти всегда вызывает проблемы. Увидетьstackoverflow.com/a/8606734/231316 а такжеstackoverflow.com/a/5119739/231316 Chris Haas
Спасибо, теперь это работает. Dave

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