Изменить ориентацию альбомных страниц только в PDF

У меня есть файл PDF, экспортированный из LibreOffice Writer. Вот пример. Некоторые страницы имеют книжную ориентацию, а другие - альбомную. Я использую Linux, и когда я просматриваю файл в evince или Foxit Reader, он отображается правильно, то есть все текстовые строки расположены горизонтально. Он также правильно печатается на моем принтере на бумаге формата А4: альбомные страницы поворачиваются на 90 градусов против часовой стрелки, поэтому текстовые строки становятся вертикальными.

Проблема в том, что документ будет напечатан на другом устройстве (в издателе), и мне сказали, что все страницы должны иметь книжную ориентацию. Я не уверен, что это уже так, и даже показывает, что страницы с альбомной ориентацией повернуты по часовой стрелке. Например, pdfinfo file.pdf печать Page rot: 0, Если так, то все хорошо. Однако, если в файле PDF есть команда, говорящая о том, что следующая страница находится в альбомном режиме, необходимо повернуть ее на 90 градусов и объявить ее портретной.

Так можно ли вращать только ландшафтные страницы из командной строки? Я знаю, что могу сделать это с помощью pdftk, но тогда мне нужно указать номера страниц вручную. У меня много документов, и сложно вручную указывать номера альбомных страниц. Есть ли автоматический способ?

2 ответа

Решение

Это возможно с Python и модулем PyPDF2. Смотрите пример кода:

import PyPDF2

pdf_in = open('test.pdf', 'rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_in)
pdf_writer = PyPDF2.PdfFileWriter()

numofpages = pdf_reader.numPages

numrotated = 0 
for pagenum in range(numofpages):
    page = pdf_reader.getPage(pagenum)
    mb = page.mediaBox
    if (mb.upperRight[0] > mb.upperRight[1]) and (page.get('/Rotate') is None):
        page.rotateCounterClockwise(90)
        numrotated = numrotated + 1
    pdf_writer.addPage(page)

print str(numrotated) + " of " + str(numofpages) + " pages were rotated"
pdf_out = open('test_rotated.pdf', 'wb')
pdf_writer.write(pdf_out)
pdf_out.close()

pdf_in.close()

Протестировано на Red Hat Enterprise Linux 6, Python 2.7.12, PyPDF2 1.26.0. Также работает на Windows.

Это ответ выше, но преобразованный в python3.

      
pdf_in = open('test.pdf', 'rb')
pdf_reader = PyPDF2.PdfReader(pdf_in)
pdf_writer = PyPDF2.PdfWriter()

numofpages = len(pdf_reader.pages)

numrotated = 0
for pagenum in range(numofpages):
    page = pdf_reader.pages[pagenum]
    mb = page.mediabox
    if (mb.upper_right[0] > mb.upper_right[1]) and (page.get('/Rotate') is None):
        page.rotate(90)
        numrotated = numrotated + 1
    pdf_writer.add_page(page)

print (str(numrotated) + " of " + str(numofpages) + " pages were rotated")
pdf_out = open('test_rotated.pdf', 'wb')
pdf_writer.write(pdf_out)
pdf_out.close()

pdf_in.close()
Другие вопросы по тегам