Frequently asked questions
How do I let people sign a PDF in a Laravel application?
Install darvis/laravel-document-sign, run the migrations and call Signer::document($path)->addSigner($name, $email)->send(). Every signer gets a mail with a signing link, draws a signature on the signing page, and the package places all signatures on the PDF once everyone has signed.
Is darvis/laravel-document-sign a DocuSign alternative?
It offers a DocuSign like flow inside your own Laravel application, with the documents on your own storage. It is an independent open-source package under the MIT license, free to use and not affiliated with DocuSign. It places a drawn signature image on the PDF and keeps an audit trail; it does not provide qualified electronic signatures and does not sign the PDF cryptographically.
Which PHP and Laravel versions does darvis/laravel-document-sign support?
PHP 8.2 or higher with the GD extension, and Laravel 11, 12 and 13. It installs setasign/fpdf and setasign/fpdi for the PDF work.
How long does a signing link stay valid, and how do I send it again?
For link_expires_after_hours hours after the invitation was last sent, 72 by default. After that the signing page, the PDF and submitting a signature all answer 403. Notify the signer again with SignatureRequested and record an invitation_sent audit event to reopen the window.
How do I position a signature on the page?
With page, x and y on addSigner(), as percentages of the page measured from the top left, plus an optional width in percent of the page width. A page beyond the last page is skipped without an error, so check the page count with FPDI before sending.
What happens when the last signer has signed, and what if stamping fails?
The package places every signature on the original PDF with FPDI, stores the result as signed_path on the configured disk, sets the document to Completed and dispatches DocumentCompleted. Signing runs in one database transaction, so when stamping fails nothing is kept, SigningFailed is reported and the signer is asked to try again.
Where are the documents and signatures stored?
On the filesystem disk from config/signer.php (SIGNER_DISK, local by default) under storage_path (signer), in the folders originals, signatures and signed. The data is in five database tables prefixed signer_.
Who can log in to the portal, and what can they see?
Any user of the guard in signer.portal.guard (web by default), and every one of them sees and can delete every customer and document, because the portal has no roles. Restrict it with your own middleware in signer.portal.middleware, or turn it off with SIGNER_PORTAL_ENABLED=false. The login is limited to five attempts a minute per email address and IP address.
Is there an audit trail of who signed?
Every step is recorded in signer_audit_events as document_created, invitation_sent, document_signed and document_completed. The document_signed event stores the IP address and user agent of the signer.
How do I test the signing flow without sending mail?
Use Storage::fake() for the configured disk and Notification::fake(), build a small PDF with FPDF, call send(), and post a PNG data URL to the signer.store route. The testing page of the documentation has a complete example.