![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
преобразовать doc и xls в pdf [D6, XP]
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]а зачем... лично я вот не вижу смысла, ну будет раннее связывание, ну чуток по быстрее вызовы будут проходить... меня и позднего скорость устраивает...