Один способ использовать 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')
Библиотека 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)
Первый шаг должен произвести файл 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]*'
извлечь количество страницы.
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)
Вы могли также использовать ЛАТЕКС, чтобы сделать это (хотя я знаю, что это, вероятно, не, что Вы хотите). Что-то как следующее должно работать:
\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.
\includepdf[pages=-]{...}
.
– jofel
28.02.2013, 18:41
\cleardoublepage
только вставляет пустую страницу, если Вы используете класс, сделанный для двухсторонней печати. Я использовал статью, которая не работает; я зафиксировал его и обновил вопрос отразить это.
– Sam Whited
28.02.2013, 19:56
\includepdf
включает только первую страницу по умолчанию (не все страницы). \documentclass[twoside]{article}
работы также.
– jofel
01.03.2013, 02:57
Вот код с 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"))
./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
– Gilles 'SO- stop being evil' 01.03.2013, 14:53<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