使用Free Spire.PDF在Java程序中創(chuàng)建和轉(zhuǎn)換PDF文件

在這篇文章中舞痰,我將舉例說明如何創(chuàng)建一個包含標(biāo)題,段落氨菇,圖像儡炼,編號列表和表格的簡單的PDF文件,以及如何使用Free Spire.PDF將PDF轉(zhuǎn)換為其他文件格式查蓉。

概述

Free Spire.PDF for Java是一個類庫乌询,您可以直接在Java程序中創(chuàng)建和處理PDF文件,而無需安裝任何其他軟件豌研。使用此類庫您可以輕松創(chuàng)建PDF文件妹田。您只需創(chuàng)建一個PdfDocument對象,再根據(jù)需要創(chuàng)建足夠數(shù)量的PdfPageBase對象聂沙,然后向頁面添加字符串蹈丸,圖像国旷,表格,列表等任何其他元素焕阿,最后保存文檔屯烦。

準(zhǔn)備工作

此鏈接下載Free Spire.PDF for Java坷随,并在您的Java項目中導(dǎo)入Spire.Pdf.jar文件。

坐標(biāo)系

Spire.PDF生成的頁面由邊距和內(nèi)容區(qū)域組成驻龟。 坐標(biāo)系僅存在于內(nèi)容區(qū)域中温眉,允許用戶將內(nèi)容添加到指定坐標(biāo)。 Spire.PDF中的坐標(biāo)系遵循以下規(guī)則翁狐。

  • 坐標(biāo)系的原點(0,0)即內(nèi)容區(qū)域的左上角頂點类溢。
  • X軸向右延伸,Y軸向下延伸露懒。


    1.png

創(chuàng)建自定義函數(shù)

Spire.PDF提供了有用的類和方法闯冷,例如PdfPageBase類,drawString方法和drawImage方法懈词,您可以借助它們進(jìn)行頁面設(shè)置蛇耀,并添加文本和圖像到指定坐標(biāo)。為了使代碼更便于閱讀坎弯,我預(yù)先定義了以下五個自定義函數(shù)來執(zhí)行不同的任務(wù)纺涤。

? drawTitle

在PDF文件上繪制標(biāo)題時译暂,您可能需要對齊文本。 基于drawString創(chuàng)建的drawTitle函數(shù)允許您將文本水平對齊撩炊,例如外永,居中對齊。

public static void drawTitle(PdfPageBase page, String text, PdfTrueTypeFont font, PdfBrush brush, float x, float y, PdfTextAlignment alignment) {
    
    //通過PdfStringFormat類庫設(shè)置文本對齊
    PdfStringFormat format = new PdfStringFormat();
    format.setAlignment(alignment);

    //在頁面繪制題目
    page.getCanvas().drawString(text, font, brush, x, y, format);
}
  • drawParagraph

drawParagraph函數(shù)與drawTitle不同拧咳,盡管它們采用類似的參數(shù)象迎。此函數(shù)基于PdfTextWidget.draw方法創(chuàng)建,并返回PdfLayoutResult類的對象呛踊,該對象包含正在繪制的元素的邊界信息砾淌。通過這樣做,您能夠知道當(dāng)前段落的結(jié)束位置以及從何處開始繪制下一段內(nèi)容谭网。

public static PdfLayoutResult drawParagraph(PdfPageBase page, String text, PdfTrueTypeFont font, PdfBrush brush, float x, float y) {

    // 創(chuàng)建一個PdfTextWidget對象
    PdfTextWidget widget = new PdfTextWidget(text, font, brush);

    // dfLayoutType設(shè)置為分頁汪厨,使內(nèi)容自動分頁
    PdfTextLayout layout = new PdfTextLayout();
    layout.setLayout(PdfLayoutType.Paginate);

    //在將要放置段落的地方創(chuàng)建一個矩形
    Rectangle2D.Float rect = new Rectangle2D.Float(0, y, (float) page.getClientSize().getWidth(), (float) page.getClientSize().getHeight());

    //在頁面繪制段落
    PdfLayoutResult layoutResult = widget.draw(page, rect, layout);
    return layoutResult;
}
  • drawImage

drawImage函數(shù)簡單地重載了原始方法。此函數(shù)不會返回PdfLayoutResult對象愉择。 為了知道以下內(nèi)容開始的位置劫乱,您需要通過PdfImage對象獲取圖像高度,然后計算Y坐標(biāo)锥涕。

public static void drawImage(PdfPageBase page, PdfImage image, float x, float y) {

    //在頁面繪制圖像
    page.getCanvas().drawImage(image, x, y);
}
  • drawTable

使用drawTable函數(shù)在PDF頁面上繪制表格時衷戈,需要在String [] []數(shù)組中指定表格數(shù)據(jù)。 此函數(shù)還會返回到PdfLayoutResult對象层坠,該對象將幫助我們獲取表格的位置和大小殖妇。

