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

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

PDFの作成   01/29 水

 PDFを読んで、画像に変換するためには、PDFium というライブラリを使用しましたが、PDFを作成するためには、PDFSharp というライブラリを使用すると良さそうです。ただし、いろいろな数値がゴチャゴチャして、分かりにくいのが難点です。

 たぶん、いろいろな人が、いろいろな開発をしていて、基本的な考え方を統一せずにライブラリが出来上がってきているのかなあと思います。でも、いろいろな考え方があるというのは、豊かな発想の源泉にもなるでしょうから、悪いことではないでしょうけれど。

 とはいえ、整理しておかないと、分からなくなってしまうので、サンプルプログラムをメモしておきます。

using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PDF_Make
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            PdfDocument PDFdoc = new PdfDocument();
            PdfPage mypage;

            XGraphics mypage_g;
            XImage image = XImage.FromFile("sample.png");
            XFont xfont = new XFont("Arial Unicode MS", 8, XFontStyle.Regular);
            
            // ここから 1ページ目
            mypage = PDFdoc.AddPage();
            
            // サイズを指定しておく
            mypage.Size = PageSize.A4;
            mypage.Orientation = PageOrientation.Portrait;
            int pw = (int)mypage.Width.Point;
            int ph = (int)mypage.Height.Point;

            // XGraphics ドライバは、使用後は Dispose() すること
            mypage_g = XGraphics.FromPdfPage(mypage);
            mypage_g.DrawImage(image, 0, 0, pw, ph);
            mypage_g.Dispose();

            // ここから 2ページ目、2ページ目以降はサイズは同じものとする
            mypage = PDFdoc.AddPage();

            // XGraphics ドライバは、使用後は Dispose() すること
            mypage_g = XGraphics.FromPdfPage(mypage);
            mypage_g.DrawImage(image, 0, 0, pw / 2, ph / 2);
            mypage_g.DrawImage(image, 0, ph / 2, pw / 2, ph / 2);
            mypage_g.DrawImage(image, pw / 2, 0, pw / 2, ph / 2);
            mypage_g.DrawImage(image, pw / 2, ph / 2, pw / 2, ph / 2);

            for (int i = 0; i < 20; i++)
            {
                mypage_g.DrawString(
                   "Hello World こんにちは世界",
                    xfont,
                    XBrushes.Black,
                    new XRect(i*50, i*10, 0, 0),
                    XStringFormats.BottomLeft
                    );
            }
            mypage_g.Dispose();

            PDFdoc.Save("00Hapy.pdf");
        }
    }
}

ここで、いくつかパラメーターが出てきていますが、

  • ア、用紙全体の大きさに関するもの
  • イ、画像を用紙全体に広げるためのもの

に大きく分かれると思います。それぞれ列挙しておくと、

ア、用紙全体の大きさに関するもの

mypage.Size = PageSize.A4;
mypage.Orientation = PageOrientation.Portrait;
int pw = (int)mypage.Width.Point;
int ph = (int)mypage.Height.Point;

イ、画像を用紙全体に広げるためのもの

mypage_g = XGraphics.FromPdfPage(mypage);
mypage_g.DrawImage(image, 0,      0,      pw / 2, ph / 2);
mypage_g.DrawImage(image, 0,      ph / 2, pw / 2, ph / 2);
mypage_g.DrawImage(image, pw / 2, 0,      pw / 2, ph / 2);
mypage_g.DrawImage(image, pw / 2, ph / 2, pw / 2, ph / 2);
mypage_g.Dispose();

ということになろうかと思います。

f:id:takase_hiroyuki:20191123160855p:plain