【发布时间】:2014-08-18 04:20:49
【问题描述】:
我正在使用以下代码使用 iText 库缩小现有 pdf 的每一页(顶部和底部)。
代码运行良好。 但是现在如果我处理 result pdf,我会得到 0 值 用于每一页的旋转,而旧 pdf 也有其他旋转(即 90 度)。
我想按原样保持轮换,但无法做到。
我使用如下代码来缩小页面
public void shrinkPDFPages() throws Exception {
PdfReader reader = new PdfReader("D:/testpdfs/test.pdf");
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(
"D://testpdfs/result.pdf"));
doc.open();
PdfContentByte cb = writer.getDirectContent();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
PdfImportedPage page = writer.getImportedPage(reader, i);
float pageHeight = reader.getPageSizeWithRotation(i).getHeight();
float pageWidth = reader.getPageSizeWithRotation(i).getWidth();
int rotation = reader.getPageRotation(i);
Rectangle pageRectangle = reader.getPageSizeWithRotation(i);
Rectangle PageRect = null;
System.out.println(rotation);
switch (rotation) {
case 0:
PageRect = new Rectangle(pageRectangle.getWidth(), pageRectangle
.getHeight());
doc.setPageSize(PageRect);
doc.newPage();
AffineTransform af = new AffineTransform();
af.scale(1, 0.84f);
af.translate(1, 50);
cb.addTemplate(page, af);
break;
case 90:
PageRect = new Rectangle(pageRectangle.getWidth(), pageRectangle
.getHeight());
doc.setPageSize(PageRect);
doc.newPage();
cb.addTemplate(page, 0, -1f, 0.84f, 0, 50, pageHeight);
break;
case 270:
PageRect = new Rectangle(pageRectangle.getWidth(), pageRectangle
.getHeight());
doc.setPageSize(PageRect);
doc.newPage();
cb.addTemplate(page, 0, 1f, -0.84f, 0, pageWidth - 50, 0);
break;
case 180:
PageRect = new Rectangle(pageRectangle.getWidth(), pageRectangle
.getHeight());
doc.setPageSize(PageRect);
doc.newPage();
cb.addTemplate(page, -1f, 0, 0, -0.84f, pageWidth,
pageHeight - 50);
break;
default:
break;
}
}
doc.close();
}
我该怎么办?所以旋转保持原样。
我要获取的另一个问题是,无法保留内部超链接。
实际 pdf 页面:
收缩后(缩小内容):
【问题讨论】:
-
您将文档页面复制到具有自己的页面定义的新文档中。如果你想保留页面定义,你必须复制它们,或者更好地使用 PdfStamper
-
如果我使用 PdfStamper,我可以缩小/缩放页面吗?
-
诚然收缩是困难的。因此,创建具有适当轮换的新页面是您的最佳选择。
-
如果可能的话,你能提供一些样品吗?我不知道该怎么做。
-
我是否正确理解您的编辑,您想垂直挤压但保持尺寸水平?在这种情况下,您必须将
String.format("\nq %s 0 0 %s %s %s cm\nq\n", ...之后的第一个百分比替换为1并将offsetX设置为0。