To say it short:
- Don't use the String class
- Don't use SoftwareSerial if you have hardware serial
The String class fragments your memory and has some serious memory bugs, your Arduino will reset quite often because of that.
The SoftwareSerial's timing is not as exact as the hardware version and because of that some devices fail to correctly communicate with it. You don't seem to use the hardware serial so try moving your printer communication there, it's much more reliable.