Arquivo texto para pdf (hbpdf) com comandos ESC

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

athayde
Colaborador
Colaborador
Mensagens: 166
Registrado em: 14 Fev 2007 16:54

Arquivo texto para pdf (hbpdf) com comandos ESC

Mensagem por athayde »

Estava usando a hbvpdf em meus projetos desde que usava o harbour, mas para eliminar esses fontes a mais e velhos, adaptei a rotina para o harbour com hbhpdf (haru), pois não encontrei nenhum que usasse os códigos ESC, sei que o código esta meio sujo, mas esta ai se alguém quiser dar uma polida agradeço
Modo de Usar:

Código: Selecionar todos

   PdfDrawPageDOSNew( cArquivo, cNamePdf, 5, 1, lLandScape )

Função

Código: Selecionar todos

FUNCTION PDFDRAWPAGEDOSNew( cPRN, cPDFName,nMargem,nMargemTop,lLandScape )

LOCAL cBuffer := Space(2052), poz := 2052, cLinha, nLinha, nColuna
LOCAL hFile, nI, nII, cPRNMem
LOCAL oPdf, oPage

   oPdf := HPDF_New()
   HPDF_SetCompressionMode( oPdf, HPDF_COMP_ALL )

*** setando fontes 
   oCourier := HPDF_GetFont( oPdf, "Courier", "CP1252" )
   oCourierBold := HPDF_GetFont( oPdf, "Courier-Bold", "CP1252" )
      
*** tirar o ultimo eject para não gerar uma pagina em branco    
   cPRNMem := MEMOREAD( cPRN )
   IF SUBS(cPRNMem,Len(cPRNMem)-2,1)==CHR(12) 
      cPRNMem := SUBS(cPRNMem,1,Len(cPRNMem)-3)
      MEMOWRIT( cPRN, cPRNMem )
   ENDIF
	hFile := FOPEN( cPRN, 0 + 64 )
   IF hFile <> - 1
      tamanho=FSeek(hFile,0,2)
      FSeek(hFile,0)

      oPage := HPDF_AddPage(opdf)
      HPDF_Page_SetSize(oPage, HPDF_PAGE_SIZE_A4, IF(lLandscape=.T.,HPDF_PAGE_LANDSCAPE,HPDF_PAGE_PORTRAIT) )
      nAltura := HPDF_Page_GetHeight( oPage )
      nLargura := HPDF_Page_GetWidth( oPage )
   
      nLinha := nAltura
  
      lFirst = .T.

*     default         
      l8lp := .F.
      lComprimido = .F.
      lExpandido = .F.
      lNegrito = .F.

      DO WHILE .T.
         cLinha := RDSTR( hFile,@cBuffer,@poz,2052 )
         IF lFirst = .T. && tirando primeiro caracter que sempre vem um epsço em branco a mais
            lFirst := .F.
            cLinha = SUBS(cLinha,2)
         ENDIF
         IF LEN( cLinha ) = 0
            EXIT
         ENDIF

         nColuna = nMargem
         FOR nI=1 TO Len(cLinha)
            cCaracter := SUBS(cLinha,nI,1)
            // Codes of EPSON - Codigos EPSON

            nII = nI
            IF SUBS(cLinha,nI,3)==CHR(27)+"W"+CHR(1)
               lExpandido := .T.
               nI += 3
            ELSEIF SUBS(cLinha,nI,3)==CHR(27)+"W"+CHR(0)
               lExpandido := .F.
               nI += 3
            ENDIF
            IF SUBS(cLinha,nI,2)==CHR(27)+"G"
               lNegrito := .T.
               nI += 2
            ELSEIF SUBS(cLinha,nI,2)==CHR(27)+"H"
               lNegrito := .F.
               nI += 2
            ENDIF
            IF SUBS(cLinha,nI,1)==CHR(15)
               lComprimido := .T.
               nI ++
            ELSEIF SUBS(cLinha,nI,1)==CHR(18)
               lComprimido := .F.
               nI ++
            ENDIF
            // 8 linhas por polegada
            IF SUBS(cLinha,nI,2)==CHR(27)+"0"
               l8lp := .T.
               nI += 2
            ELSEIF SUBS(cLinha,nI,2)==CHR(27)+"2"
               // 6 linhas por polegada
               l8lp := .F.
               nI += 2
            ENDIF
            IF nII<>nI
               nI --
               LOOP
            ENDIF

                        // Eject
            IF cCaracter=CHR(12)
		         oPage := HPDF_AddPage(opdf)
               HPDF_Page_SetSize(oPage, HPDF_PAGE_SIZE_A4, IF(lLandscape=.T.,HPDF_PAGE_LANDSCAPE,HPDF_PAGE_PORTRAIT) )
               nAltura := HPDF_Page_GetHeight( oPage )
               nLargura := HPDF_Page_GetWidth( oPage )
					nLinha := nAltura
               EXIT
            ENDIF
            
