【问题标题】:iText: split a PDF into several PDF (1 per page)iText:将 PDF 拆分为多个 PDF(每页 1 个)
【发布时间】:2011-04-20 21:10:29
【问题描述】:

我想要的是:给定一个 10 页的 pdf 文件,我想在网络上的表格中显示该 pdf 的每一页。实现这一目标的最佳方法是什么?我想一种方法是将这个 10-pages-pdf-file 拆分为 10 个 1-pages pdf,并以编程方式将每个 pdf 显示到表格的一行上。我可以用 iText 做到这一点吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: java itext


    【解决方案1】:

    使用PDDocument,您可以非常轻松地做到这一点。

    您只需要使用PDDocument 类型的Java List 和Splitter 函数来拆分文档。

    List<PDDocument> Pages=new ArrayList<PDDocument>();
    PDDocument.load(filePath);
    try {
        Splitter splitter = new Splitter(); 
        Pages = splitter.split(document);
    }
    catch(Exception e) {
        e.printStackTrace(); // print reason and line number where error exist
    }
    

    【讨论】:

    • 问题是关于使用 iText 的解决方案。如果您真的想使用不同的 pdf 库添加解决方案,您至少应该提及这一点。此外,这个答案基本上重复了你对这个问题的其他答案。
    • 是的,如果您想查看 .我已经提到可以使用 PDDocument 来实现。我不明白你想说什么。关于重复的答案,我试图纠正以前的答案。
    • “我已经提到可以使用 PDDocument 来实现” - 是的。但并不是每个人都知道该类是另一个库 PDFBox 的一部分,并在 itext 中搜索该类(因为问题是关于 itext)。
    【解决方案2】:

    来自Split a PDF file (using iText)

    import java.io.FileOutputStream;
    
    import com.lowagie.text.Document;
    import com.lowagie.text.pdf.PdfCopy;
    import com.lowagie.text.pdf.PdfImportedPage;
    import com.lowagie.text.pdf.PdfReader;
    
    public class SplitPDFFile {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            try {
                String inFile = args[0].toLowerCase();
                System.out.println ("Reading " + inFile);
                PdfReader reader = new PdfReader(inFile);
                int n = reader.getNumberOfPages();
                System.out.println ("Number of pages : " + n);
                int i = 0;            
                while ( i < n ) {
                    String outFile = inFile.substring(0, inFile.indexOf(".pdf")) 
                        + "-" + String.format("%03d", i + 1) + ".pdf"; 
                    System.out.println ("Writing " + outFile);
                    Document document = new Document(reader.getPageSizeWithRotation(1));
                    PdfCopy writer = new PdfCopy(document, new FileOutputStream(outFile));
                    document.open();
                    PdfImportedPage page = writer.getImportedPage(reader, ++i);
                    writer.addPage(page);
                    document.close();
                    writer.close();
                }
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
    
            /* example : 
                java SplitPDFFile d:\temp\x\tx.pdf
    
                Reading d:\temp\x\tx.pdf
                Number of pages : 3
                Writing d:\temp\x\tx-001.pdf
                Writing d:\temp\x\tx-002.pdf
                Writing d:\temp\x\tx-003.pdf
             */
    
        }
    }
    

    许多 iText 示例here

    【讨论】:

    • Stefan 实际上放了包含确切内容的链接。所以我会接受他的回答。 +1
    • 有没有办法在内存中做到这一点,以便不制作实际文件?我想遍历所有页面并将每个页面发送到 OCR 以读取文本。
    • @Omnipresent 是的,有。在 PdfCopy 构造函数中使用 ByteArrayOutputStream 而不是 FileOutputStream。
    【解决方案3】:

    我无法发表评论,但这一行在投票最多的答案中

    Document document = new Document(reader.getPageSizeWithRotation(1));
    

    应该是

    Document document = new Document(reader.getPageSizeWithRotation(i+1));
    

    如果其他页面的页面大小不同,则获取正确的 pdf 大小(它知道这种情况很少见)

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2010-10-04
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多