【问题标题】:Generate Base64 from iTextSharp从 iTextSharp 生成 Base64
【发布时间】:2017-09-26 14:52:44
【问题描述】:

我的项目中有以下方法。

        [Route("GerarPdf")]
        [HttpGet()]
        public object GerarPdf()
        {

            var doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);
            var mem = new MemoryStream();

            PdfWriter wri = PdfWriter.GetInstance(doc, mem);

            doc.Open();//Open Document to write
            Paragraph paragraph = new Paragraph("This is my first line using Paragraph.");
            Phrase pharse = new Phrase("This is my second line using Pharse.");
            Chunk chunk = new Chunk(" This is my third line using Chunk.");

            doc.Add(paragraph);
            doc.Add(pharse);
            doc.Add(chunk);

            var pdf = mem.ToArray();

            return Convert.ToBase64String(pdf);
        }

此代码的目的是生成一个可通过以下 JavaScript 代码下载的 PDF 文件

     var dataURI = "data:application/pdf;base64," +result;
     window.open(dataURI,'_blank'); 

但新打开的页面在加载 PDF 时总是返回错误。方法返回给结果变量的base64码为:

JVBERi0xLjQKJeLjz9MK

谁能帮我解决这个问题?

【问题讨论】:

  • 您是否已经尝试发送从 PdfReader 获得的现有 Pdf 文档?我使用与您非常相似的代码来创建电子邮件附件,所以应该没问题。
  • PDF 的生成不会是静态的,上面的生成只是一个例子。将来我将创建一个完全个性化的文件,并且页数将是可变的。所以我相信我不能使用来自 PdfReader 的静态文档。
  • 我考虑过验证 javascript 部分 - 如果它适用于现有文档,您可以专注于分析生成的 Pdf。您也可以反过来检查,看看您生成的 Pdf 是否从保存到文件中打开。

标签: javascript c# pdf base64 itext


【解决方案1】:

问题是文档在转换为字节数组时没有关闭。在我添加 doc.Close(); PDF 已成功生成。

        [Route("GerarPdf")]
        [HttpGet()]
        public object GerarPdf()
        {

            var doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);
            var mem = new MemoryStream();

            PdfWriter wri = PdfWriter.GetInstance(doc, mem);

            doc.Open();//Open Document to write
            Paragraph paragraph = new Paragraph("This is my first line using Paragraph.");
            Phrase pharse = new Phrase("This is my second line using Pharse.");
            Chunk chunk = new Chunk(" This is my third line using Chunk.");

            doc.Add(paragraph);
            doc.Add(pharse);
            doc.Add(chunk);

            doc.Close();

            var pdf = mem.ToArray();

            return Convert.ToBase64String(pdf);
        }

【讨论】:

  • 这就是为什么我总是将我的文档和内存流放入一个 using () { } 块中,它会自动为我关闭它们。如果您有兴趣,我可以发布您的代码的修改版本。
  • 请发帖。
【解决方案2】:

要让您的 MemoryStreamDocument 自动关闭并为您处置,请将它们放入 using() 块中,如下所示:

[Route("GerarPdf")]
[HttpGet()]
public object GerarPdf()
{
    byte[] pdf = new byte[] { };

    using (var mem = new MemoryStream())
    {
        using (var doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35))
        {
            PdfWriter wri = PdfWriter.GetInstance(doc, mem);

            doc.Open(); //Open Document to write

            Paragraph paragraph = new Paragraph("This is my first line using Paragraph.");
            Phrase pharse = new Phrase("This is my second line using Pharse.");
            Chunk chunk = new Chunk(" This is my third line using Chunk.");

            doc.Add(paragraph);
            doc.Add(pharse);
            doc.Add(chunk);
        } // doc goes out of scope and gets closed + disposed

        pdf = mem.ToArray();
    } // mem goes out of scope and gets disposed

    return Convert.ToBase64String(pdf);
}

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多