2015-02-07 3109 views
1

我想使用itext库从java servlet中返回一个来自pdf文件的页面(以减小文件大小的下载)。 使用此代码使用iText从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(); 
    } 

此代码返回的页面,但文件尺寸较大,有时等于原始文件的大小,即使它只是一个页面。

+0

也许你有一个大的字体或每个页面使用的大图像。在这种情况下,如果在100页中丢弃99个文件,则无关紧要:该页面仍然需要字体和图像,并且PDF文件的大小不会缩小。如果您想获得更有用的答案,您必须向我们提供有关PDF的性质的更多信息。 – 2015-02-07 12:58:45

+0

该文件的副本位于保管箱[文件链接](https://www.dropbox.com/sh/rjkw0uageilbjm0/AAAYRLUk0j0FIk0R3KLYH1Isa/1st%20and%202nd%20Year%20Materials/Anatomy/%D8%AE%D8%A7 %D9%84%D8%AF%20%D9%85%D9%8A%D9%84%D8%A7%D8%AF /%D8%A7%D9%84%D9%85%D9%86%D9% 87%D8%AC%20%D8%A7%D9%84%D9%86%D8%B8%D8%B1%D9%8A?dl = 0),大部分页面都是论文的图片。 – Ahmed 2015-02-07 13:47:32

+0

我已经下载了abdomen.pdf。这是一个只包含图像的PDF。你为什么不提取图像并提供服务?如果您可以提供单独的图像,为什么还需要单页PDF? – 2015-02-07 13:58:18

回答

4

我已经下载从你的库中的单个文件: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(); 
    } 
} 

要“爆发”是指将拆分单独的页面。虽然原文件Abdomen.pdf是72570 KB(约70.8 MB),单独的页面要小得多:

enter image description here

我无法重现您所描述的问题。

+0

但对于一些文件,如(简介2013 .pdf),生成的文件非常大,请参阅此链接(http://2-dot-sheet-s0.appspot.com/toimage?name=Introduction%202013.pdf&page=1)生成的文件大小约为12 MB等于pdf的大小。 – Ahmed 2015-02-07 14:36:20

+0

我不再在我的电脑上,而是在我的手机上。如果你想让我测试一个特定的文件,你应该这么说。这会让你在将来更加精确。 – 2015-02-07 14:51:22

+2

@Ahmed在文件*简介2013.pdf *你有同样的问题,在问题中讨论[itextsharp:拆分页面大小等于文件大小](http://stackoverflow.com/questions/15566896/itextsharp-splitted-pages -size-equals-file-size):所有页面共享一个*​​ Resources **字典,** 4 0 R **。因此,分割复制每个页面的所有资源。因此,在分割之前,您应该优化PDF以为每个页面提供单独的** Resources **字典,其中只包含实际在该页面上使用的资源,参见参考资料。我对这个问题的回答。 – mkl 2015-02-09 09:40:15