如何缩放 PDAnnotation?
How to scale a PDAnnotation?
我有一个 pdf 已通过签名(注释)传递给我,我必须缩放 pdf,但是当我缩放 pdf 时,注释不会缩放,而且它变形了。有什么建议么?我给大家看一下方法的代码和前后的pdf
PDF 之前
PDF 之后
方法
public static byte[] adjustPages(byte[] content) {
try (PDDocument pdf = PDDocument.load(content)) {
float letterWidth = PDRectangle.LETTER.getWidth();
float letterHeight = PDRectangle.LETTER.getHeight();
PDPageTree tree = pdf.getDocumentCatalog().getPages();
for (PDPage page : tree) {
if (page.getMediaBox().getWidth() > letterWidth || page.getMediaBox().getHeight() > letterHeight) {
float fWidth = letterWidth / page.getMediaBox().getWidth();
float fHeight = letterHeight / page.getMediaBox().getHeight();
float factor = Math.min(fWidth, fHeight);
PDPageContentStream contentStream = new PDPageContentStream(pdf, page, PDPageContentStream.AppendMode.PREPEND, false);
contentStream.transform(Matrix.getScaleInstance(factor, factor));
contentStream.close();
page.setMediaBox(PDRectangle.LETTER);
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
pdf.save(baos);
return baos.toByteArray();
}catch (IOException ioe) {
return content;
}
}
正如评论中所说,对于每个页面,您不仅应该缩放内容流,还应该缩放其上的所有其他坐标,特别是其上每个注释的矩形。作为回应,您要求提供示例。
您可以将内部 if
块扩展到
if (page.getMediaBox().getWidth() > letterWidth || page.getMediaBox().getHeight() > letterHeight) {
float fWidth = letterWidth / page.getMediaBox().getWidth();
float fHeight = letterHeight / page.getMediaBox().getHeight();
float factor = Math.min(fWidth, fHeight);
PDPageContentStream contentStream = new PDPageContentStream(pdf, page, PDPageContentStream.AppendMode.PREPEND, false);
contentStream.transform(Matrix.getScaleInstance(factor, factor));
contentStream.close();
page.setMediaBox(PDRectangle.LETTER);
for (PDAnnotation pdAnnotation : page.getAnnotations()) {
PDRectangle rectangle = pdAnnotation.getRectangle();
PDRectangle scaled = new PDRectangle(factor * rectangle.getLowerLeftX(), factor * rectangle.getLowerLeftY(),
factor * rectangle.getWidth(), factor * rectangle.getHeight());
pdAnnotation.setRectangle(scaled);
}
}
(ScalePageWithAnnots 测试 testForPereZix
)
这将缩放页面上绘制相应注释的矩形区域。
但请注意:根据文档中注释的确切类型,您还必须缩放注释的其他属性。
一方面,有许多带有一些额外坐标信息的注释,例如link 的 QuadPoints、标记和修订注释。
另一方面,如果 PDF 查看器没有伴随的外观流,则存在与创建注释外观相关的注释属性,例如一般注释的边框宽度和文本字段小部件的 DA 字体大小。
我有一个 pdf 已通过签名(注释)传递给我,我必须缩放 pdf,但是当我缩放 pdf 时,注释不会缩放,而且它变形了。有什么建议么?我给大家看一下方法的代码和前后的pdf
PDF 之前
PDF 之后
方法
public static byte[] adjustPages(byte[] content) {
try (PDDocument pdf = PDDocument.load(content)) {
float letterWidth = PDRectangle.LETTER.getWidth();
float letterHeight = PDRectangle.LETTER.getHeight();
PDPageTree tree = pdf.getDocumentCatalog().getPages();
for (PDPage page : tree) {
if (page.getMediaBox().getWidth() > letterWidth || page.getMediaBox().getHeight() > letterHeight) {
float fWidth = letterWidth / page.getMediaBox().getWidth();
float fHeight = letterHeight / page.getMediaBox().getHeight();
float factor = Math.min(fWidth, fHeight);
PDPageContentStream contentStream = new PDPageContentStream(pdf, page, PDPageContentStream.AppendMode.PREPEND, false);
contentStream.transform(Matrix.getScaleInstance(factor, factor));
contentStream.close();
page.setMediaBox(PDRectangle.LETTER);
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
pdf.save(baos);
return baos.toByteArray();
}catch (IOException ioe) {
return content;
}
}
正如评论中所说,对于每个页面,您不仅应该缩放内容流,还应该缩放其上的所有其他坐标,特别是其上每个注释的矩形。作为回应,您要求提供示例。
您可以将内部 if
块扩展到
if (page.getMediaBox().getWidth() > letterWidth || page.getMediaBox().getHeight() > letterHeight) {
float fWidth = letterWidth / page.getMediaBox().getWidth();
float fHeight = letterHeight / page.getMediaBox().getHeight();
float factor = Math.min(fWidth, fHeight);
PDPageContentStream contentStream = new PDPageContentStream(pdf, page, PDPageContentStream.AppendMode.PREPEND, false);
contentStream.transform(Matrix.getScaleInstance(factor, factor));
contentStream.close();
page.setMediaBox(PDRectangle.LETTER);
for (PDAnnotation pdAnnotation : page.getAnnotations()) {
PDRectangle rectangle = pdAnnotation.getRectangle();
PDRectangle scaled = new PDRectangle(factor * rectangle.getLowerLeftX(), factor * rectangle.getLowerLeftY(),
factor * rectangle.getWidth(), factor * rectangle.getHeight());
pdAnnotation.setRectangle(scaled);
}
}
(ScalePageWithAnnots 测试 testForPereZix
)
这将缩放页面上绘制相应注释的矩形区域。
但请注意:根据文档中注释的确切类型,您还必须缩放注释的其他属性。
一方面,有许多带有一些额外坐标信息的注释,例如link 的 QuadPoints、标记和修订注释。
另一方面,如果 PDF 查看器没有伴随的外观流,则存在与创建注释外观相关的注释属性,例如一般注释的边框宽度和文本字段小部件的 DA 字体大小。