【问题标题】:How to down scale content of a pdf?如何缩小pdf的内容?
【发布时间】:2018-09-15 06:20:54
【问题描述】:

我有一个需要缩小比例的 pdf。 pdf 处于 A4 纵向模式,我需要将 pdf 的内容缩小到 5% 并将其放入一个新的 PDF 中,同样采用 A4 尺寸和纵向模式。它不是将 pdf 转换为图像、缩放它们并将其放回 pdf 的选项。我正在寻找一种在java中解决这个问题的方法。有没有办法用pdfbox或itext解决这个问题?

【问题讨论】:

    标签: java pdf itext pdfbox


    【解决方案1】:

    如果你使用iText 7,那么这是一个选项:

    public void manipulatePdf(String src, String dest) throws IOException {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
        int n = pdfDoc.getNumberOfPages();
        PdfPage page;
        for (int p = 1; p <= n; p++) {
            new PdfCanvas(pdfDoc.getPage(p).newContentStreamBefore(),
                    new PdfResources(), pdfDoc).writeLiteral("\nq 0.05 0 0 0.05 0 0 cm\nq\n");
            new PdfCanvas(pdfDoc.getPage(p).newContentStreamAfter(),
                    new PdfResources(), pdfDoc).writeLiteral("\nQ\nQ\n");
        }
        pdfDoc.close();
    }
    

    请注意,5%(writeLiteral() 方法中的 0.05 值)非常小。如果有文字,将很难阅读它所说的内容。也许你的意思是 95%。在这种情况下使用:writeLiteral("\nq 0.95 0 0 0.95 0 0 cm\nq\n")

    来源:How to shrink pages in an existing PDF?

    注意:iText 5 已停产,但 iText 5 的答案已于 2014 年发布在 Stack Overflow 上:Shrink PDF pages with rotation using Rectangle in existing PDF

    【讨论】:

    • 感谢您的回答,很遗憾,我买不起这个版本,可能您不会为旧版本 2.1.7 提供解决方案?
    • 当你说我买不起这个版本,你是什么意思?如果您避免创建闭源软件并遵守 AGPL,那么您可以使用 AGPL 下的 iText。如果您为雇主工作,不必为许可证付费,这取决于您的雇主。如果您是个体经营者,请考虑通过在 iText 7 platform 上创建插件来赚钱。
    • 顺便说一句:您也不能再在商业环境中使用 iText 2.1.7:请参阅FAQ
    • @AlPhaba 如果您仅限于您提到的图书馆的古代版本,您应该从一开始就在您的问题中指出这一点。
    【解决方案2】:

    PDFBox 2.0.*的答案:

    try (PDDocument doc = PDDocument.load(new File("...")))
    {
        for (int p = 0; p < doc.getNumberOfPages(); ++p)
        {
            PDPage page = doc.getPage(p);
            try (PDPageContentStream cs = new PDPageContentStream(doc, page, AppendMode.PREPEND, true))
            {
                cs.saveGraphicsState();
                cs.transform(Matrix.getScaleInstance(0.05f, 0.05f));
                cs.saveGraphicsState();
            }
            try (PDPageContentStream cs = new PDPageContentStream(doc, page, AppendMode.APPEND, true))
            {
                cs.restoreGraphicsState();
                cs.restoreGraphicsState();
            }
        }
        doc.save(new File("...."));
    }
    

    你会在左下角看到一些小东西。

    【讨论】:

    • PDFBox
    • 1.8 中没有 PREPEND 功能,所以要模拟这个需要做很多工作。更新到 2.0。
    猜你喜欢
    • 2021-12-03
    • 2013-10-12
    • 1970-01-01
    • 2014-01-29
    • 2011-11-24
    • 2011-10-16
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多