it-swarm-vi.com

Chia trang bằng pdf

Tôi có một tệp pdf được quét đã quét hai trang trên một trang ảo (trang trong tệp pdf).

Độ phân giải là với chất lượng tốt. Vấn đề là tôi phải phóng to khi đọc và kéo từ trái sang phải.
[.__.] Có một số lệnh (convert, pdftk, ...) hoặc tập lệnh có thể chuyển đổi tệp pdf này với các trang bình thường (một trang từ sách = một trang trong tệp pdf )?

72
xralf

Đây là một tập lệnh nhỏ Python sử dụng thư viện PyPdf thực hiện công việc một cách gọn gàng. Lưu nó trong tập lệnh có tên un2up (hoặc bất cứ điều gì bạn thích), làm cho nó có thể thực thi được (chmod +x un2up) và chạy nó dưới dạng bộ lọc (un2up <2up.pdf >1up.pdf).

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

Bỏ qua bất kỳ cảnh báo khấu hao; chỉ những người duy trì PyPdf cần quan tâm đến những người đó.

Nếu đầu vào được định hướng theo một cách khác thường, bạn có thể cần sử dụng các tọa độ khác nhau khi cắt ngắn các trang. Xem Tại sao mã của tôi không phân chia chính xác từng trang trong pdf được quét?


Trong trường hợp nó hữu ích, đây là câu trả lời trước đây của tôi sử dụng kết hợp hai công cụ cộng với một số can thiệp thủ công:

  • Pdfjam (ít nhất là phiên bản 2.0), dựa trên gói pdfpages gói LaTeX, để cắt các trang;
  • Pdftk , để đặt nửa trái và phải trở lại với nhau.

Cả hai công cụ đều cần thiết vì theo như tôi có thể nói với các trang pdf không thể áp dụng hai biến đổi khác nhau cho cùng một trang trong một luồng. Trong lệnh gọi pdftk, thay thế 42 bằng số trang trong tài liệu đầu vào (2up.pdf).

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf

Trong trường hợp bạn không có pdfjam 2.0, thì cài đặt PDFLaTeX là đủ với gói pdfpages (trên Ubuntu: bạn cần texlive-latex-khuyên dùngInstall texlive-latex-recommended và có lẽ (trên Ubuntu: texlive-phông chữ được đề xuấtInstall texlive-fonts-recommended ) và sử dụng tệp trình điều khiển sau driver.tex:

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}

Sau đó chạy các lệnh sau, thay thế 42 bằng số trang trong tệp đầu vào (phải được gọi là 2up.pdf):

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf

Chỉ là một bổ sung vì tôi gặp vấn đề với tập lệnh python (và một số giải pháp khác): đối với tôi mutool hoạt động rất tốt. Đó là một bổ sung đơn giản và nhỏ được gửi với trình đọc mupdf thanh lịch. :

mutool poster -y 2 input.pdf output.pdf

Đối với phân tách ngang, thay thế y bằng x. Và tất nhiên, bạn có thể kết hợp cả hai cho các giải pháp phức tạp hơn.

Thực sự hạnh phúc khi tìm thấy điều này (sau nhiều năm sử dụng mupdf hàng ngày :)

mutool được phân phối với mupdf bắt đầu từ phiên bản 1.4: http://www.mupdf.com/news


Cài đặt mupdfmutool từ nguồn:

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
Sudo make prefix=/usr/local install

Hoặc truy cập trang tải xuống để tìm phiên bản mới hơn.

60
martz

Imagemagick có thể làm điều đó trong một bước:

$ convert in.pdf -crop 50%x0 +repage out.pdf
18
tomas

Dựa trên câu trả lời từ Gillescách tìm PDF số trang Tôi đã viết

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven

Để tôi có thể chạy

./split.sh my.pdf 50 1.2

trong đó 50 cho điều chỉnh lề và 1,2 cho tỷ lệ.

6
Anton Bessonov

Lệnh Convert của ImageMagick có thể giúp bạn cắt tập tin của bạn thành 2 phần. Xem http://www.imagemagick.org/Usage/crop/

Nếu tôi là bạn, tôi sẽ viết một kịch bản (Shell) như thế này:

  1. Tách tệp của bạn với pdfsam : 1 trang = 1 tệp trên đĩa (Định dạng không thành vấn đề. Chọn một tệp mà ImageMagick biết. Tôi chỉ cần lấy PS hoặc PDF.
  2. Đối với mỗi trang, cắt nửa đầ và đặt nó vào một tệp có tên $ {PageNumber} A

  3. Cắt nửa thứ hai và đặt nó vào một tệp có tên $ {PageNumber} B.

    Bạn nhận được 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf, v.v.

  4. Bây giờ, lắp ráp lại một lần nữa trong một tệp PDF mới. Có nhiều phương pháp để làm điều này.
6
tiktak

Đây là một biến thể của mã PyPDF được đăng bởi Gilles. Chức năng này sẽ hoạt động bất kể định hướng trang là gì:

import copy
import math
import pyPdf

def split_pages(src, dst):
    src_f = file(src, 'r+b')
    dst_f = file(dst, 'w+b')

    input = pyPdf.PdfFileReader(src_f)
    output = pyPdf.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i)
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.mediaBox.lowerLeft
        x3, x4 = p.mediaBox.upperRight

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)
        x5, x6 = math.floor(x3/2), math.floor(x4/2)

        if x3 > x4:
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical
            p.mediaBox.upperRight = (x3, x4)
            p.mediaBox.lowerLeft = (x1, x6)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

        output.addPage(p)
        output.addPage(q)

    output.write(dst_f)
    src_f.close()
    dst_f.close()
4
moraes

Giải pháp tốt nhất là mutool xem ở trên:

Sudo apt install mupdf-tools pdftk

chia:

mutool poster -y 2 input.pdf output.pdf

nhưng sau đó bạn cần xoay các trang bên trái:

pdftk output.pdf cat 1-endleft output rotated.pdf
3
Eduard Florinescu

moraes giải pháp không hoạt động với tôi. Vấn đề chính là tính toán x5 và x6. Ở đây một phần bù phải được xem xét, tức là nếu lowLeft không ở (0,0)

Vì vậy, đây là một biến thể khác, với sự thích ứng bổ sung để sử dụng PyPDF2 và python 3:

import copy
import math
import PyPDF2
import sys
import io 

def split_pages(src, dst):
    src_f = io.open(src, 'r+b')
    dst_f = io.open(dst, 'w+b')

    input = PyPDF2.PdfFileReader(src_f)
    output = PyPDF2.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i) 
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.cropBox.lowerLeft
        x3, x4 = p.cropBox.upperRight        

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)

        x5 = math.floor((x3-x1) / 2 + x1)
        x6 = math.floor((x4-x2) / 2 + x2)

        if x3 > x4:        
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical        
            p.mediaBox.lowerLeft = (x1, x6)
            p.mediaBox.upperRight = (x3, x4)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

        output.addPage(p)
        output.addPage(q)

    output.write(dst_f)
    src_f.close()
    dst_f.close()

if __name__ == "__main__":
    if ( len(sys.argv) != 3 ):
        print ('Usage: python3 double2single.py input.pdf output.pdf')
        sys.exit(1)

    split_pages(sys.argv[1], sys.argv[2])
1
vbar

Dựa trên câu trả lời của Benjamin tại AskUbfox, tôi khuyên bạn nên sử dụng công cụ GUI có tên gscan2pdf .

  1. Nhập PDF quét tệp vào gscan2pdf. Lưu ý rằng không phải hình ảnh PDF các tập tin có thể không hoạt động. Quét vẫn ổn, vì vậy bạn không phải lo lắng.

    enter image description here

  2. Nó có thể mất một lúc tùy thuộc vào kích thước của tài liệu. Đợi đến khi nó tải lên.

  3. Nhấn Ctrl + A để chọn tất cả các trang và sau đó xoay (Ctrl + Shift + C) chúng nếu cần thiết.

    enter image description here

  4. Chuyển đến Công cụ >> Dọn dẹp . Chọn Bố cục làm nhân đôi # trang đầu ra = 2 .

    enter image description here

  5. Nhấn [~ # ~] ok [~ # ~] và đợi cho đến khi công việc kết thúc.

    enter image description here

  6. Lưu tệp PDF. Xong.

1
Nanashi No Gombe