Sayfaları pdf olarak bölme


67

Bir sanal sayfada iki sayfa taramış (pdf dosyasında sayfa) taranmış bir pdf dosyam var.

Çözünürlük iyi kalitede. Sorun, okurken yakınlaştırmalı ve soldan sağa doğru sürüklemem gerekiyor. Bu pdf dosyasını normal sayfalarla dönüştürebilen bir
komut ( convert,, pdftk...) veya komut dosyası var mı (kitaptan bir sayfa = pdf dosyasında bir sayfa)?


1
En çok cevaplanan cevap olmasa da, bu beni gerçekten şaşırttı. Basit, kısa, hızlı ve zarif. Burada bahsetmeye değeceğini düşündüm, çünkü bazen diğer cevaplara
kaymayacak kadar tembeliz

Kayıtları için ters işlem (birden çok sayfa katılmadan) ile (daha doğrusu "dosyasına baskı" yerine) komut satırından elde olabilir pdfnupgelen pdfjampaketi.
Skippy le Grand Gourou

Yanıtlar:


46

İşte işi düzgün yapan PyPdf kütüphanesini kullanan küçük bir Python betiği . Bunu bir komut dosyasına un2up(veya ne istersen) kaydedin , çalıştırılabilir hale getirin ( chmod +x un2up) ve bir 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)

Herhangi bir kullanımdan kaldırma uyarısını yoksay; yalnızca PyPdf sağlayıcılarının bunlarla ilgilenmesi gerekir.

Giriş alışılmadık bir şekilde yönlendirilmişse, sayfaları keserken farklı koordinatlar kullanmanız gerekebilir. Kodum neden taranan bir pdf'deki her sayfayı düzgün bir şekilde bölmedi?


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

