使用流生成PDF

时间:2018-09-27 14:25:10

标签: java spring pdf inputstream

我正在尝试将InputStream转换为字节数组以将其写入文件中,以生成PDF。

我有一个带有PDF网址的File类型,有了它,我有了那个的inputStream。

File fichero_pdf = new File("C:/Users/agp2/Desktop/PDF_TRIAXE.pdf");
InputStream stream4 = new FileInputStream(fichero_pdf);

直到这里一切都完美,当我尝试将此InputStream转换为byte []并将其写入新文件时,问题出现了。 我有以下两种方法:

将流转换为字节[]:

private static byte[] getArrayFromInputStream(InputStream is) {

    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();


    String line;
    try {

        br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
            sb.append(line+"\n");
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return sb.toString().getBytes();

}

要在新文件中写入byte []:

...

File file=new File(dto.getTitulo());
  InputStream stream=dto.getContenido();      
               byte[] array=getStringFromInputStream(stream);
               OutputStream salida=new FileOutputStream(file);
               salida.write(array);
               salida.close();
               stream.close();
               helper.addAttachment(file.getName(), file);
           }
            mailSender.send(message);
...

电子邮件发送完美,但是当我无法打开.pdf时。 另外,我将新pdf的代码与第一个pdf的代码进行比较,并且有所不同。

我需要从inputStream创建有效的pdf文件。

1 个答案:

答案 0 :(得分:0)

您有2个问题:

  1. 您正在尝试将字节读取为字符串,但是不必这样做。在您的情况下,应该使用字节流(FileInputStream,BufferedInputStream),而不是字符流(InputStreamReader,BufferedReader)。

  2. 在此处将String转换为字节时,会丢失数据: 返回sb.toString()。getBytes();

我建议您使用Java 7 try-with-resources而不是try-catch-finally。 您可以使用ByteArrayOutputStream将整个文件读取为字节数组。

示例代码执行以下操作:

  1. getArrayFromInputStream()-将所有文件字节读取到字节数组

  2. writeContent()-将内容写入新文件,在我的示例中为pdf_sample2.pdf

示例:

public class ReadAllBytes {

// as example - write to resources folder
private static String DIR = "src\\main\\resources\\";

public static void main(String[] args) throws IOException {
    try {
        byte[] fileAsBytes = getArrayFromInputStream(new FileInputStream(new File(DIR + "pdf-sample.pdf")));
        writeContent(fileAsBytes, DIR + "pdf_sample2.pdf");
    } catch (Exception e){
        e.printStackTrace();
    }
}

private static byte[] getArrayFromInputStream(InputStream inputStream) throws IOException {
    byte[] bytes;
    byte[] buffer = new byte[1024];
    try(BufferedInputStream is = new BufferedInputStream(inputStream)){
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int length;
        while ((length = is.read(buffer)) > -1 ) {
            bos.write(buffer, 0, length);
        }
        bos.flush();
        bytes = bos.toByteArray();
    }
    return bytes;
}

private static void writeContent(byte[] content, String fileToWriteTo) throws IOException {
    File file = new File(fileToWriteTo);
    try(BufferedOutputStream salida = new BufferedOutputStream(new FileOutputStream(file))){
        salida.write(content);
        salida.flush();
    }
}
}