Draw up a schematic of what you are connecting.
If done correctly and your software multplexing is done correctly, then you could get away with driving 4 LEDs high on 4 columns from arduino while you pulled 1 row low with a ULN2803 controlled by arduino, and work your way across the 4 rows, then jumped to next level and worked across the 4 rows, then the 3rd & 4th.
Picture this:
Level 1
C C C C
a b c d R1
e f g h R2
i j k l R3
m n o p R4
Level 2
C C C C
a b c d R5
e f g h R6
i j k l R7
m n o p R8
Level 3
C C C C
a b c d R9
e f g h R10
i j k l R11
m n o p R12
Level 4
C C C C
a b c d R13
e f g h R14
i j k l R15
m n o p R16
The Cs are your arduino high outputs.
The Rs are your ULN2803 current sinks - the lows. You need 2 devices.
So as long as you only have 1 R low at a time, each Arduino High output will only Source up to 20mA (controlled by the resistor), and each ULN2803 will sink up to 80mA when on, but only one at a time.
So your code will set the Cs, drive an R on, then off.
Set the Cs, drive an R on, then off.
Or, drive an R, turn Cs on. Turn Cs off.
Next R, turn Cs on, Turn Cs off.
Never turn 2 Rs on, that will really stress the Arduino C outpout. 3 will likely fatally damage it.
Another option is to have Arduino control a PNP transistor as the current source.
Options - use shift register with ULN2803 on output, free up more pins & seperate the Cs, maybe have 2 sets on at once.
Or possibly all 4, with seperate pins driving each set of columns, and clever shifting (needs 2 pins, maybe 3) to have R1,5,9,13 on, then 2,6,10,14.