iTextSharp - создать новый документ как Byte[]

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

Проблема в том, что переменная «байты» в предложении else имеет значение null.

Есть идеи, что не так?

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;
}

person Dave    schedule 17.11.2013    source источник


Ответы (2)


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

bytes = ms.GetBuffer();

нет

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

Вы пытаетесь использовать 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();
    }
}
person Chris Haas    schedule 18.11.2013
comment
Спасибо, это работает, хотя я изменил оператор return на .GetBuffer(); - person Dave; 18.11.2013
comment
@Dave Я изменил оператор возврата на .GetBuffer(). Скорее всего, это означает, что у вас есть PDF-файл плюс несколько завершающих мусорных байтов (которые могут быть или не быть 0) в возвращаемом Byte[]. Не хорошая идея; в то время как Acrobat Reader часто открывает такие документы без загрузки, это противоречит спецификациям, и некоторые программы могут отклонить ваши PDF-файлы. - person mkl; 18.11.2013