Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie pliku RTF - rozwiązanie
Forum PHP.pl > Forum > PHP
Vir
Hi!

Właśnie skończyłem męczyć się z generowaniem plików RTF z poziomu strony internetowej. Przeglądałem trochę rozwiązań, być może znalazły by się lepsze, ale to wydaje mi się na prawdę dobre i niezawodne. Rozwiązanie oparte jest o sposób przedstawiony na stronie http://lab.artlung.com/php/rtf/. Podczas pracy pojawiło się trochę problemów, które uwzględnia poniższy tekst. Należy liczyć się z tym, że część informacji nie wniesie niczego nowego w stosunku do tego co znajdziecie na stronie http://lab.artlung.com/php/rtf/. Zainteresowanych zapraszam do lektury biggrin.gif

Dla porządku przedstawię wszystko w kolejnych punktach:

1) Potrzebne nam będą 3 pliki:
- plik 1 - formularz np. formularz.html
- plik 2 - dokument RTF np. formularz.rtf
- plik 3 - plik .htaccess

2) Tworzymy dokument RTF np. w programie Word, zapisujemy go np. pod przyjętą w pkt 1 nazwą formularz.rtf. Miejsca, które mają być wypełnione na razie pozostawiamy puste.

3) Tworzymy html-owy odpowiednik utworzonego przed chwilą formularza i zapisujemy go np. pod przyjętą w pkt 1 nazwą formularz.html.
Pola, które będą wypełnione umieszczamy w znaczniku
Kod
<form action="nazwa_pliku.rft" method="post"></form>


np.
Kod
<form action="formularz.rtf" method="post">

Podaj imię: <input type="text" name="imie"><br>

Podaj adres: <textarea name="adres"></textarea>

</form>


4) Tworzymy plik .htaccess z następującą zawartością:
Kod
AddType apaplication/x-httpd-php .rtf


* Pliki, o których mowa w pkt 1, 2, 3 powinny znajdować się w tym samym katalogu *

5) Aby plik .htaccess przyniósł zamierzony rezultat (aby nowy typ został dodany) należy (w razie konieczności) zmienić dyrektywę
Kod
AllowOverride  None
na
Kod
AllowOverride FileInfo
Dyrektywę tą znajdziesz w pliku konfiguracyjnym Apacha - httpd.conf. Może być też
Kod
AllowOverride All
ale nie wiem czy jest to bezpieczne (muszę jeszcze trochę poczytać o Apache :-))

Uwaga - zamiast zmieniać dyrektywę AllowOverride i tworzyć plik .htaccess można zamieścić deklarację
Kod
AddType application/x-httpd-php .rtf
bezpośrednio w pliku httpd.conf (w miejscu deklaracji typów).


Dobra mamy już pliki formularz.html, formularz.rtf oraz .htaccess, teraz trochę pomieszamy ;-)

6) Otwieramy plik formularz.rtf stworzony w pkt 2. W puste miejsca, które mają być wypełnione danymi z formularza html wpisujemy
[php:1:8ee5bfa475]<?php echo StripSlashes($_POST['nazwa_zmiennej')?>[/php:1:8ee5bfa475].
Przy imieniu będzie to
[php:1:8ee5bfa475]<?php echo StripSlashes($_POST['imie']) ?>[/php:1:8ee5bfa475]
a przy adresie [php:1:8ee5bfa475]<?php echo StripSlashes($_POST['adres']) ?>[/php:1:8ee5bfa475]

Uwaga - być może pamiętasz, że pole adres to textarea, a więc bardzo prawdopodobne, że przyszły użytkownik zechce przejść do nowej linii wybierając Enter. Standardowo przejście do nowej linii nie zostanie zinterpretowane poprawnie i w wygenerowanym dokumencie RTF będzie widoczny ciągły tekst. W tym celu należy użyć następującego wywołania (może nie jest ono skomplikowane, ale wpadłem na nie dopiero po jakimś czasie):
[php:1:8ee5bfa475]<?php echo str_replace('<br />', 'line', nl2br(StripSlashes($_POST['nazwa_zmiennej']))) ?>[/php:1:8ee5bfa475]
Myślę, że nie trzeba tłumaczyć. Zainteresowanych użytymi funkcjami zapraszam do manuala ;-) W skrócie chodzi o to, żeby zastąpić znacznik
Kod
<br />
wpisem
Kod
line
znaczącym w specyfikacji RTF tyle co "przejdź do nowej linii".

Teraz radzę się wczytać ;-)

