c# - 创建 pdf 类型的 Memorystream 并返回浏览器
问题描述
我必须创建一个带有简单文本消息的空白 PDF 并将其返回给浏览器。我不必使用任何第三方 PDF 库,如 iTextSharp、PDFDocument 等。
我正在使用MemoryStream
,但正在生成损坏的 PDF。
MemoryStream ms = new MemoryStream();
ms.Write(System.Text.Encoding.Unicode.GetBytes("test message"), 0, System.Text.Encoding.Unicode.GetBytes("test message").Length);
Response.AddHeader("Content-Disposition", "attachment;filename=" + id.ToString() + ".pdf");
return File(ms.ToArray(), "application/pdf");
我错过了什么?
解决方案
您基本上已经创建了一个 TXT 文件并将其发送到浏览器,将其声明为 PDF。
PDF 有自己的文件格式。PDF 标准的旧版本(例如 PDF 1.2)可以以类似文本的格式编写。Wayback Machine有一份 PDF 1.2 规范的副本。
您可能希望从 PDF 标准的较新版本中受益。也许你不想花时间阅读和理解 400 页。此外,您不需要巨大的字符串模板,而是一种更具表现力的创建 PDF 文件的方式。因此,图书馆可以为您节省大量时间和精力。
无论如何,您可以阅读该规范并提出类似
string template = @"
%PDF-1.2
4 0 obj << >>
stream
BT/ 12 Tf({0})' ET
endstream
endobj
3 0 obj << /Type /Page /Parent 2 0 R /Contents 4 0 R >> endobj
2 0 obj << /Kids [3 0 R ] /Count 1 /Type /Pages /MediaBox [ 0 0 99 99 ] >> endobj
1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj
trailer << /Root 1 0 R >>
%%EOF
";
string text = "Text message";
string pdf = string.Format(template, text);
它有:
%PDF-1.2
章节 5.2 中描述的标题- 第 4 章中描述的各种对象
- 里面的字典
<< >>
如第 4.7 章所述 - 和之间的流
stream
,endstream
如第 4.8 章所述 - 一个文本对象,以图 8.1 中描述的方式引入
BT
和结束ET
- 文本字体操作,
Tf
如第 8.7.3 章所述 - 和之间的文本字符串
(
,)
如第 4.4 章所述。我在{0}
这里使用 .NET 占位符。 - 具有所需
MediaBox
定义页面大小的页面,如第 6.4 章所述 - A
trailer
如第 5.5 章所述,以 结尾%%EOF
,包含必填/Root
项。
您有点“自下而上”地阅读此 PDF。预告片指的是Object 1 0
,指的是页面2 0
,指的是一页3 0
,指的是内容4 0
。
推荐阅读
- elasticsearch - 模糊多重匹配未按预期工作 Elastic Search
- android - 长文本不适合文本视图
- angular - 如何将 Typescript 变量值添加到 Angular div 标签?
- sql - 使用 Docker 时如何向数据库创建虚拟数据?
- python - 如何在python中启动秒表
- javascript - SAP UI5 主从应用程序
- latex - Latex :在部分名称中使用自定义计数器时,nameref 不正确
- java - @JsonProperty:在反序列化中没有得到正确的值
- python - 为什么在尝试导入 BeautifulSoup 时出现“NameError: name 'bs4' is not defined”错误?
- terraform0.12+ - 在 for_each 中使用动态块时出现 Terraform 错误