AdjustCoords.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Annotations;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、Page.AdjustCoordinates()メソッドを使用して、
    // GcPdfDocumentに読み込まれ、かつそのページに不明な任意の変換が適用された
    // 可能性があるPDFの、視覚座標(DsPdf の規則に従ってページの左上隅から
    // 測定された座標)を正しい座標に変換する方法を示しています。調整された
    // 座標は、注釈の配置(この場合は墨消し)などに使用することができます。
    // 
    // このサンプルで使用されたPDFには、時計回りに90度回転させた請求書の
    // サンプルのスキャンを含むページがあります。PDFのページを270度
    // 回転させて補正しています(ですので、視覚的にページの向きが
    // 正しい縦向きになります)。
    public class AdjustCoords
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            using (var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "invoice-scan-rot270.pdf")))
            {
                doc.Load(fs);

                if (doc.Pages.Count != 1)
                    throw new Exception("予期せぬエラー:請求書のサンプルは1ページちょうどでなければなりません。");

                var page = doc.Pages[0];

                // PDFページの左上隅から計測された、墨消しする領域の境界の矩形です。
                // この矩形をそのまま使用すると、対象となるコンテンツを見失います。
                var rectToRedact = new RectangleF(20, 170, 200, 40);

                // ページ変換(この場合は回転)の可能性を考慮に入れて調整された
                // 境界の矩形です。
                var adjusted = page.AdjustCoordinates(rectToRedact);

                // 注意: 'adjusted'の代わりに'rectToRedact'を使用すると、
                // 墨消しの対象(顧客名/住所)を見失います。
                var redact = new RedactAnnotation()
                {
                    Rect = adjusted,
                    OverlayFillColor = Color.Orange,
                    OverlayText = "墨消しされています",
                    Page = page
                };
                // 墨消しを適用します。
                doc.Redact(redact);

                // PDF ドキュメントを保存します。
                doc.Save(stream);
                return doc.Pages.Count;
            }
        }
    }
}