Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

преобразовать doc и xls в pdf [D6, XP]


Страницы:   1 2

matriza ©   (2008-06-27 10:53:00) 

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

знаю что произвести конвертацию из doc и xls в pdf можно как минимум тремя способами
1) использовать printout на виртуальный принтер создающий pdf
2) с использованием компонент FastReport
3) с использованием библиотеки adobepdfmakerx.dll

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

а вот два остальных способа поинтереснее но как их реализовать я не знаю... особенно интересно как сделать с помощью FastReport


Ega23   (2008-07-02 10:01:00) [1]

Вот тут посмотри, вроде народ по делу обсуждает
http://www.sql.ru/forum/actualthread.aspx?tid=405083


Ega23   (2008-07-02 09:58:00) [2]


> если вы не хотите рассказать как это сделать может все таки
> намекнете как это делать???


А я и не знаю. Задачи такой никогда не стояло, а "просто так" делать у меня тупо времени нет. Но наверняка как-то можно.

Просто в ОО действительно есть экспорт в pdf. Когда понадобилось excel-файл в pdf перегнать, то так и сделали: открыли в ОО, сохранили в pdf.


matriza   (2008-07-02 08:15:00) [3]

все равно не могу разобраться с OpenOffice

вобщем есть такой модуль

{=============================================================================== =
Copyright (C) 1997-2003 Mills Enterprise

Unit     : OpenOfficePDF
Purpose  : This unit provides a single class to enabled the programmer to create a PDF
         document through the OpenOffice.Org API.  This unit is provided as freeware
         please use at your own risk.  This file can be found as a part of the rmControls
         library
Date     : 07-25-2005
Author   : Ryan J. Mills
Version  : 1.93
================================================================================ }

unit OpenOfficePDF;

interface

uses ComObj, Variants, sysutils;

type
 TOOoWriter = class(TObject)
 private
   fOpenOffice : Variant;
   fDocument : Variant;
   fConnected : boolean;
   fDocumentOpened : boolean;
   fDesktop : Variant;
   fHTMLSrc : boolean;

   function MakePropertyValue(PropName:string; PropValue:variant):variant;
 public
    Constructor Create;
    destructor Destroy; override;

    function Connect : boolean;
    procedure Disconnect;

    function OpenDocument(Filename:string):boolean;
    procedure SaveToPDF(FileName:string);
    procedure CloseDocument;
 end;

implementation

uses
  ActiveX;

{ TOOoWriter }

procedure TOOoWriter.CloseDocument;
begin
   if fDocumentOpened then
   begin
      fDocument.Close(false);

      fDocumentOpened := false;
      fDocument := Unassigned;

      fDesktop.Terminate;
      fDesktop := UnAssigned;
   end;
end;

function TOOoWriter.Connect: boolean;
begin
   if  VarIsEmpty(fOpenOffice) then
       fOpenOffice := CreateOleObject('com.sun.star.ServiceManager');

   fConnected := not (VarIsEmpty(fOpenOffice) or VarIsNull(fOpenOffice));
   Result := fConnected;
end;

constructor TOOoWriter.Create;
begin
 inherited;
 CoInitialize(nil);
end;

destructor TOOoWriter.Destroy;
begin
 CoUninitialize;
 inherited;
end;

procedure TOOoWriter.Disconnect;
begin
   if fDocumentOpened then
      CloseDocument;

   fConnected := false;
   fOpenOffice := Unassigned;
end;

function TOOoWriter.MakePropertyValue(PropName: string;
 PropValue: variant): variant;
var
  Struct: variant;
begin
   Struct := fOpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
   Struct.Name := PropName;
   Struct.Value := PropValue;
   Result := Struct;
end;

function TOOoWriter.OpenDocument(Filename: string): boolean;
var
  wProperties : Variant;
  wViewSettings : Variant;
  wController : Variant;
begin
  if not fConnected then
     abort;

  fDesktop := fOpenOffice.createInstance('com.sun.star.frame.Desktop');

  wProperties := VarArrayCreate([0, 0], varVariant);
  //wProperties[0] := MakePropertyValue('Hidden', True);
  wProperties[0] := MakePropertyValue('Hidden', 'MS Word 97');

  fDocument := fDesktop.loadComponentFromURL('file:///'+ StringReplace(FileName, '\', '/', [rfIgnoreCase, rfReplaceAll]) , '_blank', 0, wProperties);

  fDocumentOpened := not (VarIsEmpty(fDocument) or VarIsNull(fDocument));

  fHTMLSrc := pos('.htm', lowercase(extractfileext(Filename))) > 0;

  if fDocumentOpened and fHTMLSrc then
  begin
    wController := fDocument.Getcurrentcontroller;
    if not (VarIsEmpty(wController) or VarIsNull(wController)) then
    begin
       wViewSettings := wController.getviewsettings;
       if not (VarIsEmpty(wViewSettings) or VarIsNull(wViewSettings)) then
          wViewSettings.ShowOnlineLayout := false;
    end;
    wViewSettings := Unassigned;
    wController := Unassigned;
  end;

  result := fDocumentOpened;
end;

procedure TOOoWriter.SaveToPDF(FileName: string);
var
  wProperties: variant;

begin
  if not (fConnected and fDocumentOpened) then
     abort;

  wProperties := VarArrayCreate([0, 3], varVariant);
  if fHTMLSrc then
     wProperties[0] := MakePropertyValue('FilterName', 'writer_web_pdf_Export')
  else
     wProperties[0] := MakePropertyValue('FilterName', 'writer_pdf_Export');

  wProperties[1] := MakePropertyValue('CompressionMode', '1');
  wProperties[2] := MakePropertyValue('Pages', 'All');
  wProperties[3] := MakePropertyValue('Overwrite', TRUE);

  fDocument.StoreToURL('file:///'+ StringReplace(FileName, '\', '/', [rfIgnoreCase, rfReplaceAll]), wProperties);
end;

end.


и вот код который использует модуль


unit OOUnit6;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,ComObj,ActiveX;

type
 TForm6 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
procedure MakePDF(InFileName, OutFileName:string);
   { Public declarations }
 end;

var
 Form6: TForm6;

implementation

uses StripStringUnit1, OpenOfficePDF;

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
var
inFilename,OutFilename : string;
begin
 inFilename := 'E:\Programming\work\Sources\other\crazy_mailer\coding\pdf\db\OpenOffice\Test2.d oc';
 OutFilename :='E:\Programming\work\Sources\other\crazy_mailer\coding\pdf\db\OpenOffice\test2 .pdf';
 MakePDF(infilename,OutFilename);
end;

procedure TForm6.MakePDF(InFileName, OutFileName:string);
var
  wWriter : TOOoWriter;
begin
  try
     wWriter := TOOoWriter.Create;
     try
       if wWriter.Connect then
       try
          if wWriter.OpenDocument(InFileName) then
          try
             wWriter.SaveToPDF(OutFileName);
          finally
             wWriter.CloseDocument;
          end;
       finally
          wWriter.Disconnect;
       end;
     finally
        wWriter.free;
     end;
  except
     on e:exception do
     begin
        Showmessage(e.message);
     end;
  end;
end;
end.



на выходе получается пдф-файл... но при открытии в акробате он пишет что файл поврежден если открыть пдф-файл в Writer то файл открывается

но мне нужно чтобы он открывался в акробате без проблем

оч надеюсь на вашу помощь...


matriza   (2008-06-29 11:58:00) [4]

>Ega23 ©   (27.06.08 18:10) [34]

примеров конечно много нашел и узнал основы работы с OpenOffice

но так и не могу добраться до экспорта в pdf...

если вы не хотите рассказать как это сделать может все таки намекнете как это делать???


matriza   (2008-06-27 18:25:00) [5]

ясна =) спасибо огромное =) нашел на delphimaster пример =) через несколько часов буду у ноута испрбую...


Ega23   (2008-06-27 18:10:00) [6]


> а можно поподробнее???


OpenOffice + Google даст шикарные результаты.


matriza   (2008-06-27 18:00:00) [7]

>Ega23 ©   (27.06.08 17:41) [31]

а можно поподробнее???

>salexn   (27.06.08 17:47) [32]

мне если честно также все меньше и меньше верится в это... в принципе из тех трех способов сработал только принтаут

с использованием библиотеки adobepdfmakerx.dll возможно тоже бы сработал но у меня не получилось импортировать данную библиотеку... хотя даже маленький примерчик нашел кода


salexn   (2008-06-27 17:47:00) [8]

>matriza
А что обрабатывать на OnGetValue? Какие данные "вживлять" в Fast? Я не представляю себе шаблон Fast и то, что он должен делать...


Ega23   (2008-06-27 17:41:00) [9]

OpenOffice умеет.


matriza   (2008-06-27 17:36:00) [10]

>salexn   (27.06.08 17:19) [28]

я почему то думал что можно заюзать фастовый обработчик OnGetValue(вроде бы как так называется в данную минуту с коммуникатора пишу посмотреть не могу точно)... думал как нибудь можжно подгрузить в него word и excel


matriza   (2008-06-27 17:20:00) [11]

также интересно как можно реализовать конвертацию с помощью FastReport??? говорят что пдф он может делать глючно но все равно интересно и лишним не будет =)


salexn   (2008-06-27 17:19:00) [12]

>matriza
Fast вряд ли тут помощник, т.к. он не сможет "поднять" excel\word файлы.


matriza   (2008-06-27 17:15:00) [13]

также интересно как можно реализовать конвертацию с помощью FastReport??? говорят что пдф он может делать глючно но все равно интересно и лишним не будет =)


matriza   (2008-06-27 17:11:00) [14]

ну а все таки... как программно можно реализовать конвертацию???
ради данной задачи не проблема поставить офис2007 учитывая скорость и качество пдф.... просто не хватает опыта что нужно делать после импорта tlb???


Anatoly Podgoretsky   (2008-06-27 14:58:00) [15]

> umbra  (27.06.2008 13:19:24)  [24]

Ну нужен, и не только он хорош, и сам офис тоже.


umbra   (2008-06-27 13:19:00) [16]


> SaveAsPDFandXPS.exe


Хорошая наверно штука, только вот к ней еще оффис 2007 нужен :))


Anatoly Podgoretsky   (2008-06-27 13:09:00) [17]

> Palladin  (27.06.2008 12:59:22)  [22]

Это был просто контрольный выстрел.
Я предпочитаю СОМ


Palladin   (2008-06-27 12:59:00) [18]

про OLE


Anatoly Podgoretsky   (2008-06-27 12:55:00) [19]

> Palladin  (27.06.2008 12:43:20)  [20]

Ты про OLE или COM говоришь?


Palladin   (2008-06-27 12:43:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо