diff --git a/controllers/main.py b/controllers/main.py
index f175dee8fa8157bde8c25e94aa2462f84456b6f3..ecafacfbe012fe45cccf1f456a9cf6f93f73e1e0 100644
--- a/controllers/main.py
+++ b/controllers/main.py
@@ -1,10 +1,11 @@
 # Copyright 2021 Le Filament (<http://www.le-filament.com>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
+import base64
 
 from odoo import SUPERUSER_ID, _, http
 from odoo.exceptions import AccessError, MissingError
-from odoo.http import request
+from odoo.http import Response, request
 from odoo.tools import consteq
 
 from odoo.addons.portal.controllers.portal import CustomerPortal
@@ -36,7 +37,9 @@ class AccAccountMain(CustomerPortal):
                 download=False,
             )
         else:
-            raise AccessError(_("Vous n'êtes pas autorisé à accéder à ce document"))
+            return Response(
+                _("Aucun document n'est disponible à cette URL."), status=404
+            )
 
     @http.route(
         ["/contract/<int:contract_id>"],
@@ -49,17 +52,33 @@ class AccAccountMain(CustomerPortal):
     def print_contract(self, contract_id, access_token=None, **kw):
         contract = request.env["acc.contract"].browse([contract_id])
         contract_sudo = contract.with_user(SUPERUSER_ID).exists()
+        if not contract_sudo:
+            return Response(
+                _("Aucun document n'est disponible à cette URL."), status=404
+            )
         if (
             not access_token
             or not contract_sudo.access_token
             or not consteq(contract_sudo.access_token, access_token)
         ):
-            raise AccessError(_("Vous n'êtes pas autorisé à accéder à ce document"))
+            return Response(
+                _("Aucun document n'est disponible à cette URL."), status=404
+            )
         else:
-            content_base64 = contract_sudo.document
-            headers = [
-                ("Content-Type", "application/pdf"),
-                ("Content-Length", len(content_base64)),
-            ]
+            status, headers, content_base64 = (
+                request.env["ir.http"]
+                .sudo()
+                .binary_content(
+                    model="acc.contract",
+                    id=contract_sudo.id,
+                    field="document",
+                    default_mimetype="application/pdf",
+                    download=False,
+                )
+            )
+            content = base64.b64decode(content_base64)
+            headers = http.set_safe_image_headers(headers, content)
+            response = request.make_response(content, headers)
+            response.status_code = status
 
-            request.make_response(content_base64, headers=headers)
+            return response
diff --git a/models/acc_account.py b/models/acc_account.py
index 2db658470bd329a30dac8145bea0f64570217b1a..aa3abed433f6c6f91fe82c054e169e80ebda3f5c 100644
--- a/models/acc_account.py
+++ b/models/acc_account.py
@@ -141,7 +141,8 @@ class AccAccount(models.Model):
             move.access_url = "/invoice/%s" % (move.id)
 
     def _get_report_base_filename(self):
-        return "Facture"
+        self.ensure_one()
+        return "Facture %s" % (self.name,)
 
     @api.depends(
         "line_ids",