PDF'lerin sayfalarını birden çok sayfaya kesin [kapalı]


16

Tek bir PDF sayfasına iki "gerçek" sayfa içeren bir grup PDF dosyam var; Bunları ikiye ayırmak ve her yarıyı ayrı bir sayfaya koymak istiyorum. Aslında, tam tersini yapan pdfnup(veya psnup) bir şeye ihtiyacım var . Bu başarı nasıl elde edilebilir?

Platform Linux, açık kaynak kodlu; (GUI'nin aksine) yazılabilecek bir şey yapmak için bunlardan büyük bir yığınım var, bu yüzden sadece bir liste verebilir ve çiğnemesini sağlayabilirim.

Önceden varolan bir komut dosyası da tek seçenek değildir; PDF'leri üçüncü taraf bir kütüphane ile benzer şekilde işlemek için örnek kod varsa, muhtemelen istediğimi yapmak için hackleyebilirim.


Yanıtlar:


22

Bunu Ghostscript yardımıyla çözebilirsiniz. pdftkyalnız bunu yapamam (bilgim dahilinde). Bunu manuel olarak yapmanız için size komut satırı adımlarını vereceğim. Bunu bir yordam olarak, sayfa boyutları ve sayfa numaraları için farklı parametrelerle komutlamak kolay olacaktır. Ama bunu kendin yapabileceğini söyledin ;-)

Ghostscript yardımıyla nasıl çözülür ...

... ve eğlenmek için, son zamanlarda "çift sayfa" sayfaları içeren bir giriş dosyası ile değil , "tiz-up" içeren bir dosya ile yaptım . Bu vaka için cevap okuyabilir burada .

Durumunuz daha da basit. Buna benzer bir şeyiniz var gibi görünüyor:

+------------+------------+   ^
|            |            |   |
|      1     |      2     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
             ^
            fold
             v
+------------+------------+   ^
|            |            |   |
|      3     |      4     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
<---------- 842 pt -------->

Her biri 421 pt x 595 pt boyutunda 4 sayfalık 1 PDF oluşturmak istiyorsunuz.

İlk adım

Önce giriş sayfalarının her birinden sol bölümleri çıkaralım:

gs \
    -o left-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [0 0]>> setpagedevice" \
    -f double-page-input.pdf

Bu parametreler ne yaptı?

İlk olarak, PDF'de 1 inç == 72 puan olduğunu bilin . Sonra geri kalanı:

  • -o ...............:Çıktı dosyasını adlandırır. Kesinlikle de kullanır -dBATCH -dNOPAUSE -dSAFER.
  • -sDEVICE=pdfwrite : PDF'yi çıktı biçimi olarak istiyoruz.
  • -g................:çıktı ortam boyutunu piksel olarak ayarlar. pdfwrite'ın varsayılan çözünürlüğü 720 dpi'dir. Bu nedenle PageOffset ile bir eşleşme elde etmek için 10 ile çarpın.
  • -c "..............:Ghostscript'ten verilen PostScript kod snippet'ini ana giriş dosyasından hemen önce işlemesini ister (bunu takip etmesi gerekir -f).
  • <</PageOffset ....:sayfa görüntüsünün ortama kaydırılmasını ayarlar. (Elbette, sol sayfalar için kaydırmanın [0 0]gerçek bir etkisi yoktur.)
  • -f ...............: bu girdi dosyasını işleyin.

Son komut hangi sonucu elde etti?

Bu:

Output file: left-sections.pdf, page 1
+------------+  ^
|            |  |
|     1      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: left-sections.pdf, page 2
+------------+  ^
|            |  |
|     3      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

İkinci adım

Ardından, doğru bölümler:

gs \
    -o right-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [-421 0]>> setpagedevice" \
    -f double-page-input.pdf

Görüntüleme alanını sabit tutarken sayfayı sola kaydırdığımız için negatif kaymaya dikkat edin.

Sonuç:

Output file: right-sections.pdf, page 1
+------------+  ^
|            |  |
|     2      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: right-sections.pdf, page 2
+------------+  ^
|            |  |
|     4      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

Son adım

Şimdi sayfaları tek bir dosyada birleştiriyoruz. Bunu ghostscript ile de yapabiliriz, ancak pdftkbunun yerine kullanacağız , çünkü bu iş için daha hızlı:

pdftk \
  A=right-sections.pdf \
  B=left-sections.pdf \
  shuffle \
  output single-pages-output.pdf
  verbose

Bitti. İşte istenen sonuç. 4 farklı sayfa, 421x595 punto.

Sonuç:

+------------+ +------------+ +------------+ +------------+   ^
|            | |            | |            | |            |   |
|     1      | |     2      | |     3      | |     4      |   |
|            | |            | |            | |            |5595 pt
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
+------------+ +------------+ +------------+ +------------+   v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->

