格式轉換-----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.pswp.cn/news/379888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379888.shtml
英文地址,請注明出處:http://en.pswp.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; …