Проблема

Необходимо установить факт изменения порядка страниц в документе (например, PDF, DOCX). Это требуется для форензики подлинности, особенно при проверке изменяли ли порядок страниц в документе в судебных или корпоративных расследованиях.

Причины

- Злоумышленник переставил страницы для искажения хронологии событий (подлог) или скрытия улик.
- Автоматическая обработка (склейка сканов, распознавание) могла нарушить последовательность.
- Некорректное редактирование или конвертация многостраничного файла.

Решение


1. Для PDF (наиболее частый случай) — анализ объектной структуры

Используйте `pikepdf` или `pdfminer.six` для извлечения хэшей содержимого каждой страницы. Если есть эталонный экземпляр (оригинал), сравните последовательность хэшей.

bash
<h2 id="ustanovka-zavisimostey">Установка зависимостей</h2>
pip install pikepdf pdfminer.six


python
import pikepdf
import hashlib

def extract_page_hashes(pdf_path):
with pikepdf.open(pdf_path) as pdf:
hashes = []
for page in pdf.pages:
# сериализация объекта страницы (содержимое + ресурсы)
page_data = page.get_raw_value().to_bytes(stream=True)
hashes.append(hashlib.sha256(page_data).hexdigest())
return hashes

<h2 id="sravnenie-dvuh-versiy">Сравнение двух версий</h2>
original_hashes = extract_page_hashes("original.pdf")
modified_hashes = extract_page_hashes("suspect.pdf")

if original_hashes == modified_hashes:
print("Порядок страниц не менялся")
else:
print("Последовательность страниц изменена. Подробнее:")
# Поиск перестановок
for i in range(min(len(original_hashes), len(modified_hashes))):
if original_hashes[i] != modified_hashes[i]:
print(f"Страница {i+1}: различие")


2. Для PDF — прямой разбор дерева /Pages

В PDF-структуре страницы упорядочены в массиве `Kids` узла `/Pages`. Изменение порядка страниц в PDF меняет этот массив. Используйте `pdfinfo` (poppler-utils) или кастомный скрипт:

bash
pdfinfo -f 1 -l 10 suspect.pdf   # вывести список страниц с Info (не покажет порядок)
<h2 id="luchshe-eksport-v-tekst-i-sravnivat-razmery-heshi-izobrazheniy-stranits">Лучше: экспорт в текст и сравнивать размеры/хэши изображений страниц</h2>


3. Для DOCX — проверка внутреннего XML

DOCX — ZIP-архив с XML. Порядок страниц в DOCX не фиксирован (зависит от разметки), однако можно сравнить последовательность абзацев (paragraphs) и секций (sections). Извлеките контент каждой страницы через `python-docx`:

python
from docx import Document
import hashlib

def extract_paragraphs_hashes(docx_path):
doc = Document(docx_path)
hashes = []
for para in doc.paragraphs:
hashes.append(hashlib.sha256(para.text.encode()).hexdigest())
return hashes

<h2 id="sravnenie-posledovatelnosti-heshey-teksta-mezhdu-versiyami">Сравнение последовательности хэшей текста между версиями</h2>


4. Универсальный метод — визуальное сравнение (Image Magic)

Извлеките каждую страницу как изображение (через `poppler` для PDF, `LibreOffice` для DOCX) и вычислите хэш изображения (`ImageHash`). Сравните порядок хэшей с эталоном.

bash
pdftoppm suspect.pdf output -png   # извлекает страницы в output-1.png, output-2.png...
<h2 id="zatem-sravnite-heshi-izobrazheniy-cherez-python">Затем сравните хэши изображений через python</h2>


5. Анализ метаданных

Проверьте время создания/редактирования отдельных страниц (для PDF: `/Info` – только глобальные). Однако метаданные страниц редко хранят временные метки, поэтому метод ненадёжен.

Рекомендация: использовать комбинацию анализа хэша объектного дерева (PDF) и визуального сравнения. Если нужно как узнать переставляли ли страницы PDF без оригинала — изучите последовательность уникальных контентных фрагментов (например, номера страниц, колонтитулы) с помощью регулярных выражений на выдержках текста.

Легальность: все методы легальны, не нарушают законодательство РФ (анализ собственного файла или файла с разрешённым доступом).