Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z generowanymi plikami *doc w php
Forum PHP.pl > Forum > PHP
Czadus
Witam. Skorzystałem z klasy zip() tworzącej w locie spakowane archiwa z pewną zawartością. Moją zawartością mają być pliki *doc, które aby otworzyć w MS WORD, najpierw trzeba wybrać dla nich odpowiednie kodowanie. Jak zrobić, jak generować takie pliki, aby nie mieć tego okienka??

Klasa wygląda następująco:
Kod
class zip {
  var $datasec      = array();
  var $ctrl_dir     = array();
  var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  var $old_offset   = 0;

  function addFile($data, $name) {
    $name  = str_replace('\\', '/', $name);
    $fr    = "\x50\x4b\x03\x04";
    $fr   .= "\x14\x00";            // ver needed to extract
    $fr   .= "\x00\x00";            // gen purpose bit flag
    $fr   .= "\x08\x00";            // compression method
    $fr   .= "\x00\x00\x00\x00";    // last mod time and date
    $unc_len = strlen($data);
    $crc     = crc32($data);
    $zdata   = gzcompress($data);
    $zdata   = substr(substr($zdata, 0, strlen($zdata)-4),2); // fix crc bug
    $c_len   = strlen($zdata);
    $fr .= pack('V', $crc);              // crc32
    $fr .= pack('V', $c_len);            // compressed filesize
    $fr .= pack('V', $unc_len);          // uncompressed filesize
    $fr .= pack('v', strlen($name));     // length of filename
    $fr .= pack('v', 0);                 // extra field length
    $fr .= $name;
    $fr .= $zdata;
    $fr .= pack('V', $crc);              // crc32
    $fr .= pack('V', $c_len);            // compressed filesize
    $fr .= pack('V', $unc_len);          // uncompressed filesize
    $this->datasec[] = $fr;
    $cdrec  = "\x50\x4b\x01\x02";
    $cdrec .= "\x00\x00";                // version made by
    $cdrec .= "\x14\x00";                // version needed to extract
    $cdrec .= "\x00\x00";                // gen purpose bit flag
    $cdrec .= "\x08\x00";                // compression method
    $cdrec .= "\x00\x00\x00\x00";        // last mod time & date
    $cdrec .= pack('V', $crc);           // crc32
    $cdrec .= pack('V', $c_len);         // compressed filesize
    $cdrec .= pack('V', $unc_len);       // uncompressed filesize
    $cdrec .= pack('v', strlen($name));  // length of filename
    $cdrec .= pack('v', 0);              // extra field length
    $cdrec .= pack('v', 0);              // file comment length
    $cdrec .= pack('v', 0);              // disk number start
    $cdrec .= pack('v', 0);              // internal file attributes
    $cdrec .= pack('V', 32); // external file attributes - 'archive' bit set
    $cdrec .= pack('V', $this->old_offset);
    $this->old_offset += strlen($fr);
    $cdrec .= $name;
    $this->ctrl_dir[] = $cdrec;
  }

  function file() {
    $data    = implode('', $this->datasec);
    $ctrldir = implode('', $this->ctrl_dir);
    return
      $data.$ctrldir.$this->eof_ctrl_dir.
      pack('v', sizeof($this->ctrl_dir)). // total # of entries "on this disk"
      pack('v', sizeof($this->ctrl_dir)). // total # of entries overall
      pack('V', strlen($ctrldir)).        // size of central dir
      pack('V', strlen($data)).           // offset to start of central dir
      "\x00\x00";                         // .zip file comment length
  }

  function tofile($name) {
    $f = fopen($name, "wb");
    fwrite($f, $this->file());
    fclose($f);
  }

  function todownload($name) {
    header("Content-type: application/octet-stream");
    header("Content-disposition: attachment; filename=$name");
    echo $this->file();
  }

}


Natomiast plik generuję w następujący sposób:
Kod
$dane = @mysql_fetch_array($zap);
$zip = new zip(); // tworzę nowy obiekt
$jeden = $dane['tytul_'.$ln];
$dwa = $dane['tresc_'.$ln];

