顯示具有 Java 外掛元件 標籤的文章。 顯示所有文章
顯示具有 Java 外掛元件 標籤的文章。 顯示所有文章

Java iText 將 HTML 語法轉換成 PDF 文件

這裡介紹 Java 如何利用 iText,

將 HTML 語法轉換成 PDF 文件,

範例, 如下 :
 程式碼
<%@page import="java.io.*" %>
<%@page import="java.net.*" %>
<%@page import="java.util.ArrayList" %>
<%@page import="com.lowagie.text.*" %>
<%@page import="com.lowagie.text.pdf.*" %>
<%@page import="com.lowagie.text.html.simpleparser.*" %>
<%@page contentType="application/pdf;charset=Big5" %>

<%
Document document = document = new Document( PageSize.A4, 0, 0, 0, 0 );

try
{
PdfWriter.getInstance( document, new FileOutputStream( request.getRealPath("") + "/1.pdf" ) );
document.open();

// HTML 語法
StringBuffer simpleHtmlCode = new StringBuffer("<html><body>");
simpleHtmlCode.append( "你好, 歡迎光臨<br/>" );
simpleHtmlCode.append( "我是 <font color='#0000FF'>昭佑.天翔</font><br/>" );
simpleHtmlCode.append( "祝你 新年快樂 !!<br/>" );
simpleHtmlCode.append( "<br/>" );
simpleHtmlCode.append( "<table border='1' cellspacing='0' cellpadding='0' width='100%'>"
+ "<tr>"
+ "<td height='100' valign='top'>歡迎光臨</td>"
+ "<td height='100' align='right'>Hello World</td>"
+ "</tr>"
+ "<tr>"
+ "<td colspan='2' height='300' bgColor='#FFFF00'> 歡迎<font color='#0000FF'>光臨</font></td>"
+ "</tr>"
+ "</table>"
);
simpleHtmlCode.append("</body></html>");

// 將 StringBuffer 轉換成 StringReader
StringReader stringReader = new StringReader(simpleHtmlCode.toString());

// 載入字型
FontFactory.register( request.getRealPath("") + "/Font/kaiu.ttf" );

// 設定 HTML 標籤樣式
StyleSheet st = new StyleSheet();
st.loadTagStyle("body", "face", "標楷體"); // 字型
st.loadTagStyle("body", "size", "8px"); // 字體大小
st.loadTagStyle("body", "encoding", "Identity-H"); // 顯示中文字

// 產生 HTML 轉換物件
HTMLWorker worker = new HTMLWorker(document);

// 輸出 HTML 到 PDF
ArrayList p = HTMLWorker.parseToList( stringReader, st );
for( int k = 0; k < p.size(); k++ )
document.add((Element)p.get(k));

document.close();

response.sendRedirect( "1.pdf" );
}
catch(Exception e)
{
out.println( "錯誤 : "+ e.toString() );
}

document.close();
%>

範例結果 :


Java 如何將 TEXT 文字檔轉換成 PDF 檔案

在 Java 程式中,

若要將 TEXT 文字檔轉換成 PDF 檔案,

可以利用 iText 套件,

程式範例, 如下 :
 程式碼
File f1 = new File( request.getRealPath("") + "/tom.pdf" );

// 建立 PDF Document 物件
Document document = null;
int vPageWidth = (int)(Math.round(Double.parseDouble(request.getParameter("pagewidth")) * 72));
int vPageHeight = (int)(Math.round(Double.parseDouble(request.getParameter("pageheight")) * 72));

if( request.getParameter("pagewidth") != null && request.getParameter("pageheight") != null )
{
// 設定 Page 範圍
Rectangle pdfPage = new Rectangle( vPageWidth
, vPageHeight
);

// 建立 PDF Document 物件, 且紙張設定以 page 物件為主
document = new Document( pdfPage, 10, 10, 10, 10 );
}
else
document = new Document();

