Soru PDF'leri PDFTK ile Bookmarks ile birleştirme


Birden fazla pdf'yi birleştirmek için pdftk kullanmak iyi çalışıyor. Bununla birlikte, her bir pdf için bir yer imi oluşturmanın kolay bir yolu birleşti mi?

Bu konuda pdftk dokümanlarında hiçbir şey görmüyorum, bu yüzden pdftk ile mümkün olduğunu düşünmüyorum.

Birleştirilmiş tüm dosyalarımız 1 sayfa olacak, bu yüzden daha sonra yer imleri ekleyebilecek başka bir yardımcı program olup olmadığını mı merak ediyorsunuz?

Ya da her bireysel pdf için bir yer imi belirtirken birleştirmek için izin verecek başka bir linux tabanlı pdf programı.


30
2018-06-03 20:21


Menşei


Versiyon 1.45 - 6 Aralık 2012 ile mümkün update_info. Bakın steventareer'in cevabı. - jerik


Cevaplar:


Ayrıca Ghostscript ile birden çok PDF'yi birleştirebilirsiniz. Bu rotanın büyük avantajı, bir çözümün kolayca betimlenebilmesi ve gerçek bir programlama çabası gerektirmemesidir:

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          input1.pdf input2.pdf input3.pdf [....]

Ghostscript ile geçebileceksiniz pdfmark Elde edilen PDF'ye giren her ek kaynak dosya için bir İçerik Tablosu ve yer imleri ekleyebilen ifadeler. Örneğin:

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          file-with-pdfmarks-to-generate-a-ToC.ps ^
          -f input1.pdf input2.pdf input3.pdf [....]

veya

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          file-with-pdfmarks-to-generate-a-ToC.ps ^
          -f input1.pdf ^
             input2.pdf ^ 
             input3.pdf [....]

Pdfmark konusuna biraz giriş için, ayrıca bkz. Thomas Merz PDFmark Primer.


Düzenle:
Sana bir örnek vermek istedim file-with-pdfmarks-to-generate-a-ToC.psama bir şekilde unuttun. İşte burada:

