it-swarm-eu.dev

Rozdělte stránky v pdf

Mám naskenovaný soubor PDF, který naskenoval dvě stránky na jedné virtuální stránce (stránka v souboru PDF).

Rozlišení je v dobré kvalitě. Problém je, že při čtení musím přiblížit a přetáhnout zleva doprava.
Existuje nějaký příkaz (convert, pdftk, ...) nebo skript, který dokáže tento soubor PDF převést na normální stránky (jedna stránka z knihy = jedna stránka v souboru pdf) )?

72
xralf

Zde je malý skript Python skript používající knihovna PyPdf =), který úlohu úhledně provede. Uložte ji do skriptu s názvem un2up (nebo cokoli chcete), aby bylo spustitelné (chmod +x un2up) a spusťte jej jako filtr (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)

Ignorovat všechna varování o zastoupení; Těmi se musí zabývat pouze správci PyPdf.

Pokud je vstup orientován neobvyklým způsobem, budete možná muset při zkrácení stránek použít různé souřadnice. Viz Proč můj kód není správně rozdělen na každou stránku v naskenovaném pdf?


Jen v případě, že je to užitečné, zde je moje dřívější odpověď, která používá kombinaci dvou nástrojů plus nějaký ruční zásah:

  • Pdfjam (alespoň verze 2.0), založené na balíčku pdfpages LaTeX, oříznutí stránek;
  • Pdftk , dát levou a pravou polovinu zpět dohromady.

Oba nástroje jsou potřebné, protože pokud mohu říci, pdfpages není schopen aplikovat dvě různé transformace na stejnou stránku v jednom proudu. Při volání pdftk nahraďte 42 vstupním dokumentem počtem stránek (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

V případě, že nemáte pdfjam 2.0, stačí nainstalovat PDFLaTeX s balíčkem pdfpages (na Ubuntu: potřebujete doporučeno texlive-latexInstall texlive-latex-recommended a možná (na Ubuntu: doporučeno texlive-fontsInstall texlive-fonts-recommended ) a použijte následující soubor ovladače 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}

Poté spusťte následující příkazy a nahraďte 42 počtem stránek ve vstupním souboru (který musí být nazván 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

Jen dodatek, protože jsem měl problémy se skriptem python (a několik dalších řešení)): pro mě mutool fungovalo skvěle. Je to jednoduchý a malý dodatek dodávaný s elegantním mupdf reader, takže můžete vyzkoušet:

mutool poster -y 2 input.pdf output.pdf

U vodorovných dělení nahraďte y za x. A můžete je samozřejmě kombinovat pro složitější řešení.

Opravdu rádi, že jsme to našli (po letech každodenního používání mupdf :)

mutool je dodáván s mupdfem od verze 1.4: http://www.mupdf.com/news


Instalace mupdf a mutool ze zdroje:

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

Nebo přejděte na stránku stránka ke stažení a vyhledejte novější verzi.

60
martz

Imagemagick to dokáže v jednom kroku:

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

Na základě odpovědi od Gilles a jak najít PDF počet stránek Napsal jsem

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

Takže můžu běžet

./split.sh my.pdf 50 1.2

kde 50 pro úpravu okraje a 1,2 pro měřítko.

6
Anton Bessonov

Příkaz Převést ImageMagick vám pomůže oříznout soubor na 2 části. Viz http://www.imagemagick.org/Usage/crop/

Kdybych byl tebou, napsal bych (Shell) skript takto:

  1. Rozdělte soubor s pdfsam : 1 stránka = 1 soubor na disku (na formátu nezáleží. Vyberte si ten, který ví ImageMagick. Jenom vezmu PS nebo PDF.
  2. Pro každou stránku ořízněte první polovin a vložte ji do souboru s názvem $ {PageNumber} A

  3. Ořízněte druhou polovinu a vložte ji do souboru s názvem $ {PageNumber} B.

    Získáte 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf atd.

  4. Nyní to sestavte znovu do nového PDF. Existuje mnoho metod, jak toho dosáhnout.
6
tiktak

Zde je variace kódu PyPDF zaslaného Gillesem. Tato funkce bude fungovat bez ohledu na orientaci stránky:

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

Nejlepší řešení bylo mutool viz výše:

Sudo apt install mupdf-tools pdftk

rozdělení:

mutool poster -y 2 input.pdf output.pdf

ale pak musíte otočit stránky doleva:

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

moraes řešení pro mě nefungovalo. Hlavním problémem byl výpočet x5 a x6. Zde je třeba vzít v úvahu offset, tj. Pokud dolní levost není na (0,0)

Tady je tedy další variace, s dalšími úpravami pro použití PyPDF2 a 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

Na základě odpověď Benjamina v AskUbuntu bych doporučil použít nástroj GUI s názvem gscan2pdf .

  1. Import skenovaného souboru PDF naskenovaný soubor do gscan2pdf.) Nezobrazujte PDF soubory nemusí fungovat. Skenování je v pořádku, takže se nemusíte bát.

    enter image description here

  2. V závislosti na velikosti dokumentu může chvíli trvat. Počkejte, až se načte.

  3. Stisknutím Ctrl + A vyberte všechny stránky a poté otočte (Ctrl + Shift + C) v případě potřeby.

    enter image description here

  4. Přejděte na Nástroje >> Vyčistit . Vyberte rozložení jako dvojité a # výstupní stránky = 2 .

    enter image description here

  5. Stiskněte [~ # ~] ok [~ # ~] a počkejte, až bude úloha dokončena.

    enter image description here

  6. Uložte soubor PDF). Hotovo.

1