Halaman

Selasa, 10 Agustus 2010

Create PDF file using C# and iTextSharp

iText is a library that allows you to generate PDF files on the fly, and it is an ideal library for developers looking to enhance web- and other applications with dynamic PDF document generation and/or manipulation. iText is not an end-user tool. Typically you won't use it on your Desktop as you would use Acrobat or any other PDF application. Rather, you'll build iText into your own applications so that you can automate the PDF creation and manipulation process.

The iText classes are very useful for people who need to generate read-only, platform independent documents containing text, lists, tables and images; or who want to perform specific manipulations on existing PDF documents.

Say we already have a C# project created with Microsoft Visual Studio, and want to generate a PDF file using iTextSharp. Below is my step:

1. Download itextsharp-5.0.2-dll.zip (1.2MB) from http://sourceforge.net/projects/itextsharp/files/
2. Extract the zip file to get itextsharp.dll file.
3. On Visual Studio, Add Reference to that file.
4. Open your source code and put this
using iTextSharp.text;
using iTextSharp.text.pdf;

5. Create a function like this:
private void generatePDF()
{
Document doc = new Document();
string dirPath = AppDomain.CurrentDomain.BaseDirectory + "pdf";
string pdfFile = dirPath + "\\" + "my.pdf";

PdfWriter writer = PdfWriter.GetInstance(doc, new System.IO.FileStream(pdfFile, System.IO.FileMode.Create));
writer.SetEncryption(PdfWriter.STRENGTH128BITS, "readpassw", "editpassw", PdfWriter.AllowCopy PdfWriter.AllowPrinting);

doc.Open();

doc.AddTitle("iTextSharp");
doc.AddSubject("Create Paragraph");
doc.AddCreator("iTextSharp");
doc.AddAuthor("We");
doc.AddTitle("My Title");

string tit = "This document using 128 bits encryption";
doc.Add(new Paragraph(tit, FontFactory.GetFont(FontFactory.HELVETICA, 20, 5,BaseColor.BLUE)));

Paragraph p = new Paragraph(new Chunk("iText is a library that allows you to generate PDF files on the fly", FontFactory.GetFont(FontFactory.HELVETICA, 10)));
p.Add("The most recent version is iText 5.0.3.");
p.Add("iText is an ideal library for developers looking to enhance web-");

p.Add(new Chunk("and other applications with dynamic PDF document generation and/or manipulation."));
p.Add(new Phrase("iText is not an end-user tool."));
p.Add(new Phrase("You'll build iText into your own applications to automate the PDF creation and manipulation process.", FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 18)));
doc.Add(p);

doc.NewPage();
p = new Paragraph(new Phrase("This is my second paragraph.", FontFactory.GetFont(FontFactory.TIMES_ITALIC, 11)));
p.Add("In short: the iText classes are very useful for people who need.");
doc.Add(p);
doc.Close();
}

6. Call that function and chek my.pdf file using your PDF reader.

Sabtu, 07 Agustus 2010

Boot on Ring

Seminggu yang lalu, saya berada sekitar 1000 km dari server sebut saja "DearServer". Perjalanan yang mengasyikkan bersama Hari, Suhendra, Teguh. Canda tawa, guyonan dan ide "andai-andai" pun mewarnai perjalanan kami saat melihat indahnya pemandangan, orang, mesin, makanan, bahkan sensor di bandara...bak komentator..dengan rileks dan tanpa beban menyampaikan pandangannya...

Kami beranjak meninggalkan DearServer pukul 05.40 dan tiba di remote area sekitar jam 16. Jam 20 memulai setup komputer, camera, cabling, konfigurasi LAN, tes koneksi internal dan ke internet via RG. Semua lancar dan response aplikasinya baik. Oh ya di DearServer ada rekan Salihin, yang setia menssuport kami, dan di server lokal ada rekan Iwan yang mendampingi. Dari testing aplikasi App2 kami masih menemui kendala. Jam telah menunjukkan hampir pukul 23 dan kami pun istirahat.

Esoknya kami mulai pelatihan internal dan laptop Vaio18 pun digunakan hingga jam 16. Jam 21, PR untuk App2 dilanjutkan. Untuk misi kali ini, ada 2 Aplikasi di DearServer yang harus dijalankan. App1 dan App2.
App1 terbuka untuk diakses via internet, sedangkan App2 khusus untuk intranet. App1 bisa diakses, namun tidak untuk App2. Koneksi VPN digunakan namun gagal koneksi ke App2. Routing dinamik dibuat dan App2 bisa diakses. Naah, sekarang saatnya mengganti dengan routing statis.
Saat membuat routing statis saya membuat IP yang sama (konflik) dalam server island, SSH pun terputus. Jam telah menunjukkan pukul 23, tak mungkin menelpon Salihin untuk datang mereset DearServer. Ide pun muncul andai bisa menelpon petugas untuk melakukan warm/cold boot server, andai ada tambahan NIC, atau andai ring telepon yang membuat Boot On Ring...next time kali yaaa.. Hmmmm...routing statis kan bisa dikerjakan besok pagi...kami melakukan finishing dan kembali pukul 01.

