使用iText从pdf文件中提取一页

Ahm*_*med 2 java pdf google-app-engine itext

我想使用itext库从java servlet中返回pdf文件中的一页(以减少文件大小下载).使用此代码

     try {
        PdfReader reader = new PdfReader(input);
        Document document = new Document(reader.getPageSizeWithRotation(page_number) );


        PdfSmartCopy copy1 = new PdfSmartCopy(document, response.getOutputStream());
        copy1.setFullCompression();
        document.open();

        copy1.addPage(copy1.getImportedPage(reader, page_i) );
        copy1.freeReader(reader);
        reader.close();

        document.close();

    } catch (DocumentException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

此代码返回页面,但文件大小很大,有时等于原始文件大小,即使它只是一页.

Bru*_*gie 8

我从您的存储库下载了一个文件:Abdomen.pdf

然后,我使用以下代码"破解"PDF:

public static void main(String[] args) throws DocumentException, IOException {
    PdfReader reader = new PdfReader("resources/Abdomen.pdf");
    int n = reader.getNumberOfPages();
    reader.close();
    String path;
    PdfStamper stamper;
    for (int i = 1; i <= n; i++) {
        reader = new PdfReader("resources/abdomen.pdf");
        reader.selectPages(String.valueOf(i));
        path = String.format("results/abdomen/p-%s.pdf", i);
        stamper = new PdfStamper(reader,new FileOutputStream(path));
        stamper.close();
        reader.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

"爆发"意味着在单独的页面中分割.虽然原始文件Abdomen.pdf是72,570 KB(大约70.8 MB),但单独的页面要小得多:

在此输入图像描述

我无法重现你描述的问题.

  • @Ahmed在文件*Introduction 2013.pdf*中遇到的问题与问题[itextsharp:拆分页面大小等于文件大小]中讨论的问题相同(http://stackoverflow.com/questions/15566896/itextsharp-splitted-pages- size-equals-file-size):在你的情况下,所有页面共享一个*​​资源**字典,**4 0 R**.因此,拆分会复制每个页面的所有资源.因此,在拆分之前,您应该优化PDF以使每个页面具有单独的**Resources**词典,这些词典仅包含该页面上实际使用的资源,参见 我对另一个问题的回答. (2认同)