【问题标题】:Concatenating PDF using PDFsharp returns empty PDF使用 PDFsharp 连接 PDF 返回空 PDF
【发布时间】:2016-05-09 06:40:04
【问题描述】:

我有一个存储为 list<byte[]> 的 PDF 列表。我尝试使用 PDFsharp 连接所有这些 PDF 文件,但在我的操作之后,我得到了一个具有适当页数的 PDF,但所有页面都是空白的。看起来我丢失了一些标题或其他东西,但我找不到在哪里。

我的代码:

        PdfDocument output = new PdfDocument();
        try
        {
            foreach (var report in reports)
            {
                using (MemoryStream stream = new MemoryStream(report))
                {

                    PdfDocument input = PdfReader.Open(stream, PdfDocumentOpenMode.Import);

                    foreach (PdfPage page in input.Pages)
                    {
                        output.AddPage(page);
                    }
                }
            }


            if (output.Pages.Count <= 0)
            {
                throw new Exception("Empty Document");
            }
            MemoryStream final = new MemoryStream();
            output.Save(final);
            output.Close();
            return final.ToArray();
        }
        catch (Exception e)
        {
            throw new Exception(e.ToString());
        }

我想将其返回为byte[],因为我稍后会使用它们:

return File(report, System.Net.Mime.MediaTypeNames.Application.Octet, "test.pdf");

这将返回具有正确页数的 PDF,但全部为空白。

【问题讨论】:

  • 是否输出。保存(文件名);工作吗?
  • 保存到文件时是否得到正确的文件?如果不是,那么您导入的 PDF 文件可能存在问题。如果是,那么问题可能出在您正在使用的 MemoryStream 上(在您调用 ToArray 之前它会关闭两次 - 如果没有 Debugger,我不能说这是否有问题)。如果没有 MCVE,我不会尝试调试您的问题。
  • 当我只返回一个 pdf 而不使用 PDFSharp 时,它可以正常工作。当我使用 PDFSharp 将 6 个 pdf 与一页连接时,我得到 1 个 6 页的 pdf,但所有页面都是空白的。
  • 仅使用代码 sn-p 且没有 PDF 文件,我们无法正确调查此问题。请提供 MCVE。当您保存到文件时,您是否也会得到六个空白页?
  • 是的,我得到了六个空白页,但文件大小正确。此外,当我检查最终的 byte[] 它包含信息时,看起来我丢失了标题。我不能给你 pdf 样本,因为我是在运行时从 SSRS 报告生成的。我 100% 确定我生成的 PDF 是正确的,因为我过去使用过它。

标签: c# pdf concatenation pdfsharp


【解决方案1】:

您在评论中告知文件来自 SSRS。

旧版本的 PDFsharp 需要特殊的 SSRS 设置:

对于 ReportExecutionService 对象的 Render 方法的 DeviceSettings 参数,传递此值:

theDeviceSettings = "<DeviceInfo><HumanReadablePDF>True</HumanReadablePDF></DeviceInfo>"; 

来源:
http://forum.pdfsharp.net/viewtopic.php?p=1613#p1613

【讨论】:

  • 感谢我将 PDFSharp 形式 1.32 的版本切换到 1.50 Beta_3B,它现在可以工作了。我相信如果我添加此设置并使用旧版本,我也会工作。谢谢你的帮助。没想到DLL的创建者会尽力帮助我。支持产品的好方法 :) 再次感谢 :)
【解决方案2】:

我使用 iTextSharp,看看这个 saple 代码(它有效)

public static byte[] PdfJoin(List<String> pdfs)
    {
        byte[] mergedPdf = null;
        using (MemoryStream ms = new MemoryStream())
        {
            using (iTextSharp.text.Document document = new iTextSharp.text.Document())
            {
                using (iTextSharp.text.pdf.PdfCopy copy = new iTextSharp.text.pdf.PdfCopy(document, ms))
                {
                    document.Open();

                    for (int i = 0; i < pdfs.Count; ++i)
                    {
                        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(pdfs[i]);
                        // loop over the pages in that document
                        int n = reader.NumberOfPages;
                        for (int page = 0; page < n; )
                        {
                            copy.AddPage(copy.GetImportedPage(reader, ++page));
                        }
                    }
                }
            }
            mergedPdf = ms.ToArray();
        }
        return mergedPdf;
    }




 public static byte[] PdfJoin(List<byte[]> pdfs)
    {
        byte[] mergedPdf = null;
        using (MemoryStream ms = new MemoryStream())
        {
            using (iTextSharp.text.Document document = new iTextSharp.text.Document())
            {
                using (iTextSharp.text.pdf.PdfCopy copy = new iTextSharp.text.pdf.PdfCopy(document, ms))
                {
                    document.Open();

                    for (int i = 0; i < pdfs.Count; ++i)
                    {
                        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(pdfs[i]);
                        // loop over the pages in that document
                        int n = reader.NumberOfPages;
                        for (int page = 0; page < n; )
                        {
                            copy.AddPage(copy.GetImportedPage(reader, ++page));
                        }
                    }
                }
            }
            mergedPdf = ms.ToArray();
        }
        return mergedPdf;
    }

【讨论】:

  • 可能你是对的,但我不能使用 iText(这是公司代码,所以我必须使用 PDFSharp)
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多