Generate PDF Dinamis menggunakan Windows services C#

Pada artikel kali ini saya akan menerangkan bagaimana membuat services yang berjalan automatis untuk melakukan generate PDF dari HTML.

Yang perlu disiapkan.

1. Microsoft Visual Studio 2017 ( Yang saya gunakan )

2. NET. Framework >= 4.2.1

3. SSMS ( Sql Server management Studio )

4. File HTML untuk tampilan PDF nantinya.


Silakan download Package yang dibutuhkan untuk generate PDF melalui link ini 



lalu buat table terlebih dahulu di database menggunakan script berikut

CREATE TABLE [dbo].[template](
	[NAMA] [varchar](100) NOT NULL,
	[ARTIKEL] [varchar](100) NOT NULL,
	[TEMPLATE] [varchar](MAX) NOT NULL
)

Bila sudah silakan isi table tersebut dengan data berikut

NAMA : Nama Saya
ARTIKEL : GENERATE PDF
TEMPLATE : 

<h1> Ini adalah Hasil Generate PDF</h1>
<div style="font-size:12pt;font-family:Verdana;">
<p><span style="font-size: medium;">HALLO :&nbsp; &nbsp; </span><strong>[nama]</strong></p>

<p>Ini Adalah Artikel Tentang : &nbsp; <strong>[artikel]</strong></p>
<br>
<div id = "Grid">
<table  border="1" width="50%">
        <tr><td>
           <table border="0">
					<tr>
						<td width="40%">Nama Saya </td>
						<td>[nama]</td>
					</tr>
					<tr>
						<td width="60%">Nama artikel</td>
						<td>[artikel]</td>
					</tr>
					
		   </table>
        </td></tr>
    </table>
</div>
<br><br>
</div>

Oke selanjutnya silakan buka Visual Studio anda dan buat Project Windows Services Baru
File > New > Project > Windows Services
Jangan lup setting target framework anda menjadi 4.5.1 dan klik  OK


Selanjutnya silakan extract File GeneratePDF_Packages.zip  yang telah anda download sebelumnya. Lalu Tambahkan file tersebut sebagai refrance pada aplikasi anda.



Next buka file Service1.cs anda dan klik Switch to Code View  Sesuaikan Script pada file Service1.cs dengan script berikut

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace GeneratePDF
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        Timer timer = new Timer();
        public void TraceService(string content)
        {
            //set up a filestream
            FileStream fs = new FileStream(ConfigurationManager.AppSettings["LogFilePath"] + DateTime.Now.ToString("ddMMyyyy") + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
            //set up a streamwriter for adding text
            StreamWriter sw = new StreamWriter(fs);

            //find the end of the underlying filestream
            sw.BaseStream.Seek(0, SeekOrigin.End);

            //add the text
            sw.WriteLine(content);
            //add the text to the underlying filestream

            sw.Flush();
            //close the writer
            sw.Close();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                //add this line to text file during start of service
                TraceService("[" + DateTime.Now.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffzzz") + "]Initialize Service");

                //handle Elapsed event
                timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

                //This statement is used to set interval (1 minute = 60,000 milliseconds)
                timer.Interval = 300000;

                //Run Service for The First Time
                new GeneratePDF();

                //enabling the timer
                timer.Enabled = true;
            }
            catch (Exception exception)
            {
                TraceService(exception.Message);
                TraceService(exception.ToString());
            }
        }

        protected override void OnStop()
        {
            timer.Enabled = false;
            TraceService("[" + DateTime.Now.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffzzz") + "]Stop Service");

        }
        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            try
            {
               
            }
            catch (Exception exception)
            {
                TraceService(exception.Message);
                TraceService(exception.ToString());
            }
        }
    }
}





Jika pada bagian Configuration Managernya terdapat line merah, silakan tambahkan System.Configuration pada Refrance anda.


# Penjelasan


Void TraceService ini digunakan untuk mencatat log dari services ini nantinya.


Time elapses dan time interval ini digunakan untuk mensetting setiap beberapa lama sekali service ini akan running nantinya. Yang digunakan adalah millisecond. 1 Menit ( 60000 Milisecon ) silakan disesuaikan.


