it-swarm-tr.com

Sayfaları pdf olarak böl

Bir sanal sayfada (pdf dosyasındaki sayfa) iki sayfa tarayan taranmış bir pdf dosyası var.

Çözünürlük iyi kalitede. Sorun, okurken yakınlaştırmak ve soldan sağa sürüklemek zorundayım.
Bu pdf dosyasını normal sayfalarla (kitaptan bir sayfa = pdf dosyasındaki bir sayfa) dönüştürebilecek bazı komutlar (convert, pdftk, ...) veya komut dosyası var mı? )?

72
xralf

İşte PyPdf kütüphanesi kullanarak işi düzgün bir şekilde yapan küçük bir Python komut dosyası. un2up (Veya istediğinizi) adlı bir komut dosyasına kaydedin, çalıştırılabilir yapın (chmod +x un2up) ve filtre olarak çalıştırın (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)

Kullanımdan kaldırma uyarılarını dikkate almayın; bunlarla yalnızca PyPdf sahiplerinin ilgilenmesi gerekir.

Giriş alışılmadık bir şekilde yönlendirilmişse, sayfaları keserken farklı koordinatlar kullanmanız gerekebilir. Bkz. Kodum neden taranmış bir pdf'deki her sayfayı doğru şekilde bölmüyor?


Yararlı olması durumunda, iki aracın ve bazı manuel müdahalelerin bir kombinasyonunu kullanan önceki cevabım:

  • Pdfjam (en az sürüm 2.0), pdfpages LaTeX paketini temel alarak sayfaları kırpın;
  • Pdftk , sol ve sağ yarımları tekrar bir araya getirmek.

Her iki araca da ihtiyaç duyulmaktadır, çünkü pdf sayfalarına aynı akışta aynı sayfaya iki farklı dönüşüm uygulayamadığımı söyleyebilirim. pdftk çağrısında 42'yi giriş belgesindeki sayfa sayısı ile değiştirin (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

Pdfjam 2.0'ınız yoksa, pdfpages paketiyle bir PDFLaTeX kurulumu yapmanız yeterlidir (Ubuntu'da: texlive-latex-recommendedInstall texlive-latex-recommended ve belki (Ubuntu'da: texlive-fonts-recommendedInstall texlive-fonts-recommended ) ve aşağıdaki sürücü dosyasını kullanın 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}

Ardından, 42'yi giriş dosyasındaki sayfa sayısı ile değiştirerek aşağıdaki komutları çalıştırın (2up.pdf Olarak adlandırılmalıdır):

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

python script (ve diğer birçok çözüm) ile ilgili sorunlar yaşadığım için sadece bir ek: benim için mutool harika çalıştı. Zarif mupdf reader.

mutool poster -y 2 input.pdf output.pdf

Yatay bölünmeler için y ile x değiştirin. Ve elbette, ikisini daha karmaşık çözümler için birleştirebilirsiniz.

Bunu bulduğum için gerçekten mutluyum (günlük mupdf kullanımından yıllar sonra :)

mutool 1.4 sürümünden başlayarak mupdf ile gönderilir: http://www.mupdf.com/news


Kaynaktan mupdf ve mutool yükleniyor:

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

Veya daha yeni bir sürüm bulmak için indirme sayfası adresine gidin.

60
martz

Imagemagick tek bir adımda yapabilir:

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

Gilles ve nasıl bulunur PDF sayfa sayısı yazdım.

#!/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

Böylece koşabilirim

./split.sh my.pdf 50 1.2

burada kenar boşluğunu ayarlamak için 50 ve ölçek için 1,2.

6
Anton Bessonov

ImageMagick'in Convert komutu dosyanızı 2 parçaya ayırmanıza yardımcı olabilir. Bakınız http://www.imagemagick.org/Usage/crop/

Ben olsaydım, böyle bir (Shell) betiği yazardım:

  1. Dosyanızı diskteki pdfsam : 1 sayfa = 1 dosyayla bölün (Biçim önemli değil. ImageMagick'in bildiği birini seçin. PS veya PDF alıyorum.
  2. Her sayfa için ilk yarıyı kırp ve $ {PageNumber} A adlı bir dosyaya koyun

  3. İkinci yarıyı kırpın ve $ {PageNumber} B adlı bir dosyaya koyun.

    1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf vb.

  4. Şimdi bunu yeni bir PDF'de yeniden bir araya getirin. Bunu yapmak için birçok yöntem vardır.
6
tiktak

İşte Gilles tarafından yayınlanan PyPDF kodunun bir varyasyonu. Bu işlev, sayfa yönü ne olursa olsun çalışır:

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

En iyi çözüm mutool idi yukarı bakınız:

Sudo apt install mupdf-tools pdftk

bölünme:

mutool poster -y 2 input.pdf output.pdf

ancak sonra kalan sayfaları döndürmeniz gerekir:

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

moraes çözüm benim için çalışmadı. Asıl sorun x5 ve x6 hesaplamasıydı. Burada bir ofset dikkate alınmalıdır, yani. LowLeft (0,0) değerinde değilse

İşte PyPDF2 ve 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

AskUbuntu'daki Benjamin tarafından cevap temel alınarak, gscan2pdf adlı GUI aracını kullanmanızı tavsiye ederim.

  1. İçe Aktar the PDF dosyayı gscan2pdf'ye tara. Resim dışı PDF dosyaların çalışmayabileceğini unutmayın. Taramalar iyi, böylece endişelenmene gerek yok.

    enter image description here

  2. Belgenin boyutuna bağlı olarak biraz zaman alabilir. Yüklenene kadar bekleyin.

  3. Tüm sayfaları seçmek için Ctrl + A tuşlarına basın ve ardından döndürün (Ctrl + Üst Karakter + C) gerekiyorsa.

    enter image description here

  4. Araçlar >> Temizle adresine gidin. Düzen olarak çift ve # çıktı sayfaları = 2 seçin.

    enter image description here

  5. [~ # ~] ok [~ # ~] tuşuna basın ve iş bitene kadar bekleyin.

    enter image description here

  6. Kaydet PDF dosya. Tamam.

1