ここでは、OpenOffice ファイルを PDF に保存する例を示します。同様のコードを使用して、Calc ファイルを PDF に保存しています。writer_pdf_Export
(プロパティをに変更するだけで十分calc_pdf_Export
です。)
残念ながら、コードは元のファイルで定義された印刷領域を考慮していません。
どうやってやるの?
ここでは、OpenOffice ファイルを PDF に保存する例を示します。同様のコードを使用して、Calc ファイルを PDF に保存しています。writer_pdf_Export
(プロパティをに変更するだけで十分calc_pdf_Export
です。)
残念ながら、コードは元のファイルで定義された印刷領域を考慮していません。
どうやってやるの?
以前のコードを拡張して (これは可能な限りクリーンではありません)、次のようなことを試みます (まだテストしていないことに注意してください)。3 番目のパラメーターは、エクスポートされる範囲をTRect
変数として指定します。
procedure ExportCalcRangeToPDF(const ASourceFileURL, ATargetFileURL: string;
ASheetIndex: Integer; ARange: TRect);
var
CellRange: Variant;
StarOffice: Variant;
StarDesktop: Variant;
StarDocument: Variant;
FilterParams: Variant;
ExportParams: Variant;
ExportObject: Variant;
function CreateProperty(const AName: AnsiString; const AValue: Variant): Variant;
begin
Result := StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
Result.Name := AName;
Result.Value := AValue;
end;
begin
StarOffice := CreateOleObject('com.sun.star.ServiceManager');
StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop');
FilterParams := VarArrayCreate([0, 0], varVariant);
FilterParams[0] := CreateProperty('Hidden', True);
StarDocument := StarDesktop.LoadComponentFromURL(ASourceFileURL, '_blank', 0,
FilterParams);
CellRange := StarDocument.Sheets.getByIndex(ASheetIndex).getCellRangeByPosition(
ARange.Left, ARange.Top, ARange.Right, ARange.Bottom);
ExportParams := VarArrayCreate([0, 0], varVariant);
ExportParams[0] := CreateProperty('Selection', CellRange);
ExportObject := StarOffice.Bridge_GetValueObject;
ExportObject.Set('[]com.sun.star.beans.PropertyValue', ExportParams);
FilterParams := VarArrayCreate([0, 1], varVariant);
FilterParams[0] := CreateProperty('FilterName', AnsiString('calc_pdf_Export'));
FilterParams[1] := CreateProperty('FilterData', ExportObject);
StarDocument.StoreToURL(ATargetFileURL, FilterParams);
StarDocument.Close(True);
StarDesktop.Terminate;
StarDocument := Unassigned;
StarDesktop := Unassigned;
StarOffice := Unassigned;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExportCalcRangeToPDF(
'file:///C:/SourceFile.ods',
'file:///C:/TargetFile.pdf',
0,
Rect(1, 1, 2, 2)
);
end;
スプレッドシートの印刷領域を取得するには、次のようにします。(もちろん、改善可能です)。
...
Sheet: Variant;
PrintAreas: Variant;
...
...
Sheet := StarDocument.Sheets.getByIndex(0); // get the first sheet
PrintAreas := Sheet.getPrintAreas; // get print areas
CellRange := Sheet.getCellRangeByPosition(PrintAreas[0].StartColumn,
PrintAreas[0].StartRow, PrintAreas[0].EndColumn,
PrintAreas[0].EndRow); // Get range of the first print area
...