如何从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 <= reader.getNumberOfPages(); i++)
{
Rectangle cropBox = reader.getCropBox(i);
float widthToAdd = width - cropBox.getWidth();
float heightToAdd = height - cropBox.getHeight();
if (Math.abs(widthToAdd) > 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获取字节数组。
答案 0 :(得分:3)
让我们从不同的角度提出问题。在我看来,您希望逐页呈现PDF。如果是这样,那么你的问题就错了。提取页面内容流是不够的,因为我已经指出:没有一个渲染器能够渲染这样的流,因为你没有传递任何资源,如字体,Form和Image XObjects,......
如果要从PDF渲染单独的页面,则需要将文档拆分为单独的单页PDF文档。这些单页文档需要包含呈现页面所需的所有信息。这不是内存友好的:假设你有一个100页的10页文档,每页显示一个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文件的字节。在你的任何(尴尬)尝试中都不是这种情况。
答案 1 :(得分:2)
PdfReader reader = new PdfReader("source.pdf");
byte byteArray[] = reader.getPageContent(1); // page 1
另请查看此link