Как я могу объединить файлы PDF так, чтобы каждый файл начался на нечетном номере страницы?

Один способ использовать sed:

Содержание script.sed:

## Change line.
s/.*/('&','&')/

## Append it to hold space.
H

## In end of file substitute newlines with commas and print.
$ {
    g   
    s/^\n//
    s/\n/,/g
    p   
}

Команда:

sed -nf script.sed infile

Вывод:

('chair','chair'),('table','table'),('pen','pen'),('desk','desk')
10
13.12.2017, 23:03
5 ответов

Библиотека PyPdf делает этот вид вещей легким, если Вы готовы записать немного Python. Сохраните код ниже в названном сценарии pdf-cat-even (или независимо от того, что Вам нравится), сделайте это исполняемым файлом (chmod +x pdf-cat-even), и выполненный это как фильтр (./pdf-cat-even a.pdf b.pdf >concatenated.pdf). Вам нужен pyPdf ≥1.13 для addBlankPage метод.

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0
alignment = 2           # to align on even pages
for filename in sys.argv[1:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)
6
27.01.2020, 20:02
  • 1
    Спасибо, это работало на меня! Поскольку я предпочитаю читать названия pdfs из файла, я изменил Ваш код немного и отправил его как отдельный ответ. –  Jan Warchoł 01.03.2013, 14:28
  • 2
    @JanekWarchol, Если Ваши имена файлов не содержат специальные символы оболочки, такие как пробел: ./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf –  Gilles 'SO- stop being evil' 01.03.2013, 14:53
  • 3
    К сожалению, они действительно содержат пробелы. Но спасибо, тем не менее - я не понял, что это могло быть сделано этот путь. инструменты –  Jan Warchoł 02.03.2013, 17:23
  • 4
    @JanekWarchol Затем можно использовать <list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf –  Gilles 'SO- stop being evil' 04.03.2013, 03:33

Первый шаг должен произвести файл PDF с пустой страницей. Можно сделать это легко с большим количеством программ (LibreOffice/OpenOffice, inkscape, (La) TEX, scribus, и т.д.)

Затем просто включайте эту пустую страницу при необходимости:

pdftk A.pdf empty_page.pdf B.pdf output result.pdf 

Если Вы хотите сделать это автоматически со сценарием, можно использовать, например. pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*' извлечь количество страницы.

3
27.01.2020, 20:02
  • 1
    Это чувствует себя подобно определенному взлому. Хотя, если это работает, это работает, я предполагаю. –  Sam Whited 28.02.2013, 18:18
  • 2
    Этот подход почти работал на меня: я записал сценарий, который произвел список pdfs с epmtyPage.pdf, добавленным в случае необходимости, но я не мог заставить pdftk правильно анализировать этот список, если бы имена файлов содержали пробелы. Я попытался изменить значение IFS, с помощью кавычек, но напрасно - возможно, это - отказ pdftk. Так или иначе ответ с помощью pypdf работал на меня. –  Jan Warchoł 01.03.2013, 14:18
  • 3
    @JanekWarchol, Какую версию pdftk Вы использовали? По крайней мере, pdftk 1.44 и более новый, кажется, поддерживает пробелы в именах файлов. –  jofel 09.03.2013, 03:11
  • 4
    @jofel pdftk --version pdftk 1.44 возвратов. Я помню, что мои more-bash-savvy друзья провели по крайней мере 15 минут, пробуя разные вещи для получения этой работы и сдались. –  Jan Warchoł 09.03.2013, 10:44

Ответ Gilles работал на меня, но так как я должен объединить много файлов, более удобно, если я могу считать их имена из текстового файла. Я немного изменил код Gilles, чтобы сделать просто, что, возможно, он помог бы кому-то еще:

#!/usr/bin/env python

# requires PyPdf library, version 1.13 or above -
# its homepage is http://pybrary.net/pyPdf/
# running: ./this-script-name file-with-pdf-list > output.pdf

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

listoffiles = open(sys.argv[1]).read().splitlines()
for filename in listoffiles:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)
1
27.01.2020, 20:02

Вы могли также использовать ЛАТЕКС, чтобы сделать это (хотя я знаю, что это, вероятно, не, что Вы хотите). Что-то как следующее должно работать:

\documentclass{book}

\usepackage{pdfpages}

\begin{document}

\includepdf[pages=-]{A}
\cleardoublepage % Make sure we clear to an odd page
\includepdf[pages=-]{B} % This inserts all pages. Or you can specify specific pages, a range, or `{}` for a blank page

\end{document}

Отметьте это \cleardoublepage только вставляет пустую страницу с классами, которые сделаны для двухсторонней печати (например, книга)

Больше опций и информации о pdfpages может быть найден на CTAN.

1
27.01.2020, 20:02
  • 1
    Для включения всех страниц автоматически можно использовать \includepdf[pages=-]{...}. –  jofel 28.02.2013, 18:41
  • 2
    @jofel Спасибо, зафиксированное вопрос. Я думаю это значения по умолчанию ко всем страницам также, я просто поместил его там, чтобы показать, что было возможно выбрать определенные страницы. –  Sam Whited 28.02.2013, 19:51
  • 3
    @jofel кроме того, \cleardoublepage только вставляет пустую страницу, если Вы используете класс, сделанный для двухсторонней печати. Я использовал статью, которая не работает; я зафиксировал его и обновил вопрос отразить это. –  Sam Whited 28.02.2013, 19:56
  • 4
    \includepdf включает только первую страницу по умолчанию (не все страницы). \documentclass[twoside]{article} работы также. –  jofel 01.03.2013, 02:57
  • 5
    Из того, что я вижу, что имел бы к explicitely, пишут все файлы, которые должны быть включены, таким образом, это не достаточно хорошо для меня. Но спасибо так или иначе. –  Jan Warchoł 01.03.2013, 14:19

Вот код с PyPDF2 и python3

#!/usr/bin/env python


# requires PyPdf2 library, version 1.26 or above -
# its homepage is https://pythonhosted.org/PyPDF2/index.html
# running:./this-script-name output.pdf file-with-pdf-list

import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

for filename in sys.argv[2:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename, "rb"))
    output.appendPagesFromReader(input)
    output_page_number += input.getNumPages()

    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1

output.write(open(sys.argv[1], "wb"))
0
27.01.2020, 20:02

Теги

Похожие вопросы