从服务器响应设置内容后损坏的 Pdf

Damaged Pdf after setting content from a server response

我目前正在对服务器进行休息调用以签署 pdf 文档。

我正在发送 pdf(二进制内容)并检索已签名 pdf 的二进制内容。 当我从输入流中获取二进制内容时:

    try (InputStream inputStream = conn.getInputStream()) {
        if (inputStream != null) {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
                String lines;
                while ((lines = br.readLine()) != null) {
                    output += lines;
                }
            }
        }
    }

signedPdf.setBinaryContent(output.getBytes());

(signedPdf 是一个带 byte[] 属性的 DTO) 但是当我尝试使用响应 pdf 的内容设置 pdf 的内容时:

ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(signedPdf);
pdf.setContent(signedPdf);

打开试试,说是pdf损坏,无法修复

有人遇到过类似的情况吗?我是否还需要为输出流设置内容长度?

PDF 是二进制数据。当阅读为 text(在 Java 中始终是 Unicode)时,PDF 会损坏。 这也是一种浪费:一个字节作为 char 会使内存使用量加倍,并且 有两种转换:使用某种编码从字节到字符串,反之亦然。 从 UTF-8 转换时甚至可能会出现 UTF-8 格式错误。

try (InputStream inputStream = conn.getInputStream()) {
    if (inputStream != null) {
        byte[] content = inputStream.readAllBytes();
        signedPdf.setBinaryContent(content);
    }
}

是否使用 BufferedInputStream 取决于预期的 PDF 大小等。

此外 new String(byte[], Charset)String.getBytes(Charset) 显式 Charset(如 StandardCharsets.UTF_8)优于默认的 Charset 重载版本。那些使用当前平台编码,因此提供 non-portable 代码。在另一个 platform/computer.

上表现不同