Void OnElaspedTime digunakan untuk mensetting apa yang akan terjadi setelah aplikasi memasukin interval running service nantinya.


Baik selanjutnya kita akan membuat File .CS baru dengan nama GeneratePDF.cs

Klik kanan pada Solution Explorer anda > Add  > New Item dan pilih CLASS 


Buka File yang baru anda buat tersebut dan ketikan Script berikut.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace GeneratePDF
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        Timer timer = new Timer();
        public void TraceService(string content)
        {
            //set up a filestream
            FileStream fs = new FileStream(ConfigurationManager.AppSettings["LogFilePath"] + DateTime.Now.ToString("ddMMyyyy") + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
            //set up a streamwriter for adding text
            StreamWriter sw = new StreamWriter(fs);

            //find the end of the underlying filestream
            sw.BaseStream.Seek(0, SeekOrigin.End);

            //add the text
            sw.WriteLine(content);
            //add the text to the underlying filestream

            sw.Flush();
            //close the writer
            sw.Close();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                //add this line to text file during start of service
                TraceService("[" + DateTime.Now.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffzzz") + "]Initialize Service");

                //handle Elapsed event
                timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

                //This statement is used to set interval (1 minute = 60,000 milliseconds)
                timer.Interval = 300000;

                //Run Service for The First Time
                new GeneratePDF();

                //enabling the timer
                timer.Enabled = true;
            }
            catch (Exception exception)
            {
                TraceService(exception.Message);
                TraceService(exception.ToString());
            }
        }

        protected override void OnStop()
        {
            timer.Enabled = false;
            TraceService("[" + DateTime.Now.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffzzz") + "]Stop Service");

        }
        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            try
            {
               
            }
            catch (Exception exception)
            {
                TraceService(exception.Message);
                TraceService(exception.ToString());
            }
        }
    }
}

# Penjelasan



Data pada string folder adalah data dari configuration manager yang akan digunakan untuk mensetting di mana file akan di generate


Script ini berguna untu mengambil data di database dan menyimpannya kedalam Datatable , ini berfungsi agar koneksi tidak dibuka terlalu lama jika data yang di baca banyak.


Data yang ditarik akan dimasukan ke dalam parameter sendiri 

String nama untuk Field NAMA 

string artikel untuk Field ARTIKEL

Sedangkan filename akan digunakan sebagai nama file nantinya yang akan digenerate

Untuk Field Template beberapa string akan direplace sesuai dari data yang kita ambil, pada contoh kali ini maka string [nama] akan diganti dengan field nama yang berada di database



Function Generate_from_html berfungsi untuk mengenerate template yang telah kita siapkan sebelmnya menjadi PDF dengan nama file yang telah kita tetapkan.

 

Jika sudah selesai. Silakan tambahkan class GeneratePDF pada file Service1.cs pada bagian on Start



Jika sudah, klik 2x Appconfig yang di solustion explorer dan ubah script menjadi seperti berikut

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
 <connectionStrings>
 <add name="DBSERVER" connectionString="Data Source=[server_db];Initial Catalog=[nama_DB];Persist Security Info=True;User ID=sa;Password=password" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <appSettings>
    <add key="FOLDER" value="D:\BISA_DIHAPUS\TEMP_GENERATED_FILES\" />
    <add key="LogFilePath" value="D:\BISA_DIHAPUS\LOG_SERVICES\" />
  </appSettings>
</configuration>

# Penjelasan



Dibagian Connection string merupakan koneksi anda ke database server, sedangkan untuk APP SETTING merupakan settingan di Folder mana file log akan dibuat dan File PDF akan dibuat.

Selanjutnya kita akan membuat Installer, klik 2x Service1.cs pada solution explorer dan klik kanan pada halaman yang dibuka dan pilih add installer.



1 Klik serviceProsesInstaller dan ubah Misc > Account menjadi LocalSystem

2. Klik ServiceInstaller1 dan ubah ServiceName Sesuai keinginan anda pada panel properties

 

Lalu build Project. Dan install services melalui Command prompt as administrator


Script : %systemroot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe [path installer]


Bila sudah berhasil silakan jalankan servicenya. Lalu silakan cek di folder yang anda setting untuk generate file tersebut.










Load comments