Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразовать doc в jpg, преобразовать doc в jpg + водяные знаки 
:(
    Опции темы
matriza
Дата 21.6.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую всех =)

Вобщем такая проблема...

Имеется три файла (один doc и  два xls)

1) doc файл, состоящий из трех страниц, нужно, соответствнно, преобразовать в три jpg-файла. Причем в третьем файле на месте определенной фразы или ниже ее нужно вставить водяной знак, ну или другими словами определенную картинку

2) с xls файлами, которые каждый состоят из одного листа нужно проделать такую же операцию... так как лист один преобразовать ее в один jpg-файли и на месте определенной фразы или ниже ее нужно вставить водяной знак...

знаю что нужно применять Word.Application Excel.Application и Canvas, но как именно происходит преобразование, а самое главное вставка водяного знака не знаю... и очень хотелось бы узнать как реализовать данную задачу




заранее огромное спасибо!!!
PM MAIL   Вверх
ne0n
Дата 21.6.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


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

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



Цитата(matriza @  21.6.2008,  18:17 Найти цитируемый пост)
хотелось бы узнать как реализовать данную задачу


т.е. Сделать за вас? smile 

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


Новичок



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

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



Цитата

т.е. Сделать за вас? 


нет... неверно...

натолкнуть как это сделать... если можно привести небольшой пример кода... а самое думаю сложное рассказать как вставить водяной знау в нужном месте...
PM MAIL   Вверх
ne0n
Дата 21.6.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


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

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



Цитата(matriza @  21.6.2008,  19:49 Найти цитируемый пост)
натолкнуть как это сделать

ладно попробуем натолкнуть)Для ворда вижу наиболее простое решение таким:
сохраняем файл как текствоый:
Код

procedure TForm1.Button1Click(Sender: TObject);
var

fname: string;

WordAppl, WordDoc: OleVariant;

begin
with TOpenDialog.Create(nil) do
try
 Filter := 'word documents (*.doc)|*.doc';
 if not Execute then Exit;
 fname := FileName;
finally
  Free;
end;

WordAppl := CreateOleObject('Word.Application');
try
  WordDoc := WordAppl.Documents.Open(fname);
  fname := ExtractFilePath(fname) + 'test.txt';
  WordDoc.SaveAs(FileName := fname,FileFormat := 2);
finally
  WordAppl.Quit;
end;
end;


cчитываем содержимое файла, и собственно для отрисовки поступаем так:
Код

 var
 JpegIm: TJpegImage;
 bm: TBitMap;
begin
 bm := TBitMap.Create;
 bm.Height:=100;
 bm.Width:=100;
 bm.Canvas.TextOut(20,20,'Текст Текст Текст');
 JpegIm := TJpegImage.Create;
 jpegim.Assign(bm);
 JpegIm.SaveToFile('C:\Screen.jpg');
 bm.Destroy;
 JpegIm.Destroy;



ну это так в общем виде.... для xls будет наверно посложнее...

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


Новичок



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

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



спасибо огромное за примеры =) 

сейчас пытаюсь сделать без перевода в текстовый формат чтобы не терялось форматирование ворда...

изображение должно получаться как отсканированное...

отрисовку думаю сегодня доделаю для ворда... для меня самым сложным кажется вставка водяного знака в нужное место документа... как я думаю это нужно делать во время отрисовки когда дойду циклом до нужной фразы но как именно вставить этот знак пока не знаю...
PM MAIL   Вверх
MetalFan
Дата 22.6.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



даю наводку: офис при копировании в буфер обмена содержания документа, позволяет получить его из буфера в разных форматах, в т.ч. в wmf,emf,bmp


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ne0n
Дата 22.6.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


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

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



Цитата(MetalFan @  22.6.2008,  08:53 Найти цитируемый пост)
офис при копировании в буфер обмена содержания документа, позволяет получить его из буфера в разных форматах, в т.ч. в wmf,emf,bmp


хм, интересно...я тут ради интереса порылся, и единственно ечто нашел это метод CopyAsPicture, о нем идет речь?

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


Новичок



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

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



я думаю да =) счс приведу пример что удалось пока написать... нехватает знание работы с word... очень мало работал с ним делал только примитивное создание документа... не могу понять как в ворд выделить все страницы или нужные мне страницы думаю что нужно применять WordDocument1.Range но пока не получается

вот код
Код

procedure TForm1.Button1Click(Sender: TObject);
var    
fil: OleVariant;
MetaFile : TMetafile; 
Bitmap : TBitmap;
begin
if OpenDialog1.Execute then
begin
  fil:=OpenDialog1.FileName;
  WordApplication1.Documents.Add(fil,EmptyParam,EmptyParam,EmptyParam);
  WordApplication1.Options.CheckSpellingAsYouType := False;
  WordApplication1.Options.CheckGrammarAsYouType := False;
  WordDocument1.Range.CopyAsPicture;
  //WordApplication1.Selection.CopyAsPicture;
  Clipboard.Open;
  {if Clipboard.HasFormat(CF_TEXT) then
     ShowMessage('áóôåð ñîäåðæèò òåêñò');
  if Clipboard.HasFormat(CF_BITMAP) then
      ShowMessage('áóôåð ñîäåðæèò èçîáðàæåíèå');
  if Clipboard.HasFormat(CF_METAFILEPICT) then
     ShowMessage('áóôåð ñîäåðæèò âåêòîðíîå èçîáðàæåíèå');
  if Clipboard.HasFormat(CF_PICTURE) then
     ShowMessage('áóôåð ñîäåðæèò îáüåêò òèïà TPicture');
  if Clipboard.HasFormat(CF_COMPONENT) then
     ShowMessage('áóôåð ñîäåðæèò êîìïîíåíò'); }
  Metafile := TMetaFile.Create;
  Bitmap := TBitmap.Create;
  try
   MetaFile.Assign(clipboard);
   with Bitmap do
   begin
    Height := Metafile.Height;
    Width := Metafile.Width;
    Canvas.Draw( 0 , 0 , MetaFile);
    Bitmap.SaveToFile('Test.bmp');
   end;
  finally
  Bitmap.Free;
  MetaFile.Free;
  end;

  Clipboard.Clear;
  Clipboard.Close;

  WordApplication1.Disconnect;
  end;    
end;    


было бы классно если бы кто нибудь объяснил про выделение страниц и если где то можно написать покорректнее также бы об этом рассказал

заранее огромное спасибо =)

буду дальше разбираться....  smile 
PM MAIL   Вверх
matriza
Дата 22.6.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вобщем научился я делать из первой страницы картинку 

Код

procedure TForm1.Button1Click(Sender: TObject);
var    
fil: OleVariant;
MetaFile : TMetafile; 
Bitmap : TBitmap;
JpegIm: TJpegImage;
begin
if OpenDialog1.Execute then
begin
  fil:=OpenDialog1.FileName;
  WordApplication1.Documents.Add(fil,EmptyParam,EmptyParam,EmptyParam);
  WordApplication1.Options.CheckSpellingAsYouType := False;
  WordApplication1.Options.CheckGrammarAsYouType := False;
  WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
  WordDocument1.Range.Select;
  WordDocument1.Range.CopyAsPicture;
  //WordApplication1.Visible := true;
  Clipboard.Open;
  {if Clipboard.HasFormat(CF_TEXT) then
     ShowMessage('áóôåð ñîäåðæèò òåêñò');
  if Clipboard.HasFormat(CF_BITMAP) then
      ShowMessage('áóôåð ñîäåðæèò èçîáðàæåíèå');
  if Clipboard.HasFormat(CF_METAFILEPICT) then
     ShowMessage('áóôåð ñîäåðæèò âåêòîðíîå èçîáðàæåíèå');
  if Clipboard.HasFormat(CF_PICTURE) then
     ShowMessage('áóôåð ñîäåðæèò îáüåêò òèïà TPicture');
  if Clipboard.HasFormat(CF_COMPONENT) then
     ShowMessage('áóôåð ñîäåðæèò êîìïîíåíò'); }
  Metafile := TMetaFile.Create;
  Bitmap := TBitmap.Create;
  try
   MetaFile.Assign(clipboard);
   with Bitmap do
   begin
    Height := Metafile.Height;
    Width := Metafile.Width;
    Canvas.Draw( 0 , 0 , MetaFile);
    //Bitmap.SaveToFile('Test.bmp');
    JpegIm := TJpegImage.Create;
    JpegIm.Assign(Bitmap);
    JpegIm.SaveToFile('Test.jpg');
   end;
  finally
  Bitmap.Free;
  MetaFile.Free;
  JpegIm.Free;
  end;

  Clipboard.Clear;
  Clipboard.Close;

  WordApplication1.Disconnect;
  end;    
end;    


а вот как добраться до третьей страницы пока не знаю....
PM MAIL   Вверх
MetalFan
Дата 22.6.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



вот что у меня получилось на позднем связывании:
код сохраняет рядом с исходным файлом страницы в отдельных BMPшках
Код

function ConvertMSWORDToImages( const AFileName: string ): Integer;
var
  lWord: Variant;
  lFN: string;
  lPages: Variant;
  lPageNum: Integer;
  lPage: Variant;
  lRect: Variant;
  lRange: Variant;
  i, j: longword;
  lBmp: TBitmap;
  lMF:  TMetafile;
begin
  Result := -1;
  lWord := CreateOleObject( 'Word.Application' );
  lBmp := TBitmap.Create;
  lMF := TMetafile.Create;
  try
    lWord.Documents.Open(FileName := AFileName, ReadOnly := True );
    lPages := lWord.ActiveDocument.ActiveWindow.Panes.Item(1).Pages;
    for i := 1 to lPages.Count do
    begin
//без этого изварата почемуто с первого раза не получался доступ к страницам > 1
      try
        lPages.Item(i);
      except
      end;
//конец изврата

      lPage := lPages.Item(i);
      for j := 1 to lPage.Rectangles.Count do
      begin
        lRect := lPage.Rectangles.Item(j);
        lRange := lRect.Range;
        lRange.CopyAsPicture;

        if Clipboard.HasFormat(CF_METAFILEPICT) then
        begin
           lMF.Assign( Clipboard );
            if not lMF.Empty then
            begin
              lBmp.SetSize( lMF.Width, lMF.Height );
              lBmp.Canvas.Draw(0,0, lMF );
              lBmp.SaveToFile( Format( '%s%s%d_%d.bmp', [ExtractFilePath(AFileName), ExtractFileName(AFileName), i, j]) );
              lMF.Clear;
              lBmp.Free;
              lBmp := TBitmap.Create;
            end;
        end;
      end;
    end;
  finally
    lBmp.Free;
    lMF.Free;
    lWord.Quit;
    lWord := Unassigned;
  end;
end;

код сырой. стоит вылизать.

Это сообщение отредактировал(а) MetalFan - 22.6.2008, 21:49


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
matriza
Дата 23.6.2008, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



огромное спасибо за пример =)

но у меня при обработке документа пишет такю ошибку "запрашиваемый номер семейства не существует" и ругается на эту часть функции

Код

      try    
        lPages.Item(i);    
      except    
      end;    


можжет нужно в uses что то особенное указать???
PM MAIL   Вверх
MetalFan
Дата 23.6.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



matriza, у меня тоже самое... возможно стоит попробовать зациклить обращение к lPages.Item до тех пор, пока не будет получена страница.
либо сделать ворд видимым... в этом случае у меня ошибки не возникало...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
matriza
Дата 23.6.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ладно... с вордом более мнее разобрались =) 

теперь сижу мучаю excel 

не могу найти что то похожее на CopyAsPicture в ворде...
PM MAIL   Вверх
MetalFan
Дата 23.6.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



да пофигу. используй просто Copy. судя по документации к VBA для ворда - это одно и то же.

Это сообщение отредактировал(а) MetalFan - 23.6.2008, 18:25


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
matriza
Дата 24.6.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



все таки вроде бы как в excel copy это не одно и то же

например применяя вот такой код 
Код

ExcelApplication1.Sheets.Copy(EmptyParam,EmptyParam,0);

и проверяя что будет в буфере обмена при проверке срабатывает то что в буфере текст а не картинка CF_TEXT

и проблемы при вставке рисунка 
Код

  Clipboard.Assign(Image1.Picture);
  vstart:=1;
  vend:=2;
  WordApplication1.Selection.InsertAfter('Ìýí Õóà');
  //i:=1;
  //WordDocument1.Frames.Item(i).Height:=Image1.Height;
  //WordDocument1.Frames.Item(i).Width:=Image1.Width;
  //WordDocument1.Frames.Item(i).Select;


те места что закомментированы не срабатывают
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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