FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Manupulate PDF via Acrobat PRO DC
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Fri Dec 24, 2021 09:02 PM

ok.
Then the initial generation will work, and afterwards we will add a bookmark consecutively with the names that lead to each sheet of pdf file, from array namers.

Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Sat Dec 25, 2021 11:55 AM
This Sample work for me ....

Code (fw): Select all Collapse
Function Main()

local aPdf := {}
local cPathFiles
local aBookMarks := { "Master_0", "Master_1" }
local i 
local cMaster

    cPathFiles := "c:\fwh\samples\salida\"
    cMaster    := cPathFiles + "Master.pdf" 

    for i = 1 to len( abookMarks )
      aadd( aPdf ,  cPathFiles+ aBookMarks[i]+".pdf" )
    next  

    MergeMultiPdf( aPdf, cMaster ,.t. )
    alert( "creado master")

    AddPdfBookMarks( cMaster, aBookmarks, cPathFiles +"MasterSal.pdf" , "Indice", .t. )

Return nil

//------------------------------------------


Function AddPdfBookMarks( cPdfIni, aBookmarks, cPdfEnd ,cRootName, lShow )

local app := CreateObject("AcroExch.App")

local oAVDoc1 := CreateObject("AcroExch.AVDoc")
local oPDDoc1 := CreateObject("AcroExch.PDDoc")

LOCAL lOk
local nLenBookMarks
local nLenPages
local nMinLen

local jso, bmr
local arrParents, bkmChildsParent

local cEntra1
local i

 
DEFAULT lShow := .F.

 cPdfIni := IF( hb_IsNil(cPdfIni) , cGetFile( "*.Pdf" ) , cPdfIni )

 lOk := oAVDoc1:Open( cPdfIni, "")

    IF !lOk
            Alert("error al abrir "+ cPdfIni +" pdf" )
        RETURN .f.
    ENDIf

    if Empty( aBookmarks )
         Alert("Error no especifica bookmarks " )
    RETURN .f.
    endif

  nLenBookMarks := len( aBookMarks )  
  
  oPDDoc1 = oAVDoc1:GetPDDoc()
  
  nLenPages = oPDDoc1:GetNumPages() 
  
  nMinLen := Min( nLenPages, nLenBookMarks )
  
  jso := opDDoc1:GetJSObject() // JavaScript Object
       
  bmr = jso:bookmarkRoot()  // BookMark Root Object 
   
              
  if !Empty( cRootName )  // if use Root  
        bmr:createChild( cRootName, "this.pageNum = 0" , 0)
        bkmChildsParent := jso:bookmarkRoot:children()[1]
       else
     bkmChildsParent := bmr 
  endif

    for i = 1 to nMinLen // add pages bookmarks 
       bkmChildsParent:createchild( aBookmarks[i], "this.pageNum=" +alltrim(str(i-1)),i-1 )
  next 

    if Empty( cPdfEnd )
    cPdfEnd := cPdfIni 
    endif

  lOk := opDDoc1:Save( 1, cPdfEnd )

    opDDoc1:Close()
    opddoc1:= nil

    oAVDoc1:Close(1)
    oAVDoc1 := nil

    app:CloseAllDocs()
    app:Exit()
    
  IF !lOk
         Alert("Error. Not Save "+ cPdfEnd )
         RETURN .f.
    ENDIF

IF lshow
   IF File(cPdfEnd )
      Shellexecute(nil,"open",cPdfEnd )
   endif
endif

Return nil


//---------------------------------------------

Function MergeMultiPdf( aPdfIni, cPdfEnd ,lShow )

local app := CreateObject("AcroExch.App")

local oAVDoc1 := CreateObject("AcroExch.AVDoc")
local oAVDoc2 := CreateObject("AcroExch.AVDoc")

local oPDDoc1 := CreateObject("AcroExch.PDDoc")
local oPDDoc2 := CreateObject("AcroExch.PDDoc")

LOCAL  lOk

local x
local jso, bmr
local arrParents, bkmChildsParent

local cEntra1, cEntra2
local i

DEFAULT lShow := .F.


 if Empty( aPdfIni ) .or. !hb_IsArray( aPdfIni )
    Alert( " Error. in Parameter") 
    return .f. 
 endif

 if len( aPdfIni ) == 1
    Alert( " Error. only 1 file in array") 
    return .f.  
 endif 
 
 cEntra1 := aPdfIni[1]

 lOk = oAVDoc1:Open(cEntra1, "")

 IF !lOk
     MsgInfo("error al abrir "+ cEntra1 +" pdf" )
     oAVDoc1 := nil
     RETURN .f.
 ENDIF


   oPDDoc1 = oAVDoc1:GetPDDoc()
   X = oPDDoc1:GetNumPages() - 1

   for i=2 to len( aPdfIni )

     cEntra2:= aPdfIni[i]

         lOk := oAVDoc2:Open(cEntra2, "")
         IF !lOk
            MsgInfo("error al abrir "+ cEntra2 +" pdf" )
            RETURN .f.
         ENDIF

     oPDDoc2 = oAVDoc2:GetPDDoc()
   
     lOk := opDDoc1:InsertPages( x, OPDDoc2, 0, oPDDoc2:GetNumPages(), 0 )

         IF !lOk
             MsgInfo("Se no pudo insertar el documento "+ cEntra2 +"en " +cEntra1 )
            RETURN .f.
         ENDIF

         opDDoc2:Close()
         opddoc2:= nil
         oAVDoc2:Close(1)

   next 

    if Empty( cPdfEnd )
         cPdfEnd := cEntra1 
    Endif   
    
  lOk := opDDoc1:Save( 1, cPdfEnd )
  
  opDDoc1:Close()
  opddoc1:= nil
  oAVDoc1:Close(1)

  app:CloseAllDocs()
  app:Exit()
  
    IF !lOk
        MsgInfo("Se no pudo Grabar "+ cPdfEnd )
        RETURN .f.
    ENDIF
    

    IF lshow
     IF File(cPdfEnd)
          Shellexecute(nil,"open",cPdfEnd )
    endif
    endif


