iTextSharp i CP1250

0

Witam serdecznie, mam następujący problem, chcę wczytać plik html wygenerowany w wordzie (filtered html) i przekonwertować go na PDF. uzywam w tym celu itextsharp, jednak nie mogę uzyskać polskich czcionek. Poniżej zamieszczam kawałek kodu :
Proszę o pomoc bo czas mnie nagli a pomysły powoli się kończą.

Document pdf = new Document();
            PdfWriter writer = PdfWriter.GetInstance(pdf, new FileStream(filepath, FileMode.OpenOrCreate));
            BaseFont baseFont = BaseFont.CreateFont("c:\\Windows\\Fonts\\Arial.ttf", BaseFont.CP1250, BaseFont.EMBEDDED);
            iTextSharp.text.html.simpleparser.StyleSheet css = new iTextSharp.text.html.simpleparser.StyleSheet();
              
            pdf.Open();
            writer.DirectContent.SetFontAndSize(baseFont, 12);

            ArrayList list = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(new StreamReader("plik.html", Encoding.GetEncoding("windows-1250")), null);
            
            for (int i = 0; i < list.Count; i++)
            {
                pdf.Add((IElement)list[i]);
            }

            pdf.Close();    
1

Encoding.GetEncoding("windows-1250")

Jesteś pewien co do tego kodowania? Najczęściej chyba stosowanym kodowaniem jest UTF-8, możliwe też (jeśli ustawienia niesprecyzowane) ASCII.

PS. Czemu korzystasz z archaicznej klasy ArrayList? :| Czemu nie korzystasz z foreach? :|

0

A dlaczego ma używać foreach?
For jest szybszy i uniwersalniejszy.

0

Niestety przy UTF-8 plik PDF jest niepoprawny (pusty lub acrobat mówi że uszkodzony) iso-8859-2 nie ma polskich znaków tylko jakieś krzaki, podobnie Unicode(to wszystko w GetEncoding).

1

A dlaczego ma używać foreach?
For jest szybszy i uniwersalniejszy.

Od czegoś w końcu jest, a z tym 'szybszy' to takie różnice można sobie podarować. Wyjątkiem są miejsca gdzie szbykość jest newralgiczna (np. gry) ale to nie w "zwykłych" aplikacjach...

A ten plik.html ma zdefiniowaną w kodzie html jakieś kodowanie? (np. encoding="utf"). Sprawdź może też czy na pewno zapisujesz go zgodnie z tym kodowaniem.

Co to za klasa PdfWriter? Jest w standardowej bibliotece?

Czemu używasz Encoding.GetEncoding? Sporo encodingów można dostać przez Encoding.cośtam (np .ASCII, .UTF8, .Unicode, wtc).

0

Gdyby tym forem chciał zyskać na wydajności to by nie używał dostępu do właściwości za każdym przejściem, które i tak tę różnicę w jakiś sposób zniweluje.

0

Panie i Panowie, kwestia 3 milisekund w te czy wewte nie jest tak istotna w tym przypadku, Encodings.ASCII daje znaki zapytania, UTF'y powodują że wynikowy PDF nie jest rozpoznwany jako prawidłowy plik tego formatu, iso-8859-2 też nic nie daje. Zastanawiam się gdzie jest problem...

1

Jeszcze miałem 2 pytania na które nie odpowiedziałeś :]

A ten plik.html ma zdefiniowaną w kodzie html jakieś kodowanie? (np. encoding="utf"). Sprawdź może też czy na pewno zapisujesz go zgodnie z tym kodowaniem.

Co to za klasa PdfWriter? Jest w standardowej bibliotece? [a jeśli nie, to w jakiej?]

