Нашел отличную библиотеку на Python: pymupdf. Кто умеет, тот может написать так:
with fitz.open(file) as doc:
for page in doc:
list_texts = page.getText('blocks')
for text in list_texts:
print(text[4])
И вы получите текст в виде отдельных блоков, которые идут последовательно (сначала все блоки первой колонки, потом все блоки второй колонки, третьей....) и никак между собой не пересекаются. Это не сырой текст, где надо искать какие- то неточные признаки (типа, больше одного пробела подряд- значит первая колонка закончилась и после пробелов начнется строка второй колонки).