Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie plików RTF [Vir]
Forum PHP.pl > Wortal > Artykuły
scanner
Opinie na temat artykułu "Generowanie plików RTF"
migacz
Witam
Artykuł bardzo ciekawy. Pomógł mi rozwiązać parę problemów, ale mam jeszcze jeden, dla mnie b.istotny.
Otóż pobieram z bazy dane i muszę je wstawić do rtf w postaci tabeli
|Lp.|Nazwisko|Imie|
|1 |Kowalski |Jan |
|2 |Chrzna |Jan |
itd.
Oczywiście za każdym razem liczba osób jest inna. Gdzie wstawić pętlę by generowala nowe wiersze tabeli automatycznie, oraz by 1 wiersz tabeli był widoczny na każdej nowej stronie.
Z góry dzięki za jakąkolwiek pomoc
makay
Mama problemy z tworzeniem tego rtf wyskakuje mi [php:1:3ba0b4254e]Warning: Unexpected character in input: '' (ASCII=92) state=1 in c:program filesapache groupapachehtdocsadminm.rtf on line 1

Warning: Unexpected character in input: '' (ASCII=92) state=1 in c:program filesapache groupapachehtdocsadminm.rtf on line 1

Parse error: parse error, unexpected T_STRING in c:program filesapache groupapachehtdocsadminm.rtf on line 1


[/php:1:3ba0b4254e]
Co robie nie tak questionmark.gif
Vir
Sorki, że tak późno się odzywam i bez gotowych odpowiedzi, ale poczekajcie chwilę na nie - może jeszcze z 1 dzień bo komp łącznie z siecią tak mi szwankuje, że cudem piszę tego posta (o ile nie wywali mnie zaraz biggrin.gif ).

Ps.
Problemy są do rozwiązania smile.gif
Vir
Hi!

Na początek małe sprostowanie do arykułu smile.gif i sorki za "tasiemca".

Napisałem, że jedynie znaki { } oraz \ wymagają zamiany na tzw. sekwencje ucieczki. Teoretycznie zmianie powinny także podlegać wszystkie znaki o kodach ASCII powyżej 127. W praktyce nie stanowi to problemu bo po pierwsze - 99% tych znaków to hieroglify, których nie idzie wpisać do pola tekstowego w formularzu, po drugie - wpisanie np. tyldy (kod ASCII 152) nic nie knoci.

