Basierend auf den Hinweisen auf saputellos Kommentare könnte man in der Tat das eigentliche Dokument zweimal verarbeiten: Einmal ganz normal und einmal mit zusätzlichen Einstellungen, die dafür sorgen, dass nur die Zeichen in der Ausgabe landen, die auch wirklich gezählt werden sollten. Dieses Zähldokument lässt man dann ebenfalls erstellen, macht beispielsweise mit `pdftotext` eine Textdatei daraus und zählt mit einem Programm wie `wc` (ist bei Linux normalerweise dabei, gibt es aber auch für OSX und [Windows](http://gnuwin32.sourceforge.net/packages/coreutils.htm)) dann die Zeichen in der Textdatei.
Die Erzeugung des Zähldokuments kann sehr einfach aus dem Hauptdokument per `filecontents`-Umgebung erfolgen. Die Verwendung von Paket [`stdpage`](https://ctan.org/pkg/stdpage) in dem Zähldokument ist nicht zwingend, kann aber bereits einige Dinge erleichter. Fehlende Dokumentvereinfachungen ergänzt man zusätzlich.
Die benötigten Aufrufe, um aus dem Zähldokument schließlich die Anzahl der Zeichen zu erhalten, kann man in den Dokumenterstellungsvorgang ähnlich dem Aufruf von `makeindex` oder `biber` etc. einfügen. Man kann aber auch mit dem Paket [`shellesc`](https://ctan.org/pkg/shellesc), das Bestandteil neuerer Version der LaTeX-Standard-Tools ist, die Aufrufe direkt aus dem Hauptdokument heraus durchführen. Dazu muss `pdflatex` (oder `lualatex` oder `xelatex`) allerdings [mit Option `--shell-escape` aufgerufen](https://texwelt.de/wissen/fragen/10341/wie-aktiviere-ich-shell-escape-in-meinem-editor) werden.
Angenommen, wir haben ein Dokument `test-hauptdatei.tex`:
\RequirePackage{filecontents}
\begin{filecontents*}{normseiten.tex}
\makeatletter
\newcommand*{\GenerateInfoPage}{%
\usepackage[hyphen=false,just=false,parskip]{stdpage}%
\let\tableofcontents\relax
\let\listoffigures\relax
\let\maketitle\relax
\let\ps@plain\ps@empty
\let\ps@headings\ps@empty
\renewcommand*{\includegraphics}[2][]{}%
}
\makeatother
\input{test-hauptdatei.tex}
\end{filecontents*}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\newcommand*{\BeispielMakro}{Das ist nur irgend ein Beispielmakro}
\usepackage{mwe}
\usepackage{shellesc}
\providecommand*{\GenerateInfoPage}{%
\AtEndDocument{%
\typeout{Es erfolgt die Ermittlung der Zeichen.}%
\ShellEscape{pdflatex normseiten.tex}% Normseiten erstellen.
\ShellEscape{pdftotext normseiten.pdf normseiten.txt}% In Text wandeln
\ShellEscape{wc -m normseiten.txt | cut -d' ' -f1 > test-anzahlseiten.txt}% Zeichen zählen
\clearpage
\IfFileExists{test-anzahlseiten.txt}{%
Dieses Dokument hat ohne diese Seite \input{test-anzahlseiten.txt}Zeichen.
}{%
Um die Anzahl der Zeichen in diesem Dokument zu bestimmen, ist Option
\texttt{--shell-escape} beim Aufruf von \texttt{pdflatex} erforderlich!
}%
}%
}
\pagestyle{headings}
\GenerateInfoPage% Sollte die letzte Anweisung vor \begin{document} sein!
\begin{document}
\title{Titel}
\author{Ijon Tichy}
\maketitle
\tableofcontents
\listoffigures
\blinddocument
\begin{figure}
\includegraphics{example-image}
\caption{Testbild mit \BeispielMakro}
\end{figure}
\end{document}
dann erhält man auf diese Weise als letzte Seite den Hinweis:
[![Dieses Dokument hat ohne diese Seite 4376 Zeichen.][1]][1]
Wie zu sehen ist, ist das Einbinden des Zählergebnisses selbst dabei das kleinere Problem. Entscheidender ist in der Tat, dass man wirklich genau das zählt, was man wirklich zählen will. Das sollte man anhand der Datei `normseiten.pdf` unbedingt überprüfen!
Um die Infoseite nicht mit zu zählen wurde ein einfacher Trick verwendet. Die Anweisung, die diese Infoseite erzeugt, wird nur dann definiert, wenn sie nicht bereits definiert ist. Im Zähldokument wiederum wird diese Anweisung bereits vorab, also vor dem Einlesen des Hauptdokument, definiert und enthält dann die ganzen Änderungen, die nur für das Zähldokument gelten. Wollte man die Infoseite mitzählen, müsste man hier stattdessen unterschiedliche Befehle verwenden und den für das Zähldokument im Hauptdokument nur ausführen, wenn er definiert ist.
[1]: https://texwelt.de/wissen/upfiles/test_20180612_090113.png