ひとりも見捨てないことを、あきらめない

学校教育、社会教育、数学、技術家庭科、Youtube、EdTech、ICT、プログラミング、その他

画像をグリッド表示する  02/02 日

 C# .Net Framework 4.7 を使って、プログラミングしています。データベースは、SQLite を使っています。また、もともとのデータとしては、PDF ファイルを読み込んでいます。
 具体的には、次のような内容になります。

  1. データベースがなければ新たにつくる
  2. PDFファイルを読み、画像に変換する
  3. 変換した画像の全体、および画像の一部を切り取ったものをデータベースに保存する
  4. その他のテキストデータも、データベースに保存する
  5. 保存したデータを読み出す
  6. 読み出したデータを、データ・グリッド・ビューを用いて、一覧表示させる(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();
		}
	}
}

f:id:takase_hiroyuki:20191123160855p:plain