listings and accsupp packages (recent version).
The technique relies on:
* the listings option
columns=fullflexible in order not to insert superfluous spaces* the listings option
literate to map characters to their exact ASCII counterparts.* the package accsupp to get some magic done between Unicode and ASCII spaces in order to preserve indentation (this is essential in some cases, for instance to copy-paste Python code)
Here is a simple ASCII example that is completely copyable with Ctrl-C in a PDF viewer (evince, xpdf, acrobat reader, etc.) or with pdftotext. The resulting copied string is equal to the one in LaTeX source:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{listings}
\lstset{
upquote=true,
columns=fullflexible,
basicstyle=\ttfamily,
literate={*}{{\char42}}1
{-}{{\char45}}1
{\ }{{\copyablespace}}1
}
\usepackage[space=true]{accsupp}
\newcommand{\copyablespace}{\BeginAccSupp{method=hex,unicode,ActualText=00A0}\hphantom{x}\EndAccSupp{}}
\begin{document}
\pagestyle{empty}
\begin{lstlisting}
# 0123456789abcdefghijklmnopqrstuvwxyz
# ABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[]^_`{|}~
#
for i in range(1,2):
print(i)
\end{lstlisting}
\end{document}
Readers
With pdftotext, this results in a perfectly preserved output (preserved space, preserved indentation, using option `-layout`: `pdftotext -layout input.pdf -`
For some readers, this solution does not preserve indentation on Sep 2020, see https://tex.stackexchange.com/questions/563803/how-make-a-latex-document-that-generates-a-pdf-from-which-copy-paste-works-corre and https://github.com/ho-tex/accsupp/issues/1
See also:
Producing searchable and copyable pdf files with accents using latex-pdflatex
Copy-pastable ASCII characters with pdftex/pdflatex