[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark
[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark
[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark
[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark 

Bu, ilk 4 dosya için bir ToC oluşturacaktır == ilk 4 sayfa (bileşen dosyalarınızın birleştirilmiş PDF'niz için 1 sayfa olduğunu garanti ettiğinizden).

  1. [/XYZ null null null] bölümü, bağlantıyı izlerken sayfa görüntüleme ve yakınlaştırma düzeyinizin geçerli olandan değişmediğinden emin olur. (Söyleyebilirdin [/XYZ 222 111 2] keyfi bir örnek istiyorsanız bunu yapmak için.)
  2. /Title (some string you want) thingie ToC'de hangi metnin olduğunu belirler.

Ayrıca, bu parametreleri doğrudan Ghostscript komut satırına da ekleyebilirsiniz:

gswin32c.exe ^
       -o merged.pdf ^
       [...more Ghostscript options as needed...] ^
       -c "[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark" ^
       -c "[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark" ^
       -c "[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark" ^
       -c "[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark" ^
       -f input1.pdf ^
          input2.pdf ^ 
          input3.pdf ^ 
          input4.pdf [....]



'nother Düzenleme: 

Oh, ve bu arada: Ghostscript yapar iki PDF dosyasını bir araya getirmek için kullandığınızda yer imlerini koruyun - pdftk.exe yapmaz. İlk düzenlememin komutuyla oluşturulanı kullanalım (aynı dosyanın 2 kopyasını etkin bir şekilde birleştirerek):

 gswin32c ^
    -sDEVICE=pdfwrite ^
    -o doublemerged.pdf ^
     merged.pdf ^
     merged.pdf

Dosya doublemerged.pdf şimdi 2 * 4 = 8 yer imleri olacak.

  • Beklendiği gibi: 1, 2, 3 ve 4 numaralı sayfalara yer işareti 1, 2, 3 ve 4.
  • Sorun şu ki, 5, 6, 7 ve 8 numaralı yer imleri de sayfa 1, 2, 3 ve 4'te bağlanmaktadır.

Bunun nedeni, önceden var olan yer imlerinin, bağlantı hedeflerini mutlak sayfa numaraları ile çözmesidir. Bunun etrafında çalışmak (ve imleri birleştirilmiş dosyalar içinde çalışmak) için, hedef hedeflere bağlantı hedeflerine işaret eden yer imleri oluşturmalıdır (ve bunların birleştirilen belgeler arasında tek olduğundan emin olun).

(Bu yaklaşım ayrıca linux üzerinde çalışır, sadece gswin32c yerine gs kullanın.)


apandis

Yukarıdaki komut satırı kullanır [...more Ghostscript options as needed...] Daha fazla seçenek için bir yer tutucu olarak.

Diğer seçenekleri kullanmazsanız, Ghostscript yerleşik parametrelerini çeşitli parametreler için uygular. Ancak, bu sizin beğeninize olmayan sonuçlar verebilir. Ghostscript, girdiye dayalı tamamen yeni bir PDF oluşturduğundan, bu, orijinal nesnelerin bazılarının değiştirilebileceği anlamına gelir. Bu renk alanları ve görüntü sıkıştırma seviyeleri için geçerlidir.

Orijinal olarak gömülü görüntüleri değiştirmeyen parametreler nasıl uygulanır? Süper Kullanıcı: "Ghostscript kullanın, ancak görüntüleri yeniden işlemeyeceğini söyle".


39
2018-06-24 09:57



+1 Tam olarak aynı durumdaydım. Cevabınızı dün kullandı, bir ısmarlıyorum. Teşekkürler! - dalton
tam istediğim bu ve linuxjournal.com/content/tech-tip-extract-pages-pdf Bazı sayfaların nasıl çıkarılacağı hakkında daha fazla bilgi verir. - Larry Cai
@larrycal: ... ve kim linuxjournal.com TechTip yazdı (kimin açık adı altında yayınladılar)? ;-) - Kurt Pfeifle
Ha? Neden düşüş var?!? - Kurt Pfeifle
@ kime atanan-kefaret: Vay! Çok teşekkürler! :-) - Kurt Pfeifle


Bunu daha önce bahsettiğim başka yollar olduğunu biliyorum, ancak pdftk ile pdf'de varolan bilgilerin bir .info dosyası oluşturmak için pdftk işlevi dump_data işlevini kullanarak birleştirilmiş pdf'yi ve yer imlerini ekleyebilirsiniz. Daha sonra, her bir yer işareti için aşağıdaki dört satırı ekleyerek .info dosyasına yer işareti bilgisi ekleyebilirsiniz.

BookmarkBegin
BookmarkTitle: name
BookmarkLevel: level
BookmarkPageNumber: page number

Sonra birleştirilmiş pdf yer imlerini .info dosyasına yazdıklarınızla güncellemek için update_info çağrısını kullanın. Eğer ilgilenirse, autohotkey'de bunu benim için bazı basit işlevler yazdım. Görmek http://www.autohotkey.com/board/topic/98985-scripts-to-merge-pdfs-and-add-bookmarks-with-pdftk/


10
2017-12-02 16:39



İyi bir ekleme, bu yüzden prosedür 1) Birleştirilecek dosyalardan yer imlerini tut. 2) Dosyaları ve yer imlerini (sayfaları ayrı ayrı) birleştir: 3) Birleştirilmiş ve kaydırılmış yer imlerini birleştirilen PDF'ye yerleştir. - Nenotlep
1) evet, 2) yer imlerini pdftk ile birleştiremezsiniz 3) evet. - steventaitinger
Şu anda pdf dosyasına kelime dosyalarını ve autocad dosyalarını bir arada yazdıramıyorum ve dosyaları açarken yer imlerinin bir listesini yapıyorum. Sonra tüm pdf dosyalarını birleştiririm. Sonra birleştirilmiş pdf için .info dosyası oluşturur. Ardından, daha önce yaptığım yer işaretleri listeme bağlı olarak .info dosyasını düzenlerim. Sonra birleştirilmiş pdf dosyasını .info dosyasına göre güncellerim. - steventaitinger
Tam bir örnek, nasıl kullanılır update-info burada bulunabilir: stackoverflow.com/a/40222656/1933185 - jerik