public static PdfLayoutResult drawTable(PdfPageBase page, String[][] dataSource, PdfTrueTypeFont font, float x, float y) {

    //創(chuàng)建一個PdfTable對象
    PdfTable table = new PdfTable();

    //填充指定單元格
    table.getStyle().setCellPadding(2);

    //設(shè)置字體
    table.getStyle().getDefaultStyle().setFont(font);

    //使用樣本數(shù)據(jù)填充表格
    table.setDataSource(dataSource);

    //在頁面繪制表格
    PdfLayoutResult layoutResult = table.draw(page, new Point2D.Float(x, y));
    return layoutResult;
}
  • drawSortedList

最后一個函數(shù)drawSortedList與drawTable非常相似,只是它需要一些獨特的參數(shù)破花,如列表內(nèi)容谦趣,順序標(biāo)記和列表縮進(jìn)。

public static PdfLayoutResult drawSortedList(PdfPageBase page, String listContent, PdfOrderedMarker marker, PdfTrueTypeFont font, PdfBrush brush, float x, float y, float indent) {
    //根據(jù)列表內(nèi)容創(chuàng)建排序列表
    PdfSortedList sortedList = new PdfSortedList(listContent);

    //設(shè)置列表屬性
    sortedList.setFont(font);
    sortedList.setBrush(brush);
    sortedList.setIndent(indent);
    sortedList.setMarker(marker);

    //在頁面繪制列表
    PdfLayoutResult layoutResult = sortedList.draw(page, x, y);
    return layoutResult;

}

使用的代碼

調(diào)用這些自定義函數(shù)座每,您將能夠在PDF頁面的適當(dāng)位置繪制元素前鹅。

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfNumberStyle;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;
import com.spire.pdf.lists.*;
import com.spire.pdf.tables.PdfTable;

import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

public class CreatePdf {
    public static void main(String[] args) {

        //創(chuàng)建一個PdfDocument對象
        PdfDocument doc = new PdfDocument();

        //添加頁面
        PdfPageBase page = doc.getPages().add();
       
        //創(chuàng)建兩個純色筆刷
        PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
        PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));
      
        //創(chuàng)建兩種字體
        PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial Unicode MS", 
        Font.PLAIN,  14), true);
        PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial Unicode MS", 
        Font.PLAIN, 10), true);

        //初始化X軸和Y軸坐標(biāo)
        float x = 0;
        float y = 0;
        
        //題目
        String title = "題目";
        
        //通過PdfTextAlignment類庫將文本居中對齊
        PdfTextAlignment alignment = PdfTextAlignment.Center;
        
        //在文檔中心繪制標(biāo)題
        drawTitle(page, title, font1, brush1, (float) page.getClientSize().getWidth() / 2, y, 
        alignment);
        y = y + 30;

        //段落文本
        String paragraph = "測試文字測試文字測試文字測試文字測試文字測試文字測試文字 " +
        "測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字 " +
        "測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字)";

        //在頁面繪制段落
        PdfLayoutResult layoutResult = drawParagraph(page, paragraph,font2, brush2, x, y);
        y = y + (float) layoutResult.getBounds().getHeight() + 10;

        //加載一個圖像文件
        PdfImage image = PdfImage.fromImage("C:\\Users\\Administrator\\Desktop\\th.jpg");

        //在頁面繪制圖像
        drawImage(page, image, x, y);
        y = y + (float) image.getPhysicalDimension().getHeight() + 10;

        //定義樣本數(shù)據(jù)
        String[] data = {"第一列;第二列;第三列",
                         "a1;a2;a3",
                         "b1;b2;b3"};
        String[][] dataSource = new String[data.length][];
        for (int i = 0; i < data.length; i++) {
        dataSource[i] = data[i].split("[;]", -1);
        }

        //在頁面繪制表格
        layoutResult = drawTable(page, dataSource, font2, x, y);
        y = y + (float) layoutResult.getBounds().getHeight() + 10;

        //創(chuàng)建一個順序標(biāo)記
        PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.Upper_Roman, new   
        PdfFont(PdfFontFamily.Helvetica, 12f, PdfFontStyle.Bold));

        //定義列表內(nèi)容
        String listString = "e蘋果\n香蕉\n葡萄\n柚子\n西瓜";

        //在頁面繪制列表
        drawSortedList(page, listString, marker, font2, brush2, x, y, 10);

         //保存文件
        doc.saveToFile("CreatePdf.pdf");
    }

}

生成的PDF文件如下所示。

2.png

將PDF轉(zhuǎn)換為其他格式

您可以直接通過saveToFile方法將生成的PDF(PdfDocument對象)保存為PDF文件峭梳,以及其他文件格式舰绘,如Doc,Docx葱椭,XPS捂寿,SVG和HTML。 在下面的代碼片段中挫以,我會向您展示如何加載現(xiàn)有的PDF文檔并進(jìn)行文件格式轉(zhuǎn)換者蠕。

//創(chuàng)建一個PdfDocument對象
PdfDocument doc = new PdfDocument();

//加載現(xiàn)有的PDF文件
doc.loadFromFile("C:/Users/Administrator/Desktop/Input.pdf");