I jeszcze jedna kwestia, która wyszła dopiero na dniach po instalacji nowego systemu i oprogramownia (m.in. Office 2003).
W Office 2000 wpisanie w treści dokumentu RTF kodu php wraz z cudzysłowanimi (np. echo "bleble") wyglądało później (w czystym kodzie - po otwarciu np. w Notatniku) tak samo tzn. cudzysłów pozostawał cudzysłowem. Office 2003 przykłada się bardziej do roboty i zmienia cudzysłowy na sekwencje ucieczki. Taki kod może później szwankować, ponieważ nie będzie prawidłowo interpretowany. W związku z tym należy w momencie dodawania deklaracji nagłówka przejrzeć dla pewności wpisane funkcje - czy przypadkiem nie stało się tak jak wspomniałem. Nie powinno być to problemem mimo, że kod dokumentu RTF nie wygląda zbyt ciekawie winksmiley.jpg - klikasz CRTL+F i znajdujesz dane funkcje. Zmienione cudzysłowy (podane w formie sekwencji ucieczki - może być \'84 \'93 \'94), czy inne niechciane zmiany przywracamy do stanu pierwotnego.
Warto przy okazji wskazać na kolejną interesującą kwestię (powiązaną z powyższą). Otóż wprowadzane np. w Notaniku (zwykłym edytorze) cudzysłowy to tzw. cudzysłowy proste o kodzie ASCII 34 (<=127). Tak samo cudzysłów wprowadzany w formularzu na stronie internetowej będzie cudzysłowem prostym, a nie tym Word-owskim. Jednym słowem nie będzie sprawiał problemów.
Niektórzy pomyślą skoro nie cudzysłowów to użyję apostrofów. Tutaj też jest problem - po zapisaniu do formatu RTF są one zamieniane na oznaczenie \rquote.
Podsumowując konieczne jest sprawdzenie fukcji i ewentualne poprawienie ich.
Być może nie jest to kwestia wersji Office'a, tylko jego ustawień, tym niemniej będziecie wiedzieli w razie kłopotów o co biega winksmiley.jpg

Niektórym może przyda się informacja, że poszczególne znaki przyporządkowane kodom ASCII zarówno powyżej, jak i poniżej 127 możemy uzyskać konwertując dzięsiętną wartość kodu ASCII na liczbę szesnastkową (Hex, hexadecimal) i zapisując ją w formacie \'hh gdzie hh to wspomniana wartość Hex. W bardzo prosty sposób zrobimy to używając standardowego kalkulatora Windows-owego (wcześniej należy tylko przełączyć wygląd na profesjonalny - wpisujemy kod ASCII i klikamy na radiobutton-a Hex).

I w końcu odpowiem na Wasze maile smile.gif

Mail makay-a:

Sprawdź to co napisałem o zmianie cudzysłowów i apostrofów, sprawdź czy po otwarciu dokumentu np. w Notatniku wpisany przez Ciebie kod php nie został zmieniony podczas zapisu do RTF-a w inny sposób. Na 99% to wspomniany problem z Wordem. Może raczej nie problem tylko "kwestia techniczna" smile.gif


Mail migacz-a:

Sprawa jest do wykonania, ale jest pewne ale winksmiley.jpg - czytaj pkt. 1
Analizując zaprezentowane przeze mnie rozwiązanie widać, że kod dokumentu RTF znajduje się poza kodem php. Nie można dowolnie obrabiać kodu dokumentu RTF, "zapętlać" jego fragmentów np. tabel, a następnie "wyprintować" go. Można natomiast wywołać funkcją echo fragment dokumentu RTF, który wstawiony "w środku" zostanie prawidłowo zinterpretowany i wyświetlony. Może jaśniej zobrazuje to przykład z wykonaniem dokumentu, o który Ci chodzi - w którym jakieś dane pobierane są z bazy danych i wstawiane są do automatycznie generowanej tabeli.

A więc po kolei:
1) Po pierwsze będziesz musiał zajrzeć do specyfikacji RTF sad.gif w celu przyjrzenia się definiowaniu tabel
2) Otwórz czysty dokument, wpisz w nim np. xxx i zapisz jako dokument RTF
3) Otwieramy zapisany dokument RTF np. w Notatniku. Na początku wprowadzamy (zgodnie z informacjami z artykułu) deklarację nagłówka, a wraz z nim możemy wpisać funkcje odpowiedzialne za połączenie z bazą danych np.:

  1. <?php
  2.  
  3. Header('Content-Type: application/rtf'); $conn=mysql_connect('localhost', 'root') or die ('Nie mogę się połączyć z bazą.'); mysql_select_db('info', $conn); $result=mysql_query('select opis from dane', $conn);
  4.  
  5. ?>


następnie odnajdujemy (CTRL+F czy F3) wcześniej wpisany ciąg znaków (u nas było to xxx - sprawdź tylko, żeby nie był to ciąg zaraz bo definicji \title bowiem w tym miejscu zapisywany jest tytuł dokumentu - kolejne nasze xxx powinno być we właściwym miejscu). Ciąg tych znaków zmieniamy na funkcję php wyświetlającą poszczególne dane z bazy. Efekt zapytania zostaje "wkomponowany" w zdefiniowaną w kodzie RTF tabelę, którą wywołujemy poprzez użycie funkcji echo. Przykład:

  1. <?php
  2.  
  3. while ($myrow = mysql_fetch_assoc($result)) { echo 'trowd trgaph cellx1440 pardintbl ' .$myrow['opis'] .'cell row'; }
  4.  
  5. ?>


