iText7を使用してC#でPDFページ内の画像座標を取得する方法は？


現在、C#でiText7フレームワークを使用しており、PDFの各ページ内の画像の座標を取得する必要があります。

ただし、現在のコードは、次の2つの特定のシナリオでのみ正常に機能することに気付きました：

  * PDFページの回転角度が0度で、画像の回転角度が90度の場合。
  * PDFページの回転角度が0度で、画像の回転角度が0度の場合。

PDFページの回転角度が0、90、180、または270度で、画像の回転角度が0、90、180、または270度の場合、取得する座標が正確でないことがあります。

iText7でページの左上隅を原点とし、左上隅から右にX軸が、左上隅から下にY軸が伸びるような画像の座標を取得する一般的な方法はありますか？

次のコードを使用しています：

[code]

    public static List<RectangleF> GetImageLocations(PdfPage page)
    {
        List<RectangleF> imageList = new List<RectangleF>();
    
        // 画像の位置情報を取得するためのリスナーを作成
        ImageLocationEventListener listener = new ImageLocationEventListener();
        PdfCanvasProcessor parser = new PdfCanvasProcessor(listener);
        parser.ProcessPageContent(page);
    
        // 画像の情報を取得
        foreach (ImageRenderInfo imageRenderInfo in listener.Images)
        {
            Matrix ctm = imageRenderInfo.GetImageCtm();
            // 画像の角度を計算（ラジアン単位）
            float angle = (float)Math.Atan2(ctm.Get(Matrix.I12), ctm.Get(Matrix.I11));
    
            float x, y, width, height;
    
            // 角度に基づいて座標情報を調整
            if (Math.Abs(angle) < Math.PI / 4)
            {
                // A4縦
                x = ctm.Get(Matrix.I31);
                y = page.GetPageSize().GetHeight() - ctm.Get(Matrix.I32);
                width = Math.Abs(ctm.Get(Matrix.I11));
                height = Math.Abs(ctm.Get(Matrix.I22));
            }
            else
            {
                // A4横
                x = ctm.Get(Matrix.I32);
                y = ctm.Get(Matrix.I31);
                width = Math.Abs(ctm.Get(Matrix.I12));
                height = Math.Abs(ctm.Get(Matrix.I21));
            }
    
            y = y - height;
    
            RectangleF image = new RectangleF(x, y, width, height);
    
            imageList.Add(image);
        }
    
        return imageList;
    }
    
    public class ImageLocationEventListener : IEventListener
    {
        public List<ImageRenderInfo> Images { get; } = new List<ImageRenderInfo>();
    
        public void EventOccurred(IEventData data, EventType type)
        {
            if (type == EventType.RENDER_IMAGE)
            {
                ImageRenderInfo imageRenderInfo = (ImageRenderInfo)data;
                Images.Add(imageRenderInfo);
            }
        }
    
        public ICollection<EventType> GetSupportedEvents()
        {
            return new List<EventType> { EventType.RENDER_IMAGE };
        }
    }
    
[/code]

