【发布时间】:2018-09-15 06:20:54
【问题描述】:
我有一个需要缩小比例的 pdf。 pdf 处于 A4 纵向模式,我需要将 pdf 的内容缩小到 5% 并将其放入一个新的 PDF 中,同样采用 A4 尺寸和纵向模式。它不是将 pdf 转换为图像、缩放它们并将其放回 pdf 的选项。我正在寻找一种在java中解决这个问题的方法。有没有办法用pdfbox或itext解决这个问题?
【问题讨论】:
我有一个需要缩小比例的 pdf。 pdf 处于 A4 纵向模式,我需要将 pdf 的内容缩小到 5% 并将其放入一个新的 PDF 中,同样采用 A4 尺寸和纵向模式。它不是将 pdf 转换为图像、缩放它们并将其放回 pdf 的选项。我正在寻找一种在java中解决这个问题的方法。有没有办法用pdfbox或itext解决这个问题?
【问题讨论】:
如果你使用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
【讨论】:
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("...."));
}
你会在左下角看到一些小东西。
【讨论】: