/* ----------------------------------------------------------------------------- Main.Prg - Sistema gerador das informações pra a CenProt. - mr, janeiro/2019. ----------------------------------------------------------------------------- */ #include #require "hbhpdf" #include "hbclass.ch" #include "inkey.ch" #include // incluido pra testes / mr. #define PDF_PORTRAIT 1 #define PDF_LANDSCAPE 2 #define PDF_TXT 3 DECLARE DLL_TYPE_HBITMAP FastQRCode (DLL_TYPE_LPCSTR file, DLL_TYPE_LPCSTR path) IN QrCodeLib.dll //REQUEST HB_LANG_PT //REQUEST HB_CODEPAGE_PT850 Function Main PARAMETERS _xPht PRIVATE cCod := SPAC(10), ; cSen := SPAC(10), ; nUser := SPAC(10), ; Mdata := DATE(), ; TestesMario := .f. // .t.=testes de impressão em arquivo, .f.=impressora SET DELE ON SET CENT ON SET SOFT OFF SET DATE BRIT SET EPOC TO 1964 SET NAVIGATION EXTENDED SET BROWSESYNC ON SET EXCLUSIVE OFF //SET LANGUAGE TO PORTUGUESE // Para o 3.1.x (*) //REQUEST HB_CODEPAGE_PTISO //HB_CDPSELECT("PTISO") REQUEST HB_CODEPAGE_UTF8EX hb_cdpSelect( "UTF8EX" ) IF ! EMPT(_xPht) //msginfo(xPht) SET DEFAULT TO (_xPht) ENDIF REQUEST DBFCDX REQUEST DESCEND // Para forçar a linkedição, senão a função não sobe para o .EXE / Dica do Clipper on Line, 16/11/16. (3.x) RDDSETDEFAULT("DBFCDX") DBSETDRIVER("DBFCDX") Load Window Main Main.Center DOMETHOD("main","MAXIMIZE") // Para maximizar o form principal. Main.Activate Return //// FUNCTION Testa_PDF() LOCAL x, cMsg, oPDF, nLinha, nLenItem, nLenDescri, nLenUnit, nLenDescont, nLenTotal, nMaxCol, nMaxRow //REQUEST HB_CODEPAGE_UTF8EX //hb_cdpSelect( "UTF8EX" ) //REQUEST HB_CODEPAGE_PT850 //hb_cdpSelect("PT850") //REQUEST HB_CODEPAGE_PTISO //HB_CDPSELECT("PTISO") //hb_SetCodepage("PT850") //hb_CodePage_PTISO() //hb_CodePage_PT850() //hb_CodePage_PT860() //Hb_LangSelect("PT") //REQUEST HB_LANG_PT oPDF:=PDFClass() oPDF:Begin() oPDF:SetType( 2 ) oPDF:SetInfo('Mario','Sistema SAC','Teste PDF/A') oPDF:AddPage() nMaxCol := oPDF:MaxCol() nMaxRow := oPDF:MaxRow() oPDF:DrawText( 2.0, 42, PadC( "Cartório do Ofício Único de Deus Me Livre", nMaxCol - 80 ), Nil, 10, "Courier", Nil, Nil ) oPDF:DrawText( 3.5, 42, PadC( "CEP 21069-069 - DML-RJ", nMaxCol - 82 ), Nil, 10, "Courier", Nil, Nil ) oPDF:DrawText( 5.5, 42, PadC( "Tabelião: Joaquim José da Silva Xavier", nMaxCol - 95 ), Nil, 11, "Courier-Bold", Nil, Nil ) oPDF:DrawText( 7.5, 42, PadC( "www.oficiounico.com", nMaxCol - 80 ), Nil, 10, "Courier", Nil, Nil ) oPDF:End() RETURN NIL //// /* --------------------------------------------------------------------- Programa: INICIAL.PRG Objetivo: Inicializar um vetor com o conteudo do Bco.de dados ativo ou com brancos. Sintaxe.: INICIAL( ExpC1,Array1,ExpC2,Array2 ) ExpC1 -> tipo de operacao (Inclusao, Alteracao, etc) Array1 -> vetor a ser inicializado ExpC2 -> tipo do vetor: "N"ormal ou "B"idimensional. Parametro << opcional >> Array2 -> vetor com os dados p/inicializar a outra dimensao. Parametro <> ExpC3 -> determina se o conteudo de variaveis logicas serao .T./.F. ou "S"/"N" (.T. retorna logico) -------------------------------------------------------------------- Autor...: Nicacio Criacao.: 17:19 06 Oct,1991 Revisao.: 10:22 29 Abr,1992 -------------------------------------------------------------------- */ FUNCTION INICIAL( Oper,VetVar,TipoVet,TamBi,TemReg,RetLogic ) LOCAL VetCpo := DBSTRUCT(), K := 1, Vez := 1 TipoVet := IIF( TipoVet == NIL, "N", TipoVet ) TemReg := IIF( TemReg == NIL, .F., TemReg ) RetLogic := IIF( RetLogic == NIL, .T., RetLogic) IF TipoVet == "N" FOR I = 2 TO LEN(VetCpo) * VetVar[I] := FILL(VetCpo[I,1],VetCpo[I,2],VetCpo[I,3],Oper,RetLogic) * NEXT ELSE IF Oper == "I" FOR I = 2 TO LEN( VetCpo ) * VetVar[I,1] := FILL(VetCpo[I,1],VetCpo[I,2],VetCpo[I,3],Oper,RetLogic) FOR K = 2 TO TamBi VetVar[I,K] := FILL(VetCpo[I,1],VetCpo[I,2],VetCpo[I,3],Oper,RetLogic) NEXT * NEXT ELSEIF Oper # "I" FOR I = 1 TO TamBi * VetVar[1,I] := FILL(VetCpo[1,1],VetCpo[1,2],VetCpo[1,3],Oper,RetLogic) FOR K = 2 TO LEN( VetCpo ) VetVar[K,I] := FILL(VetCpo[K,1],VetCpo[K,2],VetCpo[K,3],Oper,RetLogic) NEXT * IF TemReg DBSKIP() // CODIGO DOS PRODUTOS DIGITADOS VetVar[1,I+1] := FILL(VetCpo[1,1],VetCpo[1,2],VetCpo[1,3],Oper,RetLogic) * IF VALTYPE(VetVar[1,I+1]) = "N" IF ( VetVar[1,I+1] = 0 .OR. VetVar[1,I+1] # VetVar[1,I] ) RETURN(VetVar) ENDIF ELSEIF VALTYPE(VetVar[1,I+1]) = "C" IF ( EMPTY(VetVar[1,I+1]) .OR. VetVar[1,I+1] # VetVar[1,I] ) RETURN(VetVar) ENDIF ENDIF ENDIF NEXT ENDIF ENDIF RETURN(VetVar) /* -------------------------------------------------------------------- Programa..: FILL.PRG Objetivo..: Inicializar vars.de memoria conforme sua correspondente no BD. Parametros: Campo -> Nome do cpo.no Bco. Tp -> Tipo do campo ,Tam -> Tamanho do reg Tp_Oper -> Tipo de operacao: I = INCLUSAO e O = OUTROS Tp_Campo-> Se deseja o inicializar com o proprio tipo do campo ou nao. Ex: Para Tp_Campo = .T., Tamanho := .T. ou .F., senao, Tamanho := "S" ou "N". -------------------------------------------------------------------- Autor.....: Nicacio Criacao...: 16:24 18 Ago,1991 Revisao...: 16:02 24 Dez,1992 -------------------------------------------------------------------- */ FUNCTION FILL( Campo,Tp,Tam,Tp_Oper,Tp_Campo ) LOCAL Tamanho Tp_Campo := IIF( Tp_Campo = NIL, .T., Tp_Campo ) DO CASE CASE Tp = "C" // --------> CARACTERE Tamanho := SPACE(Tam) CASE Tp = "N" // --------> NUMERICO Tamanho := 0 CASE Tp = "D" // DATA Tamanho := DATE() CASE Tp = "L" // --------> LOGICO IF Tp_Campo Tamanho := .T. ELSE Tamanho := "S" ENDIF CASE Tp = "M" // -------->MEMO Tamanho := SPACE(10) OTHERWISE Tamanho := "TIPO INDEFINIDO" ENDCASE IF Tp_Oper # "I" // DIFERENTE DE INCLUSAO IF Tp = "L" .AND. !Tp_Campo // TIPO DE VAR.LOGICA E NAO RETORNA LOGICO Tamanho := IIF( FIELDGET(FIELDPOS(Campo)) = .T., "S", "N" ) ELSEIF Tp # "L" .OR. Tp_Campo Tamanho := FIELDGET( FIELDPOS(Campo) ) ENDIF ENDIF RETURN(Tamanho) /* ------------------------------------------------------------------ Programa..: DBREPL.PRG Objetivo..: Executa replaces p/rotinas gerais Parametros: VarRepl - Vetor que contem variaveis para replaces VarModo - "I" Inclusao ou "A" Alteracao TipoVet - Tipo do vetor; se "N"ormal ou "B"i-dimen- sional. Tam - Tamanho do vetor (No.de regs.) Mshared - Informa se replace sera efetuado em ar - quivo compartilhado ou nao Mlin - linha de mensagens Mcor - cor das mensagens Atualizacao: 21:51 13 Feb,1992 Revisao....: 09:46 02 Jun,1997 - Multiusuario ------------------------------------------------------------------ */ FUNCTION DBREPL( VarRepl,VarModo,TipoVet,Tam,Mshared,Mlin,Mcor ) LOCAL Mgrava := .T., ; Mnum := 0 TipoVet := IIF( TipoVet == NIL, "N", TipoVet ) Mshared := IIF( Mshared == NIL, .F.,Mshared ) // Mgrava := IIF(VarModo="I",IIF(APBRANCO(),.T.,.F.),IIF(REG_TEST(),.T.,.F.)) IF Mgrava .AND. TipoVet == "N" IF VarModo == "I" IF ! Mshared DBAPPEND() ELSE WHILE Mnum <= 3 IF FLOCK() // TRAVO ARQUIVO P/NAO TER ERRO NA GRAVACAO DBAPPEND() IF NETERR() ++Mnum ELSE EXIT ENDIF ELSE ++Mnum ENDIF END IF Mnum > 3 Mgrava := .F. // NAO CONSEGUIU ABRIR REG.EM BRANCO //BEEP(2) @ Mlin,02 SAY "Atenção, não consegui incluir lançamento." COLOR Mcor INKEY(3) @ Mlin,02 SAY SPACE(41) COLOR Mcor ENDIF ENDIF ENDIF IF Mgrava .AND. Mshared // CONSEGUIU ABRIR REG.EM BRANCO IF RLOCK() FOR Gravei = 1 TO FCOUNT() //msginfo(str(gravei,3,0)) //+":"+VarRepl[Gravei]) FIELDPUT(Gravei,VarRepl[Gravei]) NEXT DBCOMMIT() DBUNLOCK() Mgrava := .T. ELSE //BEEP(2) //@ Mlin,02 SAY "Aten‡„o, n„o consegui gravar lan‡amento." COLOR Mcor //INKEY(3) //@ Mlin,02 SAY SPACE(41) COLOR Mcor MSGINFO("Atenção, não consegui gravar lançamento.") Mgrava := .F. ENDIF ELSEIF Mgrava .AND. ! Mshared IF RLOCK() FOR Gravei = 1 TO FCOUNT() FIELDPUT(Gravei,VarRepl[Gravei]) NEXT DBCOMMIT() DBUNLOCK() Mgrava := .T. ELSE //BEEP(2) //@ Mlin,02 SAY "Aten‡„o, n„o consegui gravar lan‡amento." COLOR Mcor //INKEY(3) //@ Mlin,02 SAY SPACE(41) COLOR Mcor MSGINFO("Atenção, não consegui gravar lançamento.") Mgrava := .F. ENDIF ENDIF ELSEIF Mgrava .AND. TipoVet == "B" /* ***** Gravei = No.de campos do banco ***** ***** K = No.de regs.a serem Mgravados ***** */ FOR K = 1 TO Tam IF VarModo == "I" IF !Mshared DBAPPEND() ELSE WHILE Mnum <= 3 IF FLOCK() // TRAVO ARQUIVO P/NAO TER ERRO NA GRAVACAO DBAPPEND() IF NETERR() ++Mnum ELSE EXIT ENDIF ELSE ++Mnum ENDIF END IF Mnum > 3 Mgrava := .F. // NAO CONSEGUIU ABRIR REG.EM BRANCO //BEEP(2) //@ Mlin,02 SAY "Aten‡„o, n„o consegui incluir lan‡amento." COLOR Mcor //INKEY(3) //@ Mlin,02 SAY SPACE(41) COLOR Mcor MSGINFO("Atenção, não consegui gravar lançamento.") ENDIF //ELSE // Mgrava := .T. ENDIF ENDIF IF Mgrava .AND. Mshared // CONSEGUIU ABRIR REG.EM BRANCO IF RLOCK() FOR Gravei = 1 TO FCOUNT() FIELDPUT(Gravei,VarRepl[Gravei,K]) NEXT DBCOMMIT() DBUNLOCK() ELSE //BEEP(2) //@ Mlin,02 SAY "Aten‡„o, n„o consegui gravar lan‡amento." COLOR Mcor //INKEY(3) //@ Mlin,02 SAY SPACE(41) COLOR Mcor MSGINFO("Atenção, não consegui gravar lançamento.") ENDIF ELSEIF Mgrava .AND. !Mshared IF RLOCK() FOR Gravei = 1 TO FCOUNT() FIELDPUT(Gravei,VarRepl[Gravei,K]) NEXT DBCOMMIT() DBUNLOCK() ELSE //BEEP(2) //@ Mlin,02 SAY "Aten‡„o, n„o consegui gravar lan‡amento." COLOR Mcor //INKEY(3) //@ Mlin,02 SAY SPACE(41) COLOR Mcor MSGINFO("Atenção, não consegui gravar lançamento.") ENDIF ENDIF //FOR Gravei = 1 TO FCOUNT() // FIELDPUT( Gravei,VarRepl[Gravei,K] ) //NEXT NEXT //DBCOMMIT() ENDIF RETURN(Mgrava) //// // Geração de QR-Code a partir da função FastQRCode na lib QRCodeLib.Dll // FUNCTION Gera_FastQRCode(nArq, nTxt) cTexto := nTxt cFile := _xPht + nArq + ".jpg" FastQRCode(cTexto, cFile) //msginfo('gerou no fast a imagem '+cfile) RETURN NIL //// /* #require "hbhpdf" #include "hbclass.ch" #include "inkey.ch" #define PDF_PORTRAIT 1 #define PDF_LANDSCAPE 2 #define PDF_TXT 3 */ CREATE CLASS PDFClass VAR oPdf VAR oPage VAR cFileName INIT "" VAR nRow INIT 999 VAR nCol INIT 0 VAR nAngle INIT 0 VAR cFontName INIT "Courier" VAR nFontSize INIT 9 VAR nLineHeight INIT 1.3 VAR nMargin INIT 30 VAR nType INIT 1 VAR nPdfPage INIT 0 VAR nPageNumber INIT 0 VAR cHeader INIT {} VAR cCodePage INIT "CP1252" // "WinAnsiEncoding" // "UTF-8" // "StandardEncoding" // "FontSpecific" // METHOD AddPage() METHOD RowToPDFRow( nRow ) METHOD ColToPDFCol( nCol ) METHOD MaxRow() METHOD MaxCol() METHOD DrawText( nRow, nCol, xValue, cPicture, nFontSize, cFontName, nAngle, anRGB, lBold ) METHOD DrawLine( nRowi, nColi, nRowf, nColf, nPenSize ) METHOD DrawRetangle( nTop, nLeft, nWidth, nHeight, nPenSize, nFillType, anRGB ) METHOD DrawImage( cJPEGFile, nRow, nCol, nWidth, nHeight ) METHOD Cancel() METHOD PrnToPdf( cInputFile ) METHOD SetType( nType ) METHOD PageHeader() METHOD MaxRowTest( nRows ) METHOD SetInfo( cAuthor, cCreator, cTitle, cSubject ) METHOD Begin() METHOD End() ENDCLASS METHOD Begin() CLASS PDFClass IF ::nType > 2 IF Empty( ::cFileName ) ::cFileName := MyTempFile( "LST" ) ENDIF SET PRINTER TO ( ::cFileName ) SET DEVICE TO PRINT ELSE IF Empty( ::cFileName ) ::cFileName := MyTempFile( "PDF" ) ENDIF ::oPdf := HPDF_New() HPDF_SetCompressionMode( ::oPdf, HPDF_COMP_ALL ) IF ::cCodePage != NIL HPDF_UseUTFEncodings( ::oPDF ) // mr //HPDF_SetCurrentEncoder( ::oPDF, ::cCodePage ) // isolado para teste / mr. //HPDF_Encoder_GetUnicode(::cCodePage, "UTF-8") // mr. ENDIF ENDIF RETURN NIL METHOD End() CLASS PDFClass IF ::nType > 2 SET DEVICE TO SCREEN SET PRINTER TO //RUN ( "cmd /c start notepad.exe " + ::cFileName ) Hb_Run( "start /s notepad.exe " + ::cFileName ) ELSE //IF ::nPdfPage == 0 //::AddPage() //::DrawText( 10, 10, "NENHUM CONTEUDO (NO CONTENT)",, ::nFontSize * 2 ) //ENDIF IF File( ::cFileName ) fErase( ::cFileName ) ENDIF // Set PDF/A-1b conformance // //msginfo('conversão pdf/a') HPDF_PDFA_SetPDFAConformance(::oPdf, HPDF_PDFA_1B) HPDF_SaveToFile( ::oPdf, ::cFileName ) HPDF_Free( ::oPdf ) RUN ( "cmd /c start " + ::cFileName ) ENDIF RETURN NIL METHOD SetInfo( cAuthor, cCreator, cTitle, cSubject ) CLASS PDFClass IF ::nType > 2 RETURN NIL ENDIF cAuthor := iif( cAuthor == NIL, "JPA Tecnologia", cAuthor ) cCreator := iif( cCreator == NIL, "Harupdf", cCreator ) cTitle := iif( cTitle == NIL, "", cTitle ) cSubject := iif( cSubject == NIL, cTitle, cSubject ) HPDF_SetInfoAttr( ::oPDF, HPDF_INFO_AUTHOR, cAuthor ) HPDF_SetInfoAttr( ::oPDF, HPDF_INFO_CREATOR, cCreator ) HPDF_SetInfoAttr( ::oPDF, HPDF_INFO_TITLE, cTitle ) HPDF_SetInfoAttr( ::oPdf, HPDF_INFO_SUBJECT, cSubject ) //HPDF_SetInfoDateAttr( Year( Date() ), Month( Date() ), Day( Date() ), Val( Substr( Time(), 1, 2 ) ), Val( Substr( Time(), 4, 2 ) ), Val( Substr( Time(), 7, 2 ) ), "+", 4, 0 ) RETURN NIL METHOD SetType( nType ) CLASS PDFClass IF nType != NIL ::nType := nType ENDIF ::nFontSize := iif( ::nType == 1, 9, 6 ) RETURN NIL METHOD AddPage() CLASS PDFClass LOCAL Nom_font := "", Def_font := "" // mr IF ::nType < 3 ::oPage := HPDF_AddPage( ::oPdf ) // /* Configura fonte externa para trabalhar com Unicode. - mr */ Nom_font = HPDF_LoadTTFontFromFile(::oPdf, "cour.ttf", HPDF_TRUE) msginfo(nom_font) Def_font = HPDF_GetFont(::oPdf, Nom_font, "UTF-8") msginfo(def_font) // HPDF_Page_SetSize( ::oPage, HPDF_PAGE_SIZE_A4, iif( ::nType == 2, HPDF_PAGE_PORTRAIT, HPDF_PAGE_LANDSCAPE ) ) //HPDF_Page_SetFontAndSize( ::oPage, HPDF_GetFont( ::oPdf, ::cFontName, ::cCodePage ), ::nFontSize ) // isolado, mr. HPDF_Page_SetFontAndSize( ::oPage, Def_font, ::nFontSize ) // para pegar fonte externa / mr ENDIF ::nRow := 0 RETURN NIL METHOD Cancel() CLASS PDFClass IF ::nType < 3 HPDF_Free( ::oPdf ) ENDIF RETURN NIL METHOD DrawText( nRow, nCol, xValue, cPicture, nFontSize, cFontName, nAngle, anRGB, lBold ) CLASS PDFClass LOCAL nRadian , cTexto LOCAL Nom_font := "", Def_font := "" // mr nFontSize := iif( nFontSize == NIL, ::nFontSize, nFontSize ) cFontName := iif( cFontName == NIL, ::cFontName, cFontName ) cPicture := iif( cPicture == NIL, "", cPicture ) nAngle := iif( nAngle == NIL, ::nAngle, nAngle ) cTexto := Transform( xValue, cPicture ) ::nCol := nCol + Len( cTexto ) IF ::nType > 2 @ nRow, nCol SAY cTexto ELSE // /* Configura fonte externa para trabalhar com Unicode. - mr */ Nom_font = HPDF_LoadTTFontFromFile(::oPdf, "cour.ttf", HPDF_TRUE) msginfo(nom_font) Def_font = HPDF_GetFont(::oPdf, Nom_font, "UTF-8") msginfo(def_font) // nRow := ::RowToPDFRow( nRow ) nCol := ::ColToPDFCol( nCol ) //HPDF_Page_SetFontAndSize( ::oPage, HPDF_GetFont( ::oPdf, cFontName, ::cCodePage ), nFontSize ) - isolado, mr. HPDF_Page_SetFontAndSize( ::oPage, Def_font, nFontSize ) // para pegar fonte externa / mr IF anRGB != NIL HPDF_Page_SetRGBFill( ::Page, anRGB[ 1 ], anRGB[ 2 ], anRGB[ 3 ] ) HPDF_Page_SetRGBStroke( ::Page, anRGB[ 1 ], anRGB[ 2], anRGB[ 3] ) ENDIF HPDF_Page_BeginText( ::oPage ) //HPDF_Encoder_GetUnicode(::cCodePage, "UTF-8") // mr. nRadian := ( nAngle / 180 ) * 3.141592 HPDF_Page_SetTextMatrix( ::oPage, Cos( nRadian ), Sin( nRadian ), -Sin( nRadian ), Cos( nRadian ), nCol, nRow ) HPDF_Page_ShowText( ::oPage, cTexto ) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// If !EMPTY( lBold ) .AND. lBold HPDF_Page_SetTextMatrix( ::oPage, Cos( nRadian ), Sin( nRadian ), -Sin( nRadian ), Cos( nRadian ), ( nCol + .5 ), nRow ) HPDF_Page_ShowText( ::oPage, cTexto ) EndIf ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HPDF_Page_EndText( ::oPage ) IF anRGB != NIL HPDF_Page_SetRGBFill( ::Page, 0, 0, 0 ) HPDF_Page_SetRGBStroke( ::Page, 0, 0, 0 ) ENDIF ENDIF RETURN NIL METHOD DrawLine( nRowi, nColi, nRowf, nColf, nPenSize ) CLASS PDFClass IF ::nType > 2 nRowi := Round( nRowi, 0 ) nColi := Round( nColi, 0 ) @ nRowi, nColi SAY Replicate( "-", nColf - nColi ) ::nCol := Col() ELSE nPenSize := iif( nPenSize == NIL, 0.2, nPenSize ) nRowi := ::RowToPDFRow( nRowi ) nColi := ::ColToPDFCol( nColi ) nRowf := ::RowToPDFRow( nRowf ) nColf := ::ColToPDFCol( nColf ) HPDF_Page_SetLineWidth( ::oPage, nPenSize ) HPDF_Page_MoveTo( ::oPage, nColi, nRowi ) HPDF_Page_LineTo( ::oPage, nColf, nRowf ) HPDF_Page_Stroke( ::oPage ) ENDIF RETURN NIL METHOD DrawImage( cJPEGFile, nRow, nCol, nWidth, nHeight ) CLASS PDFClass LOCAL oImage IF ::nType > 2 RETURN NIL ENDIF nRow := ::RowToPDFRow( nRow ) nCol := ::ColToPDFCol( nCol ) nWidth := Int( nWidth * ::nFontSize / 2 ) nHeight := nHeight * ::nFontSize oImage := HPDF_LoadJPEGImageFromFile( ::oPdf, cJPEGFile ) HPDF_Page_DrawImage( ::oPage, oImage, nCol, nRow, nWidth, nHeight ) RETURN NIL METHOD DrawRetangle( nTop, nLeft, nWidth, nHeight, nPenSize, nFillType, anRGB ) CLASS PDFClass IF ::nType > 2 RETURN NIL ENDIF nFillType := iif( nFillType == NIL, 1, nFillType ) nPenSize := iif( nPenSize == NIL, 0.2, nPenSize ) nTop := ::RowToPDFRow( nTop ) nLeft := ::ColToPDFCol( nLeft ) nWidth := ( nWidth ) * ::nFontSize / 1.666 nHeight := -( nHeight ) * :: nFontSize HPDF_Page_SetLineWidth( ::oPage, nPenSize ) IF anRGB != NIL HPDF_Page_SetRGBFill( ::oPage, anRGB[ 1 ], anRGB[ 2 ], anRGB[ 3 ] ) HPDF_Page_SetRGBStroke( ::oPage, anRGB[ 1 ], anRGB[ 2 ], anRGB[ 3 ] ) ENDIF HPDF_Page_Rectangle( ::oPage, nLeft, nTop, nWidth, nHeight ) IF nFillType == 1 HPDF_Page_Stroke( ::oPage ) // borders only ELSEIF nFillType == 2 HPDF_Page_Fill( ::oPage ) // inside only ELSE HPDF_Page_FillStroke( ::oPage ) // all ENDIF IF anRGB != NIL HPDF_Page_SetRGBStroke( ::oPage, 0, 0, 0 ) HPDF_Page_SetRGBFill( ::oPage, 0, 0, 0 ) ENDIF RETURN NIL METHOD RowToPDFRow( nRow ) CLASS PDFClass RETURN HPDF_Page_GetHeight( ::oPage ) - ::nMargin - ( nRow * ::nFontSize * ::nLineHeight ) METHOD ColToPDFCol( nCol ) CLASS PDFClass RETURN nCol * ::nFontSize / 1.666 + ::nMargin METHOD MaxRow() CLASS PDFClass LOCAL nPageHeight, nMaxRow IF ::nType > 2 RETURN 63 ENDIF nPageHeight := HPDF_Page_GetHeight( ::oPage ) - ( ::nMargin * 2 ) nMaxRow := Int( nPageHeight / ( ::nFontSize * ::nLineHeight ) ) RETURN nMaxRow METHOD MaxCol() CLASS PDFClass LOCAL nPageWidth, nMaxCol IF ::nType > 2 RETURN 132 ENDIF nPageWidth := HPDF_Page_GetWidth( ::oPage ) - ( ::nMargin * 2 ) nMaxCol := Int( nPageWidth / ::nFontSize * 1.666 ) RETURN nMaxCol METHOD PrnToPdf( cInputFile ) CLASS PDFClass LOCAL cTxtReport, cTxtPage, cTxtLine, nRow cTxtReport := MemoRead( cInputFile ) + Chr(12) TokenInit( @cTxtReport, Chr(12) ) DO WHILE .NOT. TokenEnd() cTxtPage := TokenNEXT( cTxtReport ) + HB_EOL() IF Len( cTxtPage ) > 5 IF Substr( cTxtPage, 1, 1 ) == Chr(13) cTxtPage := Substr( cTxtPage, 2 ) ENDIF ::AddPage() nRow := 0 DO WHILE At( HB_EOL(), cTxtPage ) != 0 cTxtLine := Substr( cTxtPage, 1, At( HB_EOL(), cTxtPage ) - 1 ) cTxtPage := Substr( cTxtPage, At( HB_EOL(), cTxtPage ) + 2 ) ::DrawText( nRow++, 0, cTxtLine ) ENDDO ENDIF ENDDO RETURN NIL METHOD PageHeader() CLASS PDFClass ::nPdfPage += 1 ::nPageNumber += 1 ::nRow := 0 ::AddPage() ::DrawText( 0, 0, "EMPRESA DE TESTE" ) ::DrawText( 0, ( ::MaxCol() - Len( ::cHeader ) ) / 2, ::cHeader ) ::DrawText( 0, ::MaxCol() - 12, "Page " + StrZero( ::nPageNumber, 6 ) ) ::DrawLine( 0.5, 0, 0.5, ::MaxCol() ) ::nRow := 2 ::nCol := 0 RETURN NIL METHOD MaxRowTest( nRows ) CLASS PDFClass nRows := iif( nRows == NIL, 0, nRows ) IF ::nRow > ::MaxRow() - 2 - nRows ::PageHeader() ENDIF RETURN NIL FUNCTION TxtSaida() RETURN { "PDF Landscape", "PDF Portrait", "Matrix" } //// Function MyTempFile() Return "Teste" + "00000001" + ".PDF" ******