Friday, 17 July 2009

ItexSharp generowanie dokumentów PDF z zewnętrznego dokumentu XML wraz z polskimi znakami

Ostatnio musiałem wygenerować dokumenty PDF z zewnętrznych dokumentów XML myślę sobie OK! … użyje biblioteki ITexSharp (port dla .NET C# z iText, a free Java-Pdf libr ary ), jest szybka i pozwala w prosty sposób generować dokumenty PDF. Dokumentacja jest przejrzysta znajduje się nawet przykładowy parser. No ale jak to w życiu bywa... pojawił się problem z generowanie polskich znaków w dokumentach PDF.

Przykładowy parser dostępny w dokumentacji biblioteki w ogóle nie uwzględnia polskich znaków


using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.xml;
using iTextSharp.text.pdf;

public class XmlToPdf
{

public static void Main()
{

Console.WriteLine("XML to PDF conversion example");

// step 1: creation of a document-object
Document document = new Document();

try
{

// step 2:
// we create a writer that listens to the document
// and directs a XML-stream to a file
PdfWriter.GetInstance(document, new FileStream("document.pdf", FileMode.Create));

// step 3: we create a parser
ITextHandler xmlHandler = new ITextHandler(document);

// step 4: we parse the document
xmlHandler.Parse("document.xml");
}
catch (Exception e)
{
Console.Error.WriteLine(e.StackTrace);
Console.Error.WriteLine(e.Message);

if (e.InnerException != e)
{
Console.Error.WriteLine(e.InnerException.Message);
}
}
finally
{
Console.WriteLine("Finished - Hit any enter to close this window.");
}

Console.ReadLine();
}
}


Przeglądając różne grupy dyskusyjne znalazłem trochę rozwiązań ale jak już działało to z użyciem „hardcode” czyli dokument XML był zakodowany w wewnątrz plików *.cs .

Metodą testów udało mi się dojść do rozwiązania problemu mianowicie jeśli mamy wygenerować dokument PDF z wykorzystaniem ItexSharp z zewnętrznych dokumentów XML musimy zmodyfikować naszego parsera dokumentów przykład poniżej.

Zmodyfikowany parser :


using System;
using System.Text;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.xml;
using iTextSharp.text.pdf;
using iTextSharp.text.factories;
using iTextSharp.text.html;

namespace generationDocument
{

public class xmlToPdf
{
public static void Main()
{
Console.WriteLine(
"XML to PDF conversion");
BaseFont arial = BaseFont.CreateFont(
@"C:\WINDOWS\Fonts\arial.ttf", "iso-8859-2", BaseFont.EMBEDDED);
Font font = newFont(arial, 9);
//creation of a document-object
Document document = newDocument();
try
{
PdfWriter.GetInstance(document, newFileStream(
"generowanyDokument.pdf", FileMode.Create));
//create a parser
ITextHandler xmlHandler = newITextHandler(document, newHtmlTagMap(), arial);
//parse the document

xmlHandler.Parse(
"generowanyDokument.xml");

}

catch (Exception e)
{
Console.Error.WriteLine(e.StackTrace);
Console.Error.WriteLine(e.Message);
if (e.InnerException != e)
{
Console.Error.WriteLine(e.InnerException.Message);
}

}
finally
{
Console.WriteLine(
"Finished - Hit any enter to close this window.");
}
Console.ReadLine();
}

}
}


W ten oto sposób uzyskamy upragnione polskie znaki w naszych dokumentach PDF.

Dodam że dokument XML musi być zakodowany w formacie utf-8. Przykładowy dokument XML znajduje się poniżej :


<?xml version="1.0" encoding="utf-8" ?>

<itext>

<list numbered="false" symbolindent="350" first="-2" listsymbol="" font="Helvetica" size="20.0" fontstyle="bold">

<listitem leading="18.0" font="unknown" align="Default" indentationleft="20.0">

.....................

</listitem>

</list>

<paragraph leading="18.0" font="unknown" align="Default">

.....................

</paragraph>

<paragraph leading="18.0" font="unknown" align="Default">

.....................

</paragraph>

<paragraph leading="18.0" font="unknown" align="Default">

.....................

</paragraph>

<paragraph leading="18.0" font="unknown" align="Default">

<newline />

</paragraph>

<table columns="0" width="100%" height ="100%" align="Center" borderwidth="0.0" left="true" right="true" top="true" bottom="true" red="0" green="0" blue="0">

<row>

<cell rowspan="0" borderwidth="0.0" left="false" right="false" top="true" bottom="true" horizontalalign="Center" verticalalign="Center" header="true" leading="18.0">

<paragraph leading="10.0" font="arial" size="20.0" align="Center">Przykład : </paragraph>

<paragraph leading="18.0" font="unknown" align="Default">

<newline />

</paragraph>

</cell>

</row>

</table>

<paragraph leading="18.0" font="unknown" align="Center">

<newline />

</paragraph>

<paragraph leading="18.0" font="unknown" align="Center">

<newline />

</paragraph>



<paragraph leading="6.0" font="unknown" align="Center">

<newline />

</paragraph>

<paragraph leading="18.0" font="arial" align="Default">

Polskie Znaki ąśęółźżć

</paragraph>

<paragraph leading="18.0" font="unknown" align="Default">

<newline />

</paragraph>

<list numbered="false" symbolindent="350" first="-2" listsymbol="" font="Helvetica" size="20.0" fontstyle="bold">

</list>

<paragraph leading="18.0" font="unknown" align="Center">

<newline />

</paragraph>

</itext>


Przykładowo wygenerowany dokument PDF z powyższego pliku XML



Mam nadzieje że ten krótki tekst zaoszczędzi trochę czasu oraz nerwów tym, którzy borykają się z problemem generowania polskich znaków z wykorzystaniem ItexSharp.

Strona domowa biblioteki ItexSharp : http://itextsharp.sourceforge.net/

Artykuł został również opublikowany w serwisie codeguru.pl pod adresem :
www.codeguru.pl/Default.aspx?Page=Articles/Details&pubid=761




Monday, 6 July 2009

Break Stereotype...

Zauważyłem że pisząc mojego skromnego bloga napotkać można pewną cykliczność co roku max cztery wpisy... :D Stereotyp w tym roku został przełamany i pojawił się o to szósty post :)

