如何缩小PDF格式的内容?

时间:2018-04-05 12:16:23

标签: java pdf itext pdfbox

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

2 个答案:

答案 0 :(得分:2)

如果您使用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%(0.05方法中的writeLiteral()值)非常小。如果有文字,将很难阅读它的内容。也许你的意思是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

答案 1 :(得分:1)

回答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("...."));
}

你会在左下方看到一些微小的东西。