将 iTextSharp PDF 作为内存流返回会导致 StreamNotSupported

2024-01-15

我正在使用 iTextSharp 中的 PdfStamper 创建 PDF 文件,并将 PDF 作为内存流返回 调用函数的对象,然后用于在 Teleriks PDF Viewer Component for WinForms 中显示 PDF。

这就是目标。

现在,创建 PDF 的工作正常,它将数据返回到 Calling 函数,在 Calling 函数中,我是否应该将内存流内容写入文件流,然后在 Adob​​e Reader 中打开它?一切看起来都很好。

但是,如果我选择在 PDF 查看器控件中显示 PDF,我只会收到“不支持的流类型”错误。

现在,我发现 PDF 数据出了问题,所以我决定创建 PDF 文件,将其保存到磁盘,然后在调用函数中将其读取到内存流,并在 PDF 查看器中显示该内存流,对于我来说,未知原因,有效......

我真的无法解决这个问题,需要一些帮助。

所以这won't work:

//The Calling function
private void dlgViewPDF_Load(object sender, EventArgs e)
{
    MemoryStream ms = PDFcreator.GeneratePDFdata(id);

   rPdfView.LoadDocument(ms);
}

//The PDF generator
public static MemoryStream GeneratePDFdata(string id)
{
    MemoryStream ms = new MemoryStream();

    string sTemplate = string.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "\\template.pdf");

    PdfReader pdfReader = new PdfReader(sTemplate);
    PdfStamper pdfStamper = new PdfStamper(pdfReader, ms);

    PdfContentByte cb = pdfStamper.GetOverContent(1);

    BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
    BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
    cb.SetColorFill(iTextSharp.text.Color.BLACK);
    cb.SetFontAndSize(baseFontBold, 14);

    cb.BeginText();
    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "TEST!!", 385, 750, 0);
    cb.EndText();

    cb.SetColorStroke(new CMYKColor(0f, 0f, 0f, 1f));
    cb.SetColorFill(new CMYKColor(0f, 0f, 0f, 1f));

    cb.MoveTo(139, 398);
    cb.LineTo(146, 398);
    cb.LineTo(146, 391);
    cb.LineTo(139, 391);
    cb.ClosePathEoFillStroke();

    pdfStamper.Close();
    pdfReader.Close();

    return ms;
}

然而,由于某种原因,这确实有效:

//The Calling function
private void dlgViewPDF_Load(object sender, EventArgs e)
{
    MemoryStream ms = new MemoryStream();

    FileStream file = new FileStream(@"c:\temp\testfile.pdf", FileMode.Open, FileAccess.Read);

    byte[] bytes = new byte[file.Length];
    file.Read(bytes, 0, (int)file.Length);
    ms.Write(bytes, 0, (int)file.Length);

    rPdfView.LoadDocument(ms);
}


//The PDF generator 
public static void GeneratePDFdata(string id)
{
    MemoryStream ms = new MemoryStream();

    string sTemplate = string.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "\\template.pdf");

    PdfReader pdfReader = new PdfReader(sTemplate);

    FileStream fs = new FileStream(@"c:\temp\testfile.pdf", FileMode.Create, FileAccess.Write, FileShare.None);
    PdfStamper pdfStamper = new PdfStamper(pdfReader, fs);

    PdfContentByte cb = pdfStamper.GetOverContent(1);

    BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
    BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
    cb.SetColorFill(iTextSharp.text.Color.BLACK);
    cb.SetFontAndSize(baseFontBold, 14);

    cb.BeginText();
    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "TEST!!", 385, 750, 0);
    cb.EndText();

    cb.SetColorStroke(new CMYKColor(0f, 0f, 0f, 1f));
    cb.SetColorFill(new CMYKColor(0f, 0f, 0f, 1f));

    cb.MoveTo(139, 398);
    cb.LineTo(146, 398);
    cb.LineTo(146, 391);
    cb.LineTo(139, 391);
    cb.ClosePathEoFillStroke();

    pdfStamper.Close();
    pdfReader.Close();
}

但为什么?我宁愿将其全部保留在内存中,并让用户保存生成的 PDF(如果他/她愿意),而不是将其写入磁盘然后显示它。


出现问题的原因是,当 PdfStamper 关闭时,内存流会隐式关闭。为了防止这种情况添加

pdfStamper.Writer.CloseStream = false;

before

pdfStamper.Close();

