1。簡介
在實踐中,我們看到以某種格式統計和匯出資料的請求是很常見的。例如,我們收到匯出客戶統計報告、銷售發票、採購發票等的請求,這需要人們(尤其是程式設計師)建立軟體,您可以根據每個具體情況和要求靈活建立匯出資料的範本。你可能立刻想到的解決方案是使用Word、Excel…,但這個解決方案不適合大量不斷變化、短時間內發展的數據,同時還需要支付軟體費用和數據處理時間不是最佳的。
目前有一個相當流行的解決方案——許多程式設計師都喜歡使用的JasperReports庫。
特別是,這個庫是開源的,並且有免費版本。您可以存取其原始程式碼:https://github.com/TIBCOSoftware/jasperreports
2。使用說明
關於如何使用這個庫網上有很多說明,這裡就不詳細寫了
如果您使用 Eclipse,JasperReports 有一個額外的外掛程式可以幫助您建立報告範本。
在這篇文章中,我將指導您在IntelliJ IDEA上使用它,庫管理器是maven。
首先,您需要一個範本來填寫資料(如訂單、發票等)。為此,請下載並安裝 Jaspersoft Studio 軟體(最新的社群版本連結目前為 https://community.jaspersoft.com/files/file/19-jaspersoft®-studio-community-edition /?do=getNewComment)。
安裝開啟後,軟體會有以下介面:
要建立新模板,請前往檔案 ->新->賈斯珀報告。在「全部」部分中,選擇「空白 A4」(或您喜歡的其他範本:>)。
按一下“下一步”,指定檔案的儲存位置。點選下一步->下一步->結束。出現的新介面是模板介面,您可以根據自己的模板自由設計。
右邊是函式庫支援的物件。
假設我必須建立一個帶有標題和商品名稱的簡單購買發票表格。我將“靜態文字”物件拖放到範本中,並輸入名稱“採購發票”(您可以在螢幕右上角自行調整格式)。
接下來,我再拖曳 2 個類似的對象,但將物品類別設定在「書籍」和「鋼筆」下方。
接下來我必須加入這 2 件商品的價格。這個值是動態的,所以我必須在這裡包含一個變數(這也是這個庫的一個非常有趣和靈活的功能)。在大綱部分、參數部分中,右鍵點選並選擇「建立參數」。然後我在右角視窗修改了這個變數的值,變數名為book,資料型別為實數。
然後我將其拖曳到「Book」標籤旁。與變數“筆”和總量相同。這裡你可以分配的總金額等於變數「book」和「pen」的總和。
完成模板後,它會是這樣的
您切換到來源選項卡,這是系統將處理的資料。基本上,Jasper Report 將以類似於 XML 的文件格式接收輸入數據,但標籤名稱將由庫預先定義。例如,整個檔案的超類別的開始和結束標記必須是「jasperReport」標記。以下是一些必須注意的模板符號:
- 「$P{}」:動態加入報表中的數據,可以是鍵值對,可以是資料來源。
- 「$F{}」:從資料來源新增至報表的複雜資料欄位。
- “$V{}”:根據現有表達式自動產生資料或手動新增資料。 …… 您可以參考更多資訊(https://www.tutorialspoint.com/jasper_reports/jasper_report_expression.htm)
完成後,您可以開始將此文件複製到您的專案中以填充資料並進行處理。
然後繼續導入以下庫:
<dependency> <groupid>net.sf.jasperreports</groupid> <artifactid>jasperreports</artifactid> <version>6.21.0</version> </dependency> <dependency> <groupid>net.sf.jasperreports</groupid> <artifactid>jasperreports-fonts</artifactid> <version>6.21.0</version> </dependency>
繼續編寫程式碼匯入檔案並填入資料。
final String outputFilename = "report.pdf"; Files.deleteIfExists(new File(outputFilename).toPath()); InputStream inputStream = Main.class.getResourceAsStream("/report.jrxml"); Map<string object> parameters = new HashMap(); parameters.put("book", 55000); parameters.put("pen", 11111.1111); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource()); JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename); </string>
這裡,因為我們直接填充,所以可以使用Map類別。如果你想從資料來源(Database,...)填入數據,可以參考(https://www.baeldung.com/spring-jasper)。
結果如下
3。安全編程
因為在渲染這個模板的過程中,庫也會執行其中的函數,所以如果使用者可以自訂模板標籤,攻擊者就會添加可以執行命令的惡意標籤。此錯誤與 SSTI 非常相似。
假設允許使用者直接編輯模板。原始碼如下:
final String outputFilename = "out.pdf"; Files.deleteIfExists(new File(outputFilename).toPath()); String input = ""; String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jasperreport xmlns='\"http://jasperreports.sourceforge.net/jasperreports\"' xmlns:xsi='\"http://www.w3.org/2001/XMLSchema-instance\"' xsi:schemalocation='\"http://jasperreports.sourceforge.net/jasperreports' http: name='\"z\"' pagewidth='\"500\"' pageheight='\"1200\"' columnwidth='\"270\"'>\n" + input + "</jasperreport>"; InputStream inputStream = new ByteArrayInputStream(template.getBytes()); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource()); JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);
攻擊者填入惡意函數來控制系統:
字串輸入=“ <p>結果,命令被執行。文件「out.pdf」包含以下內容:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173597147572303.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Giới thiệu căn bản về thư viện JasperReports"></p> <p>所以程式設計師也必須小心,不要讓使用者直接在模板中輸入內容。 <br> 另外,該程式庫在舊版中也存在漏洞(<em>CVE-2018-18809、CVE-2022-42889</em>、...),程式設計時應注意使用最新版本並更新。定期。 </p>
以上是JasperReports庫的基本介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

云计算显著提升了Java的平台独立性。1)Java代码编译为字节码,由JVM在不同操作系统上执行,确保跨平台运行。2)使用Docker和Kubernetes部署Java应用,提高可移植性和可扩展性。

Java'splatformindependenceallowsdeveloperstowritecodeonceandrunitonanydeviceorOSwithaJVM.Thisisachievedthroughcompilingtobytecode,whichtheJVMinterpretsorcompilesatruntime.ThisfeaturehassignificantlyboostedJava'sadoptionduetocross-platformdeployment,s

容器化技術如Docker增強而非替代Java的平台獨立性。 1)確保跨環境的一致性,2)管理依賴性,包括特定JVM版本,3)簡化部署過程,使Java應用更具適應性和易管理性。

JRE是Java應用程序運行的環境,其作用是讓Java程序在不同操作系統上運行無需重新編譯。 JRE的工作原理包括JVM執行字節碼、類庫提供預定義類和方法、配置文件和資源文件設置運行環境。

JVM通過自動內存管理和垃圾回收確保Java程序高效運行。 1)內存分配:為新對像在堆中分配內存。 2)引用計數:跟踪對象引用,檢測垃圾。 3)垃圾回收:使用標記-清除、標記-整理或複制算法回收不再引用的對象。

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6
視覺化網頁開發工具