4) W wyniku wywołania w oknie przeglądarki tak "spreparowanego" dokumentu RTF ukaże nam się zwykły dokument, w którym będzie widniała jednokolumnowa tabela, a zawartość poszczególnych wierszy będzie stanowić zawartość pola 'opis' z bazy danych.

Teraz tylko musisz poczytać w specyfikacji RTF o tabelach, tak żeby stworzyć tabelę jaką potrzebujesz. Możesz także pobawić się w ten sposób, iż stworzysz w Wordzie tabelę, zapiszesz dokument w formacie RTF, a następnie przeglądając go w Notatniku zechcesz "wyłapać" definicję owej tabeli smile.gif

Co do wyświetlania pierwszego wiersza na każdej ze stron to myślę, że jest to zadanie z serii "mission impossible", ale mogę się mylić - pokombinuj, mam nadzieję, że Cię nakierowałem. Przyjrzę się jeszcze temu i w razie jak coś wymyślę to się odezwę.


Hmm, i tak wyszedł tekst dłuższy od artykułu smile.gif
Mam nadzieję, że pomogłem.

Pozdrawiam serdecznie i życzę miłej zabawy.
migacz
dzięki za odpowiedź. pocztalem troche o rtfie i pomału dochodzę do tego co chce osiągnąc. Dzięki
pieto
Witam, Może ktoś wymyśli sposób żeby rtfa można było zapisać po podaniu ścieżki i nazwy ?
z góry dzięki za każdą pomoc i pozdrawiam
Vir
Nie ma możliwości zapisania takiego pliku we wskazane miejsce na dysku usera (bo zakładam, że chodzi Ci o takie rozwiązanie), ponieważ php to język server-side. Możesz zrobić co najwyżej tak:

za
  1. <?php
  2. Header('Content-Type: application/rtf');
  3. ?>

dodaj:
  1. <?php
  2. Header('Content-Disposition: attachment; filename=nazwa.rtf');
  3. ?>


Pozdrawiam,
Vir
pieto
Ok, dzięki, to chyba się nie przyda
Vir
W związku z tym, że docierały do mnie w ostatnim czasie pytania (na PW) dotyczące różnych zagadnień z zakresu generowania dokumentów RTF postanowiłem niniejszym przedstawić publicznie smile.gif rozwiązania dwóch problemów poruszanych przez użytkowników do mnie piszących.
Przy okazji zwracam się z prośbą o nie pisanie w przyszłości PW z zapytaniem dotyczącym generowania dokumentu RTF, a umieszczanie go na forum, w tym wątku, tak aby inni mogli później skorzystać z udzielonej odpowiedzi.

Pierwsze zapytanie dotyczło formatowania tekstu. Odpowiedź: W celu sformatowania tekstu w generowanym dokumencie RTF należy zastosować polecenia formatujące (do znalezienia w specyfikacji RTF). Listę podstawowych poleceń formatujących przedstawiam poniżej:
\i kursywa
\b pogrubienie
\ul podkreślenie
\super indeks górny
\sub indeks dolny
\strike przekreślenie.

Kolejną poruszaną kwestią było wstawienie obrazka do dokumentu RTF.

Przykład wstawienia obrazka .gif to wywołanie funkcją echo wartości hex danego pliku graficznego poprzedzonej funkcją RTF deklarującą wstawiany typ danych:
  1. <?php echo &#092;"{pict pngblip 2sfjssfs9sfm00000000sf0034}\"; ?>

Wstawiona wyżej wartość hex jest przypadkowa. Podany przykład ma za zadanie wyświetlenie pliku .gif. Więcej szczegółow w specyfikacji.
Dodam tylko, że takie wstawianie obrazków ma sens jedynie wówczas, gdy objętość pliku graficznego jest niewielka. W przypadku wstawienia obrazka .jpg o objętości 12KB objętość całego pliku RTF rośnie do ok. 400 KB...