Kicau burung di pagi hari pun terdengar, suasana yang langka saat berada di kotanya DearServer, saat jalan pagi dan melihat pohon dan gunung yang masih tertutup embun...amazing deh...sementara Teguh menelpon Salihin untuk merestart DearServer. Jam 09, routing diberesin, dan semua OK..pada saat yang tepat... Sesuai jadwal, pelatihan eksternal pun dibuka oleh pak Edy dan kami melanjutkan dengan materi dan praktek pelatihan. Hal yang menyenangkan diperoleh dengan tidak adanya gangguan koneksi maupun hambatan pengoperasian aplikasi. Mission completed...dan perjalanan panjang menanti untuk eksekusi real-world.

Rabu, 21 Juli 2010

Outsourcing Inovasi

Artikel Michael J. Stanko, Jonathan D. Bohlmann dan Roger J. Calantone yang ditulis pada The Wall Street Journal November 2009, berjudul “Outsourcing Innovation,” memuat hasil survey mereka terhadap 359 perusahaan untuk mengetahui fator yang mempengaruhi innovative performance. Innovative performance diartikan sebagai the number of patents produced and the number of subsequent patents built on these.

Perusahaan yang berhasil dalam inovasi - innovative performance- menerapkan outsourcing dalam 4 situasi ini:

  1. Saat perusahaan butuh penambahan pengetahuan baru untuk berinovasi, seperti bagaimana bekerja dengan senyawa kimia yang tidak umum untuk membuat lini produksi farmasi yang berbeda.
  2. Pada tahap awal proyek, saat terdapat banyak rintangan teknis yang harus diatasi dan hasilnya jauh dari kepastian.
  3. Saat kekayaan intelektual tidak terlindungi baik di suatu industri. Dalam kasus ini, sejak berbagai ide baru menyebar di banyak perusahaan, maka sulit untuk membedakan produk dengan inovasinya sehingga bisnis menerapkan outsourcing untuk membatasi pengeluaran (spending).
  4. Ketika perusahaan telah berpengalaman dalam berbagai outsourcing. Dalam memilih antara mengerjakan sendiri dan menyerahkan kepada pihak eksternal, perusahaan yang sudah sering menerapkan outsourcing akan menyerahkan pekerjaan kepada pihak eksternal-3 kali lebih sering. Biaya dan manfaat outsourcing lebih pasti dan dapat diatur situasi untuk mencapai hasil yang efektif.

Terlalu banyak menyerahkan pekerjaan kepada pihak eksternal akan berdampak naiknya biaya total jika dibandingkan terlalu banyak melakukannya secara internal. Ketidakmampuan mengontrol pengeluaran kepada vendor, biaya akibat perubahan kontrak, tambahan biaya untuk koordinasi antara upaya internal dan upaya eksternal, atau usaha pertumbuhan secara cepat melalui outsourcing pengembangan produk baru tanpa memperhatikan biaya merupakan faktor penyebab bengkaknya biaya total.

Dalam artikel tersebut, diidentifikasi masalah umum yaitu terlambatnya beralih ke outsourcing dalam pengembangan produk, saat para kontraktor harus belajar lebih banyak tentang pekerjaan yang telah dikembangkan secara internal.

Outsourcing dapat membantu perusahaan dalam memilih berbagai opsi dan mengurangi waktu ke pasar. Sebagai contoh produsen mobil, yang menghadapi berbagai ketidakpastian tentang teknologi bahan bakar alternatif. Dengan outsourcing, mereka dapat melihat beberapa teknologi-jauh melampaui apa yang mungkin mereka mampu lakukan secara internal-dan dapat pergi ke pasar dengan cepat setelah keputusan dibuat.

Dampak outsourcing inovasi terhadap kinerja:

  1. Meskipun tidak selalu lebih murah, outsourcing inovasi sering menghasilkan pengembalian yang lebih tinggi atas investasi dari sumber daya yang dialokasikan.
  2. Perlu balancing jumlah outsourcing. Terlalu banyak outsourcing akan menaikkan biaya jika dibandingkan terlalu banyak pengembangan internal, sedangkan terlalu sedikit outsourcing dapat berakibat kinerja rata-rata atau menurun.
  3. Ada risiko produk menjadi generik/umum, karena dikerjakan pihak eksternal dan mungkin bisa menjadi produk massa.
  4. Ada masalah jika para outsourcer/kontraktor disertakan terlambat dalam pengembangan produk, karena mereka harus melalui kurva pembelajaran yang memakan waktu lama.
  5. Outsourcing memberikan opsi bagi perusahaan untuk masuk ke pasar dengan timing yang baik.

Tidak berlebihan jika diungkapkan dengan outsourcing today for the bright future. O ia, saat menulis saya teringat pada Robert Wolcott penulis buku "Grow From Within", yang mengatakan "Companies don't generally lack good ideas. Rather, they don't have the right approaches to refine, develop, and bring them to market", tampaknya disini barulah empowering today for the bright future. Kombinasinya tentu patut dipilih.

