Deadlock -- Way to make this better?
I would try to understand why your query leads to a deadlock. It would be useful to look at deadlock graph info. Try enabling trace flags (1204, 1222) to get more details from the SQL Server log.
Since you are using the row level locking and get deadlocks I suspect that PrintBatchId might have a large number of records associated. So SQL Server has to escalate the lock to page/table level. And as a result, you get a deadlock with an update on different PrintBatchId. (BTW. Do you have an index on PrintBatchId? W/o proper index row level locking won't work). Try to make query filter smaller.
If you can't make your filter more precise I would suggest to catch deadlocks and retry update attempt. Here is a sample code:

DECLARE @Retries INT = 5
    , @ErrorMessage nvarchar(max)
    , @ErrorLine INT    
    , @ErrorSeverity INT
    , @ErrorNumber INT 

WHILE (@Retries &gt; 0)
BEGIN             
    BEGIN TRY
        --UPDATE Command.... 
        SELECT @retries = 0
    END TRY
    BEGIN CATCH
        SELECT 
              @ErrorMessage = ERROR_MESSAGE()
            , @ErrorLine    = ERROR_LINE()
            , @ErrorSeverity= ERROR_SEVERITY()
            , @ErrorNumber  = ERROR_NUMBER();

        IF (@ErrorNumber = 1205 AND @Retries &gt; 0) -- If Deadlock, then retry 
            SELECT @ErrorMessage = 'Execution Failed due to a deadlock. Retrying... ';
        ELSE
        IF (@ErrorNumber = 1205 AND @Retries &lt;= 0) -- If Deadlock, and max number of retries reached. Fail.
            SELECT @ErrorMessage = 'Execution Failed due to a deadlock after max number of retries ... ' + CHAR(13) + ' Original Error: Msg. ' + CAST(@ErrorNumber AS VARCHAR(MAX)) + ', ' + @ErrorMessage;
        ELSE
            SELECT @ErrorMessage = 'Execution Failed: Msg ' + CAST(@ErrorNumber AS VARCHAR(MAX)) + ', ' + @ErrorMessage;

        SELECT @Retries-=1;     

    END CATCH;
END