項目使用了Activiti工作流,在windows系統使用顯示流程圖正常,但是在正式的linux系統上發現流程圖節點文字信息亂碼顯示!圖片其實是用了api提供的圖片流直接封裝顯示的。
核心部分代碼如下:
public static InputStream getDiagram(String processInstanceId){
RuntimeService runtimeService = getRuntimeService();
RepositoryService repositoryService = getRepositoryService();
//查詢流程實例
HistoryService historyService = getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
// .processInstanceId(processInstanceId).singleResult();
//查詢流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult();
//獲取BPMN模型對象
BpmnModel model = repositoryService.getBpmnModel(processDefinition.getId());
//定義使用宋體
String fontName = "宋體";
//獲取流程實例當前的節點,需要高亮顯示
List<String> currentActs = new ArrayList<String>();
if(!isFinished(processInstanceId)){
currentActs = runtimeService.getActiveActivityIds(processInstanceId);
}
//BPMN模型對象、圖片類型、顯示的節點
InputStream inputStream = processEngine
.getProcessEngineConfiguration()
.getProcessDiagramGenerator()
.generateDiagram(model, "png", currentActs, new ArrayList<String>(),
fontName, fontName, fontName, null, 1.0);
return inputStream;
}
原因最終判斷是圖片文字使用了宋體,但是linux系統中默認不包含宋體,所以系統在解析宋體的時候就亂碼啦!!解決辦法是將windows系統中的宋體安裝到windows環境中國,具體是方法配置在jdk字體文件夾下,親自驗證可行!
在console裏面輸入echo $JAVA_HOME,獲取到oracle jdk安裝目錄,然後在jre/lib/fonts目錄下創建fallback目錄,將C:\WINDOWS\Fonts\simsun.ttc拷貝到 /usr/java//jdk1.7.63/jre/lib/fonts/fallback文件夾內後重啓服務器即可。