日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用JasperReport輸出image圖像

 aaie_ 2017-03-10

    最近公司新項(xiàng)目上有一個(gè)新的需要,即在原來用jasper打印出來的文檔上面,加上一個(gè)可以進(jìn)行識別的東西(暫定為條形碼),然后對這個(gè)文檔的掃描件進(jìn)行識別。初步確定就是修改原有的jasper資源文件,并在打印方法中加入一個(gè)對條形碼的field引用,這樣來完成在文檔上打印條形碼的需求。

 

    但后面這一需要進(jìn)一步修正,因?yàn)橐獙呙杓4嫒霐?shù)據(jù)庫中,這時(shí)就想到如果不通過掃描設(shè)備,而直接將jasper在客戶端調(diào)出打印的時(shí)候,由服務(wù)器端生成一個(gè)jasper圖像,再將這個(gè)圖像直接入庫。這樣就避免了二次掃描的麻煩。

 

    在網(wǎng)上google了一下關(guān)于jasperReport的應(yīng)用,發(fā)現(xiàn)大部分都是講如何將jasper導(dǎo)入一個(gè)html或pdf進(jìn)行打印的例子,并沒有直接將jasperReport打印生成一個(gè)圖像的示例。包括jaspe自帶的demo里面,也沒有相應(yīng)的例子,決定自己看看相應(yīng)的api,找一個(gè)可以運(yùn)用的東西。

 

    產(chǎn)生想到的是jasper自帶的ImageServlet這個(gè)類,認(rèn)為可以從這個(gè)類方法中找到一些可以參考的東西??上⒋a粗略看一道,就失望了。這個(gè)類不是將一個(gè)jasper輸出一個(gè)圖像文件,而是輸出一個(gè)jasper文件中指定圖像名稱中的圖像信息。也就是說,這個(gè)類根本不能將一個(gè)jasper完整輸出成一個(gè)圖像的byte[]數(shù)組??赐赀@個(gè)類,我還真不知道這個(gè)類有什么樣,至少現(xiàn)在我不看好這個(gè)類。

 

    接到就找export包中的相應(yīng)類,看能否找到一個(gè)根圖像有關(guān)的exporter,最后找到這樣一個(gè)類:JRGraphics2DExporter.java,從文檔可以看出,它可以完整的將一個(gè)jasper文檔輸出到一個(gè)graphics對象中,而不像其他的exporter只是近似的模擬。但是這個(gè)文檔同時(shí)也說明,它只是輸出到graphics對象,而不是輸出到一個(gè)文件或字節(jié)流中。當(dāng)然這不是問題,我們可以創(chuàng)建一個(gè)可以產(chǎn)生graphics的對象(比如說bufferedimage),然后用g進(jìn)行export,當(dāng)然最后的信息就保存在擁有g(shù)的對象上了。接下來的操作就簡單了。

如下代碼所示:

Java代碼  收藏代碼
  1. Map parameters = new HashMap();  
  2. JasperPrint jasperPrint =  
  3.         JasperFillManager.fillReport(  
  4.                 (JasperReport) JRLoader.loadObject(new File("d:/injuryPresume.jasper")),//jasper對象  
  5.                 parameters,//參數(shù)列表  
  6.                 new JREmptyDataSource()//數(shù)據(jù)源信息  
  7.         );  
  8. JRGraphics2DExporter exporter = new JRGraphics2DExporter();//創(chuàng)建graphics輸出器  
  9. //創(chuàng)建一個(gè)影像對象  
  10. BufferedImage bufferedImage = new BufferedImage(jasperPrint.getPageWidth() * 4, jasperPrint.getPageHeight() * 4, BufferedImage.TYPE_INT_RGB);  
  11. //取graphics  
  12. Graphics2D g = (Graphics2D) bufferedImage.getGraphics();  
  13. //設(shè)置相應(yīng)參數(shù)信息  
  14. exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, g);  
  15. exporter.setParameter(JRGraphics2DExporterParameter.ZOOM_RATIO, Float.valueOf(4));  
  16. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
  17. exporter.exportReport();  
  18. g.dispose();//釋放資源信息  
  19. //這里的bufferedImage就是最終的影像圖像信息,可以通過這個(gè)對象導(dǎo)入到cm中了.  
  20. ImageIO.write(bufferedImage, "JPEG"new File("d:/aa.jpg"));  

 

    由上可以看出,和普通的htmlexporter一樣,產(chǎn)生創(chuàng)建jasperRecport對象,然后進(jìn)行填充,接下來就是export了。

 

    Export操作產(chǎn)生創(chuàng)建一個(gè)用于圖像export的graphics2dExporter對象,然后從bufferedImage中取出g,接著將g,jasperPrint以及其他參數(shù)設(shè)置到exporter上,調(diào)用exportReport進(jìn)行導(dǎo)出,最后釋放g,使之生成圖像。

 

    同時(shí),從上可以看出,要創(chuàng)建一個(gè)指定大小的bufferedImage,以便與jasper的大小相一致,幸好japserPrint有一個(gè)取自己width和height的方法,我們直接創(chuàng)建一個(gè)和jasperPrint一樣大小的圖像就可以了。而原代碼中,創(chuàng)建的圖像大小是原大小的4倍,這是為了讓圖像盡量大一些,這樣進(jìn)行圖像識別時(shí),能夠進(jìn)行有效地識別(比如識別圖像中的條形碼時(shí),如果圖像太小,間隔不夠,是讀取不了的)。當(dāng)然圖像大小變大之后,需要調(diào)整生成時(shí)間的比例大小,通過為JRGraphics2DExporterParameter.ZOOM_RATIO設(shè)置一個(gè)float比例值(和圖像比例一致),這樣就可以在生成時(shí)生成相應(yīng)比例的圖像了(而且生成的圖像不是直接在原有大小的基礎(chǔ)之上進(jìn)行縮放,而是像矢量圖一樣按精確像素進(jìn)行比例重繪)。

 

    我發(fā)現(xiàn)自己在網(wǎng)上找答案的時(shí)候遠(yuǎn)遠(yuǎn)多于去自己思考的時(shí)間,而且網(wǎng)上的許多東西都是重復(fù)的,想找到需要的信息還真困難。遇到問題時(shí),如果自己想想能不能很好的解決,為什么非得在網(wǎng)上找呢。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多