格式转换-----PDF格式研究笔记(一)

格式转换-----PDF格式研究笔记(一)
现在我的几个计划都需要我能够对PDF格式进行解码,所以找了一下资料,找到了一个PDF1.3的手册,特放出下载,如果谁有更高版本的,请给我一份,谢谢。
因为最近很忙,所以就不做严格的翻译了,这个笔记将是一个比较简单的文档,而且不会涉及到比较复杂的PDF特性,目前关注点主要在于Pdf->Txt的转换。

下面是正式的笔记:

概述

PDF文件依赖于PostScript的图像模型,对文本和图像用设备无关和资源无关的语法进行描述。为了提高交互速度,PDF定义了一些不同于PostScrtpi的格式。PDF支持对象,比如注释和超链接,他们不是页面的组成部分,但是对于交互式显示非常重要。
PDF文件是用一系列编号的对象来建立的。文本,图形和图像等对象用PsostScript语言组织成页面。
但是PDF文件不是一个PostScript语言程序,也不能直接用PostScript解释器来解释。但是PDF文件的页面描述信息是可以转换成PostScript程序的。

坐标系统

PDF的坐标系统定义了一个画布,用来显示你的PDF文档。文本、图形和图像在页面上的位置、方向和大小都是用这个坐标系统来定义的。
PDF支持几种坐标系统,他们大部分和PostScript的坐标系统相同。
后暂略...

对象

PDF支持7种类型的对象,booleans, numbers, strings, names, arrays, dictionaries 和 streams.
boolrans就是true和false。
number,PDF同时两种数字,整数和实数,但是不支持指数格式的实数(科学计数法)。
string和text
string就是用"("和")"包括起来的字符串,如果字符串太长可以在行尾加上\,表明下一行和本行是连在一起的。
text一般用PDFDocEncoding或者Unicode来进行编码。PDFDocEncoding是ISOLatin1的一个超集,在0-255的编码上PDFDocEncoding和Unicode是兼容的。
如果text是用Unicode编码的,那么text的前两个字节必须是[FE FF]。[FE FF]代表Unicode的高位字节必须在前。
text还可以包含一个换码序列来标明text使用的语言。换码序列必须用Unicode的16进制值U+001B开头,后面跟随两个由ISO639标准 定义的表示语言的ASCII代码,然后可选择的,跟随两个由ISO3166定义的表示国家的ASCII代码。汉语的语言编号是zh,中国的编号是CN。
name就是一个用/开头的string。
array就是一个对象的序列。一个array可以有多种类型的对象在其中。用"["开头,用"]"结束。下面是一个array的例子:
[0 (Higgs) false 3.14 3 549 /SomeName]
上面的例子也可以作为刚才说过的几种对象的例子。
dictionary是一对对象的对应表。第一个对象叫做key,第二个叫做value。key必须是一个name对象(这点和PostScript里面的dictionay对象的key不同)。value可以是任何的对象,甚至也可以是一个dictionary。
dictionay用"<<"开始,">>"结束。一般dictionay的例子:
<< /Type /Example /Key2 12 /Key3 (a string) >>
包含dictionay的dictionay的例子:
<<
/Type /AlsoAnExample
/Subtype /Bad
/Reason (unsure)
/Version 0.01
/MyInfo
<<
/Item1 0.4
/Item2 true
/LastItem (not!)
/VeryLastItem (OK)
>>
>>
dictionary对象是PDF文档的主要构成部分。PDF文档的很多部分,比如页面、字体,都是用dictionary来表现的。
stream和string一样就是一个字符的序列。然而应用程序可以读取stream的一个部分,但是读取string就必须读取整个string。所以,尺寸大的数据,比如图像或者页面描述,一般用stream来表现。
一个stream包含一个dictionary,后面是关键字stream,然后是0行或者多行的字符序列,后面是关键字endstream。
所有的stream必须是间接对象。stream的dictionary必须是一个直接对象。关键字stream和stream的dictionary之间必须用回车换行符来分割而不能仅仅用换行符。
stream的格式细节暂略。
null关键字用来表现null对象。
直接对象就是boolean、number、string、name、array、dictionary、stream或者null。一个间接对象就是一 个直接对象加上了一个标签,这样就可以被其他的对象所引用。任何类型的对象都可以被标签为间接对象。间接对象非常有用,比如,你可以把stream的 Length key设定为了一个间接对象,这样长度可以保存在stream后面。这样可以让应用程序用一个流程来生成一个PDF文件。
一个间接对象包括一个对象标识符,一个直接对象和一个endobj关键字。对象标识符包括一个整数的对象编号,一个整数的生成编号,和一个obj关键字。形如:
1 0 obj
(test)
endobj
用在arrary和dictionary元素里面的对象可以是直接对象,也可以是间接对象。间接对象引用包含一个间接对象的对象编号和产生编号,还有一个关键字R。例如:
<< /Length 8 0 R >>
8 0 obj
64
endobj

