You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter中BeanShell处理PDF转换后生成文件空白问题求助

解决JMeter BeanShell处理PDF文件生成空白问题

问题根源:PDF属于二进制文件,直接将字节数组转换为String存储到JMeter变量会导致二进制数据损坏。String基于字符编码设计,无法完整保留所有二进制字节,写入时再还原会丢失关键数据,最终生成的PDF无法正常解析,显示空白。

修正方案

1. 修改BeanShell Sampler代码,保留二进制数据完整性

不要将字节数组转成String,改用vars.putObject()直接存储字节数组对象:

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

File file = new File("C:\\Users\\hp\\Downloads\\Instructions.pdf");
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int i;
while ((i = in.read(buffer)) != -1) {
    bos.write(buffer, 0, i);
}
in.close();
byte[] pdfdata = bos.toByteArray();
bos.close();
// 用putObject存储字节数组,避免字符串转换导致的数据损坏
vars.putObject("pdfdata", pdfdata);

2. 修改BeanShell PostProcessor代码,用二进制流写入文件

使用FileOutputStream(而非处理字符的FileWriter)写入二进制数据:

import java.io.FileOutputStream;

// 读取存储的字节数组对象
byte[] pdfBytes = (byte[]) vars.getObject("pdfdata");
FileOutputStream fos = new FileOutputStream("newresult1.pdf");
fos.write(pdfBytes);
fos.close();

额外说明

  • vars.putObject()支持存储任意Java对象,能完整保留二进制数据的原始状态
  • 写入二进制文件必须使用字节流(FileOutputStream),字符流(FileWriter)会破坏二进制格式
  • 移除原代码中的true参数,新生成PDF无需追加模式,避免重复写入导致文件损坏

内容的提问来源于stack exchange,提问作者Pratik Dey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:15:41