画像をグリッド表示する 02/02 日
C# で .Net Framework 4.7 を使って、プログラミングしています。データベースは、SQLite を使っています。また、もともとのデータとしては、PDF ファイルを読み込んでいます。
具体的には、次のような内容になります。
- データベースがなければ新たにつくる
- PDFファイルを読み、画像に変換する
- 変換した画像の全体、および画像の一部を切り取ったものをデータベースに保存する
- その他のテキストデータも、データベースに保存する
- 保存したデータを読み出す
- 読み出したデータを、データ・グリッド・ビューを用いて、一覧表示させる(DataGridView)
これらを実現するために、プログラムを作成したところ、120行程度のプログラムで作成可能であることが分かりました。以下、ソースコードを引用します。
なお、NeGet を用いて「Pdfium.Net.SDK v.4.23.2704」と「System.Data.SQLite v1.0.112」もインストールしてあります。using 行の中に、これらのパッケージも出てきています。
using Patagames.Pdf.Net; using Patagames.Pdf.Enums; using System.Data; using System.Data.SQLite; using System.Drawing; using System.Windows.Forms; namespace test11 { public partial class Form1 : Form { SQLiteConnection DBconn; public void DBCheck() { DBconn = new SQLiteConnection("DataSource=data.sqlite"); DBconn.Open(); SQLiteCommand comm = DBconn.CreateCommand(); string Src; Src = "create table if not exists DBPic " + "(id integer primary key autoincrement, " + "pic blob not null, spic blob not null)"; comm.CommandText = Src; comm.ExecuteNonQuery(); } public void DBAddPdfPage(Bitmap tmp, Bitmap tmp2) { SQLiteCommand comm = DBconn.CreateCommand(); string Src; Src = "insert into DBPic(pic,spic) values (@pic, @spic);"; comm.CommandText = Src; ImageConverter converter = new ImageConverter(); byte[] btmp = (byte[])converter.ConvertTo(tmp, typeof(byte[])); byte[] btmp2 = (byte[])converter.ConvertTo(tmp2, typeof(byte[])); var param = new SQLiteParameter("@pic", System.Data.DbType.Binary) { Value = btmp }; comm.Parameters.Add(param); var param2 = new SQLiteParameter("@spic", System.Data.DbType.Binary) { Value = btmp2 }; comm.Parameters.Add(param2); comm.ExecuteNonQuery(); } public void ReadPDF() { var doc = PdfDocument.Load("11.pdf"); foreach (var page in doc.Pages) { int w = (int)page.Width; int h = (int)page.Height; // 保存する画像の解像度は 1200px とする int nw = 1200; int nh = nw * h / w; // 保存する画像と同じ大きさのビットマップを用意する Bitmap tmp = new Bitmap(nw, nh); Bitmap tmp2 = new Bitmap(250, 60); // そのビットマップに書き込む道具 g を用意する Graphics tmp_g = Graphics.FromImage(tmp); Graphics tmp2_g = Graphics.FromImage(tmp2); // ページを画像の変換し、GD+ を利用して画像化する page.Render(tmp_g, 0, 0, nw, nh, PageRotate.Normal, RenderFlags.FPDF_ANNOT); tmp2_g.DrawImage(tmp, -650, -300, nw, nh); // ビットマップをリストに追加する DBAddPdfPage(tmp,tmp2); tmp_g.Dispose(); tmp2_g.Dispose(); } doc.Dispose(); } public Form1() { InitializeComponent(); PdfCommon.Initialize(); // PDF処理のための初期化 DBCheck(); ReadPDF(); this.AutoScroll = true; DataGridView Dgv = new DataGridView(); this.Controls.Add(Dgv); Dgv.Location = new Point(10, 50); Dgv.Size = new Size(500, 500); //ヘッダーとすべてのセルの内容に合わせて、列の幅を自動調整する Dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //ヘッダーとすべてのセルの内容に合わせて、行の高さを自動調整する Dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; Dgv.ColumnHeadersHeight = 40; DataTable Dt; SQLiteCommand comm = DBconn.CreateCommand(); string Src = "select id,spic from DBPic"; comm.CommandText = Src; SQLiteDataReader reader = comm.ExecuteReader(); Dt = new DataTable(); Dt.Load(reader); Dgv.DataSource = Dt; Dt.Dispose(); } } }