Jeżeli ktoś będzie potrzebował sposobu na konwersję pliku graficznego na wartość hex to poniżej zamieszczam źródło prostego pliku, którego wykonuje taką konwersję. Jego działanie sprowadza się do użycia funkcji bin2hex().

  1. <html>
  2. <head>
  3. <title>Bin2Hex</title>
  4. <style type=\"text/css\">
  5. body
  6.  {
  7. background-color: #f6f6f6;
  8. font-family: Verdana, monospace;
  9. font-size: 12px;
  10.  }
  11.  
  12. a
  13.  {
  14. color: #000000;
  15. text-decoration: none;
  16.  }
  17.  
  18. a:hover
  19.  {
  20. color: #696969;
  21.  }
  22.  
  23. </style>
  24. <script type=\"text/javascript\">
  25.  
  26. function zaznacz()
  27.  {
  28. document.getElementById('hex').select();
  29.  }
  30.  
  31. </script>
  32. </head>
  33. <body>
  34. <h5>Konwersja pliku to wartości hex</h5>
  35. <form enctype=\"multipart/form-data\" action=\"bin2hex.php\" method=\"post\">
  36. Plik do konwersji: <input name=\"file\" type=\"file\">
  37. <input type=\"submit\" value=\"Konwertuj\">
  38. <br /><br />
  39. <textarea cols=\"80\" rows=\"26\" id=\"hex\"><?php
  40.  
  41. if ( is_uploaded_file( @$_FILES['file']['tmp_name'] ) )
  42.  
  43. {
  44. $filename = $_FILES['file']['tmp_name'];
  45. $fd = fopen ($filename , &#092;"r\" );
  46. $data = fread ( $fd, filesize ( $filename ) );
  47. fclose ( $fd );
  48. print bin2hex($data);
  49. }
  50.  
  51. ?></textarea>
  52. </form>
  53. <a href=\"javascript:zaznacz()\">Zaznacz wszystko</a>
  54. </body>
  55. </html>
oksi
mam problem,
wykonuje wszystko tak jak jest podane w przykladzie podanym przez Vir'a, odnosnie tabeli. i nic.
zapisuje po wszytkich modyfikacjach ten plik jako plik.php i w przegladarce otwiera mi sie dodatkowe okno z komunikatem ze rozpoczeto pobieranie pliku nieznanego typu MIME.
Uzywam Mozilli PL 1.6.

w oknie tym mam do dyspozycji kilka opcji:
otworz za pomoca domyslenej aplikacji...
kiedy otwieram ten plik w domyslnej aplikacji, a w tym przypadku jest to edytor edHTML,
widze tylko kod z wynikiem zapytania w odpowiednim miejscu.

Jesli wybiore opcje zapisz, i zapisze ten plik z rozszerzeniem .rtf , uzyskuje poprawny dokument rtf z tabela

Czy istnieje mozliwosc, aby od razu zostal wygenerowany dokument rtf, bez koniecznosci dodawania rozszerzenia .rtf i zapisu na dysku?

Przepraszam, za tak dlugi tekst.
Prosze o wskazowke.
Vir
Cytat
zapisuje po wszytkich modyfikacjach ten plik jako plik.php

W rozwiązaniu tym chodzi o to, że pracujemy bezpośrednio na dokumencie RTF i zapisujemy dany plik z rozszerzeniem .rtf, a nie .php. Dzięki odpowiedniej konfiguracji serwera (o czym mowa w artykule) taki plik jest odpowiednio interpretowany i wyświetlany.
Mam nadzieję, że wyjaśniłem co nieco winksmiley.jpg

Pozdrawiam
oksi
Jak sformatowac wyniki zapytania z bazy
w postaci listy:
1.
a)
cool.gif
c)
....
w rtf?

