Página 1 de 1

Arquivo texto para pdf (hbpdf) com comandos ESC

Enviado: 08 Set 2014 15:42
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

Arquivo texto para pdf (hbpdf) com comandos ESC

Enviado: 08 Set 2014 20:32
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

Arquivo texto para pdf (hbpdf) com comandos ESC

Enviado: 09 Set 2014 14:42
por athayde
acredito que só a #include "harupdf.ch"
pois é como postei da hbhpdf
testa e da um toque

[]s

Arquivo texto para pdf (hbpdf) com comandos ESC

Enviado: 27 Set 2014 21:57
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