how many 7 segment LEDs can a arduino run?

That display is 4 separate segments. There are 8 segments per digit, and 4 common cathodes.

You connect the 8 segments and 4 cathodes to 12 IO and drive each digit sequentially. Here's some code I threw together to display numbers on that particular display.

note: this code isn't all that great, or even all that complete.

#include <TimerOne.h> // this is non-standard, download it from the arduino site

const int num_digits = 10;
const byte num_pins   = 8;
const byte num_grounds= 4;
byte grounds[] = {3,2,1,0};                        // g1,g2,g3,g4
byte segments[]  = {9,6,13,12,11,8,7,4};      // A,B,C,D,E,F,G,P

byte num_to_display[]={0,0,0,0};

int led_nums[num_digits][num_pins]=
{
      {1,1,1,1,1,1,0,0},      // 0
      {0,1,1,0,0,0,0,0},      // 1
      {1,1,0,1,1,0,1,0},      // 2
      {1,1,1,1,0,0,1,0},      // 3
      {0,1,1,0,0,1,1,0},      // 4
      {1,0,1,1,0,1,1,0},      // 5
      {1,0,1,1,1,1,1,0},      // 6
      {1,1,1,0,0,0,0,0},      // 7
      {1,1,1,1,1,1,1,0},      // 8
      {1,1,1,1,0,1,1,0},      // 9
};

void setup()
{
      int i;
      for (i = 0;i < num_pins;i++)
      {
            pinMode(segments[i],OUTPUT);
            if (i < num_grounds)
            {
                  pinMode(grounds[i],OUTPUT);
                  digitalWrite(grounds[i],HIGH);
            }
      }
      
      Timer1.initialize(550);
      Timer1.attachInterrupt(updateDisplay);
}

void updateDisplay()
{
      int g,d;
      
      for (g = 0; g < num_grounds;g++)
      {
            for (d = 0;d < num_pins;d++) if(digitalRead(segments[d]) == 1) digitalWrite(segments[d], LOW);      // clear used
            digitalWrite(grounds[g],digitalRead(grounds[g])^1);      // enable digit
            for (d = 0;d < num_pins;d++) digitalWrite(segments[d], (led_nums[num_to_display[g]][d] == 1) ? HIGH : LOW); //write segments
            digitalWrite(grounds[g],HIGH);      // disable digit
      }
}

void loop()
{
      setDigits(1,2,3,4);
}

void setDigits(byte n1, byte n2, byte n3, byte n4)
{
      num_to_display[0] = n1;
      num_to_display[1] = n2;
      num_to_display[2] = n3;
      num_to_display[3] = n4;
}