这指示压模器不要关闭流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 iTextSharp PDF 作为内存流返回会导致 StreamNotSupported 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 在word文档中插入图片

    这是我第一次在 Apache POI 上工作 我要问的问题已经在这个网站上提出了 但没有给出明确的答案 所以我别无选择 只能接受你们的帮助 我正在尝试编写一个java程序 它从一个文件夹中获取图像并将该图像插入到word文档中 我在这个程序
  • 如何将 Django 模型上的属性(虚拟字段)公开为 TastyPie ModelResource 中的字段

    我在 Django 模型中有一个属性 我想通过 TastyPie ModelResource 公开该属性 我的模型是 class UserProfile models Model genderChoices u M u Male u F u
  • Trie、后缀树、后缀数组

    哪种结构提供最佳的性能结果 trie 前缀树 后缀树还是后缀数组 还有其他类似的结构吗 这些结构的良好 Java 实现是什么 编辑 在这种情况下 我想在大型名称词典和大量自然语言文本之间进行字符串匹配 以便识别文本上词典的名称 特里树是第一
  • 在 chrome DevTools/Console 面板中复制文本无法正常工作

    描述错误 最近 在 macOS 版本 12 6 3 上使用 Chrome 版本 112 0 5615 49 时 我在从 DevTools 的控制台面板复制和粘贴时遇到了问题 选择一个单词并复制后 当我粘贴它时 它总是向后移动2个字符 这可能
  • 最好的 JavaScript 日期解析器和格式化器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Zend_DB_Table 选择查询

    我有一个类似以下的代码 class Application Model Company extends Zend Db Table Abstract protected name companies private id private n
  • 为什么 rm 命令不删除文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我今天访问我的 Ubuntu 16 04 服务器并想要删除文件 test2 时 它根本没有被删除 我用过 rm test2 也 rm f
  • Nexus 7 (ME370T) 上的 BLE 与 Android 4.4.2

    我一直在尝试使用 sdk sdk samples android 18 legacy BluetoothLeGatt 中的示例将 BLE 设备与我的 Nexus 7 ME370T 配对 但我收到信息 不支持 Ble 我正在寻找解决方案 但我
  • XAML文件如何与cs文件关联?

    看来 XAML 文件在 C 项目中应该有相应的 cs 文件 我知道 Visual Studio 可以为我们做所有事情 我只是好奇它们是如何联系在一起的 我的意思是 它们是在项目文件中指定的 还是仅仅因为它们具有相同的名称 而且 App xa
  • 使用 Appium 测试 Android 应用程序时无法创建新的远程会话

    我正在尝试使用 Appium 在 Eclipse 中运行用 java 编码的测试脚本示例 我通过 npm 运行 Appium 我使用的是 Appium 1 6 3 我对 Appium 并不陌生 我之前在 Mac 和 Windows 上运行它
  • 以编程方式设置 java.util.logging 目标

    我使用 java util logging 进行日志记录和跟踪 如何在 Java 应用程序中动态设置应写入日志的文件 The java util logging FileHandler可能会为你完成它的工作 以下代码片段显示了如何以编程方式
  • if 表达式中的运算顺序是否发生变化?

    我最近遇到了一些我认为我马上就能理解的东西 但更多地思考它 我想理解它为什么会这样工作 考虑下面的代码 这 x 9 显然正在接受评估 而 y 11 不是 我的第一个想法是合乎逻辑的 启动 发现表达式已经变为 false 并在计算表达式的第二
  • 尝试部署 firebase 函数时出现 ESLint 错误

    我尝试部署 firebase 函数 但由于 ESLint 的一些问题 它一直失败 我也尝试过谷歌搜索答案 但我看到的一切对我来说都是希腊语 我也偶然发现this https stackoverflow com questions 47852
  • 如何将 CSharpEntityTypeGenerator 拉入项目?

    我看过很多帖子讨论如何子类化CSharpEntityTypeGenerator修改 EF Core 写出的内容 Visual Studio 不喜欢这样并要求安装Microsoft EntityFrameworkCore Design 我已经
  • 需要类或命名空间

    我得到了 C 中枚举的编译时间 错误显示 Expected a class or namespace mf setStatus MediaFile SyncStatus Synced 枚举是这样定义的 class MediaFile pub
  • 是否可以在 apk 中获得对 sqlite 数据库的只读访问权限? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将现有数据库放入 apk 文件中 https stackoverflow com questions 4022866 how to put existing database in the apk
  • Python:字符串列表中子字符串的最佳搜索

    我有一个特殊的问题 我想在许多字符串列表中搜索许多子字符串 以下是我想做的事情的要点 listStrings ACDE CDDE BPLL listSubstrings ACD BPI KLJ 上述条目只是示例 len listString
  • 授予 IIS Express 访问 VMWare 中网络驱动器的权限

    我在 VMWare 中有一个 Windows 7 虚拟机 用于使用默认的 IIS Express 服务器开发 ASP NET MVC 5 Web 应用程序 我喜欢将项目保存在外部硬盘驱动器上 我可以通过共享文件夹 网络驱动器在虚拟机中访问该
  • 我可以仅使用泛型而不是引用类型吗?

    在编写 Map 代码时 我发现声明Map
  • 将 iTextSharp PDF 作为内存流返回会导致 StreamNotSupported

    我正在使用 iTextSharp 中的 PdfStamper 创建 PDF 文件 并将 PDF 作为内存流返回 调用函数的对象 然后用于在 Teleriks PDF Viewer Component for WinForms 中显示 PDF