0

我有以下任务从 URL 获取 PDF 并返回 BASE64 字符串。

我目前拥有的(对不起,我不是 Java 专家):

public String readPDFSOAP(String var, Container container) throws StreamTransformationException{
try {
        //get the url page from the arguments array
        URL url = new URL("URLPDF");
        try {
            //get input Stream from URL
                            InputStream in = new BufferedInputStream(url.openStream());
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buf = new byte[131072];
            int n = 0;
            while (-1 != (n = in.read(buf))) {
                out.write(buf, 0, n);
            }
            out.close();
            in.close();
            byte[] response = out.toByteArray();
                            String string = new String(response);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }return String;}

但是无法返回字符串。任何帮助表示赞赏。

谢谢,朱利安

4

2 回答 2

0

使用java.util.Base64

PDF 可能非常大。直接对 InputStream 进行编码,而不是将其读入内存:

ByteArrayOutputStream out = new ByteArrayOutputStream();

try (InputStream in = new BufferedInputStream(url.openStream())) {
    in.transferTo(Base64.getEncoder().wrap(out));
}

String base64 = out.toString(StandardCharsets.US_ASCII);

Base64 编码的版本比原始文件还要大。我不知道您打算如何处理编码版本,但如果您打算将其写入某个地方,您希望避免将文件的任何版本(原始版本或编码版本)保留在内存中。您可以通过让您的方法接受 OutputStream 作为参数来做到这一点:

public void readPDFSOAP(OutputStream destination,
                        String var,
                        Container container)
throws StreamTransformationException,
       IOException {

    URL url = new URL("https://example.com/doc.pdf");
    try (InputStream in = new BufferedInputStream(url.openStream())) {
        in.transferTo(Base64.getEncoder().wrap(destination));
    }
}

更新:

既然您说过您不能使用 try-with-resources 语句:

try-with-resources 语句只是保证 InputStream(或其他可关闭资源)关闭的便捷方式。这个:

try (InputStream in = new BufferedInputStream(url.openStream())) {
    // code that uses 'in'
}

(几乎)等同于:

InputStream in = null;

try {
    in = new BufferedInputStream(url.openStream());
    // code that uses 'in'
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException e) {
            // Suppress
        }
    }
}
于 2021-07-20T16:27:09.923 回答
0

你的代码有各种各样的错误。对于初学者,使用 Base64 类来处理字节数组的编码。并且无需将其分配给变量,只需将其返回即可。

return Base64.getEncoder().encodeToString(response)

在你的最后一行,在你的 try/catch 块之外,抛出一个异常。如果您到达那里,那么您将无法正确检索和编码响应,因此无需返回值。您处于错误状态。

于 2021-07-20T14:28:42.603 回答