如何缩放 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 字体大小。