顯示具有 JAVA 標籤的文章。 顯示所有文章
顯示具有 JAVA 標籤的文章。 顯示所有文章

2024年12月26日 星期四

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

 近日Eclipse處理Tomcat改新版本,調整好設定後發現若干"舊"專案無法順利RUN起來,吐了 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 的問題,備忘下處理過程吧:

Step 1: 目標專案選取,然後按右鍵選下圖反白處。

選擇Deployment Assembly,然後按Add

選擇Java Build Path Entries後順著next做完即可。




2024年9月25日 星期三

gson.JsonSyntaxException Failed parsing SQL Date

發現WAS LOG有Gson解析JSON處理DATE有異常,爬了下文多篇文章表示程式碼未異動情況下,在不同的伺服器運行的結果會不一樣,開發環境使用TOMCAT所以測不到異常? 但WEBSPHERE報錯ㄌ...

不過LOG中顯然"九月"被Decode成"????"是屬於編碼問題,所以除了格式外Charset也要處理。

LOG: has Exception:com.google.gson.JsonSyntaxException: Failed parsing '???? 22, 2024' as SQL Date

解法備忘:

在寫入BLOB時,先指定DATE FORMAT跟Charset

Gson gson = new GsonBuilder().setDateFormat("MMM dd, yyyy").create();
byte[] bdata = gson.toJson(Class()).getBytes("utf-8");

還原時,也要設定DATE FORMAT跟Charset

Gson gson = new GsonBuilder().setDateFormat("MMM dd, yyyy").create();
gson.fromJson(new String(bdata, Charset.forName("utf-8")), XXX.class);


2024年9月5日 星期四

Logback 轉 Log4j2 套用備忘(JAVA 8)

嘗試這把專案Logback 改 Log4j2來處理日誌問題,備忘如下:

POM.xml

add

   src\log4j2.properties

                <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.23.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>

remove 

    src\logback.xml

                <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> 
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.14</version>
</dependency>

試了好多篇文章的方法,底下這個最單純(可能也是若干文章匹配的是特定的版本造成的)
reference: https://howtodoinjava.com/log4j2/log4j2-properties-example/

小記: 原先處理的動力是因為從WAS環境(WIN)轉容器Docker(LINUX),發現Docker上系統LOG檔要提供外部去檢視的資料夾都沒法順利取得,所以改方式來寫LOG看看能不能解決,不過嘗試迄今還沒成功 Orz...

2024年7月23日 星期二

SBOM 檔產製

資訊系統也要健檢了?  項目涵蓋這麼多(如下)...



裡面一個相對陌生的專有名詞是SBOM檔 參考日誌 爬了些文發現近期挺夯的,實作了下跑完sbom-tool-win-x64.exe會出現下方圖示

sbom-tool-win-x64.exe generate -b SBOM產製路徑 -bc 專案位置 -ps 供應商名稱 -pn 專案名稱 -pv 版次 -nsb 前綴網址


同時在指定資料夾會產製,看起來manifest.spdx.json就是所謂的SBOM嚕!!



2024年6月18日 星期二

Chrome/Edge的JavaScript onKeyDown(), ondblclice()事件異常

 最近一些在Chrome/Edge運行已久的邏輯被USER反映說功能異常(怪怪),或時好時壞。


輸入時JavaScript keydown(), keyup()事件失效 參考


在<SELECT></SELECT>使用MULTIPLE後雙擊滑鼠ondblclice()會無法觸發帶入所選項。參考


恩恩...不能說邏輯不更新就不會出事,這兩種個案通報當下都覺得不可思議,爬了爬文這兩篇看來最符合預期,留存下~~後續解法也配合文章提供的方法順利排除!!


將onKeyup()至換成下面的方式來處理,原來的地方class增加ordkeyin來做識別,用迴圈主要是幫助跳下一個位置時多個class的繼承

var allInputSelector = ":input:visible:enabled";
let elementsArray = document.querySelectorAll(".ordkeyin");
elementsArray.forEach(function(elem) {
elem.addEventListener('keyup', function (event) {
    if (event.keyCode == 13) {
                       //ENTER提交
mathod_go(event);
} else if ($("#" + this.id).val().length == 8) {
                       //滿8碼跳下一個位置
$(allInputSelector + ":eq(" + ($(allInputSelector).index($(this)) + 3) + ")").focus();
event.preventDefault();
}
    });
});

雙擊問題ondblclick="mathod_go()"改成底下的方式,移除ondblclice="..." 後在class裡面增加dbRigclk做識別,識別碼選用以不重複即可。


document.querySelector(".dbRigclk").addEventListener('dblclick', function (event) {
var clickedOption = event.target;
if (clickedOption.tagName === 'OPTION') {
        clickedOption.selected = true;
}
mathod_go();   
    });

2024年1月8日 星期一

SimpleDateFormat 12-31 加1年的異常

日前USER反映12/31的資料產出異常,從系統日誌來看當天是2023-12-31但記錄上都看到2024-12-31,所以當然資料產出異常原因就是檢索的日期2024-12-31沒相對應的記錄 XD

本以為是伺服器時區設定的問題,但比對其他執行的JOB有些正常有些有同樣的狀況,故伺服器時區出錯的假設看來不成立。這時候請教GOOGLE大神看來還是免不了,爬到這篇網誌 後看來是解迷了,系統取日期的方法確實與此篇描述相同,調整寫法把YYYY改成yyyy來避開ISO 8601規則,冀望來年別再採坑了。

後記: 其他同事系統也有發現類似狀況(+1 Year),與他分享時也表示為相同原因,看來這個坑踩的不冤,不過這段Code要打太極也能說委外廠商寫的,驗收時沒問題...就是此潛藏的異常要被察覺不容易罷了!! 經一事長一智是職場職務邁向更PRO的歷練,備忘囉!!



2023年11月21日 星期二

Code Standard

 單打獨鬥久了,Code Style通常都是自己習慣為準,當然解譯他人專案看多了通常難免會調整下自己編碼的習慣,最近被拉入Code Standard訂定的討論小組,做個memo囉!! 自己的習慣不一定是標準,跟一個人走的快一群人走的遠,哈...

保哥的文章,淺顯易懂的教學直接在IDE上套用,也不用去深究裡面為什麼這麼訂,讓工具來輔助也不賴



2023年3月6日 星期一

Image to Base64 帶入img的src內顯示

 承之前的狀況,HTML TO PDF的做法近期使用者回報圖檔會有缺圖的問題,這再開發環境並未發現但正式環境再轉檔當下若載圖有狀況就會有此問題,故調整作法直接把圖放在HTML內改善。

不過缺點顯而易見的是轉Base64那頁面的SIZE會大增,若照片多等待時間就變得更久了...不過照片多再轉PDF也是得等待故有逾時,若是再瀏覽器顯示因為有快取機制所以只有第一次得等...這就不好比較!

HTML:
<div class="flex-row" >
    <c:if test="${pic.status==true}">
<img  style="height:300px;max-width:500px;width: expression(this.width > 500 ? 500: true);" src='data:image/jpg;base64, ${pic.picbase64}' ></img><br>
    </c:if>
  </c:forEach>
</div>
  <c:forEach var="pic" items="${piclist}">

JAVA:
//轉base64 string
Base64.Encoder encoder = Base64.getEncoder();
pic.setPicbase64(encoder.encodeToString(blob.getBytes(1, (int) blob.length())).trim());

小計:
data:image/jpg; base64, 紅字處實測png, jpeg ... 只要是圖都會正確顯示,所以不用特別去抓副檔名來放,但保險起見建議還是依照實際的檔案格式來放入相對應的MIME TYPE!

2022年10月13日 星期四

HTML Page Convert to PDF

產製PDF在拉版時往往相對耗時,尤其是在有多頁的情況下相對搞工。測出來HTML FILE直轉PDF效果還不賴,做個備忘。

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;

public void ConvertPDF(String htmlPath ) {
String src = htmlPath;
try {
ConverterProperties properties = new ConverterProperties();
DefaultFontProvider fontProvider = new DefaultFontProvider();
FontProgram fontProgram;
try {
fontProgram = FontProgramFactory.createFont("c:\\windows\\fonts\\kaiu.TTF");
fontProvider.addFont(fontProgram);
properties.setFontProvider(fontProvider);
} catch (IOException e) {
System.out.println("creat base font erro:" + e );
}

HtmlConverter.convertToPdf(new File(src), new File(htmlPath.replace(".html", ".pdf")), properties);
} catch (Exception ex) {
System.out.println(ex);
}

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>4.0.3</version>
</dependency>

後記:
2022/12/12 使用者反映轉出來的PDF有文字被裁切的問題,檢視後發現Bootstrap的CSS套用上拋了許多Exception出來,看來是HTML套版改用Bootstrap造成的問題,解決方式更新為 V4.0.4 後再檢視PDF成果已無被裁切之情事,結案。

iTextPDF add image

近期處理個需求需要在產出的PDF上面加上章戳圖,專案使用的是iTextPDF所以爬了些文找到了這方式,很順利的處理需求!! 做個備忘。

import java.net.URL;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;

document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\test.pdf"));
document.open();

//取得圖檔存放路徑
URL url = getClass().getProtectionDomain().getCodeSource().getLocation();
String spath = url.toString();
spath = spath.substring(0, spath.indexOf("WEB-INF"));
String imageFile = spath + "test.jpg";

PdfContentByte cb = writer.getDirectContent();
mage imgSoc = Image.getInstance(imageFile);
//設定大小
imgSoc.scaleToFit(60, 45);                     
//設定位置
imgSoc.setAbsolutePosition(490, 760); 
cb.addImage(imgSoc);

document.close();

補充說明:若原圖縮小到合適的SIZE後加入,印出來會相對模糊,因此改用scaleToFit來做縮圖處理,這樣列印的效果USER會比較滿意。

2022年10月6日 星期四

java read from DB2 column by Bolb type

近期配合保留原始資料將class資料轉json sting 存到DB的blob欄位內,底下是JAVA取值用的邏輯備忘下,試了許多方式就這樣最精簡也符合需要。

至於為什麼選擇blob而不用clob這個主要是考量若干資安掃描會去檢查cloumn data是否有踩紅線,改bytes array可以省去不必要的困擾,不然blob通常拿來存圖或是編譯後的檔案(PDF),這類json string存clob在DB tools上會較方便識別,就看各自的需要囉!!


source json data: 
bldata value is  new Gson().toJson(Variable.class).getBytes("utf-8")

Read

select bldata from table where length(bldata) > 4 with ur;

Blob blob = resultSet.getBlob("bldata"); 

byte[] bdata= blob.getBytes(1, (int) blob.length());

Variable.class Variables jsonStr = new Gson().fromJson(new String(bdata), Variable.class);

2022年9月21日 星期三

JAVA WEB專案中呼叫外部JAR執行取得回傳

 近日碰到了個需求,要整併外部的JAR到專案中,不過對方的JAR SIZE數十MB而自已所需要的只是裡面其中一個函式,故放入lib呼叫會造成專案封裝後的SIZE大增,不太OK~所以找到了ProcessBuilder這個好用的solution來,底下做個備忘囉!!

完工後的結果如下,效果如預期的方向呈現,OK的!

Process proc = null;

BufferedReader reader = null;
StringBuilder sbTravel = new StringBuilder();
try {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd", "/c", "java -jar d://hello.jar");
processBuilder.redirectErrorStream(true);
proc = processBuilder.start();

reader = new BufferedReader( new InputStreamReader(proc.getInputStream(), "Big5"));
String line;
while ((line = reader.readLine()) != null) {
if (StringUtils.isNotBlank(line)) sbTravel.append(line + "<br>");
}
int exitVal = proc.waitFor();
if (exitVal!=0) System.out.println("sbTravel:" + sbTravel + ",exitVal:" + exitVal);

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) reader.close();
if (proc != null) proc.getOutputStream().close();
} catch (IOException e) {
System.out.println("has IOException:" + e.toString());
}
}

補充:
間中也嘗試寫bat來執行,不過webSphere不給跑TOMCAT到是沒問題
Runtime.getRuntime().exec("cmd.exe /c start d:/hello.bat");

另外一個狀況是回傳值的取得,嘗試若干方法都沒能順利取值,間中也想過把console輸出寫成File來存取,但這方向容易有檔案被使用中卡住的exception(神奇的websphere),不然可以早些結案掉的。
Runtime.getRuntime().exec("java -jar d:/hello.jar > d:/bak/hello.TXT " );

後記:
2022-12-12 : 發行在WebSphere 9運行順利;但若改為WebSphere 8.5會拋送ssh handshake
exception,因此實作上等待伺服器更新緩不濟急因此用跳板方式轉到WebSphere 9的機器上
執行呼叫,缺點就是得多等個幾秒鐘。

2022年7月22日 星期五

源碼掃描交手Part II

 年初因故將專案做了源碼掃描CHECKMARX,依照相關報告調整邏輯結果還是殘留了150左右的中高風險卡住了,近幾個月在上JAVA 11開發者的課程,補強了些JAVA的基本常識(=.= 做中學只能保證功能正確效率OK但語法是否能把該語言優勢發揮出來就難說了),再次挑戰雖然中高風險一就是150左右,但數據卻是顛倒過來,哈...

裡面的中、低風險有一堆是System.out.print() 、轉存檔案的風險,這主要是抓錯用的寫LOG或是不會被執行的項目,就先放著吧!! 等找到能騙過CHECKMARK說那段不會被跑到的寫法,應該就解決了。

專案管理是MAVRN、架構為MVC 若干的高風險都是在參數內容檢核時的風險,可以透過加Fitter時去觸發檢查XSS跟SQL Injection的邏輯! XssAndSqlHttpServletRequestWrapper 來複寫後再送入GOOGLE拿去檢索可以看到許多範例。

<filter>
  <description></description>
  <display-name>RequestFilter</display-name>
  <filter-name>RequestFilter</filter-name>
  <filter-class>ooo.xxx.filter.RequestFilter</filter-class>
  <inin-param>
<param-name>exclude</param-name>
<param-name>*.js,*.gif,*.jpg,*.jpeg,*.png,*.css,*.ico</param-name>
  </inin-param>
</filter>
<filter-mapping>
  <filter-name>SessionFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

public class RequestFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
  // Auto-generated method stub
}

@Override
public void doFilter(ServletRequest httpRequest, ServletResponse httpResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) httpRequest;
HttpServletResponse response = (HttpServletResponse) httpResponse;

XssAndSqlHttpServletRequestWrapper xssRequest = new XssAndSqlHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}

@Override
public void destroy() {
  // Auto-generated method stub
}

}

CHECKMARK對於資料編碼使用會PASS的

JAVA:

用HtmlUtils.htmlEscape(value) ,之前用URLEncoder.encode(value) 會被無視。

如果邏輯使用StringUtils.isNotBlank() 判斷是否再處理,從報告上看也會被跳過,這時候就得先處理好null的情況後把StringUtils.isNotBlank()拿掉直接強制一定會落入檢核的method才能PASS。

JSP

用 value = org.apache.commons.text.StringEscapeUtils.escapeHtml4(value); 有用,非escapeHtml一就會報錯。


至於SQL Injection大概就是認關鍵字吧,把一些會誤殺的拿掉後多次嘗試即可! 這就不分享了畢竟每個專案環境跟用途不一樣,直接套用GG的機率頗高。

2022年5月18日 星期三

Eclipse無法自動編譯出class檔案

 最近幫位新手(非新人)解Bug說專案跑不起來,顯示

Spring專案啟動有Exception
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find classs ...

看了下專案目錄bin下面沒東西,正常應該會有對應.javs的.class檔案,做個備忘囉~~小卡關以後萬一碰到可以參考。

Eclipse 的設定參考這篇網誌可以初步排除些設定上的問題,clean執行完後或是JDK移除重設定還怪怪的話,重啟Eclipse可以試試!! 不過這次碰上的個案不是這類的問題。

底下位置紅框處若有紅色X項時,要選取後選擇delete若沒清掉也無法Build,至於新手說他的另一個專案也有紅色X項但是可以build跟執行,=.= 這樣子喔...BJ4 







byte[] 與String 轉換中文亂碼備忘

姓名跟住址這類資料存取往往都會跟CharSet有關,如果某個環節沒弄好就是亂碼+破版來回報,做個備忘嚕!!