to ważne, bo bez tego ciężko się domyślić o co chodzi. Tzn. z reguły w takich wypadkach nawala kodowanie.
I jeszcze jedno - skoro już nie wiem co to za PdfWriter to pobawię się we wróżkę - często takie klasy 'writery' wymagają osobnego podania kodowania (co jest dość logiczne skoro muszą coś zapisywać w jakimś kodowaniu) - poszukaj przeciążonego konstruktora albo właściwości obrazującej kodowanie. Albo po prostu powiedz co to za PdfWriter to sam sprawdzę w dokumetacji ;).

0

PdfWriter pochodzi z iTextSharp i jest 'niskopoziomowym' obiektem odpowiedzialnym za tworzenie wynikowego pdf'a na podstawie innych obiekcikow reprezentujacych strony, paragrafy, tabele (..). iTextSharpa dosc smiesznie sie uzywa, wystarczy stworzyc writera zwiaanego z pdfdocument i .. zapomniec o nim, uzywany jest automatycznie -- no, chyba ze chcesz recznie jakies np. linie po x/y rysowac na stronie.

Wracajac do tematu: kopac Ci pdfa przy tej bibliotece moze wiele rzeczy! przede wszystkim: jaki masz system operacyjny, jaki jest podstawowy jezyk systemowy, jakiego masz acrobata, jaka wersja jezykowa acrobata? pytam, gdyz na winXP-pl z acrobatem pl/en nie mialem absolutnie nigdy zadnych problemow przy cp1250, ale juz na przyklad na vista/en+acrobat/en za cholere jasna nie da sie poprawnego dokumentu wygenerowac.. acrobat tam zawsze widzi krzaki zamiast polskich znakow.. niestety jak walczylem z tym circa 6mies temu, to nie wpadlem na to, zeby 'uszkodzone' pdfy sprobowac obejrzec na innym kompie. strzelam, ze to jest byla wina czcionek systemowych a nie biblioteki czy acrobata

0

For jest szybszy i uniwersalniejszy.

A sprawdzałeś, czy mit powielasz? Robiłem pomiar nie raz i za każdym razem foreach wychodził szybszy od fora.

0

w ktorym .net? dla tablic powinien byc dokladnie tak samo szybki, tak przynajmniej twierdza na blogach msdn (tzn. ze od 2.0 czy 3.0 kompialtor tak samo optymalizuej for i foreach dla Array). natomiast dla kontenerow, jakim tez jest arraylist -- foreach musi byc wolniejszy z definicji, bo korzysta z getenumerator..

0
Azarien napisał(a)

For jest szybszy i uniwersalniejszy.

A sprawdzałeś, czy mit powielasz? Robiłem pomiar nie raz i za każdym razem foreach wychodził szybszy od fora.

Nie powielam mitu, jakbym nie znalazł jakiegoś potwierdzenia na to, to bym nic nie pisał.
Być może źle używałeś for-a odwołując się za każdym razem do Count listy

http://www.codeproject.com/KB/cs/foreach.aspx

Chodziło mi głównie o to na początku tematu zarzucono autorowi nie używanie foreach. Przecież nie ma nakazu używania foreach i używanie fora żadnym błędem NIE jest. Nie wiem skąd to przeświadczenie. Akurat dla mnie for jest bardziej czytelny, sam nie używam foreach tylko for.

0

czytajac ten artykul radze zwrocic uwage, iz pochodzi z 2004.
obecny kompilator ----sądzę---- że został poprawiony pod tym kątem, ponieważ czytalem nie dalej jak pol roku temu artykul dotyczacy zmian w cs3.0 albo 3.5 (khem albo 4.0) gdzie wyraznie opowiadali, ze (w koncu) poprawili optymalizacje foreacha i teraz jest tak samo (roz)budowana jak analiza for'a.. szkoda ze link zostal na starym kompie :|

0

Bez komentarza z tymi Waszymi pętlami.

Co do tematu - w poprzedniej pracy generowałem jakieś PDFy, też mi ginęły polskie diakrytyki i problem leżał w tym, że biblioteka po prostu obsługiwała je tylko w niektórych czcionkach, pamiętam że w końcu udało mi się Tahomą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1