ฉันจะ 'ยกเลิกการจอง' แบบ pdf ได้อย่างไร


10

ฉันมีไฟล์ PDF ที่จัดทำเป็นรูปแบบหนังสือเล่มเล็ก มันหมายถึงการพิมพ์บนกระดาษ A4 ในแนวนอน; นี่คือสองหน้าใน pdf ซึ่งควรตรงกับสี่หน้าในหนังสือจริง

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

หมายเลขที่อยู่ในวงเล็บจะตรงกับลำดับของแต่ละหน้า

ฉันรู้ว่ามีคำสั่งทุกประเภท (pdfbook, pdfnup และอื่น ๆ ) บน linux (ซึ่งอาจใช้ในการทำหนังสือเล่มนี้ตั้งแต่แรก) ฉันจะ 'ยกเลิกการจอง' ได้อย่างไร - นั่นคือฉันต้องการทำเอกสาร pdf จากที่นี่ซึ่งแต่ละหน้าของผลิตภัณฑ์สุดท้ายคือหน้าแต่ละหน้าของ pdf เรียงตามวิธีปกติ

แก้ไข

ขอบคุณ Gilles ฉันจัดการเพื่อใช้รหัสต่อไปนี้:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)

1
ฉันคิดว่านี่น่าจะเป็นsuperuser.com
Adam Zalcman

@AdamZalcman ทำไม เขากำลังมองหาโปรแกรม Linux
Michael Mrozek

2
คุณสามารถปรับคำถามนี้ตอบ (โดย Gilles) กับปัญหาของคุณเช่นสร้างสคริปต์ PyPdf
sr_

คุณแน่ใจหรือว่าไม่ได้สลับหน้า 3 และ 4 ฉันทำงานด้านการพิมพ์ เลย์เอาต์นั้นไม่สมเหตุสมผล ....
Wildcard

คำตอบ:


4

นี่เป็นสคริปต์ Python ขนาดเล็กที่ใช้ไลบรารี PyPdfซึ่งทำงานได้ (มาจากun2up.) บันทึกในสคริปต์ที่เรียกใช้unbookทำให้เป็น executable ( chmod +x unbook) และเรียกใช้เป็นตัวกรอง ( unbook <book.pdf >1up.pdf)

pdfbook --signature=Nผมทดสอบสคริปต์นี้ในการส่งออกของ สำหรับวิธีอื่นคุณไม่จำเป็นต้องกลับหน้าการป้อนข้อมูลอื่น ๆ ทั้งหมดและลำดับหน้าอาจแตกต่างกัน (ขึ้นอยู่กับการวางแนวของหน้าแนวนอน) การจัดการหน้าไม่ตรงกับคำถามของคุณ 13,42 ไม่สมเหตุสมผลกับฉัน (ในหนังสือ 4 หน้า 3 ควรอยู่ถัดจาก 2 ไม่ใช่ถัดจาก 1)

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

ละเว้นคำเตือนการคัดค้านใด ๆ เฉพาะผู้ดูแล PyPdf เท่านั้นที่จะต้องกังวลกับสิ่งเหล่านี้


เรื่องนี้ถูกถามเมื่อไม่นานมานี้ แต่ฉันมีปัญหาในการใช้โซลูชันของคุณ ฉันใช้ OSX ติดตั้ง python และ py27-pypdf ผ่าน MacPorts ฉันสร้างไฟล์ unbook และคัดลอกและวางสคริปต์ การรันคำสั่งตามคำแนะนำจะสร้างไฟล์ 1up.pdf ใหม่ที่มี 0 ไบต์ ไม่มีข้อผิดพลาดหรืออะไรอยู่ในรายการของฉัน แต่เมื่อดำเนินการคำสั่งไม่มีอะไรเกิดขึ้น (ฉันต้อง CTRL-C ออก); ระบบไม่หยุดทำงานและไม่ได้ทำอะไรเลย ฉันจะติดตามปัญหาได้อย่างไร @Gilles
TSGM

@TSGM คำอธิบายที่น่าจะเป็นไปได้มากที่สุดคือคุณลืม<ก่อนใส่ไฟล์ หากคุณแน่ใจจริงๆว่าคุณเขียนคำสั่งถูกต้องอาจเป็นข้อผิดพลาดในไลบรารี PyPdf (ยังไม่ได้ทำให้ฉันผิดหวัง แต่อาจเกิดขึ้นได้)
Gilles 'SO- หยุดความชั่วร้าย'

ปัญหาคือฉันควรจะเรียก python ผ่าน "python unbook <in.pdf> out.pdf" ฉันโง่ นอกจากนี้โค้ดของคุณก็ค่อนข้างแปลก (มันติดอยู่ที่ส่วนท้ายของ second_half ทุกหน้าฉันดูเหมือนจะแก้ไขให้เป็นรูปแบบที่ฉันเขียนในโพสต์ต้นฉบับ) ฉันได้แก้ไขคำตอบดั้งเดิมของฉันเพื่อให้มีรหัสที่ฉันใช้ในที่สุด นอกจากนี้คำสั่งขนาดหน้าดูเหมือนจะผิด ฉันแก้ไขมันเช่นกัน @Gilles
TSGM

@TSGM รหัสถือว่าเลย์เอาต์ 1 | 4 ด้าน 2 และ 3 กลับด้านซึ่งเป็นรูปแบบหนังสือตามปกติ คุณอาจต้องปรับแต่งหากหน้าเว็บของคุณมีการจัดวางที่แตกต่างกัน เป็นการทดสอบภาคสนามในการตั้งค่านั้น การที่คุณต้องโทรหาอย่างชัดแจ้งpythonเป็นความผิดพลาดของฉัน: ฉันควรใส่สาย Shebang เพิ่ม
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.