CombinePDF是一種用純ruby編寫的精美模型,用於解析PDF文件並將其與其他PDF文件組合(合併),加水印或蓋章(所有使用PDF文件格式和純Ruby Code)。
我決定停止維護這顆寶石,希望有人可以接管該寶石的公關評論和維護(或只是打開成功的叉子)。
我之所以寫這顆寶石,是因為我需要解決bates數量的問題,使現有的pdf文檔劃分。
但是,自2014年以來,我一直免費維護寶石,完全無緣無故,除了我喜歡與社區分享它。
我喜歡這個寶石,但是我無法繼續保持它,因為我有自己的項目要專注於自己,而且我需要時間和(更重要的是)思維空間。
與Ruby Gems安裝:
gem install combine_pdf
快速摘要:
閱讀PDF表單時,可能會丟失某些表單數據。我嘗試以最好的能力來解決這個問題,但我不確定這一切還可以。
當組合PDF表單時,表單數據可能會統一。我無法解決此問題,因為這是PDF形式的工作方式(填充字段以相同名稱填充數據),但是坦率地說,我有點喜歡這個問題……這幾乎是一個功能。
在更統一相同的TOC數據時,其中一個引用將與另一個參考統一(這意味著,如果頁面看起來相同,則兩個引用將鏈接到同一頁面,而不是鏈接到兩個不同的頁面)。您可以通過在合併PDF文件之前將內容添加到頁面(即向所有頁面添加空文本框)來解決此問題。
某些鏈接和數據(URL鏈接和PDF“命名目的地”)存儲在PDF的根部,並且它們沒有從頁面上鍊接回。保留此信息需要合併PDF對象,而不是它們的頁面。
從PDF文件中刪除頁面並將它們與另一個PDF合併時,一些鏈接將丟失。
一些加密的PDF文件(通常是沒有密碼的文件)會悄悄地失敗,而不是吵鬧。如果您希望選擇嘈雜的路線,則可以使用CombinePDF.load(pdf_file, raise_on_encrypted: true)
指定raise_on_encrypted
選項,該選項將增加一個CombinePDF::EncryptionError
。
有時,即使可以解析PDF(即,當存在PDF可選內容時),CombinePDF也會引起異常。儘管對於可選的內容PDF,但使用CombinePDF.load(pdf_file, allow_optional_content: true)
。
CombinePDF GEM運行遞歸代碼以解析和格式化PDF文件。因此,PDF文件具有重嵌套的對象,以及以導致環狀嵌套的方式組合的文件可能會爆炸堆棧 - 導致異常或程序故障。
CombinePDF本地編寫在Ruby中,應該(大概)在所有遵循Ruby 2.0兼容性的Ruby平台上工作。
但是,PDF文件是非常複雜的生物,沒有保證。
例如,已知PDF表格存在問題,並且在嘗試將PDF與填充的表單數據相結合時可能會丟失數據(同樣,表單是全局對象,而不是頁面特定的,因此應該將整個PDF組合到任何數據中的整個PDF有保留的機會)。
同樣,PDF鏈接和目錄都具有全局屬性,並且在組合PDF數據時可能會損壞或丟失。
如果該圖書館導致數據丟失或燒毀您的房屋,我不應該責怪 - 如MIT許可證所指出的那樣。話雖如此,在針對不同的解決方案進行測試後,我很高興地使用圖書館。
結合PDF文件(或數據):
pdf = CombinePDF . new
pdf << CombinePDF . load ( "file1.pdf" ) # one way to combine, very fast.
pdf << CombinePDF . load ( "file2.pdf" )
pdf . save "combined.pdf"
甚至一個襯裡:
( CombinePDF . load ( "file1.pdf" ) << CombinePDF . load ( "file2.pdf" ) << CombinePDF . load ( "file3.pdf" ) ) . save ( "combined.pdf" )
您還可以添加奇數甚至頁面:
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"
請注意,添加所有頁面一個一個頁面較慢,然後添加整個文件。
要將內容添加到現有PDF頁面中,請首先從現有PDF文件中導入新內容。之後,將內容添加到您現有PDF中的每個頁面中。
在此示例中,我們將向每個頁面添加一個公司徽標:
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"
注意<<操作員在頁面上,而不是PDF對象。 <<運算符在PDF對象和頁面上的作用不同。
<<操作員默認會通過重命名引用以避免衝突來確保注入。對於使用可能無法編輯的壓縮數據覆蓋頁面(由於過濾器支持有限),您可以使用:
pdf . pages ( nil , false ) . each { | page | page << stamp_page }
將頁面號添加到PDF對像或文件中很簡單:
pdf = CombinePDF . load "file_to_number.pdf"
pdf . number_pages
pdf . save "file_with_numbering.pdf"
編號可以使用許多不同的選項完成,具有不同的格式,有或沒有框對象,甚至具有不透明度值 - 請參閱文檔。
例如,如果您希望將頁碼放在所有PDF頁面的右側,請執行:
pdf . number_pages ( location : [ :bottom_right ] )
作為另一個示例,將圍繞數字的破折號刪除,並在其周圍放置一個盒子。編號是半透明的,前3頁使用字母(a,b,c)而不是數字編號:
# 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)
加載PDF數據可以從文件系統或直接從內存完成。
從文件加載數據很容易:
pdf = CombinePDF . load ( "file.pdf" )
您還可以從內存中解析PDF文件。從內存中加載對於通過Internet或從其他作用庫(例如大蝦)收到的PDF數據特別有效:
pdf_data = prawn_pdf_document . render # Import PDF data from Prawn
pdf = CombinePDF . parse ( pdf_data )
從遠程位置加載數據時,使用parse
也很有效,從而規定了對不必要的臨時文件的需求。例如:
require 'combine_pdf'
require 'net/http'
url = "https://example.com/my.pdf"
pdf = CombinePDF . parse Net :: HTTP . get_response ( URI . parse ( url ) ) . body
同樣,對於加載和解析,也可以對內存或文件執行渲染。
您可以使用.to_pdf
輸出PDF數據字符串。例如,讓用戶從Rails應用程序或Plezi應用程序下載PDF:
# in a controller action
send_data combined_file . to_pdf , filename : "combined.pdf" , type : "application/pdf"
在辛納屈:
# in your path's block
status 200
body combined_file . to_pdf
headers 'content-type' => "application/pdf"
如果您希望將PDF數據保存到文件中,則可以隨時使用“ save
方法”,就像我們先前示例中所做的那樣。
一些PDF文件包含可選的內容部分,這些部分不能總是可靠地合併。默認情況下,如果檢測到這些文件之一,則會提出例外。您可以選擇將allow_optional_content
參數傳遞到PDFParser.new
, CombinePDF.load
和CombinePDF.parse
方法:
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 ) }
您可以看到一個“ Bates stumping Web-App”的演示,並閱讀其代碼。祝你好運 :)
一些PDF文件已加密,有些是壓縮的(使用過濾器)...
對加密文件幾乎沒有支持,並且非常基本和有限的壓縮文件支持。
我需要幫助。
如果您想幫助代碼,請注意:
我是一個自言自語的嗜好。該文檔缺乏,《守則》中的評論是差的指南。
代碼本身應該非常直截了當,但請隨時詢問您想要的任何內容。
Stefan Leitner(@sle1tner)編寫了支持包含TOC的PDF的大綱合併代碼。
Caige Nichols寫了一個令人驚嘆的RC4寶石,我在代碼中使用了它。
我想安裝寶石,但是我在Internet上遇到了問題,最終將代碼本身複製到Combine_pdf_decrypt類文件中。
歸功於他的美妙之處。請尊重他的執照和版權...和我的。
麻省理工學院
您可以查看GitHub問題頁面,並查看“ Help Wants”標籤。
如果您正在考慮捐款或向我寄錢 - 無需。這個項目可以在沒有您的錢的情況下維持自己。
這個項目需要的是關懷開發人員給它最新並修復他們注意到的任何文檔錯誤或問題的時間...曾經說過,禮物(例如免費咖啡或iTunes禮品卡)總是很有趣。但是我認為,有些真正需要的人將從您的慷慨中受益更多。