prosze o wskazowki.
W dokumentacji jest strasznie duzo opcji i nie wiem od czego zaczac, i ktore z nich sa mi potrzebne.
pozdrawiam
Vir
Ciekawe pytanie smile.gif
Przez najbliższe 2 tygodnie mogę nie mieć czasu przyjrzeć się temu bliżej, ale możesz zacząć od poczytania o "List table" w specyfikacji RTF. Być może znajdziesz tam coś ciekawego.
Ostatecznie można to zrobić w samym php - jeżeli odczytujesz dane z bazy w pętli to również w pętli możesz wypisać kolejne cyfry 1,2... do tego dodać kropkę i znak tabulacji, czy jakiś podwójny odstęp... Można pokombinować winksmiley.jpg
Swoją drogą podglądając kod dokumentu RTF, który zawiera wypunktowanie widać, że zapisane są poszczególne cyfry i litery wypunktowania (wniosek - może nie da rady zrobić tego "automatem").
oksi
dzieki za wskazowki, sprobuje cos pobrobowac.

pozdrawiam:)
Kiler
mam pytanie o konfiguracje serwera przy tych plikach rtf :
IIS nie posiada ani pliku .htaccess ani httpd.conf
to są pliki z Apache
niestety z opisu nie wynika jak się te pliki rtf tworzy ani po co taka a nie
inna konfiguracja więc prosze o podpowiedz jak to robić na IIS.
Vir
AddType jest to dyrektywa w Apache'u za pośrednictwem której dodaje się nowe typy MIME o danym rozszerzeniu.
AddType application/x-httpd-php .rtf - AddType - dyrektywa, application/x-httpd-php - typ MIME, .rtf - rozszerzenie.
Dzięki temu dokumenty RTF zostaną skojarzone ze skryptami php.
Z tego co widziałema na php.net to jest opisane kojarzenie plików o danym rozszerzeniu ze skryptami php (.php)
i wydaje mi się, że w tym przypadku tak samo jak rozszerzenie .php należy dodać rozszerzenie .rtf.
A w zasadzie wrzucę rozwiązanie po angielsku (nie moje):
Cytat
In the management console, under the properties for the virtual (or default) web in the home directory,
go to home directory | application settings | configuration.
Click on "Add" and enter the path to the php.exe as it is set for .php files.
(For me this was C:\php\php.exe "%s" "%s"). Type .rtf as the extension and press OK.

W razie kłopotów pisz na grupie "Serwery WWW" > "IIS", tam powinni wiedzieć smile.gif
Jeżeli chodzi o tworzenie dokumentów RTF to tworzy je się "zwyczajnie" winksmiley.jpg W dowolnym edytorze obsługującym ten format tworzysz dokument, a następnie zapisujesz go z rozszerzeniem .rtf. Jeżeli dysponujesz programem Word to stworzenie takiego dokumentu nie różni się niczym od stworzenia "zwykłego" dokumentu, pozostaje tylko wspomniana kwestia zapisania go z roszerzeniem .rtf
samolot
Witam Wwszystkich . Jestem u Was nowy.
Znalazłem to hasło "Generowanie plików RTF" w Gogle i tak tu trafiłem Zainteresowany jestem specyfikacją plików RTF. Nie mogę jednak otworzyć odnosnika "Generowanie plików RTF". Mieli sie i mieli ,ale się nie otwiera. Czy jest inny sposób do dotarcia do niego?
wert1
pytanie nie do tego tematu :
jak Vir zrobił dwa posty które się nie połaczyły questionmark.gif?
pschemo
Witam,

bardzo zaciekawił mnie ten artykuł =]
Zrobiłem sobie fajny formularzyk który się generuje do rtfa =]

Teraz chciałbym więcej =]]
Obecnie sprawa wygląda tak:
Ktoś wypełnia formularz, zatwierdza naciskając przycisk, i generuje się plik rtf, widzimy pytanie czy chcemy zapisać czy otworzyć ten plik..

Ja jednak chciałbym zzipować ten plik rtf i dodać go jako załącznik mailowy..

Czy ktoś już może to robił?
Będę wdzięczny za pomoc =]

Pozdrawiam,
Przemek Kiesio
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.