修復你的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解析模塊-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文件打開方法
Adobe Acrobat Reader是一款免費的PDF文件閱讀器,它是由Adobe公司開發的,可以在官網上免費下載。安裝好後,打開該軟體,然後選擇「文件」菜單,再選擇「打開」,就可以選擇需要打開的PDF文件進行閱讀了。
Adobe Acrobat Reader是一款免費的PDF文件閱讀器,它是由Adobe公司開發的,可以在官網上免費下載。安裝好後,打開該軟體,然後選擇「文件」菜單,再選擇「打開」,就可以選擇需要打開的PDF文件進行閱讀了。
總之,打開PDF文件的方法有很多種,根據不同的需求可以選擇不同的方式進行閱首鉛讀。希望本文能夠幫助大家更好地打開和閱讀PDF文件。
如者滲好果你的電腦上沒有安裝Adobe Acrobat Reader,也可以通過瀏覽器打開PDF文件。目前大多數的瀏覽器都支持PDF文件的在線閱讀,比如Chrome、Firefox、Edge等。只需要在瀏覽器中輸入PDF文件的網址或者在瀏喊襪覽器中直接打開PDF文件,就可以進行閱讀了。
❹ 為什麼有些pdf列印解析幾百兆特別慢
pdf本身可能文件較大,並且為圖片模式,列印機識別較慢,這應該是正常現象。
解決方法是:點擊「開始→設置→列印機和傳真」,然後右擊需要列印的列印機選擇「屬性」,在彈出窗口的「高級」選項卡中選擇「直接列印到列印機」,點擊「確定」後速度就提高了。
❺ pdf文檔無法解析什麼原因
是文件本身問題。是不是文件太大或者是裡面插入的東西跟pdf有沖突。
❻ 如何創建pdf的buffer,讓pdf.js實現預覽pdf文件
PDF.js 是基於開放的 HTML5 及 JavaScript 技術實現的開源產品。簡單說就是一個 PDF 解析器。運用HTML5JavaScript(即pdf.js僅使用安全的web語言,不包含任何攻擊者可以用的本地代碼塊)的PDF閱讀器pdf.js,直接在標準的HTML頁面上載入和渲染PDF文件, 還可以提高安全性(不需要安裝第三方插件,安全性由瀏覽器保證),瀏覽器所做的安全措施已經為pdf.js提供了安全的運行環境。其對IE和 FireFox瀏覽器的要求是IE9+, FireFox19+。
在線示例: http://jsbin.com/pdfjs-helloworld-v2/1/edit , http://jsbin.com/pdfjs-prevnext-v2/1/edit
源碼:https://github.com/mozilla/pdf.js
官網:http://mozilla.github.io/pdf.js/
pdf.js VS 傳統瀏覽器讀取pdf
一般來說,PDF檔案格式都是在瀏覽器中由外掛程式來描繪,通常是Adobe自己的PDF reader或來自其他供應商的描繪工具,但這些外掛通常無法充分運用PDF的特點,而且由於含有大量的受信任代碼,使得Google Chrome瀏覽器必須運用SandBox沙箱原理,來檢查PDF描繪工具是否遭到未知病毒感染。
使用adobe,必須在本地安裝軟體才能使用,而pdf.js不依賴環境、渲染速度快(測試過,確實很快)、安全性高。
pdf.js渲染PDF文件
pdf.js渲染PDF文件的流程:Fetch pdf (url / buffer) ——> canvas ——> 渲染
如果要深入pdf的渲染,需要去研究pdf.js源代碼。pdf.js可通過pdf文件的地址或pdf數據流獲取pdf,具體實現是調用介面函數 PDFJs.getDoc(url/buffer)將pdf載入html,通過canvas處理, 然後渲染pdf文件。網上給出的都是通過url來獲取pdf的例子,而我在做項目的時候,後台(python)要求是發pdf的數據流給前台,前台接收pdf的buffer,然後通過pdf.js來渲染。當然最初嘗試buffer出現了很多問題,具體問題總結如下:
1)如何通過$.ajax接收後台發給前台的buffer數據;
2)如何將buffer傳給pdf.js來處理(這里我使用了viewer.js, 所以需要考慮的是如何將buffer傳給viewer.js來處理);
3)如何將pdf.js轉換成pdf.js可以接收的buffer格式;
(對應問題解決見代碼注釋)
註:viewer.js是pdf.js的擴展,其將列印、翻頁、縮放等功能進行了實現,且界面非常好看。也就是說如果你引入了viewer.js,pdf的渲染和渲染之後的功能界面都已經幫你實現了,你不用自己去寫界面。
先從官網:http://mozilla.github.io/pdf.js/ 下載代碼,然後使用文件viewer.html , 我的html就是在viewer.html 的基礎上修改的,下面我給出buffer的例子:
<!DOCTYPE html>
<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="google" content="notranslate">
<title>在線預覽</title>
{% load static %}{% get_static_prefix as STATIC_URL %}
<link href="{{STATIC_URL}}css/preview.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="{{STATIC_URL}}pdfjs/web/viewer.css"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/compatibility.js"></script>
<link rel="resource" type="application/l10n" href="{{STATIC_URL}}pdfjs/web/locale/locale.properties"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/l10n.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/build/pdf.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/debugger.js"></script>
<script src="{{STATIC_URL}}js/jquery-1.8.3.js" type="text/javascript"></script>
<script type="text/javascript">
//convertDataURIToBinary()
//不知道什麼原因如果後台直接將pdf的數據流發給前台,得到的是亂碼,將數據轉換成 Uint8Array始終不成功
//所以就讓後台將發送之前的數據流做 了base64編碼發給前台,前台再解碼得到的數據就不是亂碼了。
var BASE64_MARKER = ';base64,';
var preFileId = {{mark}};
//viewer.js全局變數,傳入buffer,回答問題2
var DEFAULT_URL
$(document).ready(function(){
$.ajax({
type:"post",
async: false,
//ajax接收pdf數據流,注意dataType值的設置是否有錯,如果不指定,jQuery將自動根據HTTP包MIME信息返回
//responseXML或responseText . 回答問題1
contentType:"application/pdf;charset=utf-8",
url:"{% url netPan.File.views.browserFuf%}",
data:{
id: preFileId
},
success:function(data){
var pdfAsDataUri = data;
//如果引入了viewer.js , 處理方法
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
DEFAULT_URL = pdfAsArray;
// 只引入了pdf.js, 未引入viewer.js, 處理方法
// var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
// PDFJS.getDocument(pdfAsArray).then(); 自己寫pdf的處理函數
}
});
});
function convertDataURIToBinary(dataURI) { //編碼轉換,回答問題3
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
//轉換成pdf.js能直接解析的Uint8Array類型,見pdf.js-4068
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
</script>
<!--先設置全局變數DEFAULT_URL 的值,所以要後調入viewer.js -->
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/viewer.js"></script>
</head>
<body>
省略內容
</body>
</html>
❼ java解析pdf文件,求大神提供代碼,請注意是java語言的
給你提供一個參考例子,你可以在這個例子上試試,修改修改。也是解析PDF的。
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.OutputStreamWriter;
importjava.io.Writer;
importjava.net.MalformedURLException;
importjava.net.URL;
importorg.apache.pdfbox.pdmodel.PDDocument;
importorg.apache.pdfbox.util.PDFTextStripper;
publicclassPdfReader{
publicvoidreadFdf(Stringfile)throwsException{
//是否排序
booleansort=false;
//pdf文件名
StringpdfFile=file;
//輸入文本文件名稱
StringtextFile=null;
//編碼方式
Stringencoding="UTF-8";
//開始提取頁數
intstartPage=1;
//結束提取頁數
intendPage=Integer.MAX_VALUE;
//文件輸入流,生成文本文件
Writeroutput=null;
//內存中存儲的PDFDocument
PDDocumentdocument=null;
try{
try{
//首先當作一個URL來裝載文件,如果得到異常再從本地文件系統//去裝載文件
URLurl=newURL(pdfFile);
//注意參數已不是以前版本中的URL.而是File。
document=PDDocument.load(pdfFile);
//獲取PDF的文件名
StringfileName=url.getFile();
//以原來PDF的名稱來命名新產生的txt文件
if(fileName.length()>4){
FileoutputFile=newFile(fileName.substring(0,fileName
.length()-4)
+".txt");
textFile=outputFile.getName();
}
}catch(MalformedURLExceptione){
//如果作為URL裝載得到異常則從文件系統裝載
//注意參數已不是以前版本中的URL.而是File。
document=PDDocument.load(pdfFile);
if(pdfFile.length()>4){
textFile=pdfFile.substring(0,pdfFile.length()-4)
+".txt";
}
}
//文件輸入流,寫入文件倒textFile
output=newOutputStreamWriter(newFileOutputStream(textFile),
encoding);
//PDFTextStripper來提取文本
PDFTextStripperstripper=null;
stripper=newPDFTextStripper();
//設置是否排序
stripper.setSortByPosition(sort);
//設置起始頁
stripper.setStartPage(startPage);
//設置結束頁
stripper.setEndPage(endPage);
//調用PDFTextStripper的writeText提取並輸出文本
stripper.writeText(document,output);
}finally{
if(output!=null){
//關閉輸出流
output.close();
}
if(document!=null){
//關閉PDFDocument
document.close();
}
}
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
PdfReaderpdfReader=newPdfReader();
try{
//取得E盤下的SpringGuide.pdf的內容
pdfReader.readFdf("d:\b.pdf");
}catch(Exceptione){
e.printStackTrace();
}
}
}
❽ 用java如何解析pdf文件
一、前言
在企業的信息系統中,報表處理一直佔比較重要的作用,本文將介紹一種生成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畢竟不是專門為製作報表設計,所有報表中的內容、格式都需要通過寫代碼實現,相對於那些專業的支持可視化設計的報表軟體來說,編程的工作量就有一定程度的增加。