【问题标题】:Delphi 10.4. Fast Report 6. REST application. Print Failure德尔福 10.4。快速报告 6. REST 应用程序。打印失败
【发布时间】:2021-07-09 09:48:07
【问题描述】:

我在 Delphi 中使用 WebBroker 创建了一个 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;

【问题讨论】:

  • 显示您的代码,尤其是在“如果我选择”附近,以便我们看到它如何成功地为 OneNote 变体创建文件,但无法在物理设备上开始打印。
  • 编辑显示代码

标签: rest delphi printing fastreport


【解决方案1】:

问题出在这里:

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

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

【讨论】:

  • 然后OneNote保存成功了?
  • @AmigoJack 是的,每当我创建一个打印到文件时,我都会得到一个输出。
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多