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);