@Bilinmeyen: Downvoting için teşekkürler! Bunun bir nedenini belirten bir yorum yazmak ister misiniz?
Kurt Pfeifle

ASCII sanatının harika kullanımı için +1 ve çok net talimatlar. Sadece bir CLI n00b olduğum için, satırlardan kaçmak çok kolay, değil mi?
Journeyman Geek

@mullhausen: yazım hatalarını düzelttiğiniz için teşekkürler ( 421-> -421). ;-)
Kurt Pfeifle

7

Bir giriş sayfası (sayfaları döşemek veya doğramak) için birkaç sayfa içeren PDF'ler oluşturmak için kullanılabilecek bir araç pdfposter vardır. posterPostScript dosyaları için de aynısını yapan araca benzer .


pdfposter daha kolay poster montajı için kenarlardaki çakışan içeriği yazdırmaz. Yine de bir Perl betiği, bu yüzden eklemek oldukça kolay.
Matthias Urlichs

3

Bu nedenle, çok daha fazla arama yaptıktan sonra ("PDF sayfalarını kesme" çok daha iyi bir arama gibi görünüyor), unpnuphangisinin kullanıldığını poster, PDF / PS dönüşümünü ve pdftktam olarak ihtiyacım olanı yapmak için küçük bir komut dosyası buldum . Biraz uzun bir yol var, ancak bulduğum diğer yöntemlerden (imagemagick kullanmak gibi) çok daha üstündür çünkü sayfaları tükürmeden rasterleştirmez.

Mobileread'in herhangi bir nedenle ortadan kalkması durumunda, komut dosyasının çekirdeği (GPLv2 veya daha sonra Harald Hackenberg tarafından lisanslanmıştır <hackenberggmx.at>) aşağıdaki gibidir:

pdftk "$1" burst
for file in pg*.pdf;
do
    pdftops -eps $file
    poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps
    epstopdf `basename $file .pdf`.tps
done
pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf

1
İnsanlar kendi sorularına cevap verdiğinde sevmeliyim. Bununla birlikte, bir GUI ile yapmanız gerekiyorsa, özellikle sayfa boyutları eşit değilse veya her iki tarafı daha da kırpmak istiyorsanız, Briss'a bakın
frabjous

PDFTK ile istediğiniz tüm dönüşümleri kendi başınıza yapabilmeniz gerekir.
CarlF

@CarlF: Mümkün olabileceğini düşündüm, ancak PDFTK kılavuz sayfasında sayfaların içeriğini değiştirmek için hiçbir şey göremiyorum. Benim için işaretçi var mı?
womble

@frabjous: Kendi sorularınızı cevaplamanın nesi yanlış?
Kurt Pfeifle

1
@womble: dönüşümleriniz PS / EPS üzerinden gerçekleşir. Bu, kalite kayıplarına (gömülü fontlar, saydamlar, vb.) Neden olur. Benim önerim riskli PDF => EPS => PDFrotayı önler ve daha güvenli bir PDF => PDF => PDFyol izler .
Kurt Pfeifle

2

Kurt Pfeifle'ın cevabını benzer durumum için çok yararlı buldum. Çözüm modifikasyonumu başkalarıyla paylaşabileceğimi düşündüm ...

Ben de her sayfada 2 sayfa olan taranmış bir PDF'im vardı. Orijinal olarak tarandığında zımbalanmış kalan bir sırt dikişli kitapçığın 11 x 8.5 (inç) taramasıydı, bu yüzden: PDF sayfa 1 = arka ve ön kapak; PDF sayfa 2 = sayfa 2 ve 3, vb. Bu ekranda iyi okunur ancak kitapçığın daha fazla kopyasını almak için yazdıramaz ve zımbalayamazsınız.

