The restriction is the lenght of the parameter list in the shell; not specific to any program. I'm sure an 'ls *.pdf' gives the same result.
The shell attempts to find all the *.pdf files and pass them as arguments to ls. It's the length of the filenames and the number that exceeds the arg limit, not just the 3100 files.
The code below uses find which does not do the expansion, but checks the files one at a time. Passing the results to zip.
find . -name '*.pdf' -print | zip pdfFiles.zip -@