$dane = "\n".$jeden."\n\n".$dwa;
//$dane = iconv("", "UTF-8", $dane);
$zip->addfile($dane, "tekst.rtf");
$zip->todownload("archiwum.zip");


Jakieś rady??

Częściowo doszedłem już do wniosku, iż wina leży w pobieranych danych z bazy. Bo gdy tekst nie zawiera polskich znaków, to wszystko jest ok, gdy jednak zawiera, wówczas pojawia się okno z wyborem kodowania. Ale co z tym dalej??
potreb
  1. <?
  2. header("Content-Type: application/vnd.ms-word");
  3. header("Expires: 0");
  4. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  5. header("content-disposition: attachment;filename=test.doc");
  6.  
  7. $fp  =  fopen("nicon.doc",  'w+');
  8. $str  =  "<B>This  is  the  text  for  the  word  file  created  through  php  programming</B>";
  9.  
  10. fwrite($fp,  $str);
  11.  
  12. fclose($fp);
  13. ?>
Czadus
Hej. Dzięki za info, jak tylko będę w pracy, sprawdzę, czy mi to pomoże i wówczas coś więcej napiszę. Dzięki
l0ud
Z tego co wiem, pliki doc są binarne i nie możesz od tak po prostu umieścić w nich tekstu, bo word potraktuje je jak zwykłe pliki txt. Już lepiej zapisuj to w txt i otwieraj w notatniku, bądź przyjrzyj się łatwiejszemu w implementacji formatu, jak chociażby rtf.
http://www.google.pl/search?hl=pl&q=rt...=Szukaj&lr=
Czadus
Same w sobie pliki *.rtf tworzę bez problemów, jednak problem jest ze znakami. Dane w bazie są w UTF-8, w pliku stworzonym mam same krzaki i nie wiem co z nimi zrobić. Nie wiem jakie mają mieć kodowanie, czy co w końcu z tym zrobić, aby było dobrze.

Skorzystałem z klasy http://www.phpclasses.org/browse/package/1805.html. Skryptu też nie mogę zrobić na sztywno ponieważ mam wersje językowe strony i znaki niemieckie także będą potrzebowały odpowiedniego kodowania. Czy ktoś miał już podobny problem z tą klasą co ja?? Może jakaś rada?? Pomoc??

Witam. Generują plik rtf, jednak mam problem z dwoma elementami. Z dodawaniem nowej linii, ale to akurat mało ważne na razie. Ale ważniejsze jest kotowanie. Dane w bazie mam w UTF-8. Wysyłając do pliku rtf zamieniam je albo na windows-1250, iso-8859-2 i inne, i nic nie dziala. Ciagle mam krzaki. Jak to przekodować, aby było oks. Mało tego, potrzebuje miec takie kodowanie, aby zarowno polskie, jak i niemieckie i angielskie teksty dobrze byly wyswietlane. Prosze o pomoc.

Tak tworzę sobie samego RTF-a

Kod
// pobieramy dane odnosnie pobieranego artykulu
$zap = @mysql_query("SELECT * FROM `prasa` WHERE `status`='1' AND `id`='".$numerArtykulu[0]."';");
$dane = @mysql_fetch_array($zap);
                                        
// niejawnie odsylamy usera do pliku, w ktorym wygenerowany zostanie plik PDF

$rtf = new rtf("./include/rtf_rtf_config.php");
$rtf->setPaperSize(5);
$rtf->setPaperOrientation(1);
$rtf->setDefaultFontFace(0);
$rtf->setDefaultFontSize(24);
$rtf->setAuthor("noginn");
$rtf->setOperator("me@noginn.com");
$rtf->setTitle("RTF Document");
$rtf->addColour("#000000");
                                        
$rtf->addText(iconv("UTF-8", "ISO-8859-2", $dane['tytul_'.$ln].'\n\n'));
$rtf->addText(iconv("UTF-8", "ISO-8859-2", $dane['tresc_'.$ln].'\n\n'));
$rtf->getDocument();


Nikt nie ma pomysłu??
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.