Załóżmy, że nasz przykładowy formularz (imię, adres) chcemy umieścić w tabeli:
- lewa kolumna pierwszy wiersz - "Imię"
- lewa kolumna drugi wiersz - "Adres"
- w prawej kolumnie znajdą się wygenerowane dane z formularza html
Wcześniej pisałem, że w miejscu w którym dane mają się pojawić - wiersze prawej kolumny - musi znaleźć się stosowna funkcja. Funkcja nie zawiera polskich znaków. W związku z tym mogą się pojawić problemy w postaci błędnego wyświetlania polskich znaków w wierszach, do których będą wstawiane dane z formularza html. Rozwiązanie jest (chyba) jedno - należy dodać np. w środku funkcji jakieś polskie znaki, które później w ramach weryfikacji opisanej w punkcie 7 usuniemy.
Po prostu jeżeli w kolumnie znajdą się polskie litery to struktura pliku RTF zostanie tak stworzona, że nie będzie problemów z wstawieniem polskich znaków (czytaj uwagi końcowe).

7) Otwieramy ponownie plik formularz.rtf tym razem za pomocą programu, który nie interpretuje tego formatu, tylko wyświetla 'czysty' RTF (np. za pomocą notatnika)
Na początku, przed deklaracją dokumentu RTF tzn. {rtf1... wpisujemy
Kod
<? Header('Content-Type: application/rtf') ?>

! Ważne jest, aby między znakiem ">" a "{" nie było spacji.
Jednym słowem dokument powinien rozpoczynać się tak:
Kod
<? Header('Content-Type: application/rtf') ?>{rtf1...


Dodatkowo radzę odnaleźć wprowadzone w pkt 6 wywołanie zmiennych w celu sprawdzenia, czy po zapisie do formatu RTF nie zostało coś zmienione. Z tego co zauważyłem to dodawany jest jeden ukośnik przy line (line) w przypadku funkcji [php:1:8ee5bfa475]<?php echo str_replace('<br />', 'line', nl2br(StripSlashes($_POST['nazwa_zmiennej']))) ?>[/php:1:8ee5bfa475]
Oczywiście zbędne "dodatki" należy usunąć.


Uwagi końcowe
Podany opis powinien działać bez zarzutu, gdy strona kodowa formularza ustawiona jest na windows-1250. W przypadku kodowania iso-8859-2 konieczna jest dodatkowa zmiana polskich czcionek wprowadzanych do formularza na następujące kody:

Kod
"ą"=>"u261a"

"Ą"=>"u260A"

"ę"=>"u281e"

"Ę"=>"u280E"

"ć"=>"u263c"

"Ć"=>"u262C"

"ł"=>"u322l"

"Ł"=>"u321L"

"ń"=>"u324n"

"Ń"=>"u323N"

"ś"=>"u347s"

"Ś"=>"u346S"

"ź"=>"u378z"

"Ź"=>"u377Z"

"ż"=>"u380z"

"Ż"=>"u379Z"


Jak to zrobić? Nie wnikałem, mi wystarczy kodowanie windows-1250 smile.gif Najważniejsze problemy mamy (chyba) za sobą.

Mam nadzieję, że powyższe informacje komuś się przydadzą biggrin.gif

@Vir
chfast
A ja tak z ciekawości chciałbym zapytać do czego się wykorzystuje pliki RTF?
Vir
RTF (Rich Text Format) jest formatem dokumentów. Nie jest to jednak język znaczników, który mógłby być użyty do ręcznego zakodowania całego dokumentu (choć jest to możliwe). Według założeń jego twórców, RTF jest formatem danych, które mogą być odczytywane i zapisywane przez aplikacje dowolnego rodzaju. Założenia te zostały spełnione: obecnie setki aplikacji korzysta właśnie z tego formatu. Elastyczność RTF sprawia, że jest to idealny format do wielu zastosowań i może być wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia słowników na podstawie baz danych słów.

Ź r ó d ł o: RTF. Leksykon kieszonkowy, Wyd. Helion (www.helion.pl)
chfast
Jakieś przykłady praktycznego wykorzystania?
orson
witam ...

kazdy program ma dolaczona na plycie instrukcje w pliku rtf [ostatnio czesciej pdf] ... to jest tak jak doc ale jest otwarty wiec mozna wymieniac dokumenty pomiedzy platformami

cya
Seth
Vir: a moze zrobil bys z tego artykul i wzucili bysmy do php.pl ?
Vir
Spróbować zawsze można biggrin.gif Ciekawe, czy podołam zadaniu...
Napiszę PW z pytaniami, które mi się nasuwają z związku z napisaniem takiego artykułu.
matic
Taki artykuł już istnieje:
http://www.phpsolmag.org/pl/files/forms_pl_hi.pdf (HI - 1.2MB)
http://www.phpsolmag.org/pl/files/forms_pl_lo.pdf (LO - 0.4MB)
Vir
Cytat

Istnieje i takie rozwiązanie, jak to przedstawione w artykule, do którego podałeś linki. Czytałem ten artykuł przed opisaniem powyższego rozwiązania. Ponadto przedstawiony we wspomnianym przez Ciebie artykule sposób jest pewną modyfikacją/rozszerzeniem tego co już dawno można było przeczytać np. w książce "php i MySQL. Programowanie sieci Web" wyd. Robomatic.
Nie sądzę w żadnym wypadku, że jest to złe rozwiązanie, przecież działa ;-) natomiast to, które opisałem wydaje mi się być lepsze.
Pod pojęciem lepszego rozwiązania rozumiem jego prostotę (wbrew temu jakie wrażenie może wywrzeć pierwsze czytanie tego postu) - nie ma konieczności pisania dodatkowych skryptów, dzięki wprowadzaniu kodu php bezpośrenio do dokumentu RTF nie krążymy po skryptach tylko wszystko wpisujemy bezpośrenio w miejscu, gdzie mają pojawić się dane. Łatwiej nam poradzić sobie z wartościami przekazywanymi z checkbox-ów, znakami nowej linii w polach textarea...
O tym w artykule, który mam nadzieję jednak powstanie biggrin.gif
matic
Ty miales ksiazke. Inni nie wiedzieli do czego bijesz, wiec pokazalem cos gdzie mozna uzyskac szczegolowe info. dot. tego tematu.
Twoj post to rozszerzenie, wiec Ty wiesz co chciales przekazac. Majac podstawy reszte mozna juz samemu stworzyc w miare potrzeb.
pieto
Hej, witam, Poważny problem Jak zminienić formatowanie tekstu tj bold, italic, underline itp. bo problem jest w tym ze w html jest <b>BOLD</b>, a jak przerobić to na rtf ?
FiDO
www.wotsit.org

Tam jest specyfikacja RTF i sa opisane wszystkie znaczniki.
pieto
Nie za bardzo idzie się połapać, teraaz chodzi mi o tabele może komuś udało się skonstruować takie cuś ?
madalena
Witajcie
Ja mam Pytanie nastepującej treści
Mam w bazie kontrahentów z ich szczegółowymi danymi, a chciałbym aby wszystkie te dane wyswietlić w rtf i dodatkowo w tabeli

Liczba wierszy w tym przypadku byłaby różna

Jak to rozwiązać
Vir
http://forum.php.pl/index.php?showtopic=14659

Podobny problem miał Migacz.

Pozdrawiam
Fremd
Nie chcialbym irytowac VIR'a, ale jest tu expertem od RTF i byc moze pomoze mi zlokalizowac problem, z ktorym sie spotkalem.
Wykonalem wszystkie instrukcje jakie sa powyzej opisane i niestety efektu pozytywnego nie widac. Jesli wstawie
  1. <? Header('Content-Type: application/rtf') ?>
(bez spacji - jak w opisie) oczywiscie w notatniku lub innym programie nie czytajacym RTF to po otwarciu pliku.rtf przez Worda widac taki sam kod jak w notatniku. Oczywiscie po wygenerowaniu z przegladarki RTF'a widac wlasnie ten kod. Strona kodowa taka jaka polecal VIR, ustawienia w Apachu tez.
Proba byla wykonywana na lokalnym kompie, z wersja Worda 2002 SP3. Polskich czcionek nie uzywam, mam wszystko 'de'.

Temat mnie zaciekawil, wiec nie chcialbym go tak pozostawic. Uznanie dla VIR'a za artykow i informacje o RTF'ie.

Pozdrawiam @d@m
Vir
Spróbuj rozpocząć kod php znacznikiem <?php i wstawić ; po deklaracji nagłówka:
  1. <?php
  2. Header(&#092;"Content-Type: application/rtf\");
  3. ?>


Jak to nie pomoże to podeślij mi na PW kod dokumentu /mam nadzieję, że nie jest zbyt długi winksmiley.jpg /.

Rozwiązanie umieszcze na forum.

Pozdrawiam smile.gif

Edit:

Otrzymałem przesłany przez Ciebie kod dokumentu RTF.
Wszystko działa pięknie, ładnie...

W związku z powyższym wnioskuję, że problem leży po stronie serwera. Sprawdź jeszcze raz wszystkie dyrektywy konfiguracyjne serwera (AddType apaplication/x-httpd-php .rtf, AllowOverride FileInfo lub AllowOverride All itd.). Nie zapomnij go zrestartować winksmiley.jpg

Edit2 - do postu poniżej:
Chmm, ja też bezmyślnie wkleiłem powyżej kod z artykułu, w którym jak widać jest literówka tongue.gif Przy najbliżej okazji zgłoszę to do poprawki biggrin.gif
Pozdrawiam
Fremd
Istotnie problem lezal po stronie Apacha,

bezmyslnie skopiowalem
AddType apaplication/x-httpd-php .rtf

zamiast
AddType application/x-httpd-php .rtf

Dziekuje za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.