*           padrao de colunas retrato   80 normal, 134 comprimido
*                             paisagem 113 normal, 192 comprimido
            nTamanho := 11
            nEspacamento := 7.43 &&(595/80) proporcao usada
            IF lComprimido = .T.
               nTamanho := nTamanho / 1.72
               nEspacamento := 4.30 &&(595/134)
               IF lExpandido = .T.
                  nTamanho := 11
                  nEspacamento := 7.43 &&(595/80)
               ENDIF
            ELSE   
               IF lExpandido = .T.
                  nTamanho := nTamanho * 2
                  nEspacamento := 14.87 &&(595/40)
               ENDIF
            ENDIF
            IF l8lp = .T.
               nEspLinha = 9.5
            ELSE
               nEspLinha = 12
            ENDIF   
            
   	      HPDF_Page_BeginText( oPage )
            IF lNegrito = .T.
               HPDF_Page_SetFontAndSize( oPage, oCourierBold,  nTamanho )
            ELSE   
               HPDF_Page_SetFontAndSize( oPage, oCourier,  nTamanho )
            ENDIF
            HPDF_Page_TextRect(oPage, nColuna, nLinha,nColuna+nTamanho, nLinha-nEspLinha, cCaracter, HPDF_TALIGN_LEFT, NIL)
            HPDF_Page_EndText( oPage )
            nColuna += nEspacamento
         NEXT
         nLinha -= nEspLinha

      ENDDO

      TRY
         HPDF_SaveToFile( oPdf, cPDFName )
      CATCH
         msgInfo("Problemas ao gerar o PDF, tente novamente.","Aviso !")
      END

      Fclose( hFile )
   ELSE
      Return .F.
   ENDIF
RETURN(.T.)   

[]s
Fernando
projeto hbNFe NFe para [x]Harbour venha fazer parte do time http://www.pctoledo.com.br/forum/viewforum.php?f=54
Harbour 3.2 + Hwgui (HBIDE)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Arquivo texto para pdf (hbpdf) com comandos ESC

Mensagem por lugab »

Oi, Athayde...

Eu gostaria de experminetar sua solução, pq não disponho de nenhuma outra q converta TXT pra PDF...

Para tanto, eu gostaria q vc informasse quais os .H, .CH e .LIB que devo incorporar ao programa

Um abraço,

gabriel
lugab
athayde
Colaborador
Colaborador
Mensagens: 166
Registrado em: 14 Fev 2007 16:54

Arquivo texto para pdf (hbpdf) com comandos ESC

Mensagem por athayde »

acredito que só a #include "harupdf.ch"
pois é como postei da hbhpdf
testa e da um toque

[]s
projeto hbNFe NFe para [x]Harbour venha fazer parte do time http://www.pctoledo.com.br/forum/viewforum.php?f=54
Harbour 3.2 + Hwgui (HBIDE)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Arquivo texto para pdf (hbpdf) com comandos ESC

Mensagem por Pablo César »

Oi Fernando, gostei do seu exemplo e tomei atribuição de fazer algumas implementações.

1. Trabalha com ESC tanto Epson como da HP
2. Auto-detecta:
                       a. Tamanho máximo de coluna
                       b. Total de páginas
                       c. Padrão de impressão (Epson ou HP)
3. Substitui a rotina que re-grava "tirar o ultimo eject para não gerar uma pagina em branco" por isenção.
4. Funciona tanto na linha de comando para apenas converter como também selecionável na tela em modo GUI
5. Disponibilizei a função RDSTR() da HwGui para este meu caso em HMG

Obrigado pela oportunidade de contribuição no exemplo que passou para todos nós.

Valeu !

Pretendo também melhorar com mais opções para o caso de linha de comando, adicionando mais parâmetros apenas para permitir com:

1. No_Load PDF
2 Setar nMargin
3 Setar NTop
4 Setar LandScape/Portrait
5. Forçar comandos ESC, Epson ou HP
Anexos
EpsonPDF.rar
(60.79 KiB) Baixado 258 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder