将 OpenOffice Calc 文件导出为 PDF 时如何处理打印区域?

Posted

技术标签:

【中文标题】将 OpenOffice Calc 文件导出为 PDF 时如何处理打印区域?【英文标题】:How do I honor the print area when exporting OpenOffice Calc files to PDF? 【发布时间】:2012-05-21 13:51:08 【问题描述】:

Here 有一个将 OpenOffice 文件保存为 PDF 的示例。我正在使用类似的代码将 Calc 文件保存为 PDF。 (将属性writer_pdf_Export更改为calc_pdf_Export就足够了。)

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

我该怎么做?

【问题讨论】:

使用PDF过滤器数据的Selection属性就足够了,您可以在其中指定要打印的单元格范围。 【参考方案1】:

扩展我以前的代码(它不是尽可能干净)我会尝试这样的事情(注意我还没有测试过)。第三个参数指定导出范围为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 过滤器的Selection 属性有关,您需要为要导出的内容指定XCellRange。请在这里留下一些反馈。如果它有效与否。我会对此进行审查,因为保留一个硬编码的工作表名称来获取单元格范围并不是很好。 它有效。现在我需要用原始文件中定义的打印区域填充 rect 变量的方法。我正在处理,非常感谢您的帮助。【参考方案2】:

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

  ...
  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
  ...

【讨论】:

+1,也许你可以使用PrintArea := Sheet.getPrintAreas[0]; 并像getCellRangeByPosition(PrintArea.StartColumn, ... 一样使用它;-)

以上是关于将 OpenOffice Calc 文件导出为 PDF 时如何处理打印区域?的主要内容,如果未能解决你的问题,请参考以下文章

使用 xslt 过滤器从 Calc 导出时出现 OpenOffice 错误

尝试在 64 位 Windows-7 中从 c# 应用程序将 datagridview 导出到 OpenOffice Calc 时出现 cli 程序集错误

Openoffice-calc 无法更改列的日期格式

在 OpenOffice Calc 中过滤

是否可以将 Navision 5.0 导出到 Word/Excel 到 OpenOffice.org?

如何将多层 OpenOffice 绘图导出为多层 PDF 文件?