\pagegoal, \pagetotal
\pagegoal is a internal register that contains the height that needs filling, \pagestotal is the amount that is already filled.
Example:
\documentclass[a4paper]{report}
\usepackage[margin=1in,showframe]{geometry}
\usepackage{lipsum}
% Put a line in the middle of text height for testing
\usepackage{atbegshi,picture}
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
\put(0,\dimexpr-\topmargin-1in %
-\headheight-\headsep
-.5\textheight\relax){%
\line(1,0){\paperwidth}%
}%
}%
}
\newcommand*{\gotohalf}{%
\par
\begingroup
\dimen0=\pagegoal
\advance\dimen0 by -\pagetotal
\advance\dimen0 by -.5\textheight
\ifdim\dimen0<0pt %
% space left is smaller than half the text height
\newpage
\setlength{\topskip}{0pt}%
\vspace*{.5\textheight}%
\vspace{-\parskip}%
\else
\vspace{\dimen0}%
\fi
\endgroup
}
\begin{document}
\chapter*{Blabla}
\lipsum[1]
\gotohalf
\lipsum[3]
\end{document}

However there are severe limitations:
- LaTeX's output routine works asynchronous, the current values of
\pagegoal/\pagetotal might not be too accurate. At the starting page of a chapter it might work.
- Stuff at the bottom (e.g. float objects) are not taken into account thus the middle moves up.
Package zref-savepos
\pdfsavepos can be used to record the current position and is supported by many TeX compilers (pdfTeX, LuaTeX, XeTeX; both modes PDF and DVI). The page position can be stored in the .aux file and used in the next LaTeX run. Thus at least two LaTeX runs are necessary.
Package zref-savepos adds a user interface to \pdfsavepos:
\documentclass[a4paper]{report}
\usepackage[margin=1in,showframe]{geometry}
\usepackage{lipsum}
% Put a line in the middle of text height for testing
\usepackage{atbegshi,picture}
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
\put(0,\dimexpr-\topmargin-1in %
-\headheight-\headsep
-.5\textheight\relax){%
\line(1,0){\paperwidth}%
}%
}%
}
\usepackage{zref-savepos}
% Counter gotohalf helps creating unique label names for `\gotohalf
\newcounter{gotohalf}
\renewcommand*{\thegotohalf}{gotohalf\the\value{gotohalf}}
\newcommand*{\gotohalf}{%
\par
\stepcounter{gotohalf}%
\zsaveposy{\thegotohalf}%
\begingroup
\dimen0=\dimexpr.5\textheight
-\zposy{top}sp %
+\zposy{\thegotohalf}sp %
-\parskip
\relax
\ifdim\dimen0<0pt %
\newpage
\vspace*{\dimexpr.5\textheight-\topskip-\parskip\relax}%
\else
\kern\dimen0 %
\fi
\endgroup
}
\begin{document}
\zsaveposy{top}% one label at the top of a one page
% used as position reference for the top of textheight
\chapter*{Blabla}
\lipsum[1-2]
\gotohalf
\lipsum[3]
\end{document}

middleyou mean precisely 0.5 of text height or you are talking in a general fashion? – Pouya Apr 07 '14 at 10:34