C# PDFlib 使い方の簡単な例

![ 2015-04-10 11.33.51.png](https://qiita-image-store.s3.amazonaws.com/0/9988/a3a893e9-4eed-b82e-d1a8-b1f8ad413c45.png)


# PDFlib について
PDFlib は PHP や、C++、Javaや .NET、Ruby から PDF を作成するための有料のライブラリです。仕事で使うことがあったのでメモ。

## 環境

* Windows 7 Professional
* Visual Studio 2015 Professional
* IIS 7.5

## ダウンロード
PDFlib 有料製品なのですが、テストでの利用も可能だよ
→ [PDFlib Download](http://www.pdflib.jp/product/download/pdflib.html)

## インストール
2015.04.10 の時点のバージョンは 9.0.4 で ダウンロードをすると「PDFlib-9.0.4-MSWin32-.NET.msi」というインストーラが手に入るよ

インストールが終わると「C:\Users\\*********\Documents」に「PDFlib」というディレクトリができているよ。

「C:\Users\\*********\Documents\PDFlib\PDFlib 9.0.4 32-bit\.NET Framework 4.0\bin」に「PDFlib_dotnet.dll」があるので Visual Studio (以下、VS)で作成したプロジェクトのbinにでも突っ込んで参照設定に追加しましょう。

今回は、Web上で Visitor の操作で PDF を作成するという想定で作るので、WebForm で空の Webアプリケーションを作成。「inetpub/wwwroot/ProjectName/bin」に PDFlib_dotnet.dll を突っ込んだ。


## Sample.aspx の作成

jQuery でちょっとした 連打対策だけしておいた。更には結果表示用の Literal もとりあえず用意。

```aspx-cs

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Sample.aspx.cs" Inherits="PDFlibProject.Sample" %>

<!DOCTYPE html>

<html lang="ja">
<head runat="server">
	<meta charset="UTF-8">
	<title>Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script>
        function buttonDisable()
        {
            jQuery("#ExecuteButton").fadeOut();
            return true;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p><asp:Button runat="server" ID="ExecuteButton" Text="Create" OnClientClick="return buttonDisable();" OnClick="ExecuteButton_Click"  /></p>
        <p><asp:Literal runat="server" ID="StatusText"></asp:Literal></p>
    </div>
    </form>
</body>
</html>
```

## using の追加

C#側。

まずは using に追加

```csharp
using System;
using PDFlib_dotnet;

namespace PDFlibProject
{
    public partial class Sample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
```

## 次に以下の設定用変数を用意

```csharp

using System;
using PDFlib_dotnet;

namespace PDFlibProject
{
    public partial class Sample : System.Web.UI.Page
    {
        /// <summary>
        /// PDFlib オブジェクト
        /// </summary>
        private PDFlib p;

        /// <summary>
        /// font の読み込み判定を格納
        /// </summary>
        private int font;

        /// <summary>
        /// font サイズを設定
        /// </summary>
        private float fontSize = 10;

        /// <summary>
        /// PDF ファイル名
        /// </summary>
        private string fileName;
        
        /// <summary>
        /// 表示するテキスト
        /// </summary>
        private string displayText;
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
```


## Create ボタンをクリックされた際に動くメソッドを用意

```csharp
using System;
using PDFlib_dotnet;

namespace PDFlibProject
{
    public partial class Sample : System.Web.UI.Page
    {
        /// <summary>
        /// PDFlib オブジェクト
        /// </summary>
        private PDFlib p;

        /// <summary>
        /// font の読み込み判定を格納
        /// </summary>
        private int font;

        /// <summary>
        /// font サイズを設定
        /// </summary>
        private float fontSize = 10;

        /// <summary>
        /// PDF ファイル名
        /// </summary>
        private string fileName;
        
        /// <summary>
        /// 表示するテキスト
        /// </summary>
        private string displayText;


        protected void Page_Load(object sender, EventArgs e)
        {


        }

        /// <summary>
        /// PDF作成プログラム
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ExecuteButton_Click(object sender, EventArgs e)
        {

        }
    }
}

```

## PDFlib オブジェクトの生成と各種設定

```csharp

/// <summary>
/// PDF作成プログラム
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ExecuteButton_Click(object sender, EventArgs e)
{
	p = new PDFlib();

	fileName = "Sample.pdf";

	p.set_option("errorpolicy=return");
	p.set_option("SearchPath={C:\\Windows\\Fonts}");
	p.set_option("FontOutline={Meiryo=meiryo.ttc}");

	displayText = "Hello World";
}
```

## PDFlib オブジェクト（PDFドキュメント）をメモリ上に作成

```csharp
/// <summary>
/// PDF作成プログラム
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ExecuteButton_Click(object sender, EventArgs e)
{
	p = new PDFlib();

	fileName = "Sample.pdf";

	p.set_option("errorpolicy=return");
	p.set_option("SearchPath={C:\\Windows\\Fonts}");
	p.set_option("FontOutline={Meiryo=meiryo.ttc}");

	displayText = "Hello World";

	if (p.begin_document(Server.MapPath("./") + fileName, "") == -1)
	{
		return;
	}

}

```
## Fontの設定を試みる

```csharp
/// <summary>
/// PDF作成プログラム
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ExecuteButton_Click(object sender, EventArgs e)
{
	p = new PDFlib();

	fileName = "Sample.pdf";

	p.set_option("errorpolicy=return");
	p.set_option("SearchPath={C:\\Windows\\Fonts}");
	p.set_option("FontOutline={Meiryo=meiryo.ttc}");

	displayText = "Hello World";

	if (p.begin_document(Server.MapPath("./") + fileName, "") == -1)
	{
		return;
	}


	font = p.load_font("Meiryo", "unicode", "");

	if (font == -1)
	{
		return;
	}

}

```

## 実際に描画していく

```csharp
/// <summary>
/// PDF作成プログラム
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ExecuteButton_Click(object sender, EventArgs e)
{
	p = new PDFlib();

	fileName = "Sample.pdf";

	p.set_option("errorpolicy=return");
	p.set_option("SearchPath={C:\\Windows\\Fonts}");
	p.set_option("FontOutline={Meiryo=meiryo.ttc}");

	displayText = "Hello World";

	if (p.begin_document(Server.MapPath("./") + fileName, "") == -1)
	{
		return;
	}


	font = p.load_font("Meiryo", "unicode", "");

	if (font == -1)
	{
		return;
	}



	p.begin_page_ext(595,842,"topdown");
	p.setfont(font, fontSize);
	p.set_text_pos(100, 100);
	p.show(displayText);

	p.end_page_ext("");

	p.end_document("");

	this.StatusText.Text = "作成完了";
}
```

でこんなんが出来上がる

![ 2015-04-10 12.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/9988/dde53bdd-56ce-901a-11f4-971a793e1a8d.png)


## 文字列を追加

```csharp
/// <summary>
/// PDF作成プログラム
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ExecuteButton_Click(object sender, EventArgs e)
{
	p = new PDFlib();

	fileName = "Sample.pdf";

	p.set_option("errorpolicy=return");
	p.set_option("SearchPath={C:\\Windows\\Fonts}");
	p.set_option("FontOutline={Meiryo=meiryo.ttc}");

	displayText = "Hello World";

	if (p.begin_document(Server.MapPath("./") + fileName, "") == -1)
	{
		return;
	}


	font = p.load_font("Meiryo", "unicode", "");

	if (font == -1)
	{
		return;
	}



	p.begin_page_ext(595,842,"topdown");
	p.setfont(font, fontSize);
	p.set_text_pos(100, 100);
	p.show(displayText);

	p.set_text_pos(200, 200);
	p.show(displayText);

	p.end_page_ext("");

	p.end_document("");

	this.StatusText.Text = "作成完了";
}

```

set_text_posとshowを追加することで別の場所に追加ができるよ。
結果はこんな感じ

![ 2015-04-10 12.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/9988/f9c28702-799e-a839-2c95-8f849ebd8f58.png)