Return nil

//------------------------------------------------------------------------------
Posts: 1195
Joined: Mon Oct 17, 2005 05:41 AM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Sat Dec 25, 2021 10:21 PM

Thank you very much!!

Is's working very nice.

Merry Christmas

Regards,

Marc



FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
Posts: 1195
Joined: Mon Oct 17, 2005 05:41 AM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Sun Dec 26, 2021 12:50 PM
Hi,

A little question.

Now I'm using a program 'PDFtoTxt' to extract text from a pdf, but us it also possible with the Acrobat DC.

I see in an example that you made before something like

Code (fw): Select all Collapse
 resultadoHilitelist = pagHilitelist:Add(0, 9000)

  pagActual = pagPDF:CreatePageHilite(pagHilitelist)

  For i = 0 To pagActual:GetNumText() - 1

      datosPDF = datosPDF + pagActual:GetText(i)

  Next

  msginfo( datospdf )


What exectly is pagHilitelist:Add(0, 9000)? Are those the coordinates?

On my pages, the name is always on the same location on the paper.
Is it possible with this?



It's the text 'F2001_3' that I need
Regards,

Marc



FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Mon Dec 27, 2021 10:32 AM
Marc Vanzegbroeck wrote:
What exectly is pagHilitelist:Add(0, 9000)? Are those the coordinates?

Is the number of word to collect ...
pagHilitelist:Add(0, 9000) collect the first word to word 9000 . if use Add( 0,10 ) Hilite the first 10 word , if use add( 10,20 ) Hilite the word nomber 11 to 19 , ( first word is 0 ) . if your page has many words change to add( 0, 18000 ).
In the Web are multiple implementations different, some use the js object, but in essence they do the same.
https://www.vbforums.com/showthread.php ... ext-in-pdf in the 4 and 8 comment have complete methods in VB easy to switch to Harbour.
Posts: 1195
Joined: Mon Oct 17, 2005 05:41 AM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Mon Dec 27, 2021 10:36 AM

Thank you for the info.

Regards,

Marc



FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
Posts: 1195
Joined: Mon Oct 17, 2005 05:41 AM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Wed Jan 05, 2022 09:41 AM
Hi,

It's working very nice.

Just one question. The program is doing everything without showing the PDF while working, except in the 'merge' routine.
Then Acrobat is shown, and you can see the program manipulating it. Is is possible toe hide this also, because sometimes an error occur when the user click the mouse on the PDF.

While debugging, I found the place where it shows Acrobat.
This is the part of the mergemultipdf() function.
It's very strange, because on other places in the program the same function is used, without showing the Acrobat.

I moved 1 line, because the program inserted the files always on the second page, instead adding it at the end.

Code (fw): Select all Collapse
 IF !lOk
     MsgInfo("error al abrir "+ cEntra1 +" pdf" )
     oAVDoc1 := nil
     RETURN .f.
 ENDIF


   oPDDoc1 = oAVDoc1:GetPDDoc()
   // X = oPDDoc1:GetNumPages() - 1    //Moved this line from here

   for i=2 to len( aPdfIni )

     X = oPDDoc1:GetNumPages() - 1 //Moved to here

     cEntra2:= aPdfIni[i]

         lOk := oAVDoc2:Open(cEntra2, "")  //Here Acobat is shown
         IF !lOk
            MsgInfo("error al abrir "+ cEntra2 +" pdf" )
            RETURN .f.
         ENDIF

     oPDDoc2 = oAVDoc2:GetPDDoc()
   
     lOk := opDDoc1:InsertPages( x, OPDDoc2, 0, oPDDoc2:GetNumPages(), 0 )

         IF !lOk
             MsgInfo("Se no pudo insertar el documento "+ cEntra2 +"en " +cEntra1 )
            RETURN .f.
         ENDIF

         opDDoc2:Close()
         opddoc2:= nil
         oAVDoc2:Close(1)

   next

    if Empty( cPdfEnd )
Regards,

Marc



FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
Posts: 1195
Joined: Mon Oct 17, 2005 05:41 AM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Thu Jan 06, 2022 09:39 AM
I found the way to hide it :-)

With
Code (fw): Select all Collapse
app:Hide()
Regards,

Marc



FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: Manupulate PDF via Acrobat PRO DC
Posted: Fri Dec 15, 2023 11:05 AM

MANUEL

necesito contactarme con vos. podes escribirme? gracias

gusmavf arroba gmail punto com

gracias

FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/

Continue the discussion