2013-11-17 3 views
1

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

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

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

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

ответ

1

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

bytes = ms.GetBuffer(); 

не

bytes = ms.ToArray(); 
+1

'GetBuffer' почти всегда вызывает проблемы. См. Http://stackoverflow.com/a/8606734/231316 и http://stackoverflow.com/a/5119739/231316 –

+0

Спасибо, теперь он работает. – Dave

+0

Ahh, не видел ваших комментариев о том, что не использовал .GetBuffer, пока я не ответил. – Dave

3

Вы пытаетесь использовать 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(); 
    } 
} 
+0

Спасибо, это работает, хотя я изменил оператор return на .GetBuffer(); – Dave

+0

@Dave * Я изменил оператор return на .GetBuffer() * - Скорее всего, это означает, что у вас есть PDF плюс некоторые трейлинг-байты (которые могут быть или не могут быть 0) в возвращаемом 'Byte []'. Не хорошая идея; в то время как Acrobat Reader часто открывает такие документы без кричения загрузки, это противоречит спецификациям, а некоторые программы могут отклонять ваши PDF-файлы. – mkl

Смежные вопросы