try
{
// 將 PDF Document 物件輸出到檔案
PdfWriter.getInstance(document, new FileOutputStream( request.getRealPath("") + "/tom.pdf"));

// 開啟 PDF 檔案
document.open();

// 行距大小
float vLineSize = 10;

// 字型: 細明體
BaseFont bf = BaseFont.createFont( request.getRealPath("") + "/mingliu.ttc,0"
, BaseFont.IDENTITY_H
, BaseFont.EMBEDDED
);

// 設定字型大小 (比行距小一點)
Font font = new Font( bf, vLineSize - 1, Font.NORMAL );

// 讀取 TEXT 檔案 (設定編碼為 UTF-8)
try
{
String str;
boolean vPushName = false;

// 讀取來源檔案
BufferedReader br = new BufferedReader( new InputStreamReader( new java.net.URL(vURL).openStream()
, "UTF-8"
)
);

while( (str = br.readLine()) != null )
{
// 讀到換頁符號, 自動換頁
if( str.indexOf("\f") > -1 )
{
document.newPage();
document.add( new Paragraph( vLineSize, str.substring(1), font ) );
}
else
{
// 繪製資料
document.add( new Paragraph( vLineSize, str, font ) );

// 空白列
if( str.length() == 0 )
document.add( new Paragraph( vLineSize, "\n", font ) );
}
}

// 釋放資源
br.close();
}
catch( Exception e )
{
out.println( e.toString() );
}

// 顯示 PDF 網頁
response.sendRedirect( "tom.pdf" );
}
catch(Exception pdfErr)
{
out.println( "輸出 PDF 錯誤 !!" );
}

// 關閉 PDF 檔案
document.close();

以上, 這樣不管任何文字檔, 都可完整地轉換且格式仍是對齊的 PDF 檔.

Java iText 如何在 PDF 顯示中文字

利用 Java iText 產生 PDF 檔時, 最常遇到如何正常顯示 PDF, 下面就大致介紹一下 :

使用 iText 提供的兩個 class : com.lowagie.text.pdf.BaseFontcom.lowagie.text.Font,

說明, 請見程式碼 :
 程式碼
// 預設中文字型
// 優 : 產生的檔案較小一些
// 缺 : 資料不易對齊

BaseFont bf = BaseFont.createFont( "MHei-Medium", "UniCNS-UCS2-H", BaseFont.EMBEDDED );

// kaiu.ttf 為標楷體
// 優 : 資料容易對齊
// 缺 : 產生的檔案較大一些, 且小字體列印較不清楚

