0

问题:

在开发用于将多个 pdf 流合并到单个输出流的实用程序时,我在从输入流列表中读取数据时遇到SocketException ,即在这一行[ byte[] bytes = toByteArray(input) ]。这会导致仅来自某些输入流的数据被合并到单个 pdf 中,而少数引发异常的输入流不会被合并。

注意:下面代码中 inputStreamList 中的输入流是通过在各种 URL 上调用 openStream() 方法创建的。

此错误有时仅在少数环境而不是所有环境中发生。这些环境托管在不同的服务器上。

代码块:

public void doMergeIntoFile(List<InputStream> inputStreamList, final String fileName) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PDFMergerUtility merger = new PDFMergerUtility();
        merger.setDestinationStream(outputStream);
        merger.setDocumentMergeMode(OPTIMIZE_RESOURCES_MODE);
        for (InputStream input : inputStreamList) {
            try {
                byte[] bytes = toByteArray(input); // gives Socket exception sometimes
                PDDocument.load(bytes).close();
                merger.addSource(new ByteArrayInputStream(bytes));
            } catch (IOException ioExcep) {
                log.error("An exception was encountered while parsing input stream : {0}", ioExcep);
                continue;
            }
        }
        merger.mergeDocuments(setupMainMemoryOnly());
        outputStream.flush();
        outputStream.close();
        generatePdf(outputStream.toByteArray(), fileName);
    }
}

异常消息:

ERROR [origo.bimta.web.action.pdf.PDFAction] (default task-27) An exception was encountered while parsing input stream : {0}: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at sun.net.www.MeteredStream.read(MeteredStream.java:134)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3393)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3386)
    at com.google.common.io.ByteStreams.copy(ByteStreams.java:207)
    at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:252)
    at origo.bimta.web.action.pdf.PDFAction.doMergeIntoFile(PDFAction.java:482)

请求解决方案:

任何人都可以提出解决此问题的方法,以便可以防止此套接字异常,或者可以成功读取输入流列表中的所有输入流并最终成功合并到单个 pdf 中的方法?

4

1 回答 1

0

为什么要转换为字节数组?您应该直接使用 inputstream。

for (InputStream input : inputStreamList) {
            try {
                merger.addSource(input);
            } catch (IOException ioExcep) {
                log.error("An exception was encountered while parsing input stream : {0}", ioExcep);
            }
        }
于 2020-05-19T04:32:04.643 回答