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