To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of books and magazines to be printed, formulating the objective function that represents the total profit, and establishing constraints based on the available printing and binding time.

Let's define:
- $x_1$ as the number of books to be printed,
- $x_2$ as the number of magazines to be printed.

The objective function, which is the total profit, can be represented as $5x_1 + 8x_2$, since each book sold yields a profit of $5 and each magazine sold yields a profit of $8.

The constraints are based on the available time for printing and binding:
1. Printing time constraint: $10x_1 + 20x_2 \leq 5000$ (since each book takes 10 minutes to print and each magazine takes 20 minutes, with 5000 minutes available),
2. Binding time constraint: $5x_1 + 3x_2 \leq 2000$ (since each book takes 5 minutes to bind and each magazine takes 3 minutes, with 2000 minutes available).

Additionally, we have non-negativity constraints because the number of books and magazines cannot be negative:
- $x_1 \geq 0$,
- $x_2 \geq 0$.

Thus, the symbolic representation of the problem is:

```json
{
    'sym_variables': [('x1', 'number of books'), ('x2', 'number of magazines')],
    'objective_function': '5*x1 + 8*x2',
    'constraints': ['10*x1 + 20*x2 <= 5000', '5*x1 + 3*x2 <= 2000', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this optimization problem using Gurobi in Python:

```python
from gurobipy import *

# Create a model
m = Model("Printing_Company_Profit")

# Define variables
x1 = m.addVar(name='books', vtype=GRB.CONTINUOUS, lb=0)
x2 = m.addVar(name='magazines', vtype=GRB.CONTINUOUS, lb=0)

# Set the objective function
m.setObjective(5*x1 + 8*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*x1 + 20*x2 <= 5000, name='printing_time')
m.addConstr(5*x1 + 3*x2 <= 2000, name='binding_time')

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```