ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] Как разрезать книгу для прошивки
@ 2014-11-03 18:29 Eugine Kosenko
  2014-11-03 20:14 ` Denis G. Samsonenko
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Eugine Kosenko @ 2014-11-03 18:29 UTC (permalink / raw)
  To: community, linux-list

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

При этом возникает следующая проблема. На первом листе нужно
напечатать справа первую, а слева последнюю страницу. С другой стороны
того же листа нужно напечатать слева вторую, а справа ---
предпоследнюю страницу. На следующем листе нужно печатать справа
третью страницу, а слева --- третью с конца. И так далее.

Вопрос: как обеспечить такую верстку текста?

Понятно, что TeX мне в руки и вперед. Но есть ли какие-нибудь
стандартные решения без сложного освоения? Может быть, есть
специальный софт для этого?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-03 18:29 [Comm] Как разрезать книгу для прошивки Eugine Kosenko
@ 2014-11-03 20:14 ` Denis G. Samsonenko
  2014-11-04  4:51 ` Gleb Kulikov
  2014-11-04  9:54 ` Victor
  2 siblings, 0 replies; 9+ messages in thread
From: Denis G. Samsonenko @ 2014-11-03 20:14 UTC (permalink / raw)
  To: ALT Linux Community general discussions

День добрый!

4 ноября 2014 г., 0:29 пользователь Eugine Kosenko написал:
> Пусть есть текст (книга), разбитый определенным образом на страницы.
> Нужно распечатать этот текст на листах формата A4 в альбомном
> расположении по две страницы на лист. В дальнейшем эти листы
> предполагается согнуть пополам и сшить по линии сгиба, чтобы
> получилась брошюра.
> ...
> Вопрос: как обеспечить такую верстку текста?
> ...

psbook и psnup из пакета psutils. Если не поможет, то более
низкоуровневый pstops оттуда же.

Ещё есть jpdftweak: http://jpdftweak.sourceforge.net/

-- 
Всего доброго,

