Delphi 将OpenOffice Calc文件导出为PDF时,如何尊重打印区域?

Delphi 将OpenOffice Calc文件导出为PDF时,如何尊重打印区域?,delphi,pdf,openoffice-calc,Delphi,Pdf,Openoffice Calc,这里有一个将OpenOffice文件保存为PDF的示例。我正在使用类似的代码将Calc文件保存为PDF。(将属性writer\u pdf\u Export更改为calc\u pdf\u Export就足够了) 不幸的是,代码没有考虑原始文件中定义的打印区域 我怎样才能做到这一点呢?扩展我以前的代码(它没有那么干净),我会尝试类似的方法(注意,我还没有测试过它)。第三个参数将导出的范围指定为TRect变量: procedure ExportCalcRangeToPDF(const ASourceF

这里有一个将OpenOffice文件保存为PDF的示例。我正在使用类似的代码将Calc文件保存为PDF。(将属性
writer\u pdf\u Export
更改为
calc\u pdf\u Export
就足够了)

不幸的是,代码没有考虑原始文件中定义的打印区域


我怎样才能做到这一点呢?

扩展我以前的代码(它没有那么干净),我会尝试类似的方法(注意,我还没有测试过它)。第三个参数将导出的范围指定为
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;

为了得到电子表格的打印区域,我这样做。(当然可以改进)


在指定要打印的单元格范围的位置使用PDF筛选器数据的属性就足够了。所有内容似乎都与PDF筛选器的属性有关,您需要指定要导出的内容的属性。请在这里留下一些反馈。不管它是否有效。我将对此做一个回顾,因为它不太好,保留一个硬编码的表名来获取单元格范围。它很有效。现在我需要用原始文件中定义的打印区域填充rect变量的方法。我会的,非常感谢您的帮助。+1,也许您可以使用
PrintArea:=Sheet.getPrintAreas[0]并像使用getCellRangeByPosition一样使用它(PrintArea.StartColumn,
;-)
  ...
  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
  ...