【问题标题】:iTextSharp - Create new document as Byte[]iTextSharp - 创建新文档为 Byte[]
【发布时间】:2013-11-30 16:05:16
【问题描述】:

有一个小方法可以访问数据库并从 varbinary 列中检索 pdf 文档,然后将数据添加到其中。我想添加代码,以便如果找不到此文档(公司文具),则创建并返回一个新的空白文档。该方法可以返回 Byte[] 或 Stream。

问题是 else 子句中的变量“bytes”为空。

任何想法有什么问题吗?

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

【问题讨论】:

    标签: itextsharp memorystream


    【解决方案1】:

    您正在尝试使用PdfCopy,但这是针对现有文档,而不是新文档。您只需要使用PdfWriterDocument 创建一个“空白”文档。 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();
        }
    }
    

    【讨论】:

    • 谢谢,虽然我确实将返回语句更改为 .GetBuffer();
    • @Dave 我确实将 return 语句更改为 .GetBuffer() - 这很可能意味着您有 PDF 加上一些尾随垃圾字节(可能是也可能不是0) 在返回的Byte[] 中。不是一个好主意;虽然 Acrobat Reader 经常打开此类文档而不会大声加载,但这是违反规范的,某些程序可能会拒绝您的 PDF。
    【解决方案2】:

    我想你可能需要使用

    bytes = ms.GetBuffer();
    

    不是

    bytes = ms.ToArray();
    

    【讨论】:

    猜你喜欢
    • 2015-05-21
    • 2014-05-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多