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

使用JMeter保存PDF内容至另一PDF时出现空文件问题

问题分析与解决方案

原代码存在的错误

  • 变量名拼写错误:new String(extarctdata)中的extarctdata是笔误,正确变量名应为extractdata,该错误会导致变量赋值失败,最终${extractdata}为空。
  • 二进制数据错误转字符串:PDF属于二进制文件,直接将字节数组转换为String会破坏二进制结构(字符编码转换会丢失或篡改二进制信息),写回文件时内容已损坏,无法被PDF阅读器识别。
  • Windows路径未转义:Windows路径中的\需要转义为\\,否则C:\Users\...中的\U会被解析为无效转义字符,导致无法读取原PDF文件,最终生成空文件。
  • 未处理IO异常:代码未捕获文件读写时的IOException,若文件不存在、路径错误或权限不足,会直接导致采样器执行失败。

修正后的代码

1. Beanshell采样器代码

import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

try {
    // 修正路径转义,使用双反斜杠
    FileInputStream in = new FileInputStream("C:\\Users\\Dey\\Downloads\\sample.pdf");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int i;
    while ((i = in.read(buffer)) != -1) {
        bos.write(buffer, 0, i);
    }
    // 规范关闭流顺序
    bos.close();
    in.close();
    
    byte[] extractdata = bos.toByteArray();
    // 使用putObject存储二进制字节数组,避免转字符串丢失数据
    vars.putObject("extractdata", extractdata);
} catch (IOException e) {
    // 打印异常便于排查问题
    log.error("读取PDF文件失败: " + e.getMessage(), e);
    throw e; // 抛出异常标记采样器执行失败
}

2. Beanshell后置处理器代码

import java.io.FileOutputStream;
import java.io.IOException;

try {
    // 从JMeter变量中获取二进制字节数组
    byte[] extractdata = (byte[]) vars.getObject("extractdata");
    if (extractdata != null && extractdata.length > 0) {
        FileOutputStream out = new FileOutputStream("C:\\Users\\Dey\\Downloads\\output.pdf");
        out.write(extractdata);
        out.close();
    } else {
        log.warn("未获取到有效的PDF二进制数据");
    }
} catch (IOException e) {
    log.error("写入PDF文件失败: " + e.getMessage(), e);
    throw e;
}

额外说明

  • 若使用JMeter 3.1及以上版本,推荐用JSR223采样器/后置处理器替代Beanshell,JSR223支持Groovy语言,性能更高且语法更简洁。
  • 确保原PDF文件路径正确,且JMeter具备读取原文件、写入目标路径的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:24:14