Brak formatowania po edycji pliku Word doc za pomocą PHP

0

Witam,

Mój problem wygląda następująco.
Mam sobie szablonik w formacie doc, w którym są meta tagi podmieniane później na odpowiednie wartości. Odpowiada za to prosty skrypt:

$str = file_get_contents('C:/wamp/www/outfile.doc'); //wczytuje zawartosc pliku

$str = str_replace('##imie##','Imię',$str); //podmieniam ##imie## na Imię
$str = str_replace('##nazwisko##','Nazwisko',$str); 

file_put_contents('C:/wamp/www/outfile2.doc', $str); //zapis pliku

Problem w tym, że w pliku outfile2.doc nie ma żadnego formatowania (czcionek, pogrubienia, kolorów, etc.), a były w pliku outfile.doc.
Czy jest może jakiś inny sposób, żeby wstawić jakiś tekst do pliku doc lub rtf i dowolnie go sformatować?

Z góry dziękuję za pomoc!

0

Próbowałeś tego dla RTF? Formaty binarne nie najlepiej się zachowują w operacjach tekstowych, otwiera Ci się to jakoś pewnie dzięki dobrej korekcie błędów Worda. W przypadku RTF możesz zawsze podejrzeć plik wynikowy pod jakimś edytorem tekstu (nie dokumentów), wtedy zobaczysz gdzie ewentualnie robisz błąd. O ile dobrze pamiętam to RTF jest wzorowany na TeXu.

1

.doc to binarny format
mógłbyś prawdopodobnie podmienić w ten sposób dane jeśli miałyby dokładnie tyle samo znaków, a w przeciwnym wypadku musiałbyś dokonać poprawek zgodnie ze specyfikacją formatu (która zdaje się nie jest otwarta)

łatwiej ci będzie z formatem .docx który jest zwykłym zipem zawierającym dokument w plain tekście i można względnie łatwo go przerobić wbudowanymi w php funkcjami

ale jeżeli się upierasz przy .doc to skorzystaj najlepiej z jakiejś biblioteki np http://phpword.codeplex.com/ (nie sprawdzałem)
// sorry - powyższa biblioteka jest chyba tylko do .docx'ów więc bez rewelacji ;)

0
Zjarek napisał(a)

Próbowałeś tego dla RTF? Formaty binarne nie najlepiej się zachowują w operacjach tekstowych, otwiera Ci się to jakoś pewnie dzięki dobrej korekcie błędów Worda. W przypadku RTF możesz zawsze podejrzeć plik wynikowy pod jakimś edytorem tekstu (nie dokumentów), wtedy zobaczysz gdzie ewentualnie robisz błąd. O ile dobrze pamiętam to RTF jest wzorowany na TeXu.

Tak, próbowałem z RTF, efekt ten sam. Ale kiedy otwieram plik wynikowy np. w notatniku to widzę tylko sam tekst, który jest też widoczny w wordzie, żadnych więcej informacji.

unikalna_nazwa napisał(a)

łatwiej ci będzie z formatem .docx który jest zwykłym zipem zawierającym dokument w plain tekście i można względnie łatwo go przerobić wbudowanymi w php funkcjami

Wiem, ale zależy mi na formacie .doc, aby plik można było otworzyć też w starszej wersji Office.

0

A zamienia Ci to dobrze?
Bo z tego co kojarzę to tekst w *.doc i tak jest rozdzielany co drugi znak czymś.

Hm, sprawdziłem, tak, nullem rozdzielany (choć to pewnie coś z unikodem, nie zagłębiam się w to jak to działa bajt po bajcie, a php zrozumie to "jak trzeba" (choć pod koniec dokumentu jest jakiś nagłówek DOCa literka po literce)).
http://prntscr.com/77naz/direct

To, że się kodowanie zepsuło to mniejsza o to, tak czy tak, Twoje ##imie## to raczej # # i m i e # # tylko zamiast spacji znak NULL

0

Nie mam dostępu do worda, jak możesz umieścić tutaj plik (RTF) wejściowy i wyjściowy to może postaram się coś pomóc. Openoffice może nie produkować plików RTF w ten sam sposób.

1
sampi napisał(a)

Tak, próbowałem z RTF, efekt ten sam. Ale kiedy otwieram plik wynikowy np. w notatniku to widzę tylko sam tekst, który jest też widoczny w wordzie, żadnych więcej informacji.

coś ściemniasz
u mnie plik .rtf zrobiony w wordpadzie wygląda tak:

{\rtf1\ansi\ansicpg1250\deff0\deflang1045{\fonttbl{\f0\fswiss\fcharset238{\*\fname Arial;}Arial CE;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 Test\par
\par
\pard\qc Pogrubione \b ##imie## ##nazwisko##\par
\par
\pard\qr\ul\b0 ##data##\ulnone\b\par
}

ze znakiem NUL na końcu i można normalnie w notatniku zmieniać treść - a skoro można w notatniku to str_replace w php też spokojnie sobie będzie radzić

tak czy inaczej - spokojnie znajdziesz bibliotekę do obsługi doca w googlach więc nie wiem o czym tu jeszcze dyskutujemy

0

Okazuje się, że niestety trochę naściemniałem niechcący :/ Wspomniane pliczki źródłowe stworzyłem sobie zapomocą polecenia

$str = "##imie## ##nazwisko""; 
file_put_contents('C:/wamp/www/outfile.doc', $str);

i mimo, że miały rozszerzenie .doc czy też .rtf to były cały czas plain textem, dlatego w notatniku nie było nic więcej...
Przepraszam za zamieszanie.

A problem wydaje się być rozwiązany. Skorzystam z boblioteki PHPWord do zamiany moich tagów. (http://phpword.codeplex.com)

Dzięjuję userowi unikalna_nazwa na naprowadzenie na właściwą drogę i pozostałym za pomoc! :)

Aha, a wspomniana biblioteka bez problemu zapisuje do formatu .doc, nie tylko .docx.

4

o.O

to ja zaraz sobie wkleję tekst jakiejś piosenki do pliku *.mp3 i spadam na forum pytać jak dokonać np. normalizacji głośności

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