diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 8a1b6f9c05f864d07429409cebd440dfbd0d864c..318c669ae02c4afd3f410989a6b9a154c00cd969 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -1,7 +1,6 @@
 import os
 from glob import glob
 
-from django.core.files.temp import gettempdir
 from django.utils.translation import gettext_lazy as _
 
 from dynaconf import LazySettings
@@ -454,9 +453,6 @@ SASS_PROCESSOR_INCLUDE_DIRS = [
     STATIC_ROOT,
 ]
 
-# Temporary files
-TEMP_DIRECTORY = _settings.get("temp_files.directory", gettempdir())
-
 ADMINS = _settings.get("contact.admins", [])
 SERVER_EMAIL = _settings.get("contact.from", "root@localhost")
 DEFAULT_FROM_EMAIL = _settings.get("contact.from", "root@localhost")
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index e1859d3090f006833134d851b68ad4b4a85020b8..676894d28d62f32ee9c08de874edf6857f94a629 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -4,7 +4,6 @@ from datetime import datetime, timedelta
 from importlib import import_module
 from itertools import groupby
 from operator import itemgetter
-from tempfile import mkstemp
 from typing import Any, Callable, Optional, Sequence, Union
 from uuid import uuid4
 
@@ -271,9 +270,3 @@ def queryset_rules_filter(
 def unread_notifications_badge(request: HttpRequest) -> int:
     """Generate badge content with the number of unread notifications."""
     return request.user.person.unread_notifications_count
-
-
-def make_temp_file(*args, **kwargs):
-    """Wrap mkstemp to ensure that the configured temp directory is used."""
-    kwargs["dir"] = settings.TEMP_DIRECTORY
-    return mkstemp(*args, **kwargs)
diff --git a/aleksis/core/util/pdf.py b/aleksis/core/util/pdf.py
index f6e2bf298a434ece70e95b6358f83665d1ff33a8..24a98816b87f38848d5320c9e31c3f4f69ff1782 100644
--- a/aleksis/core/util/pdf.py
+++ b/aleksis/core/util/pdf.py
@@ -1,6 +1,7 @@
 import glob
 import os
 import subprocess  # noqa
+from tempfile import TemporaryDirectory
 
 from django.http.request import HttpRequest
 from django.http.response import HttpResponse
@@ -13,7 +14,7 @@ from celery_progress.backend import ProgressRecorder
 from aleksis.core.celery import app
 from aleksis.core.settings import MEDIA_ROOT, MEDIA_URL, STATIC_ROOT
 from aleksis.core.util.celery_progress import recorded_task
-from aleksis.core.util.core_helpers import make_temp_file, path_and_rename
+from aleksis.core.util.core_helpers import path_and_rename
 
 
 @recorded_task
@@ -24,22 +25,22 @@ def generate_pdf(html_code: str, pdf_path: str, recorder: ProgressRecorder):
     # Replace /static with STATIC_ROOT to get local file system paths
     html_code = html_code.replace("/static", STATIC_ROOT)
 
-    # Write HTML code to a temporary file to make it available for electron-pdf
-    f, path = make_temp_file(".html")
-    with open(path, "w") as f:
-        f.write(html_code)
-
-    # Start a X framebuffer and run electron-pdf
-    os.environ["DISPLAY"] = ":99.0"
-    xfvb_process = subprocess.Popen(  # noqa
-        ["Xvfb", ":99", "-screen", "0", "1024x768x24"],
-        stdout=subprocess.DEVNULL,
-        stderr=subprocess.DEVNULL,
-    )
-    subprocess.run(["electron-pdf", path, pdf_path])  # noqa
-    xfvb_process.terminate()
-
-    os.remove(path)
+    # Open a temporary directory
+    with TemporaryDirectory() as temp_dir:
+        # Write HTML code to a temporary file to make it available for electron-pdf
+        path = os.path.join(temp_dir, "print_source.html")
+        with open(path, "w") as f:
+            f.write(html_code)
+
+        # Start a X framebuffer and run electron-pdf
+        os.environ["DISPLAY"] = ":99.0"
+        xfvb_process = subprocess.Popen(  # noqa
+            ["Xvfb", ":99", "-screen", "0", "1024x768x24"],
+            stdout=subprocess.DEVNULL,
+            stderr=subprocess.DEVNULL,
+        )
+        subprocess.run(["electron-pdf", path, pdf_path])  # noqa
+        xfvb_process.terminate()
 
     recorder.set_progress(1, 1)