//保存為Doc文件格式
doc.saveToFile("output/ToDoc.doc",FileFormat.DOC);

//保存為Docx文件格式
doc.saveToFile("output/ToDocx.docx",FileFormat.DOCX);

//保存為Html文件格式
doc.saveToFile("output/ToHtml.html",FileFormat.HTML);

//保存為Xps文件格式
doc.saveToFile("output/ToXps.xps",FileFormat.XPS);

//保存為Svg文件格式
doc.saveToFile("output/ToSvg.svg",FileFormat.SVG);

除了上面提到的文件格式,Spire.PDF還支持將PDF轉(zhuǎn)換為普通的圖像格式掐松,如PNG踱侣,JPEG粪小,EMF和TIFF。 代碼有點難度抡句,但并不復(fù)雜探膊。

//創(chuàng)建一個PdfDocument對象
PdfDocument doc = new PdfDocument();

//加載現(xiàn)有的PDF文件
doc.loadFromFile("C:/Users/Administrator/Desktop/Input.pdf");

//聲明一個BufferedImage實例
BufferedImage image;

//循環(huán)瀏覽PDF頁面
for (int i = 0; i < doc.getPages().getCount(); i++) {

//使用saveAsImage方法將每個頁面保存為BufferedImage
image = doc.saveAsImage(i);

//將BufferedImage保存為PNG文件格式
 File file = new File( String.format("ToImage-img-%d.png", i));
 ImageIO.write(image, "PNG", file);
}

以下是Free Spire.PDF支持的一些其他有用的功能列表。

Java添加頁眉頁腳到PDF
Java添加文本/圖片水印到PDF
Java添加附件到PDF
Java添加圖片/動態(tài)圖章到 PDF
Java在PDF中應(yīng)用不同的字體
Java填充PDF表單域
Java在PDF中添加表單域
Java在PDF中添加條形碼
Java在PDF中添加形狀
Java提取PDF文本內(nèi)容/圖片
Java加密和解密PDF
Java合并/拆分PDF文檔
Java打印PDF文檔

總結(jié)

借助 Free Spire.PDF 提供的便于使用的API待榔,您可以從頭開始快速創(chuàng)建PDF文件并將PDF文件轉(zhuǎn)換為其他文件格式逞壁,而無需花費大量學(xué)習(xí)時間。 這對開發(fā)者來說無疑是一個好消息锐锣。無論您的項目是否需要PDF組件腌闯,無論您是高級程序員還是初級程序員,都?xì)g迎您下載該類庫并獲得處理PDF文檔的一些精彩體驗雕憔。

如果您有任何疑問姿骏,請隨時在下方發(fā)表評論或通過support@e-iceblue.com與我們聯(lián)系。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斤彼,一起剝皮案震驚了整個濱河市分瘦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琉苇,老刑警劉巖嘲玫,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并扇,居然都是意外死亡去团,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門拜马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渗勘,“玉大人,你說我怎么就攤上這事俩莽。” “怎么了乔遮?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵扮超,是天一觀的道長。 經(jīng)常有香客問我蹋肮,道長出刷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任坯辩,我火速辦了婚禮馁龟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漆魔。我一直安慰自己坷檩,他們只是感情好却音,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矢炼,像睡著了一般系瓢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上句灌,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天夷陋,我揣著相機(jī)與錄音,去河邊找鬼胰锌。 笑死骗绕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的资昧。 我是一名探鬼主播酬土,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榛搔!你這毒婦竟也來了诺凡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤践惑,失蹤者是張志新(化名)和其女友劉穎腹泌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尔觉,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凉袱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侦铜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专甩。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钉稍,靈堂內(nèi)的尸體忽然破棺而出涤躲,到底是詐尸還是另有隱情,我是刑警寧澤贡未,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布种樱,位于F島的核電站,受9級特大地震影響俊卤,放射性物質(zhì)發(fā)生泄漏嫩挤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一消恍、第九天 我趴在偏房一處隱蔽的房頂上張望岂昭。 院中可真熱鬧,春花似錦狠怨、人聲如沸约啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍苹。三九已至无宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢里,已是汗流浹背孽鸡。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留栏豺,地道東北人彬碱。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像奥洼,于是被迫代替她去往敵國和親巷疼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評論 1 32
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時灵奖,會觸發(fā)此異常嚼沿。 O...
    我想起個好名字閱讀 5,334評論 0 9
  • 表單域骡尽,可以按用途分為多種不同的類型,常見的有文本框擅编、多行文本框攀细、密碼框、隱藏域爱态、復(fù)選框谭贪、單選框和下拉選擇框等,目...
    哦00閱讀 1,888評論 0 0
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評論 0 3
  • 《苦樂人生》 苦樂人生縱交織锦担, 煩惱終有衰落時俭识。 縱有瀑落三千丈, 長江濤濤源于溪洞渔。 苦難愁腸棄量思鱼的, 藏身狹屋翻...
    純水陸零閱讀 397評論 5 6