【问题标题】:extracting one page from pdf file using iText使用iText从pdf文件中提取一页
【发布时间】:2015-02-07 12:48:29
【问题描述】:

我想使用 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();
    }

此代码返回页面,但文件大小很大,有时甚至等于原始文件大小,甚至只是一页。

【问题讨论】:

  • 也许您的每一页都使用了大字体或大图像。在这种情况下,您是否丢弃 100 页中的 99 页并不重要:该一页仍然需要字体和该图像,并且您的 PDF 文件大小不会减小。如果您想要更有用的答案,您必须向我们提供有关您的 PDF 性质的更多信息。
  • 文件副本在邮箱files link,大部分页面是论文图片。
  • 我已经下载了腹部.pdf。这是一个只包含图像的 PDF。为什么不提取图像并提供这些图像?如果可以提供单独的图像,为什么还需要单页 PDF?
  • 像 (Special Embryology.pdf) 这样的文本附带的文件返回小文件,但我认为返回图像是最好的解决方案,因为大多数文件都是由图像组成的,你想。

标签: java google-app-engine pdf itext


【解决方案1】:

我从您的存储库下载了一个文件: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 为 72,570 KB(约 70.8 MB),但单独的页面要小得多:

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

【讨论】:

  • 但是对于某些文件,例如(Introduction 2013.pdf),生成的文件非常大,请参阅此链接(2-dot-sheet-s0.appspot.com/…)生成的文件大小约为 12 MB,等于 pdf 大小.
  • 我不再在电脑前,而是在手机上。如果你想让我测试一个特定的文件,你应该这么说。这将使您在未来变得更加精确。
  • @Ahmed 在文件 Introduction 2013.pdf 中,您遇到的问题与问题itextsharp: splitted pages size equals file size 中讨论的问题相同:所有页面共享一个 Resources 字典,在您的情况下为 4 0 R。因此,拆分会复制每个页面的所有资源。因此,在拆分之前,您应该优化 PDF 以使每个页面都有单独的 Resources 字典,其中只包含该页面上实际使用的资源,参见。我对另一个问题的回答。
  • 这是一个很好的答案,@mkl,它表明某些 PDF 不是按照应有的方式创建的......
【解决方案2】:

更多更新和更清洁(5.5.6 及更高版本):

/**
 * Manipulates a PDF file src with the file dest as result
 * @param src the original PDF
 * @param dest the resulting PDF
 * @throws IOException
 * @throws DocumentException
 */
public void manipulatePdf(String src, String dest)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    SmartPdfSplitter splitter = new SmartPdfSplitter(reader);
    int part = 1;
    while (splitter.hasMorePages()) {
        splitter.split(new FileOutputStream("results/merge/part_" + part + ".pdf"), 200000);
        part++;
    }
    reader.close();
}

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多