Page 1 of 1

libharu

PostPosted: Mon Feb 26, 2018 4:59 pm
by AntoninoP
Hello,
In harbour\contrib\hbhpdf there is a cool library for create PDF file.
Would be great use it to create the pdf in FiveWin... any chance?

Re: libharu

PostPosted: Mon Feb 26, 2018 5:15 pm
by cnavarro

Re: libharu

PostPosted: Tue Feb 27, 2018 9:42 am
by AntoninoP
can you do a summary? they are 5 pages in Spanish... :lol: :lol:

Re: libharu

PostPosted: Tue Feb 27, 2018 11:49 am
by cnavarro

Re: libharu

PostPosted: Tue Feb 27, 2018 6:59 pm
by Carlos Mora
Ciao Antonino :D ,
AntoninoP wrote:can you do a summary? they are 5 pages in Spanish... :lol: :lol:

I wrote the class Cristobal refered you to, and it is basically a wrapper to HaruPDF to make it look like FW's TPrinter, with few exceptions that I couldn't overcome easily, mainly FONT. Fonts are handled very different in Haru and PDF technology in general, but with few effort you can translate your prints based on TPrinter to THaruPDF.

You are right, the doc is written in Spanish, I should be better write it in English.

The project in BitBucket repository is complete,and includes a very complete example. Try it in your own code, I'm pretty sure you will find help in this forum if you run into trouble. The library is _FAST_, has no external dependencies like pdf printers or OCX, just add the provided dll's, and produces very compact pdfs.

It also makes some optimizations for you. If you put the same image in several points in your pdf, the library is smart enough to include only one copy of the image and use it as an indexed image in the resulting document, so the size is kept into the minimun.

KR

Re: libharu

PostPosted: Thu Mar 01, 2018 9:45 am
by AntoninoP
The idea is good, but the implementation look a little lazy:
The SetPage method takes the nPage from this list but this implementation calls HPDF_Page_SetSize that take the values from this list

I tried using this code:
Code: Select all  Expand view

