簡體   English   中英

如何從 iText PDFReader 獲取字節數組

[英]How to get byte array from 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 <= 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) 不工作,得到空的 byteArray。

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

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

2) 不工作,得到 java.io.IOException: Error: 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 獲取字節數組。

讓我們換個角度來回答這個問題。 在我看來,您想逐頁呈現 PDF。 如果是這樣,那么你的問題都是錯誤的。 正如我已經指出的那樣,提取頁面內容流是不夠的:沒有一個渲染器能夠渲染這樣的流,因為您沒有傳遞任何資源,例如字體、表單和圖像 XObjects,...

如果你想呈現從PDF單獨的頁面,您需要將文檔沖進獨立的單頁全面的PDF文檔。 這些單頁文檔需要包含呈現頁面所需的所有信息。 這不是內存友好的:假設您有一個 100 KB 的 10 頁文檔,其中每頁顯示一個 80 KB 徽標,您最終會得到 10 個文檔,每個文檔至少為 80 KB(乘以 10 已經是 800 KB遠遠超過 10 頁文檔,其中單個 Image XObject 由 10 頁共享)。

你需要做這樣的事情:

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 文件的字節。 在您的任何嘗試中都不是這種情況。

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

也看看這個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM