一、前言
在企業的信息系統中,報表處理一直佔比較重要的作用,本文將介紹一種生成PDF報表的Java組件--iText。通過在伺服器端使用Jsp或JavaBean生成PDF報表,客戶端採用超級連接顯示或下載得到生成的報表,這樣就很好的解決了B/S系統的報表處理問題。
二、iText簡介
iText是著名的開放源碼的站點sourceforge一個項目,是用於生成PDF文檔的一個java類庫。通過iText不僅可以生成PDF或rtf的文檔,而且可以將XML、Html文件轉化為PDF文件。
iText的安裝非常方便,在http://www.lowagie.com/iText/download.html - download 網站上下載iText.jar文件後,只需要在系統的CLASSPATH中加入iText.jar的路徑,在程序中就可以使用iText類庫了。
三、建立第一個PDF文檔
用iText生成PDF文檔需要5個步驟:
①建立com.lowagie.text.Document對象的實例。
Document document = new Document();
②建立一個書寫器(Writer)與document對象關聯,通過書寫器(Writer)可以將文檔寫入到磁碟中。
PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));
③打開文檔。
document.open();
④向文檔中添加內容。
document.add(new Paragraph("Hello World"));
⑤關閉文檔。
document.close();
通過上面的5個步驟,就能產生一個Helloworld.PDF的文件,文件內容為"Hello World"。
建立com.lowagie.text.Document對象的實例
com.lowagie.text.Document對象的構建函數有三個,分別是:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
構建函數的參數pageSize是文檔頁面的大小,對於第一個構建函數,頁面的大小為A4,同Document(PageSize.A4)的效果一樣;對於第三個構建函數,參數marginLeft、marginRight、marginTop、marginBottom分別為左、右、上、下的頁邊距。
通過參數pageSize可以設定頁面大小、面背景色、以及頁面橫向/縱向等屬性。iText定義了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等紙張類型,也可以通過Rectangle pageSize = new Rectangle(144, 720);自定義紙張。通過Rectangle方法rotate()可以將頁面設置成橫向。
書寫器(Writer)對象
一旦文檔(document)對象建立好之後,需要建立一個或多個書寫器(Writer)對象與之關聯。通過書寫器(Writer)對象可以將具體文檔存檔成需要的格式,如com.lowagie.text.PDF.PDFWriter可以將文檔存成PDF文件,com.lowagie.text.html.HtmlWriter可以將文檔存成html文件。
設定文檔屬性
在文檔打開之前,可以設定文檔的標題、主題、作者、關鍵字、裝訂方式、創建者、生產者、創建日期等屬性,調用的方法分別是:
public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProcer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)
其中方法addHeader對於PDF文檔無效,addHeader僅對html文檔有效,用於添加文檔的頭信息。
當新的頁面產生之前,可以設定頁面的大小、書簽、腳注(HeaderFooter)等信息,調用的方法是:
public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN)
如果要設定第一頁的頁面屬性,這些方法必須在文檔打開之前調用。
對於PDF文檔,iText還提供了文檔的顯示屬性,通過調用書寫器的setViewerPreferences方法可以控制文檔打開時Acrobat Reader的顯示屬性,如是否單頁顯示、是否全屏顯示、是否隱藏狀態條等屬性。
另外,iText也提供了對PDF文件的安全保護,通過書寫器(Writer)的setEncryption方法,可以設定文檔的用戶口令、只讀、可列印等屬性。
添加文檔內容
所有向文檔添加的內容都是以對象為單位的,如Phrase、Paragraph、Table、Graphic對象等。比較常用的是段落(Paragraph)對象,用於向文檔中添加一段文字。
四、文本處理
iText中用文本塊(Chunk)、短語(Phrase)和段落(paragraph)處理文本。
文本塊(Chunk)是處理文本的最小單位,有一串帶格式(包括字體、顏色、大小)的字元串組成。如以下代碼就是產生一個字體為HELVETICA、大小為10、帶下劃線的字元串:
Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
短語(Phrase)由一個或多個文本塊(Chunk)組成,短語(Phrase)也可以設定字體,但對於其中以設定過字體的文本塊(Chunk)無效。通過短語(Phrase)成員函數add可以將一個文本塊(Chunk)加到短語(Phrase)中,如:phrase6.add(chunk);
段落(paragraph)由一個或多個文本塊(Chunk)或短語(Phrase)組成,相當於WORD文檔中的段落概念,同樣可以設定段落的字體大小、顏色等屬性。另外也可以設定段落的首行縮進、對齊方式(左對齊、右對齊、居中對齊)。通過函數setAlignment可以設定段落的對齊方式,setAlignment的參數1為居中對齊、2為右對齊、3為左對齊,默認為左對齊。
五、表格處理
iText中處理表格的類為:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,對於比較簡單的表格處理可以用com.lowagie.text.Table,但是如果要處理復雜的表格,這就需要com.lowagie.text.PDF.PDFPTable進行處理。這里就類com.lowagie.text.Table進行說明。
類com.lowagie.text.Table的構造函數有三個:
①Table (int columns)
②Table(int columns, int rows)
③Table(Properties attributes)
參數columns、rows、attributes分別為表格的列數、行數、表格屬性。創建表格時必須指定表格的列數,而對於行數可以不用指定。
建立表格之後,可以設定表格的屬性,如:邊框寬度、邊框顏色、襯距(padding space 即單元格之間的間距)大小等屬性。下面通過一個簡單的例子說明如何使用表格,代碼如下:
1:Table table = new Table(3);
2:table.setBorderWidth(1);
3:table.setBorderColor(new Color(0, 0, 255));
4:table.setPadding(5);
5:table.setSpacing(5);
6:Cell cell = new Cell("header");
7:cell.setHeader(true);
8:cell.setColspan(3);
9:table.addCell(cell);
10:table.endHeaders();
11:cell = new Cell("example cell with colspan 1 and rowspan 2");
12:cell.setRowspan(2);
13:cell.setBorderColor(new Color(255, 0, 0));
14:table.addCell(cell);
15:table.addCell("1.1");
16:table.addCell("2.1");
17:table.addCell("1.2");
18:table.addCell("2.2");
19:table.addCell("cell test1");
20:cell = new Cell("big cell");
21:cell.setRowspan(2);
22:cell.setColspan(2);
23:table.addCell(cell);
24:table.addCell("cell test2");
運行結果如下:
header
example cell with colspan 1 and rowspan 2 1.1 2.1
1.2 2.2
cell test1 big cell
cell test2
代碼1-5行用於新建一個表格,如代碼所示,建立了一個列數為3的表格,並將邊框寬度設為1,顏色為藍色,襯距為5。
代碼6-10行用於設定表格的表頭,第7行cell.setHeader(true);是將該單元格作為表頭信息顯示;第8行cell.setColspan(3);指定了該單元格佔3列;為表格添加表頭信息時,要注意的是一旦表頭信息添加完了之後,必須調用endHeaders()方法,如第10行,否則當表格跨頁後,表頭信息不會再顯示。
代碼11-14行是向表格中添加一個寬度佔一列,長度佔二行的單元格。
往表格中添加單元格(cell)時,按自左向右、從上而下的次序添加。如執行完11行代碼後,表格的右下方出現2行2列的空白,這是再往表格添加單元格時,先填滿這個空白,然後再另起一行,15-24行代碼說明了這種添加順序。
六、圖像處理
iText中處理表格的類為com.lowagie.text.Image,目前iText支持的圖像格式有:GIF, Jpeg, PNG, wmf等格式,對於不同的圖像格式,iText用同樣的構造函數自動識別圖像格式。通過下面的代碼分別獲得gif、jpg、png圖像的實例。
Image gif = Image.getInstance("vonnegut.gif");
Image jpeg = Image.getInstance("myKids.jpg");
Image png = Image.getInstance("hitchcock.png");
圖像的位置
圖像的位置主要是指圖像在文檔中的對齊方式、圖像和文本的位置關系。IText中通過函數public void setAlignment(int alignment)進行處理,參數alignment為Image.RIGHT、Image.MIDDLE、Image.LEFT分別指右對齊、居中、左對齊;當參數alignment為Image.TEXTWRAP、Image.UNDERLYING分別指文字繞圖形顯示、圖形作為文字的背景顯示。這兩種參數可以結合以達到預期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)顯示的效果為圖像右對齊,文字圍繞圖像顯示。
圖像的尺寸和旋轉
如果圖像在文檔中不按原尺寸顯示,可以通過下面的函數進行設定:
public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)
函數public void scaleAbsolute(int newWidth, int newHeight)直接設定顯示尺寸;函數public void scalePercent(int percent)設定顯示比例,如scalePercent(50)表示顯示的大小為原尺寸的50%;而函數scalePercent(int percentX, int percentY)則圖像高寬的顯示比例。
如果圖像需要旋轉一定角度之後在文檔中顯示,可以通過函數public void setRotation(double r)設定,參數r為弧度,如果旋轉角度為30度,則參數r= Math.PI / 6。
七、中文處理
默認的iText字體設置不支持中文字體,需要下載遠東字體包iTextAsian.jar,否則不能往PDF文檔中輸出中文字體。通過下面的代碼就可以在文檔中使用中文了:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
Paragraph pragraph=new Paragraph("你好", FontChinese);
八、後計
iText還有很多高級的功能,這里就不一一介紹了,具體開發時可參考發布的文檔。總的來說,iText是一套java環境下不錯的製作PDF的組件。因為iText支持jsp/javabean下的開發,這使得B/S應用中的報表問題能得到很好的解決。由於iText畢竟不是專門為製作報表設計,所有報表中的內容、格式都需要通過寫代碼實現,相對於那些專業的支持可視化設計的報表軟體來說,編程的工作量就有一定程度的增加。
❷ 請檢查pdf是否加密,無法進行解析
PDF文檔具體加密方法如下:
Adobe Acrobat Professional 版本為:7.0.0.2004121400,目前也有版本了,加密方法一樣的,具體操作如下:
1、打開一個任意的PDF文檔;
2、選擇菜單欄的「文檔」;
3、選擇「文檔」里的「安全性」一欄;
4、再選擇「安全性」里的「顯示本文檔的安全性設置」一欄
5、這樣進入了「文檔屬性」對話框,用滑鼠點擊一下「安全性方法」,就會出現一個下拉菜單,然後選擇「口令安全性」;
6、這樣進入「口令安全性—設置」對話框,這樣有二處可供選擇:
a:「要求打開文檔口令」。如果用滑鼠在小框內點擊一下,這樣就會把它勾上,然後你輸入你的密碼——確認,這樣,當別人點擊這個文件時,就會彈出「請輸入口令」的對話框,如果不知道密碼的人士,是完全看不見裡面的內容的。
b:「使用口令來限制文檔的列印和編輯以及它的安全性設置」,如果用滑鼠在小框內點擊一下,這樣就會把它勾上,然後你輸入你的密碼——確認。這樣就給你的當前PDF文件加密了,當別人打開你的這個文件,可以看見其內容,但別人不能修改、列印等等。
另外,也可以直接選擇「工具欄」的「安全」按鈕,出現一個下拉菜單,選擇「顯示本文檔的安全性設置」,然後接著5、6步驟去做一樣可以達到加密效果。
❸ java解析pdf文字順序不對
修復你的PDF軟體或者調整頁面順序。
java解析pdf獲取pdf中內容信息:
第一種 使用開源組織提供的開源框架 pdfboxapi ; https://pdfbox.apache.org/
特點:免費,功能強大,解析中文或許會存在亂碼,默認格式有點亂,沒有國產解析的那麼美化。
想要按行讀取:可以按照指定的模板,對pdf進行修改添加刪除等操作,總之操作很騷,很強大。
1.pdfbox 需要帶入依賴。
2.代碼。
第二種使用國產的框架 Spire.PDF包含兩種版本。
1 免費版。
https://www.e-iceblue.cn/Downloads/Free-Spire-PDF-JAVA.html
友情提示: 免費版有 10 頁的頁數輸出限制,在輸出結果文檔時只能輸出前10頁。將 PDF 文檔轉換為圖片、Word、HTML、XPS等格式時,僅支持轉換前 10 頁。如超出限制,可升級到商業版,我們僅對免費版進行不定期維護。
2 商業版本。
https://www.e-iceblue.cn/Introce/Spire-PDF-JAVA.html。
api。
http://e-iceblue.cn/licensing/install-spirepdf-for-java-from-maven-repository.html。
特點:商業版本收費,免費版本有限制,可供開發人員調試,解析格式友好,解析結果是按照行顯示,對pdf 圖形 ,水印 ,文本, 條形碼等添加增刪改操作,總之個人感覺比pdfbox順手,但就是收費啊,誰讓咱公司沒錢呢。
主要功能:
只需 Free Spire.PDF for Java,無需 Adobe Acrobat。
Free Spire.PDF for Java 是一款完全獨立的 PDF 類庫。它的運行環境無需安裝 Adobe Acrobat 或其他任何第三方組件。
多樣化的PDF文檔操作功能。
Free Spire.PDF for Java 支持畫文本、圖片、表格、條形碼、形狀到 PDF,提取文本和圖片,創建、填充和刪除 PDF 表單,添加文本/圖片水印到 PDF,添加、更新和刪除 PDF 書簽,操作超鏈接、附件和注釋,以及添加圖片/文本印章到 PDF 等。
文檔信息設置。
Free Spire.PDF for Java 支持設置 PDF 文檔信息,例如文檔屬性設置,偏好設置(頁面方向,頁面大小,縮放比例等)。
高質量的文檔轉換功能。
Free Spire.PDF for Java 支持將 PDF 文檔高質量地轉換為 Word、HTML、XPS、圖片、SVG 和 PDF/A 格式,以及將 XPS 文檔高質量地轉換為 PDF 格式。
文檔安全性設置。
Free Spire.PDF for Java 支持給 PDF 文檔添加和驗證數字簽名,加密和解密 PDF 文檔,修改 PDF 文檔的安全許可權,以及檢測簽名後的 PDF 文檔是否被修改。
易於集成。
開發人員可以輕易地將 Free Spire.PDF for Java 集成到 Java(J2SE和J2EE)應用程序中。
❹ 請檢查pdf是否加密,無法進行解析
我覺得這種PDF是否加密的話可能是因為有的時候加密的,所以你解析不出來這種情況的話,你最好就是看一看這個有沒有他的密碼,沒有他的密碼的話,那你可能只能就是說通過一些其他的來搞。
PDF是Portable Document Format的簡稱,意為「可攜帶文檔格式」,是由Adobe Systems用於與應用程序、操作系統、硬體無關的方式進行文件交換所發展出的文件格式。PDF文件以PostScript語言圖象模型為基礎。
無論在哪種列印機上都可保證精確的顏色和准確的列印效果,即PDF會忠實地再現原稿的每一個字元、顏色以及圖象。
可移植文檔格式是一種電子文件格式。這種文件格式與操作系統平台無關,也就是說,PDF文件不管是在Windows,Unix還是在蘋果公司的Mac OS操作系統中都是通用的。這一特點使它成為在Internet上進行電子文檔發行和數字化信息傳播的理想文檔格式。
越來越多的電子圖書、產品說明、公司文告、網路資料、電子郵件在開始使用PDF格式文件。
設計背景:
Adobe公司設計PDF文件格式的目的,是跨平台支持多媒體集成信息的出版和發布,尤其是提供對網路信息發布的支持。為了達到此目的, PDF具有許多其他電子文檔格式無法相比的優點。PDF文件格式可以將文字、字型、格式、顏色及獨立於設備和解析度的圖形圖像等封裝在一個文件中。
該格式文件還可以包含超文本鏈接、聲音和動態影像等電子信息,支持特長文件,集成度和安全可靠性都較高。
對普通讀者而言,用PDF製作的電子書具有紙版書的質感和閱讀效果,可以逼真地展現原書的原貌,而顯示大小可任意調節,給讀者提供了個性化的閱讀方式。
❺ android 解析pdf文件 有什麼好的開源框架
PDF操作類庫 iText
iText是一個非常著名的能夠快速產生PDF文件的Java類庫。支持文本,表格,圖形的操作,可以方便的跟 Servlet 進行結合。
Java的PDF處理類庫 PDFBox
PDFBox是Java實現的PDF文檔協作類庫,提供PDF文檔的創建、處理以及文檔內容提取功能,也包含了一些命令行實用工具。 主要特性包括: 從PDF提取文本 合並PDF文檔 PDF 文檔加密與解密 與Lucene搜索引擎的集成 填充PDF/XFDF表單數據 從文本文件創建PDF文檔
Android PDF 閱讀器
Android PDF Viewer 是Android平台下的PDF閱讀器。更多Android PDF 閱讀器信息
純Java的PDF閱讀器 PDF Renderer
PDF Renderer 是一個開源的純 Java 的 PDF 文檔渲染和閱讀器,使用 Java2D 技術。PDF Renderer 將 PDF 渲染到 Swing 面板,也可繪制到其他 Graphics2D 的實現(可方便生成各種格式的圖片)。需要注意的是 PDF Renderer 並不能幫你生成 PDF 文檔。
❻ PDF解析模塊-PDFMiner開發手冊[翻譯]
轉 https://blog.csdn.net/robolinux/article/details/43318229
原文地址: http://euske.github.io/pdfminer/programming.html
軟體版本:pdfminer-20140328
翻譯:robolinux
時間:20150110
PDF格式不是規范格式. 盡管它被叫做"PDF文檔", 但並不像word或者html文檔。PDF的表現更像一張圖片。PDF更像是在一張紙的各個准確的位置上把內容都擺放出來。大部分情況下,沒有邏輯結構,比如句子或段落,並且不能自適應頁面大小的調整。PDFMiner嘗試通過猜測它們的布局來重建它們的結構,但是不保證一定能工作。我知道這樣很難看,但是,PDF確實不夠規范。
更多關於PDF內部結構的技術詳情,請見《如何手工提取PDF內容》。
http://www.youtube.com/watch?v=k34wRxaxA_c http://www.youtube.com/watch?v=_A1M4OdNsiQ http://www.youtube.com/watch?v=sfV_7cWPgZE
由於PDF文件有如此大和復雜的結構,完整解析PDF文件很費時費力。好吧,大多數PDF工作中,很多模塊是不需要加進來的。因此 PDFMiner 採用了一個懶惰分析的策略,就是只分析所需要的部分。解析時候,至少需要2個核心類,PDFParser 和 PDFDocument。這兩個模塊配合其他模塊來使用。
PDFParser 從文件中獲取數據
PDFDocument 存儲文檔數據結構到內存中
PDFPageInterpreter 解析page內容
PDFDevice 把解析到的內容轉化為你需要的東西
PDFResourceManager存儲共享資源,例如字體或圖片
下圖顯示了PDFMiner中各個類之間的關系。
下面是解析pdf的一個典型方法:
布局分析把pdf文檔中每一頁返回為一個 LTPage 對象. 該對象包含該頁面中的子對象,格式化為樹形結構。
下圖顯示了這些對象之間的關系。
LTPage
代表一個完整的頁面。可以包含子對象,例如LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine.
LTTextBox
它包含 LTTextLine 對象的列表
代表一組被包含在矩形區域中的文本
需要注意的是,該box是根據幾何學分析得到的,並不一定準確地表現為該文本的邏輯范圍
get_text()方法可以返迴文本內容
LTTextLine
包含一個LTChar對象的列表,表現為單行文本
字元表現為一行或一列,取決於文本書寫方式
get_text()方法返迴文本內容
LTChar / LTAnno
代表一個在文本中的真實的字母,作為一個unicode字元串
LTChar 對象有真實的分隔符
LTAnno 對象沒有,是虛擬分隔符,按照兩個字元之間的關系,布局分析器插入虛擬分隔符
LTFigure
代表一個被PDF Form對象使用的區域
pdf form適用於目前的圖表(present figures)或者頁面中植入的另一個pdf文檔圖片。LTFigure對象可以遞歸
LTImage
代表一個圖形對象。可以是JPEG或者其他格式,但PDFMiner目前沒有花太多精力在圖形對象上。
LTLine
代表一根直線。用來分割文本或圖表(figures)。
LTRect
代表一個矩形。
用來框住別的圖片或者圖表。
LTCurve
代表一個貝塞爾曲線。
也可以從下面URL獲得更多完整的示例。
http://denis.papathanasiou.org/?p=343
獲得目錄
PDF文檔沒有目錄時會報:
raise PDFNoOutlines
pdfminer.pdfdocument.PDFNoOutlines
一些pdf文檔使用頁號作為目錄指向,另外的文檔則使用頁號和頁面中的物理位置。由於pdf文檔沒有邏輯結構,並且不支持從外部指向頁內對象,所以沒有辦法准確告知這些目錄指向文本的哪一部分。
你可以擴展PDFPageinterpreter類和PDFDevice類以便進行不同的加工,或者獲得其他信息。
❼ 有道pdf文檔解析失敗
PDF轉換器的問題。有道pdf文檔解析失敗解決方案:
1、首先進入我速PDF轉換器官網。
2、第二步:下載安裝完成後,打開軟體,選擇(為什麼有道詞典無法翻譯pdf)。
3、第三步:點擊或者拖拽你想要轉換的批量PDF文件或者點擊界面下方(添加文件夾);輸出目錄可以選擇(原文件目錄)或者(自定義目錄),最後點擊(開始轉換)即可完成轉換。