【问题标题】:Itext 7.0.2 Clockwise rotation of ImageItext 7.0.2 图像顺时针旋转
【发布时间】:2018-04-25 16:22:06
【问题描述】:

图像元素(com.itextpdf.layout.element.Image)支持逆时针旋转。 是否可以对同一张图片进行顺时针旋转?

PdfPage page = iTextPdfDoc.getLastPage();
PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), iTextPdfDoc);
Canvas canvas = new Canvas(pdfCanvas, iTextPdfDoc, page.getPageSize());
Image img = new Image(ImageDataFactory.create(path));
img.scaleAbsolute(525.58203, 737.0079)
img.setFixedPosition(30.785828, 34.66619)

// The following block of code does not affect the center point of rotation.
// I tried a lot of different values for rotation point. No change!
{
  img.setProperty(Property.ROTATION_POINT_X, 30.785828);
  img.setProperty(Property.ROTATION_POINT_Y, 34.66619);
}

img.setProperty(Property.ROTATION_ANGLE, Math.toRadians(90)); //img.setRotationAngle(Math.toRadians(90));
canvas.add(img);

更新:

这就是使用逆时针 90 度的图像所发生的情况。

这是逆时针使用 -90 度或 270 度的图像所发生的情况。

【问题讨论】:

  • Math.toRadians(-90) 怎么样?

标签: java image itext itext7


【解决方案1】:

怎么样:

img.setRotationAngle(Math.toRadians(270));

你为什么要为只用一个函数就能完成的事情创建两个函数来使事情复杂化?

(后一句话受到了今天上午在伟大的印度开发者峰会上 Venkat Subramaniam 的主题演讲的影响。主题演讲的标题是:“不要远离复杂性,快跑!”)

更新:

在您的初始评论之后(我也尝试使用 270。由于我不明白的原因,图像已顺时针旋转但它位于 pdf 页面的底部下方。),我制作了这张图片:

在您的第二条评论中,您写道:您是对的!这意味着我必须再次设置位置,以便将图像显示到 pdf 页面中。如何移动图像,以便移动到页面底部上方?

这可能首先取决于您如何定位图像。你目前在用什么?您使用的是setFixedPosition() 还是setRelativePosition() 方法?还是您只是将图像添加到文档中而不定义位置?

【讨论】:

  • 我也试过 270。由于我不明白的原因,图像已顺时针旋转,但它位于 pdf 页面的底部。
  • 如果图像位于页面底部,则将图像顺时针旋转 90% 将图像置于页面底部下方是有意义的。为什么你认为这是错误的?
  • 你是对的!这意味着我必须再次设置位置,以便将图像显示到 pdf 页面中。如何移动图像,以便移动到页面底部上方?
  • 我正在使用 setFixedPosition()。它应该类似于 setFixedPosition(x,y)。 x 和以前一样。 y 应该是图像对象的宽度。
  • 是的,如果从头开始创建PDF,页面底部的默认y坐标为0,y轴指向上方。
【解决方案2】:

在页面中设置不同旋转的图像并显示相同的结果。

这是一个例子,你可以相应地设置xy

itextpdf 7.0.2 版

    public Image imageWithPosition(int pageNum, PdfPage pdfPage, ImageData imageData) {
        val pageHeight = pdfPage.getPageSizeWithRotation().getHeight();
        val pageWidth = pdfPage.getPageSizeWithRotation().getWidth();
        Image image = new Image(imageData).scaleAbsolute(pageWidth, pageHeight);
        float x = 0f;
        float y = 0f;
        val rotation = pdfPage.getRotation();
        // rotation 180, 270 need to handle specially
        if (rotation == 180) {
            y = pageHeight;
        } else if (rotation == 270) {
            y = pageWidth;
        }
        // set fixed position
        image.setFixedPosition(pageNum, x, y);
        // toRadians 
        image.setRotationAngle(Math.toRadians(pdfPage.getRotation()));
        return image;
    }

【讨论】:

    【解决方案3】:

    我发现问题是由于:

    img.scaleAbsolute(525.58203, 737.0079)
    

    那条线缩放图像以适应容器

    width = 525.58203 and height = 737.0079.
    

    下面的代码块可以满足我的需要!

    PdfPage page = iTextPdfDoc.getLastPage();
    PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), 
    page.getResources(), iTextPdfDoc);
    Canvas canvas = new Canvas(pdfCanvas, iTextPdfDoc, page.getPageSize());
    Image img = new Image(ImageDataFactory.create(path));
    
    float width = img.getXObject().getWidth();
    float widthContainer = 525.58203;
    float heightContainer = 737.0079;
    float horizontalScaling = widthContainer / width;
    
    img.scaleAbsolute(widthContainer, heightContainer);
    
    img.setProperty(Property.ROTATION_ANGLE, Math.toRadians(270));
    img.setFixedPosition(imageLlx, imageLly + width * horizontalScaling);
    
    canvas.add(img);
    

    结果如下:

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多