CombinePDFは、Pure Rubyで記述された気の利いたモデルであり、PDFファイルを解析し、他のPDFファイルと組み合わせたり(マージしたり)、それらを透かしてスタンプしたり、スタンプしたりします(すべてPDFファイル形式と純粋なRubyコードを使用)。
私はこの宝石の維持をやめ、誰かがこの宝石のPRレビューとメンテナンスを引き継ぐことができることを願っています(または単に成功したフォークを開きます)。
私はこの宝石を書きました。なぜなら、既存のPDFドキュメントを提供するベイツの問題を解決する必要があったからです。
しかし、2014年以来、私は宝石を無料で維持してきましたが、それをまったく理由もなく維持しています。
私はこの宝石が大好きですが、自分のプロジェクトが自分のプロジェクトを持っているので、それを維持し続けることはできません。時間と(より重要なことに)マインドスペースの両方が必要です。
Ruby Gemsでインストール:
gem install combine_pdf
クイックランダウン:
PDFフォームを読むと、何らかの形式データが失われる可能性があります。私はこれを自分の能力のベストに固定しようとしましたが、まだすべてが機能するかどうかはわかりません。
PDFフォームを組み合わせると、フォームデータが統合される場合があります。これを修正できませんでした。これは、PDFが機能する方法であるため(フィールドを埋めることが同じ名前でどのフィールドのデータに記入します)、率直に言って、私はちょっと問題が好きでした...それはほとんど機能です。
同じTOCデータを1回統合する場合、参照の1つが他のものと統一されます(つまり、ページが同じように見える場合、両方の参照が2つの異なるページにリンクする代わりに同じページにリンクされます)。これは、PDFファイルをマージする前にページにコンテンツを追加することで修正できます(つまり、すべてのページに空のテキストボックスを追加します)。
いくつかのリンクとデータ(URLリンクとPDF「名前付きDestinations」)はPDFのルートに保存されており、ページからリンクされていません。この情報を保持するには、ページではなくPDFオブジェクトをマージする必要があります。
PDFファイルからページをリッピングして別のPDFと融合すると、一部のリンクが失われます。
いくつかの暗号化されたPDFファイル(通常、パスワードなしでは表示できないもの)は、騒々しくはなく静かに失敗します。ノイズの多いルートを選択する場合は、 CombinePDF::EncryptionError
を上げるCombinePDF.load(pdf_file, raise_on_encrypted: true)
を使用して、 raise_on_encrypted
オプションを指定できます。
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データを組み合わせるときに破損または失われる可能性があります。
このライブラリがデータの喪失を引き起こしたり、家を焼き払ったりした場合、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"
または1つのライナーでさえ:
( 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"
すべてのページを1つずつ追加すると、ファイル全体が追加されることに注意してください。
既存の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オブジェクトとページで異なる方法で動作します。
<<オペレーターは、リファレンスを名前に変更してconflicsを回避することにより、注入を確保するデフォルトです。編集可能でない可能性のある圧縮データを使用してページをオーバーレイする場合(フィルターサポートが限られているため)、次のことを使用できます。
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ファイルをメモリから解析することもできます。メモリからの読み込みは、インターネットを通じて受信された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
パラメーターCombinePDF.parse
PDFParser.new
に渡すCombinePDF.load
ができます。
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ジェムを書きました。
gemをインストールしたかったのですが、インターネットに問題があり、コード自体をcombine_pdf_decryptクラスファイルにコピーすることになりました。
彼の素晴らしい功績はここに与えられています。彼のライセンスと著作権を尊重してください...そして私のもの。
mit
GitHubの問題ページを見て、「ヘルプが必要」タグを見ることができます。
あなたが寄付を考えているか、私にお金を送っているなら - 必要はありません。このプロジェクトはあなたのお金なしでそれ自体を維持することができます。
このプロジェクトが必要とするのは、それを最新の状態に保ち、ドキュメントのエラーや問題を修正するケア開発者から与えられる時間です。しかし、私はあなたの寛大さからより多くの利益を得るものが本当の必要性のあるものがあると思います。