Wisdom quotes: Excellence

"Excellence is a better teacher than mediocrity. The lessons of the ordinary are everywhere. Truly profound and original insights are to be found only in studying the exemplary. " - Warren G Bennis

“It is not enough to do your best, you must know what to do and then do your best. Does experience help? No! Not if we are doing the wrong things".- Deming. 

Good luck in your efforts to make a difference.

Kamis, 01 Juli 2010

Jangan Tunda Besok

Seorang pemuda bernama Luniaz sedang memancing di sungai.
Ia menarik pancingnya, melepas, menariknya lagi... mengikuti gerakan ikan..
(hmmm ia begitu menikmatinya).

Dari arah timur, dua orang berjalan sang PakDe Pitok dan keponakannya Nisura.
Keduanya menghampiri Luniaz dan obrolan pun berlangsung.

PakDe Pitok: Lun, apa kamu ngga kerja?
Luniaz: saya ....
PakDe Pitok: (memotong pembicaraan), coba lihat tuh anak pakDe mu si Nisura dia kan sebaya kamu, dia bekerja dengan semangat

Nisura: Lun, bulan depan saya panen loh, jerih payahku akan kunikmati.
PakDe Pitok: sayang-kan kamu sia-siakan waktu mu. Mari kita berhitung, berapa jam kamu memancing?
Luniaz: sekitar 5 jam-an
PakDe Pitok: Ok...taruhlah 1/3 dari waktu mu sehari untuk tidur, dan 5 jam dari 2/3 waktumu untuk mancing..
Berapa jam waktumu ...

Luniaz: (langsung menyambar) 13 jam totalnya PakDe, sisanya 11 jam.
Nisura: Lun, bulan depan setelah panen..saya mau santai...woww bakalan asik bok
PakDe Pitok: dengar tuh Lun, nanti kalo kamu sudah tua, kamu bisa menikmati hari-hari mu
Luniaz: emangnya gimana contohnya PakDe?

PakDe Pitok: ya...kamu bisa nonton F1, Piala Dunia, bisa jalan kemana-mana, atau bisa mancing di The Rivers of Montana atau Kenai River di Alaska, and spend all your vacation time lying on the deck chair by the pool.

Luniaz: Why to go so much trouble? Cant you see what am i doing?...fishing...yeah I know, Never put till tomorrow , what you can do today.

PakDe Pitok dan Nisura: bertatapan !?!?

Rabu, 30 Juni 2010

Waiting for PostgreSQL 9 stable version

I just read PostgreSQL 9.0 Beta 2 and it's feature on this. Many new feature there, and drive me to use it in future. Things that I am interested in:

Backend section:
1. Column level permissions: allows specification of granular column-level permissions in addition to table level grants
2. GRANT/REVOKE ON ALL TABLES/SEQUENCES/FUNCTIONS: simplifies permission management by allowing mass changes of GRANTS

Functions and triggers section:
1. Column level triggers: adds support for SQL standard column level trigger support, by allowing triggers to only fire if specific columns are mentioned in the UPDATEs SET list
2. WHEN clause for CREATE TRIGGER: adds support for a boolean expression to be checked if a trigger should be fired or not
3. RETURNS TABLE: SQL standard RETURNS TABLE clause for CREATE FUNCTION.

Cryptographic on FreeBSD

I have two Postgresql installed one on Windows (at home) and FreeBSD (at some place out there). I use pgcrypto for encrypting sensitive data. On Windows I have installed the library by executing C:\sistemku\PostgreSQL\9.0\share\contrib\pgcrypto.sql file.

Now it's time for me to send my work to remote server.
I am making a backup secret.db by using pg_dump, then transfer the backup file onto remote server using FTP command. With PuTTY via modem connection, I restored the database. Make some test of web site contents, they looks okay except for crytographic functions. Yeah...the FreeBSD server has no pgcrypto installed.

#find / -name pgcrypto.sql (the file does not exist).


1st attempt: Execute pgcrypto.sql, as you might suspect.., it failed. I have FTPed the file before.
2nd attempt: Type this command using psql:

CREATE OR REPLACE FUNCTION digest(text, text)
RETURNS bytea AS '$libdir/pgcrypto', 'pg_digest'
LANGUAGE C IMMUTABLE STRICT;


Again an error message raised "libdir not found".

3rd attempt: Use port to install pgcrypto with the following steps:
1. Install pgcrypto module
#cd /usr/ports/database/postgresql-contrib
#make config
#make install clean


I could found /usr/local/lib/postgresql/pgcrypto.so and /usr/local/share/postgresql/contrib/pgcrypto.sql.


2. To access library functions, I load stored procedures onto my secret database.
# psql -U binsar -d secredb -f /usr/local/share/postgresql/contrib/pgcrypto.sql


3. Check if cyptographic function loaded.

secretdb=# \df digest
List of functions
Schema Name Type Argument
-------+-------+-------+------------
public digest bytea bytea, text
public digest bytea text, text



4. It works, and get my coffee.