Her iki araca da ihtiyaç var çünkü pdfpages'in aynı sayfaya tek bir akışta iki farklı dönüşüm uygulayamadığını söyleyebilirim. Çağrıda pdftk, 42 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'a sahip değilseniz, pdfpages paketi ile bir PDFLaTeX kurulumuna sahip olmak yeterlidir (Ubuntu'da: texlive-latex tarafından önerilen Texlive-latex-önerilir ve belki de (Ubuntu: texlive-fontlar-önerilen Texlive-fontları-önerilenleri yükle ) ve aşağıdaki sürücüyü kullanın dosya 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, aşağıdaki komutları çalıştırın, 42 giriş dosyasındaki sayfaların sayısıyla değiştirilmelidir (bunlar çağırılmalıdır 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

PyPdf kütüphanesi mükemmel çalışıyor. Ben sadece biraz değişti ve python conv_pdf.py res.pdf ile çalıştırın . Senaryo shebang'ı komut satırından nasıl çalıştırırsın?
xralf

Ben de (hafif ölçekleme nedeniyle) pdfjam sürümünü denemek istiyorum, ancak pdfjam paketinin yüklenmesinden sonra benim kabuk pdfjamkomutunu tanımaz .
xralf

@ xralf: Python betiğim sadece standart girdiden okuyor ve standart çıktıya yazıyor. Pdfjam sürümü pdfjam 2.0 gerektirir; Bu sadece pdfpages etrafında küçük bir paketleyicidir ve ürettiği LaTeX bitini ekledim, böylece doğrudan kullanabilirsiniz. Ölçeklendirme sorunu muhtemelen pypdf ile çözülebilir, sayfa boyutu sorunu olabilir (olanlar ve özellikle sayfa boyutları hakkında daha fazla ayrıntı verirseniz yardımcı olabilir veya olmayabilir).
Gilles

Teşekkürler, fark çok daha kötü bir çözünürlükte, ancak bu önemli değil. Latex hakkında daha çok şey öğrendiğimde ona geri döneceğim (şimdi benim için çok karmaşık ve çözüm PyPdf ile gerçekten iyi).
xralf

1
@Gilles Versy kullanışlı komut dosyası. Böyle bir şeyi pdfjam, pdftk'de görmeyi umuyordum. Her neyse, bazı insanlar sayfaları bazı eksenlere ayırmak ve farklı sıralamalar kullanmak için bazı değişiklikler isteyebilir. Bu birkaç satır değişen ve kullanma ile mümkündürq.mediaBox.lowerRight = (w, h/2)
ony

52

Sadece bir python betiği (ve diğer birkaç çözüm) ile ilgili sorunlar yaşadığımdan beri: benim için mutoolharika çalıştı. Zarif mupdfokuyucu ile birlikte gönderilen basit ve küçük bir eklentidir. Yani deneyebilirsiniz:

mutool poster -y 2 input.pdf output.pdf

Yatay böler için, yerine yile x. Ve elbette, daha karmaşık çözümler için ikisini birleştirebilirsiniz.

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

mutool1.4 sürümünden başlayarak mupdf ile birlikte gelir: http://www.mupdf.com/news


Yükleme mupdfve mutoolkaynaktan:

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ına gidin .


3
Bir djvu'm vardı ... Bir postcript'e (oldukça hızlı), daha sonra pdf'e (yavaşça kaplumbağa) döndüm - ve sonunda mutool çok hızlı bir şekilde kesmişti - işe yaramadığını sanıyordum!
Julien Puydt

2
evet, hızdan da gerçekten memnun kaldım.
martz

3
Bu en kolay ve daha iyi. mutoolbunun için yapıldı. Ayrıca, dikkat edin -y, bence çoğu durumda istediğiniz şeydir -x.
fiatjaf

2
Bu yardımcı program çok hızlı, ancak sayfa sırası ile ilgili bir sorunum var. Komut, sağdaki sayfayı ilk konumda ve soldaki sayfayı ikinci sayfaya tahsis eder. Biri bana bu konuda yardımcı olabilir mi?
garciparedes


16

Imagemagick bunu bir adımda yapabilir:

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

1
Teşekkürler. Eğer -density 400parametre `eklersem, daha da iyi kalitede olur.
xralf

11
Convert, bir ara format olarak raster kullanmaktadır. Bu, orijinal PDF vektör nesneleri içerdiğinde bile bulanık görünüme neden olur.
ony

Sayfa içeriğini rasterleştirmeden ... veya en azından daha yüksek bir çözünürlük ayarlamak için bunu bilen var mı?
Tomislav Nakic-Alfirevic

Bu, metinleri görüntülere dönüştürdü ve görüntülerden pdf oluşturdu. Belki resimler için güzel ama metin çıkarma için işe yaramaz.
andrej

6

ImageMagick'in Dönüştür komutu, dosyanızı 2 parçaya kırpmanıza yardımcı olabilir. Bkz http://www.imagemagick.org/Usage/crop/

Yerinde olsaydım şöyle bir (kabuk) betiği yazardım:

  1. Dosyanızı pdfsam ile bölün : 1 sayfa = 1 diskte dosya (Format önemli değil. ImageMagick'in bildiği birini seçin. Sadece PS veya PDF alırım.)
  2. Her sayfa için, ilk yarıyı kırpın ve $ {PageNumber} A adlı bir dosyaya yerleştirin.

  3. İkinci yarıyı kesin ve $ {PageNumber} B adlı bir dosyaya yerleştirin.

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

  4. Şimdi, bunu tekrar yeni bir PDF'de birleştirin. Bunu yapmanın birçok yolu vardır.

1
ImageMagick kullanmak, dosyaları rasterleştirmez mi? Ve bu son bölümü, özellikle izleyicideki frankofonlukların yararına açıklamak zorundasınız.
Gilles

Çünkü Fransızca'yı anlamana gerek yok. Sadece bu hedefe ulaşmak için ImageMagick'in convert, pdftk veya ghostscript'i (gs) nasıl kullanabileceğinizi gösterir. Pdftk kullanmayı seviyorum. "Raster", taranmış bir belge olduğu için önemli değildir.
tiktak

6

Gilles'in cevabına ve PDF sayfa sayısının nasıl bulunacağına dayanarak 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

Ayar marjı için 50, ölçek için 1.2.


4

İşte Gilles tarafından yayınlanan PyPDF kodunun bir çeşidi. 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()

2

En iyi çözelti, yukardaki mutool idi:

sudo apt install mupdf-tools pdftk

bölünme:

mutool poster -y 2 input.pdf output.pdf

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

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

Hala örtüşme yok ...
MUY Belçika

1

Dayanarak Benjamin tarafından cevap Ask Ubuntu, ben denilen GUI aracını kullanarak öneriyoruz gscan2pdf .

  1. İçe gscan2pdf PDF tarama dosyasını. Resim olmayan PDF dosyalarının çalışmayabileceğini unutmayın. Taramalar iyi, bu yüzden endişelenmene gerek yok.

    görüntü tanımını buraya girin

  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 gerekirse bunları döndürün (Ctrl + Shift + C) .

    görüntü tanımını buraya girin

  4. Araçlar >> Temizle'ye gidin . Seç Düzen olarak çift ve = 2 # çıkış sayfalarında .

    görüntü tanımını buraya girin

  5. Hit Tamam ve iş bitene kadar bekleyin.

    görüntü tanımını buraya girin

  6. PDF dosyasını kaydedin . Bitti.


Test edildi, çok sayıda görüntü içeren karmaşık pdf belgelerinde başarısız oldu.
MUY Belçika

0

moraes çözümü benim için işe yaramadı. Asıl sorun x5 ve x6 hesaplamalarıydı. Burada bir ofset dikkate alınmalıdır, örneğin altta bırakma (0,0) değilse

Öyleyse, PyPDF2 ve python 3'ü kullanmak için ek uyarlamalar içeren başka bir varyasyon:

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.