Tuesday, 2 June 2009

Opera i Silverlight

W końcu... zanośi się że przeglądarka opera w nowej wersji oznaczonej numerkiem 10, będzie obsługiwała Microsoftowskiego Silverlight dla przykładu Opera 10 Beta radzi sobie doskonale np. z stroną : http://www.silverlightsudoku.com/Sudoku.aspx  podczas gdy wydanie 9.64 wyświetla tylko biała planszę. 

Na marginesie aby korzystać z możliwośći platformy silverlight pod przeglądarką opera musimy się identyfikować np. jako firefox. ( Będąc na witrynie wykorzystującej Microsoft Silverlight musimy naćisnąc F12 -> Edit Site Preferences -> Network -> Identify as Firefox -> Ok. Co ciekawe jeśli wybierzemy opcję Identify as Internet Exploler, przeglądarka może się "wysypać " - osobiste doświadczenia przeglądając materiały na channel 9 msdn.) 

Aha jeszcze jedno strony które wymagają do działania technologi Silverlight ver. 1.1 nie będą działać gdyż Opera nie oficjalnie (jak narazie :( ) współpracuje jedynie od wersji Silverlight 2.0

Do przetestowania technologi silverlight można użyć strony http://bubblemark.com/

Silverlight 3 powinien działać już bez większego problemu z Operą, zobaczymy... Gdyż jest to narazie jedna z bardziej znanych przeglądarek, które nie wspiera technologi Microsoft. 



Tuesday, 26 May 2009

Eksport wiadomości z Thunderbird do Outlook 2007

Niby operacja na pierwszy rzut oka wydaję się trywialna co to za problem wyeksportować pocztę z Thunderbirda do Outlooka... a jednak napotkałem na mały problem chciałem przenieść moją pocztę z Thunderbird'a do Outlooka i zonk ani Thunderbird nie posiada opcji eksportu do formatu Outlooka ani Outlook nie posiada importu poczty z formatu Thunderbirda (co dziwnne bo Thunderbird używa dość popularnego formatu MBOX).
Przeglądając google natrafiłem co prawda na sporo tutoriali ale albo nie działały albo trzeba trochę pokombinować żeby wykonać import np. użyć narzędzia IMAPSize musimy wyeksportować pliki do odpowiedniego formatu następnie zaimportować pliki do Outlook Express czy też Windows Mail (odpowiednik expressa w Vista) dopiero po tych czynnościach możliwy jest import z Outlook Express do Outlook 2007... jeśli dojdzie do tego parę skrzynek pocztowych, robi się to trochę uciążliwe.
Po dość długim przeglądaniu googl'a natrafiłem na polski program MboxProxy który to umożliwia w bardzo prosty i szybki sposób zaimportowanie skrzynek z formatu MBOX do np. Outlook 2007.
Czynność importu sprowadza się do wybrania folderu gdzie Thunderbird trzyma pocztę, naciśnięnie przycisku "Włącz serwer" w MboxProxy i tyle... w Outlooku konfigurujemy nowe konto pocztowe jako serwery pop3 oraz smtp podajemy localhost (127.0.0.1), dane dostępowe czyli login i hasło wpisujemy obojętnie co... ważne musi coś być następnie warto wskazać w outlook folder gdzie poczta ma zaostać zapisana na koniec pobieramy naszą pocztę... ;)
Opis zastosowania programu znajduje się w dokumentacji jest napisany bardzo prosto.
Sam program Mboxproxy dostępny jest TU .






