2

レポートの作成にiTextSharpを使用しています。私のレポートには、さまざまなサイズの画像が多数含まれています。スケーリングしても、各画像は異なるサイズでレンダリングされます。多くの解決策を見つけましたが、何も役に立ちませんでした。

私のコード:

PdfPCell InnerCell;
iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(Server.MapPath(@"images\Logo.png"));
logo.ScaleToFit(80f, 80f);
InnerCell.FixedHeight = 80f;
InnerCell = new PdfPCell(logo); 

画像をチャンクに追加しようとしましたが、画像が一番上に配置されます。動的レポートであるため、x 値と y 値をチャンクで指定することはできません

InnerCell = new PdfPCell(new Phrase(new Chunk(logo, 0, 0))); 

私もこれを試しましたが、固定サイズを取得できません。

4

1 に答える 1

6

ScaleToFit(w,h)ソース画像の幅/高さの大きい方に基づいて比例的に画像をスケーリングします。複数の画像を拡大縮小する場合、寸法の比率がすべて同じでない限り、異なるサイズになってしまいます。これは仕様によるものです。

使用ScaleToFit(80,80):

  • ソースが正方形の100x100場合、次の正方形が得られます80x80
  • ソースが長方形の200x100場合、次の長方形が得られます80x40
  • ソースが長方形の100x200場合、次の長方形が得られます40x80

出てくるものは何でも、幅と高さを測定すると、少なくとも 1 つは指定した寸法の 1 つになります。

ランダムなサイズの画像を作成するサンプル プログラムを作成したところ、画像に示すように期待される出力が得られました (w=80、h=80、h=80、h=80、w=80)。

ここに画像の説明を入力

private void test() {
    //Output the file to the desktop
    var testFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
    //Standard PDF creation here, nothing special
    using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
        using (var doc = new Document()) {
            using (var writer = PdfWriter.GetInstance(doc, fs)) {
                doc.Open();

                //Create a random number generator to create some random dimensions and colors
                var r = new Random();

                //Placeholders for the loop
                int w, h;
                Color c;
                iTextSharp.text.Image img;

                //Create 5 images
                for (var i = 0; i < 5; i++) {
                    //Create some random dimensions
                    w = r.Next(25, 500);
                    h = r.Next(25, 500);
                    //Create a random color
                    c = Color.FromArgb(r.Next(256), r.Next(256), r.Next(256));
                    //Create a random image
                    img = iTextSharp.text.Image.GetInstance(createSampleImage(w, h, c));
                    //Scale the image
                    img.ScaleToFit(80f, 80f);
                    //Add it to our document
                    doc.Add(img);
                }

                doc.Close();
            }
        }
    }
}

/// <summary>
/// Create a single solid color image using the supplied dimensions and color
/// </summary>
private static Byte[] createSampleImage(int width, int height, System.Drawing.Color color) {
    using (var bmp = new System.Drawing.Bitmap(width, height)) {
        using (var g = Graphics.FromImage(bmp)) {
            g.Clear(color);
        }
        using (var ms = new MemoryStream()) {
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }
    }
}

あなたが探しているのは、画像を比例してスケーリングする機能ですが、画像を「そのサイズにする」こともできると思います。これは、残りのピクセルをクリアまたはおそらく白いピクセルで埋めることを意味します。その解決策については、この投稿を参照してください。

于 2013-07-10T21:27:08.987 に答える