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
CREATE TABLE [dbo].[template]( [NAMA] [varchar](100) NOT NULL, [ARTIKEL] [varchar](100) NOT NULL, [TEMPLATE] [varchar](MAX) NOT NULL )
<h1> Ini adalah Hasil Generate PDF</h1> <div style="font-size:12pt;font-family:Verdana;"> <p><span style="font-size: medium;">HALLO : </span><strong>[nama]</strong></p> <p>Ini Adalah Artikel Tentang : <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>
Selanjutnya silakan extract File GeneratePDF_Packages.zip yang telah anda download sebelumnya. Lalu Tambahkan file tersebut sebagai refrance pada aplikasi anda.
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
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
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()); } } } }
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>
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.