Изменить ориентацию альбомных страниц только в 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()