Java - получить PDF-файл из URL-адреса и вернуть строку BASE64

У меня есть следующая задача: получить PDF-файл по URL-адресу и вернуть строку 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;}

Но строка не может быть возвращена. Любая помощь приветствуется.

Спасибо, Джулиан

2 ответа

Ваш код ошибочен. Для начала используйте класс Base64 для обработки кодирования вашего байтового массива. И не нужно назначать его переменной, просто верните.

      return Base64.getEncoder().encodeToString(response)

и в вашей последней строке, за пределами вашего блока try/catch, просто вызовите исключение. Если вы попали туда, значит, вы не смогли правильно получить и закодировать ответ, поэтому возвращать значение не нужно. Вы в состоянии ошибки.

Используйте 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:

Примерочных с-ресурсы оператор просто удобный способ гарантировать 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
        }
    }
}
Другие вопросы по тегам