Денис.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-03 18:29 [Comm] Как разрезать книгу для прошивки Eugine Kosenko
  2014-11-03 20:14 ` Denis G. Samsonenko
@ 2014-11-04  4:51 ` Gleb Kulikov
  2014-11-04  9:54 ` Victor
  2 siblings, 0 replies; 9+ messages in thread
From: Gleb Kulikov @ 2014-11-04  4:51 UTC (permalink / raw)
  To: ALT Linux Community general discussions

[-- Attachment #1: Type: text/plain, Size: 744 bytes --]

В письме от Понедельник 03 ноября 2014 20:29:43 пользователь Eugine Kosenko 
написал:

> Вопрос: как обеспечить такую верстку текста?

В аттаче популярный скрипт, проделывающий эту операцию над произвольными pdf 
файлами (NB!: требует pdflatex + pdfinfo и не терпит,  если имена файлов на 
русском или содержат спецсимволы [это, скорее, претензии к pdflatex]).



-- 
      Салют, /GLeb

UIN: 15341920
jabber://gleb@asd.iao.ru
sip://2387245@sipnet.ru			(telephony)
skype://gleb_kulikov.tomsk		(telephony)


[-- Attachment #2: pdfbook --]
[-- Type: text/x-python, Size: 5713 bytes --]

#! /usr/bin/python

# pdfbook.c	Rearrange pages in a PDF file into signatures.
#
# Author	Tigran Aivazian <tigran at aivazian.fsnet.co.uk> (original C version)
#               Olivier Aubert <olivier.aubert at liris.cnrs.fr> (python version)
#
# Copyright:	GPLv2
#
# Based on the algorithm from psutils/psbook.c, which was
# written by Angus J. C. Duggan 1991-1995.
#
# For example, to convert a file gnt.pdf into a book with
# signature 32, we can use:
#
# $ pdfbook -s32 gnt.pdf gnt-book.pdf

# FIXME: implement max signature size
# FIXME: try to set the "duplex on short sides" option

import sys
import os
import shutil
import re
import tempfile
from optparse import OptionParser

def check_program(p):
    for d in os.getenv('PATH').split(':'):
	if os.path.exists(os.path.join(d, p)):
	    return True
    return False

def check_dependencies():
    ret=True
    if not check_program('pdflatex'):
	print "pdflatex is not installed. Please install it."
	ret=False
    if not check_program('pdfinfo'):
	print "pdfinfo is not installed. Please install the xpdf-utils package."
	ret=False
    return ret
	
def swap_pairs(array, len):
    """Swap pages for right-to-left typesetting
    """
    for i in range(0, len, 2):
	array[i], array[i+1] = array[i+1], array[i]

def get_number_of_pages(fname):
    """Return the number of pages in the PDF file.
    """
    npages=0
    regexp=re.compile("Pages:\s+(\d+)")
    f=os.popen("pdfinfo '%s'" % fname)
    for l in f:
	m=regexp.search(l)
	if m:
	    npages=m.group(1)
	    break
    return int(npages)

def shuffled_pages(npages, options):
    """Generated the list of page numbers for booklet printing.
    """
    signature=options.signature
    if signature == 0:
	maxpage = npages + (4 - npages % 4) % 4
	signature = maxpage
    else:
	maxpage = npages + (signature - npages % signature) % signature

    actualpg = [ 0 ] * maxpage
    for i in range(0, maxpage):
	actual = i - i % signature
	if i % 4 in (0, 3):
	    actual += signature - 1 - (i % signature) / 2
	else:
	    actual += (i % signature) / 2
	    
	if actual < npages:
	    actualpg[i] = actual + 1

    if options.rtol:
	swap_pairs(actualpg, maxpage)

    return actualpg

def generate_book(inputfile, outputfile, options):
    """Convert input to output, using options.
    """
    npages = get_number_of_pages(inputfile)
    if npages < 1:
	print "invalid number of pages (%d)" % npages
	check_dependencies()
	return

    if options.debug:
	print "Processing %d pages" % npages

    actualpg = shuffled_pages(npages, options)

    def printable(n):
	if n:
	    if not options.quiet:
		print "[%d]" % n,
	    return str(n)
	else:
	    if not options.quiet:
		print "[*]",
	    return "{}"

    compile_dir=tempfile.mkdtemp()

    if options.debug:
	print "Generating files in directory ", compile_dir

    (outbase, ext) = os.path.splitext(os.path.basename(outputfile))
    outtex=".".join( (outbase, 'tex') )
    outpdf=".".join( (outbase, 'pdf') )
    fullouttex=os.path.join( compile_dir, outtex )
    fulloutpdf=os.path.join( compile_dir, outpdf )

    # LaTeX generation
    fout = open(fullouttex, "w")
    fout.write("""\\documentclass[12pt,a4paper,openany]{book}
    \\usepackage{pdfpages}
    \\begin{document}
    \\includepdf[nup=1x2,landscape,pages={%s}]{%s}
    \\end{document}
    """ % (",".join( [ printable(n) for n in actualpg ] ),
	   inputfile ))
    fout.close()

    if not options.quiet:
	print "\nGenerating %s now, please wait..." % outputfile

    cmdline = "pdflatex -output-directory '%s' '%s'" % ( compile_dir, fullouttex )
    if not options.debug:
	cmdline +=  "> /dev/null 2>&1 < /dev/null"
    else:
	print "Executing ", cmdline
    ret=os.system(cmdline)
    if ret:
	print "Failed to generate %s" % outputfile
	check_dependencies()
	return

    if os.path.exists(fulloutpdf):
	shutil.move( fulloutpdf, outputfile )
    else:
	print "Cannot find %s in %s" % (outpdf, compile_dir)
	return 1

    if options.debug < 2:
	# Cleanup
	shutil.rmtree(compile_dir)
    return 0

def main():
    """Option parsing.
    """
    parser=OptionParser(usage="""Rearrange pages in a PDF file into signatures.
%prog [options] input_file.pdf [output_file.pdf]""")
    
    parser.add_option("-s", "--signature", dest="signature", action="store",
		      type="int", default=0, metavar="SIGNATURE",
		      help="Signature of the booklet. It must be positive and divisible by 4.")
    
    parser.add_option("-r", "--right-to-left", dest="rtol", action="store_true",
		      help="Do right-to-left typesetting", default=False)
    
    parser.add_option("-q", "--quiet", dest="quiet", action="store_true",
		      help="Be quiet", default=False)
    
    parser.add_option("-d", "--debug", dest="debug", action="store",
		      help="Debug level (1: display messages, 2: keep intermediary files", 
		      default=0)
    
    (options, args) = parser.parse_args()

    try:
	inputfile=args[0]
    except IndexError:
	print "input file must be specified"
	parser.print_help()
	return

    if not os.path.exists(inputfile):
	print "Cannot read input file", inputfile
	return

    (inputbase, ext) = os.path.splitext(inputfile)
    if ext != '.pdf':
	print "Input file %s should end with .pdf" % inputfile
	return

    try:
	outputfile=args[1]
    except IndexError:
	outbase = os.path.basename(inputbase)
	outputfile=outbase+"-book"+ext

    if options.signature:
	if options.signature < 0 or options.signature % 4:
	    parser.print_help()
	    return

    if options.debug:
	print "Input file :", inputfile
	print "Output file :", outputfile
	print "Signature :", options.signature

    return generate_book(inputfile, outputfile, options)

if __name__ == '__main__':
    main()

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-03 18:29 [Comm] Как разрезать книгу для прошивки Eugine Kosenko
  2014-11-03 20:14 ` Denis G. Samsonenko
  2014-11-04  4:51 ` Gleb Kulikov
@ 2014-11-04  9:54 ` Victor
  2014-11-04 13:23   ` Sergey
  2014-11-06 14:32   ` Eugine Kosenko
  2 siblings, 2 replies; 9+ messages in thread
