永川网站制作,网页设计中好的网站,市场营销说白了就是干什么的,安卓开发工程师月薪Hello#xff0c;我是小恒不会java。 由于最近有输出PDF报表的项目需求#xff0c;所以复习一下PDF到底是什么#xff0c;该如何产生#xff0c;如何应用至项目中。 更多参见Adobe官方文档#xff08;https://www.adobe.com/cn/#xff09; PDF原理
PDF#xff08;Port… Hello我是小恒不会java。 由于最近有输出PDF报表的项目需求所以复习一下PDF到底是什么该如何产生如何应用至项目中。 更多参见Adobe官方文档https://www.adobe.com/cn/ PDF原理
PDFPortable Document Format可移植文档格式是一种用于可靠地呈现和交换文档的标准文件格式。它的设计目标是无论在何种操作系统、硬件配置、字体资源或软件环境下都能精确地复现原始文档的外观和内容。
为了达到这个效果我们需要控制每个字符、每个图形的位置。为此Adode的工程师设计了一种语言PostScript
上经典代码
%PDF-1.1
%¥±ë1 0 obj /Type /Catalog/Pages 2 0 R
endobj2 0 obj /Type /Pages/Kids [3 0 R]/Count 1/MediaBox [0 0 300 144]
endobj3 0 obj /Type /Page/Parent 2 0 R/Resources /Font /F1 /Type /Font/Subtype /Type1/BaseFont /Times-Roman/Contents 4 0 R
endobj4 0 obj /Length 55
streamBT/F1 18 Tf0 0 Td(Im liheng) TjET
endstream
endobjxref
0 5
0000000000 65535 f
0000000018 00000 n
0000000077 00000 n
0000000178 00000 n
0000000457 00000 n
trailer /Root 1 0 R/Size 5
startxref
565
%%EOF%PDF-1.1PDF文件的版本号这里是1.1版本。 %¥±ëPDF文件的二进制标识符用于区分文本和二进制数据。 1 0 obj第一个对象类型为Catalog包含文档的根对象。 2 0 obj第二个对象类型为Pages包含文档的页面对象。 3 0 obj第三个对象类型为Page包含单个页面的信息。 4 0 obj第四个对象类型为Contents包含页面的内容流。 xref交叉引用表列出了PDF文件中每个对象的位置和状态。 trailer文件尾部包含文档的根对象和文件大小等信息。 startxref交叉引用表的起始位置。 %%EOFPDF文件的结束标记。 PDF文件由多个对象组成每个对象都有一个唯一的对象编号和生成编号。对象之间通过引用关系连接。在这个示例中Catalog对象引用了Pages对象Pages对象引用了Page对象Page对象引用了Contents对象。Contents对象包含了显示Hello World的内容流。 编程形式与页面描述 PDF是一种编程形式的文档格式其内容通过一系列操作符operators进行描述这些操作符按照特定语法组织形成一种类似编程语言的指令集。每个PDF文件实质上是一个程序当被PDF阅读器解析时它会按照指令重新绘制文档的各个元素从而在任何支持PDF的系统上一致地呈现文档。 基本结构与显示单元
基本显示单元
文字文本内容以字符序列的形式存储附带字体、大小、颜色、位置等属性信息。 图片包括位图如JPG、PNG和矢量图形如线条、形状以嵌入或链接的方式包含在文件中。 矢量图使用数学公式描述的图形可以无限放大而不失真如线条、曲线、形状等。 页面PDF文件的基本组织单位每个页面包含其自身的尺寸、布局、背景、内容流等属性。
扩展单元
元数据如标题、作者、创建日期等文档元信息。 交互对象如超链接、按钮、表单域、多媒体内容音频、视频、3D模型等提供了文档的交互功能。 安全特性如数字签名、权限控制、加密保护等确保文档的安全性和完整性。 导航元素如书签、目录、超链接等帮助用户在文档内快速定位和跳转。 文件结构 PDF文件遵循严格的内部结构通常包括以下几个部分 Header包含PDF版本信息和其他全局设置。 Body主体部分由一系列对象Object组成每个对象都有唯一的标识Object Number和Generation Number并按照交叉引用表Cross-Reference Table组织便于随机访问。 Catalog根对象指向文档的其他关键部分如Pages树、Outlines书签、Metadata等。 Pages树描述文档的层级结构每个页面作为一个单独的对象包含其内容流Content Stream和资源如字体、图像引用。 Content Streams包含前面提到的操作符序列定义页面上的具体内容绘制指令。 Resources如字体描述、图像数据等供内容流引用。 Cross-Reference TableXREF列出文件中所有对象的位置信息使得阅读器能够快速定位到需要的对象。 Trailer包含XREF表的位置、加密信息如有、文件的主目录Root object等元数据。 解析与渲染流程 PDF阅读器执行步骤
解析文件头确认文件为PDF格式并识别其版本。
加载交叉引用表利用XREF表快速查找文件中对象的位置。
解析对象按需读取和解析对象如Catalog、Pages树、Content Streams等构建文档内部结构的逻辑视图。
渲染页面对于每个页面根据其内容流中的操作符序列逐个绘制文字、图形、图像等元素应用适当的样式和变换最终形成可视化的页面图像。
处理交互功能如果文档包含交互元素如超链接、表单等阅读器还需要实现相关的事件响应和用户交互支持。
Java
在Java项目中有几个流行的库可以用来生成PDF文件例如iText和Apache PDFBox。 使用iText库 首先将iText库添加到项目的依赖中。对于Maven项目将以下依赖添加到pom.xml文件中 groupIdcom.itextpdf/groupIdartifactIditext7-core/artifactIdversion7.1.16/version
/dependency接下来使用以下代码创建一个简单的PDF文件 import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;import java.io.File;
import java.io.IOException;public class PdfExample {public static void main(String[] args) {try {// 创建PdfWriter实例PdfWriter writer new PdfWriter(new File(hello_world.pdf));// 创建PdfDocument实例PdfDocument pdf new PdfDocument(writer);// 创建Document实例Document document new Document(pdf);// 添加内容document.add(new Paragraph(Hello, World!));// 关闭文档document.close();} catch (IOException e) {e.printStackTrace();}}
}Django
在Django项目中可以使用reportlab库生成PDF文件 接下来使用以下view.py代码创建一个简单的PDF文件
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from io import BytesIO
from django.http import FileResponsedef some_view(request):# 创建一个文件类似的缓冲区来接收 PDF 数据buffer BytesIO()# 创建 Canvas 对象p canvas.Canvas(buffer, pagesizeletter)# 添加内容p.drawString(100, 750, Hello, World!)# 关闭 PDF 对象p.showPage()p.save()# 将缓冲区的内容移动到文件响应对象中buffer.seek(0)return FileResponse(buffer, as_attachmentTrue, filenamehello_world.pdf)首先创建了一个BytesIO缓冲区来接收PDF数据。创建了一个canvas.Canvas对象并使用drawString方法添加了一些文本。最后将缓冲区的内容移动到FileResponse对象中并将其作为响应返回。 具体阅读官方文档我在此写大致方向时间太晚了