String CharSet = "UTF-8";
byte[] bytes_rowdata = s_addr.getBytes(CharSet );
String s_Addr = ArrayCopy2Str(bytes_rowdata, 0, 11, 20, CharSet );

/*
 * i_posstr: 相對起始位置
 * i_offset: 偏移位
 * len: 取的字元長度
 * CharSet: 字元編碼 
*/
private String ArrayCopy2Str(byte[] bytes_rowdata, int i_posstr, int i_offset, int len, String CharSet ) {

String s_val = "";
try {
vResult = new byte[len];
System.arraycopy( bytes_rowdata, i_posstr + i_offset, vResult, 0, len);
                        //還原字串也要設定字元編碼,如果沒給那一定機率會變亂碼
s_val = new String(vResult, CharSet);
} catch (Exception ex) {
System.out.println("ArrayCopy2Str has exception:" + ex.toString());
}

return s_val;
}

2022年4月20日 星期三

iTEXT QRCODE備忘

最近BarCode128 不夠用了,隨著硬體設備(掃描器)跟標籤機增購所以QRCode也上了時程,做個JAVA iTextPDF產製QRCODE的備忘文章。

import java.util.HashMap;
import java.util.Map;
import com.itextpdf.text.pdf.qrcode.EncodeHintType;
import com.itextpdf.text.pdf.qrcode.ErrorCorrectionLevel;
import com.itextpdf.text.pdf.BarcodeQRCode;

//QRCODE  
StringBuffer sb = new StringBuffer ();    
sb.append ("QRCODE內容");  
Map<EncodeHintType, Object> qrParam = new HashMap<EncodeHintType, Object> ();
qrParam.put ( EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M );
qrParam.put ( EncodeHintType.CHARACTER_SET, "UTF-8" );
//size_x, size_y 為QRCODE寬跟高
BarcodeQRCode qrcode = new BarcodeQRCode ( sb.toString (), size_x, size_y, qrParam );  
Image qrcode_img = qrcode.getImage();

InputStream input =  new FileInputStream("source.pdf");
OutputStream output= new FileOutputStream(new File("target.pdf"));

PdfReader reader = new PdfReader(input);           
PdfStamper stamper = new PdfStamper(reader, output);
PdfContentByte cb = stamper.getOverContent(1);

//x,y 放置在PDF內的座標位置
qrcode_img.setAbsolutePosition(x, y); 
cb.addImage(qrcode_img);

stamper.setFormFlattening(true);           
stamper.close();           
reader.close();

2021年11月16日 星期二

iTEXT罕字處理

 

中文字博大精深尤其是姓名的使用,為了命好而擇用特殊的文字組合或筆劃值也不算罕見,不過系統列印要處理這類就狀況百出。幾個步驟備忘來留念下
1. 編碼:不管是大五碼還是簡字總之先轉碼成UNICODE為先。
2.字型:大概率要找免費的比較好,全字庫是可以考慮的範圍,底下是拿細明體+細明體ExtB來做範例,因為全字庫的罕字分三層,感覺卡麻煩。

部分罕字/特殊字的字碼會在65535使用4byte來儲存,故判斷上就不能只取3Byte不然會對不上字元,另外罕字不可能單純出現在最前或最後也可能藏在中間或單字以上,故處理上得一字字處理,底下的Method送入inStr 原始Unicode字串回傳Paragraph餵給iText來顯示....

private Paragraph getExtName(String inStr) {
Paragraph simplePara = new Paragraph();
BaseFont bf_name = null;
int i_char = 0;
try {
bf_name = BaseFont.createFont("c:\\windows\\fonts\\mingliu.ttc,1", "Identity-H", BaseFont.NOT_EMBEDDED);

int getCode;
int start=0;
int end=0;
String getstr = "";
for(int j=0;j<inStr.length();j++) 
{
getCode = inStr.codePointAt(j);
start=j;
end=start+1;
if(getCode > 65535) {
   j++;
   end=start+2;
}
getstr = inStr.substring(start, end);
boolean tmpc  = bf_name.charExists(getCode);
if(tmpc) {
Chunk Chunkid0 = new Chunk(getstr, font12_name);
simplePara.add(Chunkid0);
i_char++;
} else {
tmpc  = bf_name_ext.charExists(getCode);
if(tmpc) {
Chunk Chunkid1 = new Chunk(getstr, font12_name_ext);
simplePara.add(Chunkid1);
i_char++;
}
}
}
        } catch (Exception ex) {
        i_char = 0;
        log.error(ex.toString());
        }

if (i_char == 0) {
Phrase simplePhr1 = new Phrase(inStr, font12_name);
simplePara.add(simplePhr1);
}
return simplePara;
}

