关于java:使用Streams生成PDF

Generate a PDF using Streams

本问题已经有最佳答案,请猛点这里访问。

我正试图将一个输入流转换成一个字节数组,并将其写入一个文件中,以生成一个PDF。

我有一个文件类型和一个pdf的URL,有了它,我就有了它的输入流。

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

在这里一切都完美无缺之前,当我尝试将此输入流转换为byte[]并将其写入新文件时,问题就会出现。我有两种方法:

要将流转换为字节[]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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+"
"
);
        }

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

    return sb.toString().getBytes();

}

要将字节[]写入新文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
...

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的代码进行了比较,并且有点不同。

我需要从输入流创建一个有效的PDF文件。


您有两个问题:

  • 您试图将字节作为字符串读取,但不必这样做。在这种情况下,您应该使用字节流(fileinputstream、bufferedinputstream),而不是char流(inputstreamreader、bufferedreader)。

  • 当您将字符串转换为字节时,将在此处释放数据:返回sb.toString().getBytes();

  • 我建议您使用Java 7尝试资源,而不是尝试catch。可以使用bytearrayOutputstream将整个文件读取到字节数组。

    示例代码执行以下操作:

  • getarrayFromInputStream()-将所有文件字节读取到字节数组

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

  • 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class ReadAllBytes {

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

    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();
        }
    }
    }