Opis eksportu za pomocą programu IMAPSize o którym wspomniałem wcześniej dostępny jest pod adresem :
http://www.broobles.com/imapsize/th2outlook.php

Monday, 25 May 2009

Synchronizacja kalendarza outlook'a z kalendarzem google

Ostatnio wpadł mi w ręce fajny program od google o nazwie Google Calendar Sync, służy on do synchronizowania naszego kalendarza z outlooka z kalendarzem google. Program działa bardzo dobrze można go nawet spresonalizować - metody synchronizacji








Program jak i informacje o nim dostępne są na stronie projektu :
http://www.google.com/support/calendar/bin/answer.py?answer=98563


Tuesday, 19 May 2009

Wyłączanie - Shutdown event tracker w Windows Server 2008/2003

Shutdown event tracker jest narzędziem dzięki, któremu możemy kontrolować wyłączanie systemu np. dodając sobie notatkę "system został wyłączony z powodu ataku DoS :] " później można sobie przeglądać i zrobić statystyki z kontrolowanych wyłączeń systemu, fajnie... jednak że na maszynach testowych kiedy często wykonujemy ponowny rozruch, przydatne narzędzie jakim nie wątpliwie jest "set" staję się bardzo denerwujące. Można go w prosty sposób wyłączyć:

1. Otwieramy start --> wpisujemy gpedit.msc
2. w gpedit.msc przechodzimy

>Local Computer Policy
->Computer Configuration
-->Administrative Templates
--->System
---->"Display Shutdown Event Tracker" --> prawy klawisz myszy --> properties --> Disable -----> Apply



Tuesday, 17 February 2009

Opera, Wand i Captcha

Ostatnio zauważyłem że Opera nie radzi sobie z logowaniem, które odbywa się wraz z weryfikacja kodów (CAPTCHA). Operowy menadżer haseł pamięta wpisany kod obrazka ... który generowany jest losowo.

Jest na to sposób :

1. logujemy się na stronę podając login i hasło - pole weryfikujące kod zostawiamy puste dajemy żeby wand zapamiętał poświadczenia

2. logujemy się ponownie tym razem podajemy inne dane też tylko login i hasło - dane oczywiście wymyślone, tym razem wand znów zapyta nas o poświadczenia - wybieramy żeby nigdy nie zapamiętał dla tej witryny hasła i loginu ;)

3. logujemy się ponownie, wpisujemy kod obrazka naciskamy ctrl + enter, i tyle... wand nie zapamięta już wpisanego kodu obrazka a ma w pamięci nasze poprzednie poświadczenia.