Página 1 de 1

Win32prn para PDF

Enviado: 15 Dez 2023 22:23
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?

Win32prn para PDF

Enviado: 16 Dez 2023 01:54
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.

Win32prn para PDF

Enviado: 22 Dez 2023 23:00
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.

Win32prn para PDF

Enviado: 27 Dez 2023 13:38
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.

Win32prn para PDF

Enviado: 27 Dez 2023 13:54
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.

Win32prn para PDF

Enviado: 27 Dez 2023 14:00
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.

Win32prn para PDF

Enviado: 27 Dez 2023 14:22
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.

Win32prn para PDF

Enviado: 27 Dez 2023 15:09
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.

Win32prn para PDF

Enviado: 27 Dez 2023 15:37
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.

Win32prn para PDF

Enviado: 17 Jan 2024 23:54
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.

Win32prn para PDF

Enviado: 19 Jan 2024 11:42
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.