gpt4 book ai didi

java - 如何从 iText PDFReader 获取字节数组

转载 作者:行者123 更新时间:2023-11-30 06:20:34 31 4
gpt4 key购买 nike

如何从 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);
}
}

从上面的代码中,我需要从读取器对象中获取字节数组。怎么办?

1) 不工作,字节数组为空。

OutputStream out = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, out);
stamper.close();

byte byteArray[] = (((ByteArrayOutputStream)out).toByteArray());

2) 不工作,得到 java.io.IOException: Error: Header doesn't contain 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 获取字节数组。

最佳答案

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

如果您想从 PDF 中呈现单独的页面,您需要将文档突发成单独的单页完整 PDF 文档。这些单页文档需要包含呈现页面所需的所有信息。这对内存不友好:假设您有 10 页的 100 KB 文档,其中每一页都显示一个 80 KB 的 Logo ,您最终将得到 10 个文档,每个文档至少 80 KB(乘以 10 已经 800 KB,这远远超过 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 文件的字节。在您的任何尝试中都不是这种情况。

关于java - 如何从 iText PDFReader 获取字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21608598/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com