//------------------------------------------------------------------------------
METHOD SetPage( nPageSize )
   static aFW2HARUSizes
   if empty(aFW2HARUSizes)
      aFW2HARUSizes := {}
      aAdd(aFW2HARUSizes, { 8.5 *72     ,11   *72     }) //#define DMPAPER_LETTER    1       // Letter 8 1/2 x 11 in
      aAdd(aFW2HARUSizes, { 8.5 *72     ,11   *72     }) //#define DMPAPER_LETTERSMALL 2       // Letter Small 8 1/2 x 11 in
      aAdd(aFW2HARUSizes, {11   *72     ,17   *72     }) //#define DMPAPER_TABLOID   3       // Tabloid 11 x 17 in
      aAdd(aFW2HARUSizes, {11   *72     ,17   *72     }) ////#define DMPAPER_LEDGER    4       // Ledger 17 x 11 in
      aAdd(aFW2HARUSizes, { 8.5 *72     ,14   *72     }) //#define DMPAPER_LEGAL     5       // Legal 8 1/2 x 14 in
      aAdd(aFW2HARUSizes, { 5.5 *72     , 8.5 *72     }) //#define DMPAPER_STATEMENT   6       // Statement 5 1/2 x 8 1/2 in
      aAdd(aFW2HARUSizes, { 7.25*72     ,10.5 *72     }) //#define DMPAPER_EXECUTIVE   7       // Executive 7 1/4 x 10 1/2 in
      aAdd(aFW2HARUSizes, {29.7 *72/2.54,42   *72/2.54}) //#define DMPAPER_A3      8       // A3 297 x 420 mm
      aAdd(aFW2HARUSizes, {21   *72/2.54,29.7 *72/2.54}) //#define DMPAPER_A4      9       // A4 210 x 297 mm
      aAdd(aFW2HARUSizes, {21   *72/2.54,29.7 *72/2.54}) //#define DMPAPER_A4SMALL   10      // A4 Small 210 x 297 mm
      aAdd(aFW2HARUSizes, {14.8 *72/2.54,21   *72/2.54}) //#define DMPAPER_A5      11      // A5 148 x 210 mm
      aAdd(aFW2HARUSizes, {25   *72/2.54,35.4 *72/2.54}) //#define DMPAPER_B4      12      // B4 250 x 354
      aAdd(aFW2HARUSizes, {18.2 *72/2.54,25.7 *72/2.54}) //#define DMPAPER_B5      13      // B5 182 x 257 mm
      aAdd(aFW2HARUSizes, { 8.5 *72     ,13   *72     }) //#define DMPAPER_FOLIO     14      // Folio 8 1/2 x 13 in
      aAdd(aFW2HARUSizes, {25.5 *72/2.54,27.5 *72/2.54}) //#define DMPAPER_QUARTO    15      // Quarto 215 x 275 mm
      aAdd(aFW2HARUSizes, {10   *72     ,14   *72     }) //#define DMPAPER_10X14     16      // 10x14 in
      aAdd(aFW2HARUSizes, {11   *72     ,17   *72     }) //#define DMPAPER_11X17     17      // 11x17 in
      aAdd(aFW2HARUSizes, { 8.5 *72     ,11   *72     }) //#define DMPAPER_NOTE      18      // Note 8 1/2 x 11 in
      aAdd(aFW2HARUSizes, {3.875*72     ,8.875*72     }) //#define DMPAPER_ENV_9     19      // Envelope #9 3 7/8 x 8 7/8
      aAdd(aFW2HARUSizes, {4.125*72     , 9.5 *72     }) //#define DMPAPER_ENV_10    20      // Envelope #10 4 1/8 x 9 1/2
      aAdd(aFW2HARUSizes, { 4.5 *72     ,10.375*72    }) //#define DMPAPER_ENV_11    21      // Envelope #11 4 1/2 x 10 3/8
      aAdd(aFW2HARUSizes, { 4.75*72     ,11   *72     }) //#define DMPAPER_ENV_12    22      // Envelope #12 4 3\4 x 11
      aAdd(aFW2HARUSizes, { 5   *72     ,11.5 *72     }) //#define DMPAPER_ENV_14    23      // Envelope #14 5 x 11 1/2
      aAdd(aFW2HARUSizes, {17   *72     ,22   *72     }) //#define DMPAPER_CSHEET    24      // C size sheet 17 x 22-inches
      aAdd(aFW2HARUSizes, {22   *72     ,34   *72     }) //#define DMPAPER_DSHEET    25      // D size sheet 22- by 34-inches
      aAdd(aFW2HARUSizes, {34   *72     ,44   *72     }) //#define DMPAPER_ESHEET    26      // E size sheet 34x44
      aAdd(aFW2HARUSizes, {11   *72/2.54,22   *72/2.54}) //#define DMPAPER_ENV_DL    27      // Envelope DL 110 x 220mm
      aAdd(aFW2HARUSizes, {16.2 *72/2.54,22.9 *72/2.54}) //#define DMPAPER_ENV_C5    28      // Envelope C5 162 x 229 mm
      aAdd(aFW2HARUSizes, {23.4 *72/2.54,45.8 *72/2.54}) //#define DMPAPER_ENV_C3    29      // Envelope C3  324 x 458 mm
      aAdd(aFW2HARUSizes, {22.9 *72/2.54,32.4 *72/2.54}) //#define DMPAPER_ENV_C4    30      // Envelope C4  229 x 324 mm
      aAdd(aFW2HARUSizes, {11.4 *72/2.54,16.2 *72/2.54}) //#define DMPAPER_ENV_C6    31      // Envelope C6  114 x 162 mm
      aAdd(aFW2HARUSizes, {11.4 *72/2.54,22.9 *72/2.54}) //#define DMPAPER_ENV_C65   32      // Envelope C65 114 x 229 mm
      aAdd(aFW2HARUSizes, {25   *72/2.54,25.3 *72/2.54}) //#define DMPAPER_ENV_B4    33      // Envelope B4  250 x 353 mm
      aAdd(aFW2HARUSizes, {17.6 *72/2.54,25   *72/2.54}) //#define DMPAPER_ENV_B5    34      // Envelope B5  176 x 250 mm
      aAdd(aFW2HARUSizes, {17.6 *72/2.54,12.5 *72/2.54}) //#define DMPAPER_ENV_B6    35      // Envelope B6  176 x 125 mm
      aAdd(aFW2HARUSizes, {11   *72/2.54,23   *72/2.54}) //#define DMPAPER_ENV_ITALY   36      // Envelope 110 x 230 mm
      aAdd(aFW2HARUSizes, {3.875*72     , 7.5 *72     }) //#define DMPAPER_ENV_MONARCH 37      // Envelope Monarch 3.875 x 7.5 in
      aAdd(aFW2HARUSizes, {3.625*72     , 6.5 *72     }) //#define DMPAPER_ENV_PERSONAL 38       // 6 3/4 Envelope 3 5/8 x 6 1/2 in
      aAdd(aFW2HARUSizes, {14.875*72    ,11   *72     }) //#define DMPAPER_FANFOLD_US  39      // US Std Fanfold 14 7/8 x 11 in
      aAdd(aFW2HARUSizes, { 8.5 *72     ,12   *72     }) //#define DMPAPER_FANFOLD_STD_GERMAN  40  // German Std Fanfold 8 1/2 x 12 in
      aAdd(aFW2HARUSizes, { 8.5 *72     ,13   *72     }) //#define DMPAPER_FANFOLD_LGL_GERMAN  41  // German Legal Fanfold 8 1/2 x 13 in
    endif
   //------------------------------------------------------------------------------
   ::nWidth := aFW2HARUSizes[nPageSize,1]
   ::nHeight := aFW2HARUSizes[nPageSize,2]
   ::SyncPage()

RETURN Self

//------------------------------------------------------------------------------
METHOD SyncPage()
    LOCAL tmp
   //------------------------------------------------------------------------------
   IF ::hPage != NIL
      if ::nOrientation = HPDF_PAGE_LANDSCAPE .and. ::nWidth<::nHeight
         tmp := ::nWidth
         ::nWidth := ::nHeight
         ::nHeight := tmp
      endif
      if ::nOrientation = HPDF_PAGE_PORTRAIT .and. ::nWidth>::nHeight
         tmp := ::nWidth
         ::nWidth := ::nHeight
         ::nHeight := tmp
      endif
      HPDF_Page_SetWidth( ::hPage, ::nWidth)
      HPDF_Page_SetHeight( ::hPage, ::nHeight)
   ENDIF

RETURN NIL


Cmtr2Pix and Mmtr2Pix are wrong, it should return an array with converted value (maybe it is the old interface):
Code: Select all  Expand view
METHOD Cmtr2Pix( nRow, nCol )

   nRow *= 72 / 2.54
   nCol *= 72 / 2.54

RETURN {nRow,nCol}

METHOD Mmtr2Pix( nRow, nCol )

   nRow *= 72 / 25.4
   nCol *= 72 / 25.4

RETURN {nRow,nCol}


FillRect is missing:
Code: Select all  Expand view
METHOD FillRect(aRect, hBrush)
   LOCAL nColor := BrushColor(hBrush)
   ::Rect(aRect[1],aRect[2],aRect[1]+aRect[3],aRect[2]+aRect[4],nColor)
return nil


#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>

HB_FUNC( BRUSHCOLOR )
{
   LOGBRUSH lb;
    if( hb_parnl( 1 ) )
    {
       #ifndef _WIN64
          GetObject( ( HGDIOBJ ) hb_parnl( 1 ), sizeof( LOGBRUSH ), ( LPSTR ) &lb );
       #else
          GetObject( ( HGDIOBJ ) hb_parnll( 1 ), sizeof( LOGBRUSH ), ( LPSTR ) &lb );
       #endif
       hb_retnl( lb.lbColor );
    }
    else
       hb_retnl( 0 );
}

#pragma ENDDUMP


For now it is what I saw, It should be a transparent replace for TPrinter...
When I will have time I will do a Pull Request on BitBucket ;)

Antonino

Re: libharu

PostPosted: Thu Mar 01, 2018 11:50 am
by AntoninoP
About the font, Starting from this code
I created this FiveWin program:
Code: Select all  Expand view
#include <fivewin.ch>

#define  HKEY_LOCAL_MACHINE      2147483650        // 0x80000002
 
