2016-12-05 73 views
0

我有一個用例,我必須在pdf上顯示動態圖像。我正在使用PDF生成的FApacheFOP 2.1。我從API調用中獲取圖像行,然後將該圖像轉換爲基本64格式。使用xslfo和FOP 2.1無法在PDF中看到base64圖像

請找到Java COE轉換圖像:

String jpgFileName = ConfigManager.getImageFilePath() + "/jpgImage-"+System.currentTimeMillis()+".jpg"; 
Blob imageDataBlob = (Blob) faesRow.get("imageData"); 

     FileUtil.writeToFile(imageDataBlob, jpgFileName); 

     String base64Result = Base64.getEncoder().encodeToString(FileUtil.readFromFile(jpgFileName).getBytes("utf-8")); 

     result = base64Result; 

我正在使用XSLFO的base64數據類型上打印PDF格式的圖像,請在下面找到XSLFO,這裏$ signatureImage是發送的數據上面的java代碼:

<xsl:param name="Name">data:image/jpg;base64,{$!signatureImage}</xsl:param> 

    <fo:block-container absolute-position="absolute" left="3.50in" top="9.25in" width="4.0in" height="2.0in"> 
     <fo:block text-align="left"> 
     <fo:external-graphic content-width="scale-to-fit" 
      content-height="100%" 
      width="100%" 
      scaling="uniform" 
      src="url({$Name})"/> 
     </fo:block> 
    </fo:block-container> 

在模板渲染的輸出中,我可以在xslfo文件中獲取base64流。請找到下面的輸出:

<xsl:param name="Name">data:image/jpg;base64,{77+977+977+977+9ABBK... }</xsl:param> 

<fo:block-container absolute-position="absolute" left="3.50in" top="9.25in" width="4.0in" height="2.0in"> 
    <fo:block text-align="left"> 
    <fo:external-graphic content-width="scale-to-fit" 
     content-height="100%" 
     width="100%" 
     scaling="uniform" 
     src="url({$Name})"/> 
    </fo:block> 
</fo:block-container> 

現在的問題是,圖像沒有得到定價生成的PDF輸出。 您可以幫我找到一種在這裏打印圖片的方法。

額外信息: 1.我沒有得到任何錯誤生成PDF。 2. PDF能夠打印靜態圖像和條形碼。

+0

內容類型不應該是image/jpeg而不是image/jpg?另外,b64字符串周圍的{}看起來對我很可疑。 –

+0

我嘗試過使用jpeg並刪除{}。但是沒有運氣,它沒有顯示圖像。它看起來像問題是與base64轉換,但不知道是什麼問題。 –

+0

當我做你的「base64」數據77 + 977 + 977 + 977 + 9ABB的base64解碼...它以0xef 0xbf 0xbd 0xef開頭......這似乎不是一個jpeg文件,它將以0xff 0xd8開頭,可能接着是0xff 0xe0。看起來對我來說是錯誤的... –

回答

2

我發現這種情況下的問題。

第一個問題是與base64相互轉換,我們需要使用如下的轉換:

File file= new File(jpgFileName); 
FileInputStream fileInputStream= new FileInputStream(file); 
byte[] b= new byte[(int) file.length()]; 

fileInputStream.read(b); 

String base64Result = new String(Base64.getEncoder().encode(b),"UTF-8"); 

比這還需要在XSLFO模板中的一些變化的其他太多,請看以下變化:

<fo:block-container absolute-position="absolute" left="3.50in" top="9.25in" width="4.0in" height="2.0in"> 
    <fo:block text-align="left"> 
    <fo:external-graphic content-width="scale-to-fit" 
     content-height="100%" 
     width="100%" 
     scaling="uniform" 
     src="url('data:image/jpeg;base64,$!signatureImage')"/> 
    </fo:block> 
</fo:block-container> 
+0

關於SO的最佳問題是OP自己找到答案的那些問題。 –