如何从iText PDFReader获取字节数组

如何从Itext PDFReader获取字节数组。

float width = 8.5f * 72; float height = 11f * 72; float tolerance = 1f; PdfReader reader = new PdfReader("source.pdf"); for (int i = 1; i  tolerance || Math.abs(heightToAdd) > tolerance) { float[] newBoxValues = new float[] { cropBox.getLeft() - widthToAdd / 2, cropBox.getBottom() - heightToAdd / 2, cropBox.getRight() + widthToAdd / 2, cropBox.getTop() + heightToAdd / 2 }; PdfArray newBox = new PdfArray(newBoxValues); PdfDictionary pageDict = reader.getPageN(i); pageDict.put(PdfName.CROPBOX, newBox); pageDict.put(PdfName.MEDIABOX, newBox); } } 

从上面的代码我需要从reader对象获取字节数组。 怎么样?

1)不工作,得到空byteArray。

 OutputStream out = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, out); stamper.close(); byte byteArray[] = (((ByteArrayOutputStream)out).toByteArray()); 

2)不工作,得到java.io.IOException:错误:Header不包含versioninfo

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); for (int i = 1; i <= reader.getNumberOfPages(); i++) { outputStream.write(reader.getPageContent(i)); } PDDocument pdDocument = new PDDocument().load(outputStream.toByteArray( );) 

有没有其他方法从PDFReader获取字节数组。

 PdfReader reader = new PdfReader("source.pdf"); byte byteArray[] = reader.getPageContent(1); // page 1 

另请看这个链接

让我们从不同的角度来看问题。 在我看来,您希望逐页呈现PDF。 如果是这样,那么你的问题就错了。 提取页面内容流是不够的,因为我已经指出:没有一个渲染器能够渲染这样的流,因为你没有传递任何资源,如字体,Form和Image XObjects,……

如果要从PDF呈现单独的页面,则需要将文档分成单独的单页完整PDF文档。 这些单页文档需要包含呈现页面所需的所有信息。 这不是内存友好的:假设你有一个10页的100 KB文档,其中每个页面显示一个80 KB的标识,你最终将得到10个文件,每个文件至少80 KByte(10个文件已经是800 KByte,不仅仅是10页的文档,其中10页共享一个Image XObject)。

你需要做这样的事情:

 PdfReader reader = new PdfReader("source.pdf"); int n = reader.getNumberOfPages(); reader close(); ByteArrayOutputStream boas; PdfStamper stamper; for (int i = 0; i < n; ) { reader = new PdfReader("source.pdf"); reader.selectPages(String.valueOf(++i)); baos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, baos); stamper.close(); doSomethingWithBytes(baos.toByteArray); } 

在这种情况下, baos.toByteArray()将包含有效PDF文件的字节。 在你的任何(尴尬)尝试中都不是这种情况。