BaseFont bf = BaseFont.createFont( request.getRealPath("") + "/Font/kaiu.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );

// mingliu.ttc,0 代表 "細明體"
// 優 : 資料容易對齊, 列印也較清楚
// 缺 : 產生的檔案較大一些
// mingliu.ttc,1 代表 "新細明體"

BaseFont bf = BaseFont.createFont( request.getRealPath("") + "/Font/mingliu.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );

// 設定字型大小
// Font.NORMAL:正常
// Font.BOLD:粗體
// Font.ITALIC:斜體
// Font.BOLD | Font.ITALIC:粗斜體

Font font = new Font( bf, 12, Font.NORMAL );

// 寫入文字
document.add( new Paragraph("Hello World, 大家好 !!", font) );

Java Commons Net 進行 FTP 檔案傳輸

利用 "Jakarta Commons Net" 外掛元件, 讓 Java 進行 FTP 動作.

 FTP 基本程式碼
<%@page import="org.apache.commons.net.ftp.FTPClient" %>
<%@page import="org.apache.commons.net.ftp.FTPReply" %>
<%@page contentType="text/html;charSet=Big5" %>

<%
String ftpServer = "***.***.***.***";
String ftpUsername = "***";
String ftpPassword = "***";

// 建立 FTP Client 物件
FTPClient ftp = new FTPClient();

try
{
// FTP 連線
ftp.connect( ftpServer );
out.println( "Connected to " + ftpServer + ". <br/>" );

// 顯示 FTP Server 回應資訊
out.println( ftp.getReplyString() + "<br/>" );

// 取得 FTP 回應碼
int reply = ftp.getReplyCode();

// FTP 連線失敗
if( !FTPReply.isPositiveCompletion(reply) )
{
ftp.disconnect();
out.println( ftpServer + " FTP server connect failure.<br/>" );
}

// FTP 連線成功
else
{
// FTP 登入
boolean ftpLogin = ftp.login( ftpUsername, ftpPassword );

// 登入失敗
if( ftpLogin == false )
{
out.println( ftpServer + " FTP server login failure.<br/>" );
}

// 登入成功
else
{
out.println( ftpServer + " FTP server login success.<br/>" );

// 登出
ftp.logout();
out.println( ftpServer + " FTP server logout.<br/>" );
}
}
}
catch( Exception e )
{
out.println( "錯誤: " + e.toString() + "<br/>" );
}
finally
{
// 若有連線, 則中斷之
if( ftp.isConnected() )
try
{
ftp.disconnect();
out.println( ftpServer + " FTP server is disconnected.<br/>" );
}
catch( Exception ioe )
{
// 不做任何事
}
}
%>

執行結果 :


 登入成功, 列出 FTP Server 檔案清單
// 更改 Remote 路徑
ftp.changeWorkingDirectory( "ftpServerPath" );

// 取得 FTP Server 檔案清單
String[] ftpFiles = ftp.listNames();

// 顯示 FTP Server 檔案清單
for( int i = 0; i < ftpFiles.length; i++ )
out.println( ftpFiles[i] + "<br/>" );

 登入成功, 下載 FTP Server 檔案
// 指定下載到本地端的檔案名稱
FileOutputStream fos = new FileOutputStream( "localFileName" );

// 指定要 FTP Server 檔案, 然後下載到本地端
ftp.retrieveFile( "ftpServerFileName", fos );
fos.close();

 登入成功, 上傳檔案到 FTP Server
// 指定要上傳到 FTP Server 的本地端檔案名稱
FileInputStream fis = new FileInputStream( "localFileName" );

// 指定上傳到 FTP Server 後的檔案名稱, 然後上傳
ftp.storeFile( "ftpServerFileName", fis );
fis.close();

以上, 希望對想透過 Java 做 FTP 工作的人, 有所幫助.

Java 的各種 Plugin 外掛程式


JNDI Connection Pooling

Component: Proxool.

url: http://proxool.sourceforge.net/index.html.


XML

Component: JDOM.

url: http://www.jdom.org.


內文搜尋

Component: lucene.

url: http://lucene.apache.org/java/docs/.


Report 報表

Component: Jasper Report.

url: http://jasperreports.sourceforge.net.


Excel

Component: Jakarta-POI.

url: http://jakarta.apache.org/site/binindex.cgi.


PDF

Component: iText.

url: http://www.lowagie.com/iText.


Chart 統計圖表

Component: JFreeChart.

url: http://www.jfree.org/jfreechart.


Mail 郵件

Component: JavaMail.

url: http://www.javasoft.com/products/javamail.


Upload 上傳 / Download 下載

Component: SmartUpload.

url: http://www.jspsmart.com.


FTP / Telnet

Component: Jakarta-Commons-net.

url: http://commons.apache.org/net.


Browser 瀏覽器

Component: JDIC.

url: https://jdic.dev.java.net.

以上, 是我目前使用到的 Java 相關 Plugin 外掛程式, 供大家參考.

Java POI 讀取 Excel Cell 資料

在 Java 領域中, 存取 MS Excel 檔案資訊, 大都透過 POI 進行,

下面介紹大致介紹一下 POI 相關函數 :

 指定 Excel 檔
POIFSFileSystem fs = new POIFSFileSystem( excelFile );

 建立 Workbook 物件
HSSFWorkbook wb = new HSSFWorkbook( fs );

 建立 Worksheet 物件
HSSFSheet ws = wb.getSheetAt( 第幾個 sheet - 1);

 建立 Row 物件
HSSFRow rowObj = ws.getRow( row - 1 );

 建立 Cell 物件
HSSFCell cellObj = rowObj.getCell( (short)(col - 1) );

 讀取 Cell 資料
try
{
// 取得 Cell 資料型態
vCellType = cellObj.getCellType();

// 取得 Cell 資料值
switch( vCellType )
{
case 0 : // 數字日期型態
if ( org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cellObj) ) // 日期格式
v_excelData = dateformat.format( cellObj.getDateCellValue() );
else
{
v_excelData = cellObj.getNumericCellValue() + "";

bd = new BigDecimal( v_excelData );
v_excelData = bd.toPlainString(); // 數字格式, 避免出現科學符號
}

break;

case 1 : // 字串型態
v_excelData = cellObj.getStringCellValue();
break;

case 2 : // 公式型態
v_excelData = cellObj.getNumericCellValue() + "";
break;

case 3 : // 空白型態
v_excelData = "";
break;

case 4 : // 步林型態
v_excelData = cellObj.getBooleanCellValue() + "";
break;

case 5 : // Error
v_excelData = "";
break;
}
}
catch( Exception err2 )
{
v_excelData = "";
}

更多資訊, 可以到這網頁參考: http://poi.apache.org/.

以上, 希望對剛接觸 Java POI 的人有所幫助 ...

Java iText 如何設定 PDF 行距

Java 在利用 iText 產生 PDF 時,

若只是利用 document.add( new Paragraph(str) ); 輸入段落資料,

在同樣的紙張大小, iText PDF 的行數會比正常情況少一些,

這是由於行距過大而造成的,

其實, 在 iText 中可以設定行距 (Leading), 如下 :
 程式碼
document.add( new Paragraph(行距數值, str) );

這樣, 就可以解決行距的問題了.
Related Posts Plugin for WordPress, Blogger...