Win32prn para PDF

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Win32prn para PDF

Mensagem por Linguagemclipper »

Existe alguma forma de salvar um objeto criado com Win32prn() como PDF sem apelar para imprimir na MICROSOFT PRINT TO PDF ou não tem como?
Tem como salvar esse objeto criado com a Win32prn em arquivo? Qual seria a sua extensão apropriada (o que ele é? GhostScript? PostScript?) ? Como abrir ele depois?
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Win32prn para PDF

Mensagem por alxsts »

Olá!

O código fonte mostrado no tópico a seguir mostra como gerar e salvar o arquivo PDF: Gerar PDF
Espero que ajude.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Win32prn para PDF

Mensagem por Linguagemclipper »

Não era bem isso. Já sei dessa lib.
Eu quero salvar o arquivo da WIN32PRN, mas não consigo sem um driver de impressora PDF.
Tentei mexer no fonte, mas não deu certo...

METHOD StartDoc(cDocName,lSAVE)
...
No método:

Código: Selecionar todos

METHOD StartDoc(cDocName, lSAVE) CLASS WIN32PRN
  LOCAL Result:= .F.
  IF cDocName == NIL
    cDocName:= GetExeFileName()+" ["+DTOC(DATE())+' - '+TIME()+"]"
  ENDIF
  IF EMPTY(lSAVE)
	lSAVE := .F.
  ENDIF
  IF (Result:= StartDoc(::hPrinterDc, cDocName, lSAVE))
    IF !(Result:= ::StartPage(::hPrinterDc))
      ::EndDoc(.T.)
    ELSE
      ::Printing:= .T.
    ENDIF
  ENDIF
  RETURN(Result)
No C#:

Código: Selecionar todos

HB_FUNC_STATIC( STARTDOC )
{
  HDC hDC = (HDC) hb_parnl(1) ;
  DOCINFO sDoc ;
  BOOL Result = FALSE;
  BOOL lSAVE = hb_parnl(3) ;
  if (hDC )
  {
    sDoc.cbSize= sizeof(DOCINFO) ;
    sDoc.lpszDocName= hb_parc(2) ;    
	sDoc.lpszOutput = NULL ;
	if (lSAVE) {
		sDoc.lpszOutput = hb_parc(2) ;
		}
    sDoc.lpszDatatype= NULL ;
    sDoc.fwType      = 0 ;
    Result = (BOOL) (StartDoc(hDC, &sDoc)  >0 ) ;
  }
  hb_retl(Result);
}
Descobrí que esse "sDoc.lpszOutput = NULL ;" manda pra impressora porque é NULL, mas para gravar em arquivo é só colocar o nome do arquivo aí.
Acontece que tinha que ver como fica esse "sDoc.lpszDatatype= NULL ;" pra colocar um EMF, PS, sei lá... e nessa parte complicou.

Está dando "Error BASE/1004 Método não exportado: NEW"... entendí nada.
Não entendo bem dessas coisas de classe/metodo e C, mas acho que seria mexendo por aí, mas nem conseguí testar o bicho que deu erro logo no início.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Win32prn para PDF

Mensagem por rochinha »

Amiguinhos,

Linguagemclipper, não tenho este .PRG comigo mas te pergunto se você criou o método StartDoc e a função StarDoc.

Pode acontecer uma recursividade e o método tentar chamar a si mesmo.

Mude a função para StartDocC e no método StartDoc mude a chamada desta função para StartDocC.

Recompile e teste.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Win32prn para PDF

Mensagem por Itamar M. Lins Jr. »

Olá!
Para transformar em PDF, é preciso que o sistema operacional tenha o "engenho" que faça a leitura do que é enviado para o gerenciador de impressão.
O Windows não tem, por isso precisamos instalar algum "engenho" extra. Quem sabe se o win11 vai ter isso ?
Então essa conversão não é possível. A mesma coisa querer usar via sistema operacional DBF, PNG, SVG, CAD, DOCX, XMLX etc... precisa de um programa extra para isso.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Win32prn para PDF

Mensagem por Itamar M. Lins Jr. »

Olá!
Outra coisa C# "Cê SHARP" é uma linguagem que não tem nada a ver com C nem com C++
Harbour usa C, não usa C# ok? C ANSI, não é qualquer sintaxe C(particular) que existem em vários compiladores pelo mundo.

C# é uma linguagem nos moldes do Object Pascal + Java... Quando vc escreve C# é para tecnologia .NET da Microsoft.
Estou escrevendo isso, pq vc postou no grupo internacional e um rapaz disse que tinha um exemplo em C#... Que é outra coisa EXTERNA ao Harbour.
Vai precisar usar (!)RUN, hb_processRun... para a dica do rapaz lá em C#.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Win32prn para PDF

Mensagem por Itamar M. Lins Jr. »

Olá!
Me corrigindo!
I use COM to do this kind of thing with C#. I have a C# project with the basics to get started with creating a C# COM dll. On the Harbour side you use win_oleCreateObject() to create the COM object and then call methods on the object.
Então via OLE usando Harbour vai. É Harbour não é xHarbour.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Win32prn para PDF

Mensagem por rochinha »

Amiguinhos,

Nativamente código-puro é possivel gerar PDF à partir de uma saída TeXTo.

nfPDF - Gera arquivos Portable Document File. PDF

De outras formas usando bibliotecas como HaruPDF etc.

A Automação OLE usando Word e passando o conteúdo e acionando SaveAs com saída PDF.

De qualquer forma os driver de impressora possibilitam estas saídas mas criam dependência de tê-las instaladas nas máquinas alvo.

Possibilidades existem, só dá trabaio pra encontrar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Win32prn para PDF

Mensagem por Itamar M. Lins Jr. »

Olá!
HaruPDF
Pois é, nativamente o Harbour tem isso.
Mas o sistema operacional não tem.
Ele quer mandar imprimir em PDF pelo sistema operacional em arquivo e o windows não tem isso. Alias o windows não tem nem para ele mesmo. Não é possível salvar uma impressão na extensão nativa(da impressora) que nem sei qual é. Será convertido para alguma extensão. XPS etc...
Usando a Microsoft Print to PDF, pergunta o nome do arquivo por exemplo. Mas é uma coisa EXTRA.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Win32prn para PDF

Mensagem por Linguagemclipper »

A linguagem é PostScript (.ps) mesmo que GhostScript.
Eu compilo cpp com o BCC55 ou 58 e achei que era C#
Se vocês verem o fonte do win32prn vai ver que tem um "sDoc.lpszOutput" que é o que salva em arquivo.
Eu tentei fazer uma manobra aqui, mas não deu certo... acho que só se eu mudar direto no fonte do Harbour mesmo.

Código: Selecionar todos

// SALVAR EM ARQUIVO .PS
#pragma BEGINDUMP
#include <windows.h>
#include <winspool.h>
#include "hbapiitm.h"

HB_FUNC_STATIC( StartEMF )
{
  HDC hDC = (HDC) hb_parnl(1) ;
  DOCINFO sDoc ;
  BOOL Result = FALSE;
  if (hDC )
  {
    sDoc.cbSize= sizeof(DOCINFO) ;
    sDoc.lpszDocName= hb_parc(2) ;
    sDoc.lpszOutput = hb_parc(2) ;
	// sDoc.lpszDatatype= NULL ;
    sDoc.fwType      = 0 ;
    Result = (BOOL) (StartDoc(hDC, &sDoc)  >0 ) ;
  }
  hb_retl(Result);
}
#pragma ENDDUMP

METHOD StartEMF(cDocName) CLASS WIN32PRN
  LOCAL Result:= .F.
  IF cDocName == NIL
    cDocName:= GetExeFileName()+" ["+DTOC(DATE())+' - '+TIME()+"]"
  ENDIF
  IF (Result:= StartEMF(::hPrinterDc, cDocName))
    IF !(Result:= ::StartPage(::hPrinterDc))
      ::EndDoc(.T.)
    ELSE
      ::Printing:= .T.
    ENDIF
  ENDIF
  RETURN(Result)
Mas, eu teria esbarrado nesse "sDoc.lpszDatatype= NULL ;", pois não saberia completar a rotina para substituir NULL.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Win32prn para PDF

Mensagem por JoséQuintas »

Acho que está procurando a coisa errada.
Se tem o fonte pra winprn, só deixá-lo compatível com PDF.

Olhe em OOHG, porque lá pode escolher saída em winprn, pdf, excel, e sei lá mais o que.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder