Aspose Word DocumentBuilder

這陣子遇到需要在word上列印許多不同bar code

利用範本做變數,會導致bar code重複列印

原因應該是builder.moveToMergeField(“PIC”)

只認得PIC,只要有PIC都會插入,才會重複列印

所以寫code去畫表格,這樣才能動態設定變數

CachedRowSet crs = Servlet.getReport(str, serverRealPath, jsonObj);//從DB撈出資料並在Servlet作處理
DataTable dt = new DataTable(crs, "Data1");//範本還是需要tableStart和tableEnd這兩個變數

reportPath = C:\Desktop\reports\templateFile\xxx.doc;
Document doc = new Document(reportPath);
DocumentBuilder builder = new DocumentBuilder(doc);
//產生barCode
BitMatrix bitMatrix = new Code128Writer().encode(no + "/" + type, BarcodeFormat.CODE_128, 100, 30); 
BufferedImage bImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
//畫表格
builder.startTable(); 
builder.insertCell();//row 1 cell 1
builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(15));//設定寬度15%
builder.insertField("MERGEFIELD NAME1 \\* MERGEFORMAT", dt.getRows().get(j).get("NAME1").toString());//插入變數

builder.insertCell();//row 1 cell2
builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(35));//設定寬度35%
builder.insertField("MERGEFIELD PIC"+type+" \\* MERGEFORMAT");//插入變數
builder.moveToMergeField("PIC"+type);//移置插入的變數
builder.insertBreak(BreakType.LINE_BREAK);//插入斷行,防止條碼黏在表格線上
builder.insertImage(bImage);//插入圖片
builder.insertBreak(BreakType.LINE_BREAK);//插入斷行
//文字設定
Font font = builder.getFont();
font.setSize(8);
font.setBold(true);
builder.write(" " + caseNo + "/" + type); 

builder.insertCell();//row 1 cell 3
builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(15));
Font font2 = builder.getFont();
font2.setSize(12);
font2.setBold(false);
builder.insertField("MERGEFIELD NAME2 \\* MERGEFORMAT", dt.getRows().get(j).get("NAME2").toString());

builder.insertCell();//row 1 cell 4
builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(35));
builder.insertField("MERGEFIELD PIC"+type[n+1]+" \\* MERGEFORMAT");
builder.moveToMergeField("PIC"+type[n+1]);
builder.insertBreak(BreakType.LINE_BREAK);//防止條碼黏在表格線上
builder.insertImage(bImage);
builder.insertBreak(BreakType.LINE_BREAK);
Font font1 = builder.getFont();
font1.setSize(8); font1.setBold(true);
builder.write(" " + caseNo + "/" + type[n+1]);

builder.endRow();
builder.endTable();
 
ds.getTables().add(dt);
doc.getMailMerge().executeWithRegions(ds);

if (browser) {
    doc.save(response.getOutputStream(), SaveFormat.DOC);//存在下載
} else {
   doc.save(serverTempPath + newReportName, SaveFormat.DOC);//存在指定路徑
}

另外

bar code列印出來後發現條碼與下面的文字離太開

這時寫code去控制都沒用(可能沒寫對)

因此在範本的地方去設定行距

行距→行距選項→間距裡面的行距→選最小→行高0 pt