如何从iText PDFReader获取字节数组

时间:2014-02-06 16:32:52

标签: java itext

如何从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获取字节数组。

2 个答案:

答案 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