在這篇文章中舞痰,我將舉例說明如何創(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文件如下所示。
將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)系。