Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите создать mht-конвертер, mht2html 
:(
    Опции темы
beowulf
Дата 22.8.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.3.2006

Репутация: нет
Всего: 1



Прошу всех оказать посильную помощь в построении скрипта на пхп, отделяющего в mht-файле html от картинок и xml. Дело срочное.
PM MAIL WWW YIM   Вверх
Darhazer
Дата 22.8.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 7
Всего: 29



Вот Perl скрипт, надеюсь поможеть:

Код

#!/usr/bin/perl
use MIME::Base64;

#Set the file
$FileName = @ARGV[0];

#Read in the file & Strip \r
open(FILE, $FileName);
while($file_line = <FILE>){
  $file_line =~ s/\r\n/\n/;
  $file_contents .= $file_line;
}
close(FILE);

#Check for file
if(!$file_contents){
  print "Usage: mht2html.pl FILENAME - converts Microsoft MHT files to the html equivalent";
  exit;
}

#Parse out the MIME sections in the file
while($file_contents =~ /------=_NextPart(.*?)\n------=_NextPart/sg){
  $mime_section = $1;
 
  #Parse out the filename and content
  $mime_section =~ /Content-Location(.*)\/(.*?)\nContent/sg;
  $file_name = $2;
  $mime_section =~ /Content-Type(.*?)\n\n(.*)\n/sg;
  $content = $2;

  #Check for base64
  if($mime_section =~ /base64/){
    $content = decode_base64($content);
  }else{
    #Strip the MS garbage from the file
    $content =~ s/<!--\[(.*?)\]>(.*?)<!\[endif\]-->//sig;
    $content =~ s/<!\[(.*?)\]>//sig;
    $content =~ s/=3D/=/g;
    $content =~ s/=\n//gm;
    $content =~ s/src="(.*?)\/(.*?)"/src="$2"/sig;
  }
 
  #Write the new file
  open(FILE, ">$file_name");
  print FILE $content;
  close(FILE);
}


Это сообщение отредактировал(а) Darhazer - 22.8.2006, 17:20


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
beowulf
Дата 23.8.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.3.2006

Репутация: нет
Всего: 1



В принципе я уже написал. Только вот скажите пожалуйста как быть с картинками. Как записать из того места, где файлы картинок, чтобы эти какртинки нормально отображались. 
Возможно вопрос можно поставить так: как на пхп записать в файл определенной кодировкой. А Perl йа не знайу.
PM MAIL WWW YIM   Вверх
ewolf
Дата 23.8.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: 8
Всего: 18



Кстати, замечу, что mht по-сути представляет собой полный аналог мультипарт email (т.е. письмо, включающее в себя html, картинки и прочее), так что можно найти любой конвертер писем для php и использовать его для mht, думаю сгодится даже ( http://xpertmailer.sourceforge.net/ ), хотя и не пробовал. Смотри там пример в архиве pop3/showmail.php, если разберешься, думаю он тебе поможет
PM MAIL ICQ   Вверх
ewolf
Дата 23.8.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: 8
Всего: 18



В качестве эксперимента попробовал написать подобный конвертор (использую, как я говорил xpertmailer).

Хочу сразу заметить, что код написан просто для определения возможности конвертации, он очень грязный и не подходит для реальной работы, но все мои тестовые файлы обработал smile

Код извлекает все файлы из mht-архива и помещает их в указанную папку, передаваемую функции 2м параметром.

В дальнейшем возможно нужно будет обрабатывать ссылки в извлекаемых html-файлах, чтобы они ссылались на соответвующие файлы архива.

Ниже привожу код и напоминаю, что он просто дан для примера

Код

<?php
    require_once('func.php');
    
    function mht2htm( $mht_source, $dir )
    {            
        $msg = FUNC::split_content( $mht_source );
        
        // Обработка каждого составляющего раздела body
        foreach( $msg['body'] as $bpart )
        {
            $ctype = $encode = $disp = $fname = $data = false;
            //Обработка параметров
            foreach( $bpart as $bpart_name => $bpart_value )
            {
                // Для удобства преобразуем название параметра в нижний регистр
                $name = strtolower($bpart_name);
                                    
                switch( $name )
                {
                    case 'content-type': // Тип контента
                        $exp = explode('; ', $bpart_value);
                        $ctype = strtolower($exp[0]);        
                        
                        break;
                        
                    case 'content-transfer-encoding': // Способ кодирования контента
                        $encode = $bpart_value;
                        
                        break;
                    
                    case 'content-location': // Предполагаемое расположение файла контента
                        $fname = $bpart_value;
                        
                        break;
                    case 'data': // Данные
                        $data = $bpart_value;    
                }
            }
            
            // Теперь выполняем соответствущее действие на контентом
            
            // Определяем имя файла
            $name_parts = explode('/', $fname);
            
            if( count($name_parts) == 7 )
            {
                $dir_name = $name_parts[5];
                $file_name = $name_parts[6];
            }
            else
            {
                $dir_name = '';
                $file_name = $name_parts[5];
            }
            
            $file_data = FUNC::decode_content($bpart_value, $encode);
            
            $old_path = getcwd();
            chdir($dir);
            
            if( (!file_exists($dir_name)) && ($dir_name != '') )
            {
                mkdir($dir_name, 0755);
                chdir($dir_name);
            }
            elseif( file_exists($dir_name) && ($dir_name != '') )
                chdir($dir_name);
            
            $f = fopen($file_name, 'w');
            fwrite($f, $file_data);
            fclose($f);
            
            if( $dir_name != '' )
                chdir('..');
            
            chdir($old_path);            
        }
        
        return true;
    }

    
    mht2htm(file_get_contents('test1.mht'), getcwd());
    
    echo 'All Done';
    
?>

PM MAIL ICQ   Вверх
beowulf
Дата 24.8.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.3.2006

Репутация: нет
Всего: 1



Спасибо
PM MAIL WWW YIM   Вверх
ISQman
Дата 14.7.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Всем привет! решил воспользоваться данной темой (хоть и старая она) но лучше в нете решения я пока не нашёл.
Проблема заключается со скриптом, написанным выше на перле, он не распаковывает файлы типа sheet001.htm, которые являются книгами в текущем документе. и собственно есть ли решение данной проблемы?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.