德尔福 10.4快速报告 6. REST 应用程序打印失败

问题描述

我使用 Webbroker 在 Delphi 中创建了一个 REST 服务器。我的意图是将其用作标签打印机。客户端准备并发送详细说明打印机名称快速报告和变量的 JSON 请求。服务器读取 JSON,创建一个 tFrxReport 对象,加载必要的报告并填充变量。

这一切都令人钦佩,只是它不会打印到物理打印机。如果我选择 OneNote 作为我的目的地,标签将保存到桌面。如果我选择网络连接的打印机,则不会出现标签

我已经尝试过 PrintOptions.ShowDialog:=True 打印对话框显示,指示正确的打印机,但它没有打印。

如果有人有任何经验,你能指出我正确的方向吗?

function processjson(itm : sat; jtr : tJsonTextReader): sat;
var
idx : integer;
//itm : sat; // simple array type [idx,'val1','val2']
begin
setlength(itm,0);
idx:=0;
while jtr.Read do
  begin
  if jtr.TokenType = tJsonToken.PropertyName then
    begin
    setlength(itm,length(itm)+1);
    itm[idx].st_idx := idx;
    itm[idx].st_code := jtr.Value.ToString; // property name
    jtr.Read;
    itm[idx].st_desc := jtr.Value.Asstring; // property value
    inc(idx);
    end;
  end;
processjson := itm;
end;

function getPrinterInfo(pnam: string):printinfo_type;
var
ptr : printinfo_type;
idx : integer;
begin
ptr.idx := -1; //default printer
ptr.name := trim(pnam);
for idx := 0 to Printer.Printers.Count - 1 do
  if AnsiContainsText(Printer.Printers[idx],ptr.name) then
    ptr.idx  := idx;
result := ptr;
end;

procedure Ttfdq.tfdqactLabelAction(Sender: TObject; Request: TWebRequest;
          Response: TWebResponse; var Handled: Boolean);
var
post : simpleArray_type;
pdx,idx,iitm  : integer;
jtr  : tJsonTextReader;
sr   : tStringReader;
pish : string;
fr : tFrxReport;
thePtr : printinfo_type;
itm : sat;
tstprt : boolean;
begin
d.myHost   := 'http://' + Request.host + ':' + intToStr(Request.ServerPort);
d.hostIP   := Request.host;
d.Request  := Request;
d.Response := Response;
d.remAddr  := Request.RemoteAddr;
post       := explode(Request.Content);

tstprt := false;
pdx := isset(post,'json');
pish:='';
if (pdx >=0) then
  begin
  sr :=  tStringReader.Create(post[pdx].st_desc);
  jtr  := tJsonTextReader.Create(sr);
  while jtr.read do
    begin
    if jtr.TokenType = tJsonToken.StartObject then
       itm := processjson(itm,jtr);
    end;


if fileexists(itm[2].st_desc) then
  begin
  thePtr := getPrinterInfo(itm[1].st_desc);

  fr := tFrxReport.Create(nil);
  fr.LoadFromFile(itm[2].st_desc);

  // pre load any vars so report does not fail
  for idx := 0 to fr.Variables.Count-1 do
    fr.Variables.Items[iitm].Value := frText('');

  for idx := 4 to High(itm) do
    begin
    pish := pish + 'index of '+itm[idx].st_code+' = '+ intToStr (fr.Variables.IndexOf(itm[idx].st_code))+'<br>';
    iitm := fr.Variables.IndexOf(itm[idx].st_code);
    if iitm > -1 then
      fr.Variables.Items[iitm].Value := frText(itm[idx].st_desc);
    end;

if fr.PrepareReport then
    begin
    //fr.ShowPreparedReport;
    fr.PrintOptions.Printer := thePtr.name;
    fr.PrintOptions.PrnOutFileName := 'Trace Label';
    fr.PrintOptions.ShowDialog := tstprt;
    fr.ShowProgress := tstprt;
    fr.Print;
    end;
  fr.Free;
  end;

  Response.Content := pish ;

  end
else
  begin
  Response.Content := '<html>' +
    '<head><title>Label List</title></head>' +
      '<body>This is only used by print serve clients</p>'+
    '</body>' +
    '</html>';
  end;
end;

解决方法

问题出在这里:

fr.PrintOptions.PrnOutFileName := 'Trace Label';

我错误地认为这会在打印队列中添加描述。它实际上所做的是将报告发送到不确定状态:)