## Step 1: Define the symbolic representation of the problem
The problem involves two types of paper: lined and unlined paper. Let's denote the number of reams of lined paper as $x_1$ and the number of reams of unlined paper as $x_2$. The profit from selling lined paper is $5 per ream and from unlined paper is $3 per ream. The time required on the printing machine for lined paper is 2 minutes and for unlined paper is 1 minute. The time required on the scanning machine for lined paper is 5 minutes and for unlined paper is 2 minutes. Each machine is available for a maximum of 400 minutes per day.

## Step 2: Formulate the objective function
The objective is to maximize profit. The profit from $x_1$ reams of lined paper is $5x_1$ and from $x_2$ reams of unlined paper is $3x_2$. Therefore, the total profit to be maximized is $5x_1 + 3x_2$.

## 3: Formulate the constraints
1. The printing machine's time constraint: $2x_1 + x_2 \leq 400$.
2. The scanning machine's time constraint: $5x_1 + 2x_2 \leq 400$.
3. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$.

## 4: Symbolic representation
The symbolic representation of the problem is:
```json
{
'sym_variables': [('x1', 'reams of lined paper'), ('x2', 'reams of unlined paper')],
'objective_function': '5*x1 + 3*x2',
'constraints': ['2*x1 + x2 <= 400', '5*x1 + 2*x2 <= 400', 'x1 >= 0', 'x2 >= 0']
}
```

## 5: Gurobi code
Now, let's implement this problem using Gurobi in Python:
```python
import gurobi

def solve_paper_production_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(name="x1", lb=0, ub=gurobi.GRB.INFINITY, obj=5)  # reams of lined paper
    x2 = model.addVar(name="x2", lb=0, ub=gurobi.GRB.INFINITY, obj=3)  # reams of unlined paper

    # Add constraints
    model.addConstr(x1 * 2 + x2 <= 400, name="printing_constraint")
    model.addConstr(x1 * 5 + x2 * 2 <= 400, name="scanning_constraint")

    # Set objective function
    model.setObjective(x1 * 5 + x2 * 3, gurobi.GRB.MAXIMIZE)

    # Optimize model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal production: {x1.varValue} reams of lined paper, {x2.varValue} reams of unlined paper")
        print(f"Maximum profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

solve_paper_production_problem()
```