这里的长度就等于8 0代表的number??64。
注意:引用一个没有定义的对象,不是一个错误,而是相当于引用一个null对象。

 

 

posted on 2008-09-25 11:34 易哲 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/swneng/archive/2008/09/25/1298637.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(X)HTML嵌套规则

本文整理于互联网~ 简单认识了块元素和内嵌元素以后&#xff0c;下面就可以罗列 XHTML 标签的嵌套规则了&#xff1a; 1. 块元素可以包含内联元素或某些块元素&#xff0c;但内联元素却不能包含块元素&#xff0c;它只能包含其它的内联元素&#xff1a;<div><h1>&…

Java——集合带All的功能演示

package com.wsq.collection;import java.util.ArrayList; import java.util.Collection; public class Demo4_CollectionAll {public static void main(String[] args) {demo1(); //c1.addAll(c2);将c2整个集合给添加到c1中,即&#xff0c;c2集合中的每…

ASP.NET Web API 处理架构

这篇文章主要是介绍ASP.NET Web API的处理架构&#xff1a;当一个HTTP请求到达直到产生一个请求的过程。ASP.NET Web API 的处理架构图如下&#xff0c;主要有三层组成&#xff1a;宿主&#xff08;hosting&#xff09;&#xff0c;消息处理管道&#xff08;message handler pi…

python---可执行文件的转换

pyinstaller是常见的执行文件打包工具。该工具的安装方式非常简单&#xff0c;可运行在windows、MacOS X和GNU/Linux操作系统环境中&#xff0c;执行python2和python3。 用pyinstaller打包的执行文件&#xff0c;只能在于执行打包操作的系统类型相同的环境下运行。也就是说&…

Java——集合的遍历之迭代遍历

这些是下面的代码中所涉及到的所有方法&#xff1a;* 迭代概述:* 集合是用来存储元素&#xff0c;存储的元素需要查看&#xff0c;那么就需要迭代(遍历)* 也就是说&#xff0c;迭代就是遍历* * public interface Iterator<E> 对 collection 进行迭代的迭代器* …

数组排序最小复杂度_进行排序的最小缺失数

数组排序最小复杂度Problem statement: 问题陈述&#xff1a; Given an array of n integers. Find the minimum number of elements from the array to remove or delete so that when the remaining elements are placed in the same sequence order form a sorted sequence…

轻松掌握Windows窗体间的数据交互(转载)

轻松掌握Windows窗体间的数据交互作者&#xff1a;郑佐日期&#xff1a;2004-04-05Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集&#xff0c;它使您得以开发丰富的 Windows 应用程序…

MATLAB安装问题解决方案大集锦

我的安装后的两个问题 第一个&#xff1a;“Microsoft Visual C Runtime LibraryRuntime Error!Program:C:\Matlab7\Rin\Win32\Matlab.exeThis application has requested the runtime to terminate it in an unusual way.Please contact the applications support team for mo…

python免杀技术---shellcode的加载与执行

0x01 生成shellcode 首先通过下列命令生成一个shellcode&#xff0c;使用msfvenom -p选项来指定paylaod&#xff0c;这里选用windows/x64、exec模块接收的参数。使用calc.exe执行弹出计算器的操作。-f选项用来执行生成的shellcdoe的编译语言。 msfvenom -p windows/x64/exec …

成对的歌曲,其总持续时间可被60整除

Problem statement: 问题陈述&#xff1a; In a list of songs, the i-th song has duration of time[i] seconds. Return the number of pairs of songs for which their total duration in seconds is divisible by 60. Formally, we want the number of indices i < j w…

Qt中QTableWidget用法总结

QTableWidget是QT程序中常用的显示数据表格的空间&#xff0c;很类似于VC、C#中的DataGrid。说到QTableWidget&#xff0c;就必须讲一下它跟QTabelView的区别了。QTableWidget是QTableView的子类&#xff0c;主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先…

[转]软件架构师书单

"其实中国程序员&#xff0c;现在最需要的是一张安静的书桌。"&#xff0c;的确&#xff0c;中国架构师大多缺乏系统的基础知识&#xff0c;与其自欺欺人的宣扬"读书无用&#xff0c;重在实践变通&#xff0c;修身立命哲学书更重要"&#xff0c;把大好时间…

Java——List集合特有的功能

* List也是一个接口&#xff0c;这说明List不能new&#xff0c;其中它有一个子类ArrayList&#xff0c;所以&#xff0c;就可以父类引用指向子类对象调用* List里面特有的方法&#xff1a;* * void add(int index,E element)在列表的指定位置插入指定元素&#xff08;可选操作&…

python免杀技术---复现+改进----1

0x01 复现 复现文章&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3MzUwMTQwNg&mid2247484733&idx2&sn5b8f439c2998ce089eb44541d2da7a15&chksmeb231%E2%80%A6 首先用cobaltstruke生成一个python的payload脚本 然后复制里面的payload进行Base64编码&…

python掷骰子_用于掷骰子的Python程序(2人骰子游戏)

python掷骰子Here, we will be going to design a very simple and easy game and implement it using abstract data class. The code consists of two different classes (The base of the whole program). The one will be the class for the player and others will be for…

ForeignKey和ManyToManyField的限制关系

authorsmodels.ManyToManyField(Author,limit_choice_to{name__endswith:Smith}这样可以更方便的查询。转载于:https://www.cnblogs.com/chenjianhong/archive/2012/03/22/4145158.html

linux 目录命令_Linux目录命令能力问题和解答

linux 目录命令This section contains Aptitude Questions and Answers on Linux Directory Commands. 本节包含有关Linux目录命令的 Aptitude问答。 1) There are the following statements that are given which of them are correct about Linux commands? In the Linux o…

终于在HP2133上成功安装xp

今天拿到一台HP2133迷你笔记本&#xff0c;原装vista home basic&#xff0c;由于本人是在不喜欢vista&#xff0c;于是决定将使用xp换之。 很久没有研究装系统了&#xff0c;HP2133没有光驱&#xff0c;以前也没啥这方面经验&#xff0c;搞这个玩意安装完软件折腾了大半天&…

Java——GUI(图形用户界面设计)

事件处理&#xff1a;事件&#xff1a;用户的一个操作(例如&#xff1a;点击一下鼠标&#xff0c;或者敲击一下键盘)事件源&#xff1a;被操作的组件(例如&#xff1a;在一个窗体中的一个按钮&#xff0c;那个按钮就属于被操作的组件&#xff0c;按钮就是事件源)监听器&#xf…

python安全攻防---信息收集---IP查询

IP查询是通过当前所获得的URL去查询对应IP地址的过程&#xff0c;可应用Socket库函数中的gethostbyname()获取域名所对用的IP值 程序如下&#xff1a; # -*- coding:utf-8 -*- IP查询import socket ip socket.gethostbyname(www.baidu.com) print(ip)运行结果&#xff1a; …