Combinepdf adalah model yang bagus, ditulis dalam ruby murni, untuk menguraikan file PDF dan menggabungkan (menggabungkan) mereka dengan file PDF lainnya, tanda air atau cap (semua menggunakan format file PDF dan kode ruby murni).
Saya memutuskan untuk berhenti mempertahankan permata ini dan berharap seseorang dapat mengambil alih ulasan PR dan pemeliharaan permata ini (atau hanya membuka garpu yang sukses).
Saya menulis permata ini karena saya perlu memecahkan masalah dengan Bates-Numbering Dokumen PDF yang ada.
Namun, sejak 2014 saya telah memelihara permata secara gratis dan tanpa alasan sama sekali, kecuali bahwa saya menikmati membaginya dengan komunitas.
Saya suka permata ini, tetapi saya tidak bisa terus mempertahankannya karena saya memiliki proyek sendiri untuk fokus sendiri dan saya membutuhkan waktu dan (yang lebih penting) ruang pikiran.
Instal dengan Ruby Gems:
gem install combine_pdf
Rundown cepat:
Saat membaca formulir PDF, beberapa data formulir mungkin hilang. Saya mencoba memperbaiki ini dengan kemampuan terbaik saya, tetapi saya belum yakin semuanya berfungsi dulu.
Saat menggabungkan formulir PDF, data formulir mungkin disatukan. Saya tidak dapat memperbaikinya karena ini adalah cara kerja PDF (mengisi bidang mengisi data di bidang apa pun dengan nama yang sama), tetapi terus terang, saya agak menyukai masalah ini ... ini hampir merupakan fitur.
Saat menyatukan data TOC yang sama lebih dari sekali, salah satu referensi akan disatukan dengan yang lain (artinya jika halaman terlihat sama, kedua referensi akan menautkan ke halaman yang sama alih -alih menautkan ke dua halaman yang berbeda). Anda dapat memperbaikinya dengan menambahkan konten ke halaman sebelum menggabungkan file PDF (yaitu menambahkan kotak teks kosong ke semua halaman).
Beberapa tautan dan data (tautan URL dan PDF "bernama Destinations") disimpan pada akar PDF dan mereka tidak terhubung kembali dari halaman. Menjaga informasi ini membutuhkan penggabungan objek PDF daripada halamannya.
Beberapa tautan akan hilang saat merobek halaman dari file PDF dan menggabungkannya dengan PDF lain.
Beberapa file PDF terenkripsi (biasanya yang tidak dapat Anda lihat tanpa kata sandi) akan gagal dengan tenang alih -alih berisik. Jika Anda lebih suka memilih rute yang berisik, Anda dapat menentukan opsi raise_on_encrypted
menggunakan CombinePDF.load(pdf_file, raise_on_encrypted: true)
yang akan meningkatkan CombinePDF::EncryptionError
.
Kadang -kadang CombinepDF akan meningkatkan pengecualian bahkan jika PDF dapat diuraikan (yaitu, ketika konten opsional PDF ada) ... Saya merasa lebih baik untuk melakukan kesalahan pada sisi kehati -hatian, meskipun untuk konten opsional PDF, pengecualian dapat dihindari menggunakan CombinePDF.load(pdf_file, allow_optional_content: true)
.
Permata CombinepDF menjalankan kode rekursif untuk parse dan memformat file PDF. Oleh karena itu, file PDF yang memiliki objek yang sangat bersarang, serta yang dikombinasikan dengan cara yang menghasilkan bersarang siklik, mungkin meledakkan tumpukan - menghasilkan pengecualian atau kegagalan program.
Combinepdf ditulis secara asli dalam Ruby dan harus (mungkin) bekerja pada semua platform Ruby yang mengikuti kompatibilitas Ruby 2.0.
Namun, file PDF adalah makhluk yang cukup kompleks dan tidak ada jaminan yang disediakan.
Misalnya, formulir PDF diketahui memiliki masalah dan bentuk data mungkin hilang ketika mencoba menggabungkan PDF dengan data formulir yang diisi (juga, formulir adalah objek global, bukan spesifik halaman, jadi seseorang harus menggabungkan seluruh PDF untuk data apa pun memiliki kesempatan untuk dilestarikan).
Hal yang sama berlaku untuk tautan PDF dan Daftar Isi, yang semuanya memiliki atribut global dan dapat rusak atau hilang saat menggabungkan data PDF.
Jika perpustakaan ini menyebabkan hilangnya data atau membakar rumah Anda, saya tidak bisa disalahkan - seperti yang ditunjukkan oleh lisensi MIT. Yang sedang berkata, saya menggunakan perpustakaan dengan senang hati setelah menguji terhadap solusi yang berbeda.
Untuk menggabungkan file PDF (atau data):
pdf = CombinePDF . new
pdf << CombinePDF . load ( "file1.pdf" ) # one way to combine, very fast.
pdf << CombinePDF . load ( "file2.pdf" )
pdf . save "combined.pdf"
Atau bahkan satu liner:
( CombinePDF . load ( "file1.pdf" ) << CombinePDF . load ( "file2.pdf" ) << CombinePDF . load ( "file3.pdf" ) ) . save ( "combined.pdf" )
Anda juga dapat menambahkan halaman aneh atau bahkan:
pdf = CombinePDF . new
i = 0
CombinePDF . load ( "file.pdf" ) . pages . each do | page |
i += 1
pdf << page if i . even?
end
pdf . save "even_pages.pdf"
Perhatikan bahwa menambahkan semua halaman satu per satu lebih lambat kemudian menambahkan seluruh file.
Untuk menambahkan konten ke halaman PDF yang ada, pertama impor konten baru dari file PDF yang ada. Setelah itu, tambahkan konten ke masing -masing halaman di PDF Anda yang ada.
Dalam contoh ini, kami akan menambahkan logo perusahaan ke setiap halaman:
company_logo = CombinePDF . load ( "company_logo.pdf" ) . pages [ 0 ]
pdf = CombinePDF . load "content_file.pdf"
pdf . pages . each { | page | page << company_logo } # notice the << operator is on a page and not a PDF object.
pdf . save "content_with_logo.pdf"
Perhatikan << operator ada di halaman dan bukan objek PDF. << operator bertindak berbeda pada objek PDF dan pada halaman.
<< operator default untuk mengamankan injeksi dengan mengganti nama referensi untuk menghindari konferensi. Untuk halaman overlay menggunakan data terkompresi yang mungkin tidak dapat diedit (karena dukungan filter terbatas), Anda dapat menggunakan:
pdf . pages ( nil , false ) . each { | page | page << stamp_page }
Menambahkan nomor halaman ke objek atau file PDF sesederhana mungkin:
pdf = CombinePDF . load "file_to_number.pdf"
pdf . number_pages
pdf . save "file_with_numbering.pdf"
Penomoran dapat dilakukan dengan banyak opsi berbeda, dengan format yang berbeda, dengan atau tanpa objek kotak, dan bahkan dengan nilai opacity - lihat dokumentasi.
Misalnya, Anda lebih suka menempatkan nomor halaman di sisi kanan bawah semua halaman PDF, lakukan:
pdf . number_pages ( location : [ :bottom_right ] )
Sebagai contoh lain, tanda hubung di sekitar nomor dilepas dan sebuah kotak ditempatkan di sekitarnya. Penomorannya semi-transparan dan 3 halaman pertama diberi nomor menggunakan huruf (a, b, c) daripada angka:
# number first 3 pages as "a", "b", "c"
pdf . number_pages ( number_format : " %s " ,
location : [ :top , :bottom , :top_left , :top_right , :bottom_left , :bottom_right ] ,
start_at : "a" ,
page_range : ( 0 .. 2 ) ,
box_color : [ 0.8 , 0.8 , 0.8 ] ,
border_color : [ 0.4 , 0.4 , 0.4 ] ,
border_width : 1 ,
box_radius : 6 ,
opacity : 0.75 )
# number the rest of the pages as 4, 5, ... etc'
pdf . number_pages ( number_format : " %s " ,
location : [ :top , :bottom , :top_left , :top_right , :bottom_left , :bottom_right ] ,
start_at : 4 ,
page_range : ( 3 ..- 1 ) ,
box_color : [ 0.8 , 0.8 , 0.8 ] ,
border_color : [ 0.4 , 0.4 , 0.4 ] ,
border_width : 1 ,
box_radius : 6 ,
opacity : 0.75 )
pdf.number_pages(number_format: " %s ", location: :bottom_right, font_size: 44)
Memuat data PDF dapat dilakukan dari sistem file atau langsung dari memori.
Memuat data dari file itu mudah:
pdf = CombinePDF . load ( "file.pdf" )
Anda juga dapat menguraikan file PDF dari memori. Memuat dari memori sangat efektif untuk mengimpor data PDF yang diterima melalui internet atau dari perpustakaan penulisan yang berbeda seperti udang:
pdf_data = prawn_pdf_document . render # Import PDF data from Prawn
pdf = CombinePDF . parse ( pdf_data )
Menggunakan parse
juga efektif saat memuat data dari lokasi jarak jauh, menghindari kebutuhan untuk file sementara yang tidak perlu. Misalnya:
require 'combine_pdf'
require 'net/http'
url = "https://example.com/my.pdf"
pdf = CombinePDF . parse Net :: HTTP . get_response ( URI . parse ( url ) ) . body
Demikian pula, untuk memuat dan parsing, rendering juga dapat dilakukan baik untuk memori atau ke file.
Anda dapat mengeluarkan string data PDF menggunakan .to_pdf
. Misalnya, untuk membiarkan pengguna mengunduh PDF dari aplikasi Rails atau aplikasi Plezi:
# in a controller action
send_data combined_file . to_pdf , filename : "combined.pdf" , type : "application/pdf"
Di Sinatra:
# in your path's block
status 200
body combined_file . to_pdf
headers 'content-type' => "application/pdf"
Jika Anda lebih suka menyimpan data PDF ke file, Anda selalu dapat menggunakan metode save
seperti yang kami lakukan dalam contoh sebelumnya.
Beberapa file PDF berisi bagian konten opsional yang tidak selalu dapat digabungkan dengan andal. Secara default, pengecualian dinaikkan jika salah satu file ini terdeteksi. Anda secara opsional dapat meneruskan parameter allow_optional_content
ke PDFParser.new
, CombinePDF.load
dan CombinePDF.parse
Metode:
new_pdf = CombinePDF . new
new_pdf << CombinePDF . load ( pdf_file , allow_optional_content : true )
attachments . each { | att | new_pdf << CombinePDF . load ( att , allow_optional_content : true ) }
Anda dapat melihat demo untuk "aplikasi web bates bates" dan membaca kode itu. Semoga beruntung :)
Beberapa file PDF dienkripsi dan beberapa dikompresi (penggunaan filter) ...
Ada sangat sedikit dukungan untuk file terenkripsi dan dukungan yang sangat mendasar dan terbatas untuk file terkompresi.
Saya butuh bantuan untuk itu.
Jika Anda ingin membantu dengan kode tersebut, berhati -hatilah:
Saya seorang hobby yang terpelajar di hati. Dokumentasi kurang dan komentar dalam kode adalah pedoman yang buruk.
Kode itu sendiri harus sangat lurus ke depan, tetapi jangan ragu untuk menanyakan apa pun yang Anda inginkan.
Stefan Leitner (@sle1tner) menulis kode penggabungan garis yang mendukung PDF yang berisi TOC.
Caige Nichols menulis permata RC4 yang luar biasa yang saya gunakan dalam kode saya.
Saya ingin menginstal permata, tetapi saya memiliki masalah dengan internet dan akhirnya menyalin kode itu sendiri ke dalam file kelas Combine_PDF_Decrypt.
Penghargaan untuknya yang indah diberikan di sini. Harap hormati lisensi dan hak ciptanya ... dan milik saya.
Mit
Anda dapat melihat halaman masalah GitHub dan melihat tag "Help Wanted".
Jika Anda memikirkan sumbangan atau mengirimi saya uang - tidak perlu. Proyek ini dapat mempertahankan diri tanpa uang Anda.
Apa yang dibutuhkan proyek ini adalah waktu yang diberikan oleh pengembang yang peduli yang terus memperbarui dan memperbaiki kesalahan dokumentasi atau masalah yang mereka perhatikan ... Setelah mengatakan bahwa, hadiah (seperti kopi gratis atau kartu hadiah iTunes) selalu menyenangkan. Tapi saya pikir ada orang -orang yang benar -benar membutuhkan yang akan mendapat manfaat lebih dari kemurahan hati Anda.