如何使用 idhttpserver 为浏览器响应 pdf?

How to respond with a pdf for browser with idhttpserver?

我有一个用 delphi7 制作的服务器应用程序,我正在使用 idhttpserver,当我网站的用户通过 GET 传递参数请求报告时,我希望用报告的 pdf 版本响应这个客户端,怎么可能我这样做?

您必须自己生成 PDF 报告,这超出了 Indy 的范围。只需确保以 thread-safe 方式执行此操作,因为 TIdHTTPServer 是一个使用工作线程处理客户端请求的 multi-threaded 组件。

TIdHTTPServer.OnCommandGet事件中,如果TIdHTTPServer.ParseParams为真,则可以通过ARequestInfo.Params 属性访问请求的参数,否则可以手动解析ARequestInfo.QueryParams属性。要将报告发送回客户端,您可以:

  1. 将报告保存到 .pdf 文件,然后调用 AResponseInfo.ServeFile() 方法。例如:

    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
       // handle request parameters...
       // generate PDF to file...
       AResponseInfo.ServeFile(AContext, 'C:\path to\report.pdf');
    end;
    
  2. 将报告保存到 TStream 对象,将其分配给 AResponseInfo.ContentStream 属性(TIdHTTPServer 将取得它的所有权),然后将 AResponseInfo.ContentType 属性 设置为 'application/pdf'。例如:

    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
       // handle request parameters...
       AResponseInfo.ContentType := 'application/pdf';
       AResponseInfo.ContentStream := TMemoryStream.Create;
       // generate PDF into ContentStream...
    end;