proc main()
   LOCAL oReg := TReg32():New(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion\Fonts", .t.)
   LOCAL cKey, cValue
   LOCAL nId := 1, aInfos := {}
   
   //? oReg:nError
   do while .t.
      oReg:nError := MY_REGENUMVALUE(oReg:nHandle, nId, @cKey, @cValue)
      aadd(aInfos, { cKey, cValue })
      if oReg:nError<>0
         exit
      endif
      nId += 1        
   enddo
   XBROWSER aInfos
return

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>

#ifndef _WIN64
#define fw_parh hb_parnl
#else
#define fw_parh hb_parnll
#endif

HB_FUNC( MY_REGENUMVALUE ) // ( nKey, nIndex, @cKeyName, @uValue ) --> nResult
{
   BYTE name[ 1024 ];
   BYTE value[ 1024 ];
   DWORD lName=1024, lValue=1024, type = 0;
 
   hb_retnl( RegEnumValueA( ( HKEY ) fw_parh( 1 ), hb_parnl( 2 ), ( LPSTR ) name, &lName, 0, &type, value, &lValue ) );
   hb_storc( ( const char * ) name, 3 );
 
   switch( type )
   {
      case REG_SZ:
            hb_storc( ( const char * ) value, 4 );
           break;
 
      case REG_DWORD:
           hb_stornl( * ( ( LPDWORD ) value ), 4 );
           break;     
   }
}

#pragma ENDDUMP


That enumerate all installed fonts with filename.

Re: libharu

PostPosted: Mon Mar 05, 2018 5:37 pm
by mastintin
AntoninoP.
Fix this bug :

in METHOD SayRotate

- HPDF_Page_SetRGBFill( ::hPage, ( Int( nClrText / 0x10000 ) % 256 ) / 256.00, ( Int( nClrText / 0x100 ) % 256 ) / 256.00 , ( nClrText % 256 ) / 256.00 )

+ HPDF_Page_SetRGBFill( ::hPage, ( nClrText % 256 ) / 256.00, ( Int( nClrText / 0x100 ) % 256 ) / 256.00 , ( Int( nClrText / 0x10000 ) % 256 ) / 256.00 )


Add methods ...

METHOD SetAuthor( cAuthor ) INLINE HPDF_SetInfoAttr( ::hPdf, HPDF_INFO_AUTHOR, cAuthor ) // 2
METHOD SetTitle( cTitle ) INLINE HPDF_SetInfoAttr( ::hPdf, HPDF_INFO_TITLE, cTitle ) //5

METHOD GetAuthor() INLINE HPDF_GetInfoAttr( ::hPdf, HPDF_INFO_AUTHOR ) // 2
METHOD GetTitle() INLINE HPDF_GetInfoAttr( ::hPdf, HPDF_INFO_TITLE )

METHOD SetPermission( cMode )

default cMode := ''

cMode := upper( cMode )

SWITCH cMode
CASE "READ" ; HPDF_SetPermission( ::hPage, HPDF_ENABLE_READ ) ; EXIT
CASE "PRINT" ; HPDF_SetPermission( ::hPage, HPDF_ENABLE_PRINT ) ; EXIT
CASE "COPY" ; HPDF_SetPermission( ::hPage, HPDF_ENABLE_COPY ) ; EXIT
CASE "EDIT" ; HPDF_SetPermission( ::hPage, HPDF_ENABLE_EDIT ) ; EXIT
CASE "EDIT_ALL" ; HPDF_SetPermission( ::hPage, HPDF_ENABLE_EDIT_ALL ) ; EXIT
ENDSWITCH

Return nil

Re: libharu

PostPosted: Mon Mar 05, 2018 6:27 pm
by AntoninoP
Really I would write:
Code: Select all  Expand view
HPDF_Page_SetRGBFill( ::hPage, HB_BitAnd(Int( nClrText),0xFF ) / 255.00, HB_BitAnd(HB_BitShift(Int( nClrText),-8),0xFF ) / 255.00,HB_BitAnd(HB_BitShift(Int( nClrText),-16),0xFF ) / 255.00 )

Anyway the maintainer is Carlos...