Bunu bir dupleks fotokopi makinesinde yazdırabilmem gerekiyordu; yani GERİ yazdırmaya hazır bir "dayatılan" PDF'ye dönüştürün. Kurt'un çözümünü kullanarak, bunu (ahem) "bir astar" ı tekrar doğru sayfa sırasına göre tekrar yarım sayfaya dönüştürmek için yaptım. Herhangi bir YÜKSEKLİK ve GENİŞLİK ile aynı zamanda çok sayıda sayfa için çalışacaktır. Benim durumumda, 40 sayfalık bir kitapçım vardı (PDF'de 20 taranmış sayfa.)

HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \
count=$(set -xe; \
gs -o left.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [0  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" >/dev/null; \
gs -o right.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)")  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" | grep Page | wc -l ); \
echo '>>>>>' Re-ordering $count pages...; \
(set -xe; pdftk A=right.pdf B=left.pdf cat \
A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \
output ordered.pdf); \
echo "Done. See ordered.pdf"

HEIGHT ve WIDTH ve ORIG_FILE_PATH değerlerini belirtmek için bu komuttaki ilk birkaç parametreyi değiştirmeniz yeterlidir. Komutun geri kalanı çeşitli boyutları hesaplar ve gs'yi iki kez çağırır, ardından pdftk. Hatta taramanızdaki sayfaları sayar ve daha sonra doğru sıralama özelliğini (verdiğim senaryo için) üretir.

Yaptığı şey konusunda biraz ilerleme kaydeder ve bu şöyle görünür:

+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0  0]>> setpagedevice' -f original.pdf
++ wc -l
++ grep Page
+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
+++ perl -e 'print((11 / 2) * 72)'
++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396  0]>> setpagedevice' -f original.pdf
>>>>> Re-ordering 20 pages...
++ set +xe
+ pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf
Done. See ordered.pdf

Daha sonra, basılı bir kitapçık için ihtiyacınız olan sayfa yerleştirmesini almak için, tam olarak ihtiyacınız olan boyutta (örneğimde 5.5 x 8.5) özel bir sayfa boyutuna (siparişim 5.5 x 8.5) göndererek "kitapçık oluşturma" "aracı (benim durumumda, http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html adresinden Christoph Vogelbusch'un Mac için Kitapçık Oluştur'u kullandım ).

Ortaya çıkan PDF şimdi 11 x 8.5 orijinal sayfa boyutuna, yaprak başına 2 sayfa olacak, ancak sipariş, çift taraflı, kısa kenar ciltleme ve voilà yazdırabileceğiniz şekilde olacaktır! orijinal kitapçığı orijinali sökmeden (hatta zorunlu olarak görmeden) çoğaltarak, fotokopi çekip katlayabileceğiniz ve sırttan zımbalayabileceğiniz bir çıktıya sahip olacaksınız.

Umarım bu birine yardımcı olur!

-c


1

Yukarıdaki piptas'ın cevabına dayanarak :

Pencerelerde, başlangıçta tek bir kapak resmiyle harf boyutunda PDF'leri bölmek için aşağıdakiler benim için harika çalıştı (ikinci adımda [-612 0] 'un kullanılmasına dikkat edin, pozitif bir değer boş sayfalar yarattı çünkü yanlış yolu itti .)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

-dFirstPage=2Gs'nin sayfa 2'de işlemeye başlamasını bildiren kullanımına dikkat edin.

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

Bu sağ-bölümleri.pdf dosyasını aynı şekilde oluşturur. Ve şimdi kapak resmi:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Sonra, manuel sayfa girişi kullanarak pdftk ile birleştirmek istemediğim için, sol ve sağ bölümleri yeni bir dizinde ayrı PDF'lere böldüm.

mkdir input_file
copy cover.pdf input_file\0000.pdf
pdftk left-sections.pdf burst output input_file\%04d_A.pdf
pdftk right-sections.pdf burst output input_file\%04d_B.pdf

Daha sonra bu dizindeki PDF'lere alfabetik olarak (ve neyse ki doğru sırada sıralandıkları anlamına gelir!) Ve sonucu "Ghost: Generation number 0..65535 range dışında, düzeltmek için tekrar ghostscript üzerinden çalıştırıyorum. 0." "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" olarak adlandırılan ghostscript tarafından üretilen hatalar - benim kullanımımda dosya boyutunu yarıya indirdi. 4.5 MB orijinal ile pdftk'in sonucu 6.7 MB ve gswin32c'nin yeniden işlenmesi bunu 3.2 MB'ye düşürdü.

pdftk input_file\*.pdf cat output input_temp.pdf
gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf

Ve işimiz bitti! İnput_file klasörünü, cover.pdf, input_temp.pdf, right_sections.pdf ve left_sections.pdf dosyalarını silebilirsiniz. ;-)


1

sol taraftaki pdf'leri tek bir belgede ve sağ taraftaki pdf'leri tek bir belgede çıkarmanız gerekiyorsa, Kurt Pfeifle'ın cevabına dayanan aşağıdaki komut dosyası hile yapar (herhangi bir yükseklik için çalışır ve Genişlik):

$ cat split.sh
#!/bin/bash                                                                     

dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2)                    
width=$(echo "$dims" | cut -d " " -f7)                                          
height=$(echo "$dims" | cut -d " " -f9)                                         
half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1)                      
half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1)                      
heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1)                        

echo "pdf $1 has height $height and width $width"                               

gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1"
gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1"

sonra şu şekilde çalıştırın:

$ ./split.sh thepdftosplit.pdf
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.