JMeter中如何使用JSR223 PostProcessor保存变量值到PDF文件
JMeter通过JSR223 PostProcessor将变量值写入PDF实现方案
前置准备
- 准备PDF生成依赖包(以常用的iText 5.x系列为例),将对应的核心jar包放入JMeter安装路径下的
/lib目录,完成后重启JMeter让依赖生效 - 提前通过正则提取、JSON提取、XPath提取等方式完成
data变量的提取,可先添加Debug Sampler验证变量能正常取值,不存在空值、取值错误问题
组件配置步骤
- 在需要提取
data变量的采样器(如HTTP请求)上右键,依次选择「后置处理器」→「JSR223 PostProcessor」添加组件 - 在组件配置页的
Language下拉菜单中选择Groovy,该语言为JMeter官方推荐脚本选项,编译缓存机制下性能远高于Beanshell、JavaScript等其他脚本语言 - 将下方提供的Groovy代码粘贴到脚本输入框中,按需调整PDF存储路径、写入模式等参数即可运行
可直接运行的脚本代码
// 导入PDF操作所需核心类 import com.itextpdf.text.Document import com.itextpdf.text.Paragraph import com.itextpdf.text.pdf.PdfWriter import java.io.FileOutputStream // 通过JMeter内置vars对象获取待写入的变量值,不要直接在脚本中硬编码${data}占位符,避免影响Groovy编译缓存性能 String saveContent = vars.get("data") // 空值校验,避免空指针异常 if (saveContent == null || saveContent.trim().isEmpty()) { log.warn("待写入PDF的data变量为空,跳过本次写入操作") return } // 定义PDF输出路径,默认存储在JMeter启动目录(bin文件夹)下,可替换为自定义绝对路径 String pdfSavePath = "jmeter_extract_result.pdf" // 加类锁避免并发场景下多线程同时写入文件,导致文件损坏、内容乱序 synchronized (this.class) { Document pdfDoc = new Document() try { // FileOutputStream第二个参数为true代表追加写入,false代表每次运行覆盖原有文件,可按需调整 PdfWriter.getInstance(pdfDoc, new FileOutputStream(pdfSavePath, true)) pdfDoc.open() // 将内容写入PDF段落,可自行扩展设置字体、字号、页边距等格式 pdfDoc.add(new Paragraph(saveContent)) } catch (Exception e) { log.error("写入PDF文件发生异常", e) } finally { // 必须关闭文档释放文件资源 if (pdfDoc.isOpen()) { pdfDoc.close() } } }
注意事项
- 依赖适配:如果使用iText 7及以上版本,包名、类名会有调整,对应修改import导入路径即可
- 中文乱码处理:如果
data变量包含中文内容,需要额外引入支持中文的字体文件,在创建段落时指定对应字体,否则PDF中会显示乱码方块 - 路径规则:配置自定义存储路径时,Windows系统需要对路径分隔符做转义,例如
D:\\test_result\\output.pdf;Linux、Mac系统直接使用正常路径即可,例如/Users/xxx/jmeter/result.pdf - 性能优化:脚本中统一使用
vars.get("变量名")的方式获取JMeter变量,不要直接在Groovy代码中写${变量名}占位符,否则会破坏Groovy的编译缓存机制,大幅降低高并发场景下的脚本执行效率
内容的提问来源于stack exchange,提问作者Pratik Dey
相关产品推荐
相关产品推荐