Kullanabileceğiniz pdf yer imlerini ekleyin veya düzenleyin JPdfBookmarks. Mükemmel bir çok-işletim sistemi olan ücretsiz bir yazılımdır. Sadece yer imleriyle ilgilenir, böylece sayfaları birleştirmek veya yeniden sıralamak için başka bir araca ihtiyacınız olur. Pdftk ek olarak denemek öneririz PDF Böl ve Birleştir (iyi bir uygulama, ama tuhaf UI, deneyimlerimden yer imleri karıştırır), PDF-sürüyen (iyi çalışıyor gibi görünüyor, ancak bazen bazı dosyalar ile uğraşırken donuyor), veya PdfMod (pdfs'yi belirli bir sayfaya nasıl ekleyeceğimizi anlayamamış olmamasına rağmen, en iyi şekilde yeniden düzenleme, birleştirmeler ve yer imleri ile uğraşmak gibi).

Bazı bağlantılar sağlamadığım için özür dilerim, bir yeni kullanıcı olarak sistem sadece 2 tane köprü eklememi sağlıyor.


4
2018-01-08 14:55





Bu cevaba bakın https://stackoverflow.com/a/17781138/547578. Sejda adında bir şey kullandım. İşe yarıyor. Yer imlerini mükemmel bir şekilde birleştirir. Teşekkürler @blablatros.


4
2017-07-22 09:02



İlginç görünüyor, lisansın ne olduğunu biliyor musun? - Nenotlep
Apache Lisansı: sejda.org/about/license - fossilet
@fossilet Sorun yok. 1 sayfa PDF'ler için - yani OP'nin giriş sayfası başına yalnızca bir yer imine ihtiyacı varsa - bağlantılı yayında belirtilen PDF Bölme ve Birleştirme de yeterli olacaktır. - blablatros


@pipitas'ın iyi yanıtı, mükemmelleştirilmiş yer imi sorunlarını çözmüyor ve unix tartışmasında ilgili soru var. https://unix.stackexchange.com/questions/17065/add-and-edit-bookmarks-to-pdf/31070 önerdiğim yer

Eğer hala bu unix betiklerine bağlıysan o zaman

  1. ayrılan yer imi verileri ayıkla pdftk
  2. dökümlü yer imi verilerini phostmarks biçimine dönüştürmek için bir tane daha komut dosyası yazın, ghostscript komutu gs kabul edildi.
  3. kullanım gs pdfmarks ile birleştirmek için komut dosyası

Komut zaten var, gör pdf-merge.py itibaren PDF'leri PDFTK ile Bookmarks ile birleştirme


2
2018-02-07 06:41





Belki aşağıdaki yararlıdır. Bir dizinde bulunan tüm pdfs'leri (in_nn.pdf) ToC olarak pdfs (in_nn) giriş adlarına sahip bir out.pdf ile birleştirmek istedim. İsimleri okuyan ve sayfa numaralarını çıkaran ve pdfmarks adlı bir dosya oluşturan bir python betiği yazdım. Dosyaların birleştirilmesi daha sonra gs ile kolayca yapılır. Tam komut komut dosyası tarafından verilir ve ayrı olarak çalıştırılmalıdır (sayfa boyutu uyarlamaları veya işletim sistemi nedeniyle bazı değişiklikler olabilir).

İşte burada. Belki de pencereler için bazı değişiklikler gerekli? (İngilizce değil yorumlar için özür dilerim). Sadece python betiğini, birleştirilecek pdfs'nin bulunduğu dizinde yürütün.

#!/usr/bin/env python

import subprocess

# Dieses Skript dient dazu, eine Reihe von pdfs zu einem einzigen pdf zusammenzufassen und bookmarks fuer diese pdf-Datei zu erzeugen.
# Dafuer wird ein Datei pdfmark benoetigt, die mit diesem Skript erzeugt wird.
# Dazu einfach dieses Skript in dem Verzeichnis aufrufen, das genau alle zusammenzufassenden pdfs (*pdf, s.u.) enthaelt.
# Das zusammenfassende pdf wird dann mit diesem Befehl (in der bash) generiert:
# gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile="all.pdf" $(ls *pdf ) pdfmarks
# Bereits Inhaltsverzeichnisse bleiben erhalten, die neuen kommen ans Ende des Inhaltsverzeichnisses.
#
# pdfmarks sieht dabei prinzipiell so aus:
#
# [/Title (Nr. 1) /Page 1 /OUT pdfmark
# [/Title (Nr. 2) /Page 5 /OUT pdfmark
# [/Title (Nr. 3) /Page 9 /OUT pdfmark
# usw.

p = subprocess.Popen('ls *pdf', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

pdfdateien = []
kombinationen = []

for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
  pdfdateien.append(line)


for datei in pdfdateien:
  cmd = "pdfinfo %s" %datei 
  q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  kombination = [datei]

for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
  pdfdateien.append(line)


for datei in pdfdateien:
  cmd = "pdfinfo %s" %datei 
  q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  kombination = [datei]


  for subline in q.stdout.readlines():
# q enthaelt die Zeilen von pdfinfo
    if "Pages" in subline:
      kombination.append(subline)

  kombinationen.append(kombination)


# Jetzt kombinationen in benoetigtes Format bringen:

kombinationen_bereinigt =  []
out_string1 = "[/Title ("
out_string2 = ") /Page "
out_string3 = " /OUT pdfmark\n"
seitenzahl = 1

for kombination in kombinationen:
  dateiname = kombination[0][0:len(kombination[0])-5]

#
# Hier noch dateiname evtl. verwursten
# z. B.
#  lesezeichen = dateiname[0:1]+" "+dateiname[6:8]+"/"+dateiname[1:5]
  lesezeichen = dateiname

  anz_seiten = kombination[1][16:len(kombination[1])-1]
  seitenzahl_str = str(seitenzahl)

  kombination_bereinigt = out_string1+lesezeichen+out_string2+seitenzahl_str+out_string3
  kombinationen_bereinigt.append(kombination_bereinigt)

  seitenzahl += int(anz_seiten)


# Ausgabe ins file
outfile = open("pdfmarks", "w")

for i in kombinationen_bereinigt:
  outfile.write(i)

outfile.close()

# Merge-Befehl absetzen

print "\nFor merging all pdfs execute this (or similar) command (in bash shell):"
print "gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile=\"all.pdf\" $(ls *pdf ) pdfmarks\n"

2
2018-05-29 08:31





Ne yazık ki bunu yapmanın kolay bir yolu yok. Pdftk'nin doğrudan üzerine kurulu olduğu kütüphaneyi kullanabilir ve bir çağrı cihazınızı birleştirip, yer imleri oluşturarak iText veya iTextSharp kullanan bir Java veya .NET programı yazabilirsiniz. İText rotasına gitmek istiyorsanız, online olarak veya iText kitabında (iText yazarı tarafından yazılan) çok sayıda örnek var.

... ya da neyin işe yaramadığını bana bildirin ve yardımcı olabilirim.


1
2018-06-29 10:44





Aşağıdaki pdfmerger tarafından cevap için bir yorum olması amaçlanmıştır (https://stackoverflow.com/a/30524828/3915004).

Komut dosyası pdfmerger için teşekkürler! Sorunun linux olarak işaretlendiğini biliyorum, ancak Mac OS X için komut dosyanızı genellemek için 2 şey gereklidir:

  • ghostscriptin gs ve
  • komuta pdfinfo (örn. poppler)

İlk önce onları yükleyin brew (google, bu, biraz curl / ruby-magic komutuyla yüklenir) ve daha sonra basitçe:

brew install ghostscript
brew install poppler

ADD-ON: BÖLÜM BAŞLIKLARI İLE OKUYUN-DOSYA:

Komut dosyanızı genişletmek için. Bu iş akışını, editörlerin web sitesinden bölüm indirmeleri olarak sunulan kitaplar için kullanıyorum. Bölüm isimlerini içeren bir metin dosyası kolayca oluşturulabilir. Kodunuza aşağıdaki eklenti ek olarak, birleştirmek için pdf başına bir satır içeren 'chapters.txt' metin dosyasını okur. (Not, pdfs sayısına karşılık gelen satırların sayısı üzerinde herhangi bir kontrol uygulamamıştım.)

Aşağıdaki satırları değiştirerek komut dosyanızı genişletmeniz yeterlidir:

p = subprocess.Popen('ls *pdf', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
c = subprocess.Popen('less chapters.txt', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

pdfdateien = []
kombinationen = []
chapternames = []

for line in c.stdout.readlines():
# c contains all chapter-titles
  chapternames.append(line)

for line in p.stdout.readlines():

ve

for index, kombination in enumerate(kombinationen):
#  dateiname = kombination[0][0:len(kombination[0])-5]
#
# Hier noch dateiname evtl. verwursten
# z. B.
#  lesezeichen = dateiname[0:1]+" "+dateiname[6:8]+"/"+dateiname[1:5]
#  lesezeichen = dateiname
  lesezeichen=chapternames[index][:-1]

  anz_seiten = kombination[1][16:len(kombination[1])-1]

0
2017-12-14 21:57





Var PdfMod. Grafik bir arayüze sahiptir ve yer imlerini el ile eklemenize izin verir. Ayrıca, zaten yer imleri içeren bir PDF dosyasını düzenlerseniz, bunları doğru sayfalara yönlendirmek için otomatik olarak günceller.


0
2017-07-18 22:48





Sejda PDF (önerilen cevaplardan biri) çevrimiçi hizmet olarak da mevcuttur: https://www.sejda.com/merge-pdf.

Herhangi bir ek yazılım yüklemek istemiyorsanız ve bir tarayıcıdan çevrimiçi çalışmayı tercih ederseniz, bu kullanışlı olabilir.

Birleştirilecek adımlar:

  1. Tüm PDF dosyalarını web sayfasına sürükleyip bırakın
  2. Varsayılan olarak tüm mevcut yer imleri korunur ve birleştirilmiş belgede çalışır de.

  3. İsteğe bağlı olarak, birleştirme aracı, birleştirilen PDF belgelerine dayanarak bir içerik tablosu oluşturabilir

Option selected to generated Table of contents for merged PDF documents based on filenames

Merged PDF table of contents

PDF dosyalarını birleştirmek için çevrimiçi hizmet saatte 30 dosya ve 50Mb / 200 sayfaya kadar dosyalar için kullanmak ücretsizdir.

Yasal Uyarı: Ben Sejda üzerinde çalışan bir açık kaynak koduyum.


0
2017-12-08 13:17