2021年9月30日 星期四

decodeURIComponent後把+號改空白顯示

前後端資料拋接要避開依些特殊符號的異常或資安檢核可透過URLEncoder來轉碼,不過特殊符號在decode後會變+號造成解譯上的困擾,這時候加上.replace(/\+/g, ' ') 即可。

JAVA端

rtnval.setDatas(URLEncoder.encode(gson.toJson(tablelist), "UTF-8" ));

JS端

call_ajax($('#QueryForm').attr('action'), $('#QueryForm').serialize(), e)

.done(function(data){

$('#rtn_tbody').html(decodeURIComponent(data.datas).replace(/\+/g, ' '));

})

.fail(function(){

alert('ajax call fail.');

});

}

2021年5月12日 星期三

MAVEN PDF to JPEG

PDF轉圖檔的需求,如果再iText7有現成的Method可以使用,不過可惜專案的Framework只能支援到iText 5.x ,底下是經測試可運行的,備忘囉!!

 AT POM.xml add

        <!--PDF to JPG-->
        <dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>1.8.3</version>
</dependency>


Add CLASS Method 

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
//Filetype support jpg, jpeg, png, bmp, gif
public static int ConverPdf2Jpg(String s_path, String s_fname, String Filetype) {
String s_destname = s_fname + ".jpg";
int pageNumber = 1;
try {
        String sourceDir = s_path + s_fname + Filetype ;
        String destinationDir = s_path;
        File sourceFile = new File(sourceDir);
        File destinationFile = new File(destinationDir);
        if (!destinationFile.exists())   destinationFile.mkdir();
        if (sourceFile.exists()) {            
            PDDocument document = PDDocument.load(sourceDir);
            List<PDPage> list = document.getDocumentCatalog().getAllPages();
            String fileName = sourceFile.getName().replace(".pdf", "");                          
            for (PDPage page : list) {
            BufferedImage image = page.convertToImage();
                File outputfile = new File(destinationDir + fileName +"_"+ pageNumber + Filetype );
                ImageIO.write(image, "jpg", outputfile);
                pageNumber++;
            }
            document.close();            
        } 
    } catch (Exception e) {
        e.printStackTrace();
    }
    return pageNumber ;
}

2021年4月30日 星期五

ITEXT 5.5 合併文字的範例

最近有需求處理在PDF上加文字,有別於之前的浮水印使用的方式不太一樣,故備忘之...

X座標與Y座標可使用十分逼近法取得,無法像圖檔使用小畫家看座標,沒甚麼大學問就是苦功吧。

範例CODE 如下:

BaseFont font = BaseFont.createFont("c:\\windows\\fonts\\EUDCK.TTF", "Identity-H", BaseFont.NOT_EMBEDDED);

InputStream input =  new FileInputStream("templater.pdf");

OutputStream output= new FileOutputStream(new File("target.pdf"));

PdfReader reader = new PdfReader(input);

PdfStamper stamper = new PdfStamper(reader, output);

ColumnText ct = new ColumnText(stamper.getOverContent(1));  

Font FontChinese14 = new Font(font, 14, 0);

Paragraph iText = new Paragraph(Tpmienrol.getTpmi_Namec(), FontChinese14);

ColumnText.showTextAligned(stamper.getOverContent(1), Element.ALIGN_LEFT, iText, x座標, y座標, 0);   

stamper.setFormFlattening(true);

stamper.close();

reader.close();

因專案使用的是iTEXT 5.5版本,在iTEXT 7會更簡便些,BJ4就醬子吧~~改專案支援的FRAMEWORK施工更大,就向下延伸即可。