From: Victor @ 2014-11-04  9:54 UTC (permalink / raw)
  To: ALT Linux Community general discussions

 > Пусть есть текст (книга), разбитый определенным образом на страницы.
 > Нужно распечатать этот текст на листах формата A4 в альбомном
 > расположении по две страницы на лист. В дальнейшем эти листы
 > предполагается согнуть пополам и сшить по линии сгиба, чтобы
 > получилась брошюра.
 > 
 > При этом возникает следующая проблема. На первом листе нужно
 > напечатать справа первую, а слева последнюю страницу. С другой стороны
 > того же листа нужно напечатать слева вторую, а справа ---
 > предпоследнюю страницу. На следующем листе нужно печатать справа
 > третью страницу, а слева --- третью с конца. И так далее.
 > 
 > Вопрос: как обеспечить такую верстку текста?
 > 
 > Понятно, что TeX мне в руки и вперед. Но есть ли какие-нибудь
 > стандартные решения без сложного освоения? Может быть, есть
 > специальный софт для этого?
 > _______________________________________________
 > community mailing list
 > community@lists.altlinux.org
 > https://lists.altlinux.org/mailman/listinfo/community

Если текст - это просто текст, то Libreoffice поддерживает печать брошюрой (при 
печати на вкладке "Макет страницы" ткнуть "Brochure"). Правда печатает при 
этом только одним блоком. Соответственно, разбиение на блоки придется делать 
вручную.
Если текст - это PDF, то можно воспользоваться тем же Libreoffice (он умеет их 
открывать) и тоже брошюрой его.
----
Виктор.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-04  9:54 ` Victor
@ 2014-11-04 13:23   ` Sergey
  2014-11-06 14:38     ` Eugine Kosenko
  2014-11-06 14:32   ` Eugine Kosenko
  1 sibling, 1 reply; 9+ messages in thread
From: Sergey @ 2014-11-04 13:23 UTC (permalink / raw)
  To: community

On Tuesday 04 November 2014, Victor wrote:

> Если текст - это PDF, то можно воспользоваться тем же Libreoffice (он умеет их 
> открывать) и тоже брошюрой его.

Ещё Acrobat Reader это умеет. Нового больше больше нет для Linux, и, даже,
на сайте выбора нет для Linux, но можно пока нарыть прямые ссылки, и, даже,
у Adobe:

Вчера себе качал вот:
http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i486linux_enu.rpm

-- 
С уважением, Сергей
a_s_y@sama.ru


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-04  9:54 ` Victor
  2014-11-04 13:23   ` Sergey
@ 2014-11-06 14:32   ` Eugine Kosenko
  2014-11-13  4:24     ` Gleb Kulikov
  1 sibling, 1 reply; 9+ messages in thread
From: Eugine Kosenko @ 2014-11-06 14:32 UTC (permalink / raw)
  To: hisbreht, ALT Linux Community general discussions

2014-11-04 11:54 GMT+02:00, Victor <hisbreht@yandex.ru>:
> Если текст - это просто текст, то Libreoffice поддерживает печать брошюрой
> (при
> печати на вкладке "Макет страницы" ткнуть "Brochure"). Правда печатает при
> этом только одним блоком. Соответственно, разбиение на блоки придется делать
> вручную.

Я правильно понял, что это возможно только при финальной печати? Ведь
в диалоге "Экспорт в PDF" такой закладки нет.

Что такое "разбиение на блоки" и как его делать вручную?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-04 13:23   ` Sergey
@ 2014-11-06 14:38     ` Eugine Kosenko
  2014-11-07  7:34       ` Sergey
  0 siblings, 1 reply; 9+ messages in thread
From: Eugine Kosenko @ 2014-11-06 14:38 UTC (permalink / raw)
  To: ALT Linux Community general discussions

2014-11-04 15:23 GMT+02:00, Sergey <a_s_y@sama.ru>:
> Вчера себе качал вот:
> http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i486linux_enu.rpm

Эта версия в Сизифе может быть установлена? Честно говоря, с AR не
работал позже 6 версии, но не помню там такой возможности. Под MS
Windows в этой версии тоже есть такая возможность?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-06 14:38     ` Eugine Kosenko
@ 2014-11-07  7:34       ` Sergey
  0 siblings, 0 replies; 9+ messages in thread
From: Sergey @ 2014-11-07  7:34 UTC (permalink / raw)
  To: ALT Linux Community general discussions

On Thursday 06 November 2014, Eugine Kosenko wrote:

> > Вчера себе качал вот:
> > http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i486linux_enu.rpm
> 
> Эта версия в Сизифе может быть установлена ?

У меня Сизифа нет сейчас, в p7 ставится. apt дотягивает
libpangox-compat и libgdk-pixbuf-xlib

> Честно говоря, с AR не работал позже 6 версии, но не
> помню там такой возможности. Под MS Windows в этой
> версии тоже есть такая возможность ? 

У меня нет Windows, но печать брошурой в AR/Linux есть
очень давно, лет около десяти.

-- 
С уважением, Сергей.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Comm] Как разрезать книгу для прошивки
  2014-11-06 14:32   ` Eugine Kosenko
@ 2014-11-13  4:24     ` Gleb Kulikov
  0 siblings, 0 replies; 9+ messages in thread
From: Gleb Kulikov @ 2014-11-13  4:24 UTC (permalink / raw)
  To: ALT Linux Community general discussions

В сообщении от [6 ноября 2014 Eugine Kosenko] написал:



> Я правильно понял, что это возможно только при финальной печати? Ведь
> в диалоге "Экспорт в PDF" такой закладки нет.

Скрипт, который я бросал 4.11, делает именно pdf файл с "правильно" (для 
печати) рсположенными страницами.

-- 
      Салют, /GLeb

UIN: 15341920
jabber://gleb@asd.iao.ru
sip://2387245@sipnet.ru		(telephony)
skype://gleb_kulikov.tomsk	(telephony)

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-11-13  4:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-03 18:29 [Comm] Как разрезать книгу для прошивки Eugine Kosenko
2014-11-03 20:14 ` Denis G. Samsonenko
2014-11-04  4:51 ` Gleb Kulikov
2014-11-04  9:54 ` Victor
2014-11-04 13:23   ` Sergey
2014-11-06 14:38     ` Eugine Kosenko
2014-11-07  7:34       ` Sergey
2014-11-06 14:32   ` Eugine Kosenko
2014-11-13  4:24     ` Gleb Kulikov

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git