16

これは2008 年に尋ねられました。うまくいけば、今より良い答えがあります。

RubyでPDFを結合するにはどうすればよいですか?

私はpdf-stamper gemを使用して PDF のフォームに記入しています。n 個の PDF を取得し、それぞれのフォームに記入して、結果をnページのドキュメントとして保存したいと思います。

エビのようなネイティブ ライブラリでこれを実行できますか? rjb と iText でこれを行うことができますか? pdf-stamper は iText のラッパーです。

可能であれば、2 つのライブラリ (つまり、pdftk と iText) を使用することは避けたいと思います。

4

8 に答える 8

20

As of 2013 you can use Prawn to merge pdfs. Gist: https://gist.github.com/4512859

class PdfMerger

  def merge(pdf_paths, destination)

    first_pdf_path = pdf_paths.delete_at(0)

    Prawn::Document.generate(destination, :template => first_pdf_path) do |pdf|

      pdf_paths.each do |pdf_path|
        pdf.go_to_page(pdf.page_count)

        template_page_count = count_pdf_pages(pdf_path)
        (1..template_page_count).each do |template_page_number|
          pdf.start_new_page(:template => pdf_path, :template_page => template_page_number)
        end
      end

    end

  end

  private

  def count_pdf_pages(pdf_file_path)
    pdf = Prawn::Document.new(:template => pdf_file_path)
    pdf.page_count
  end

end
于 2013-01-11T18:59:13.313 に答える
11

Ghostscript を使用して PDF を結合します。

 options = "-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite"
 system "gs #{options} -sOutputFile=result.pdf file1.pdf file2.pdf"
于 2012-01-19T15:22:00.833 に答える
5

これを行うために ruby​​ gem を作成しました — PDF::Merger。iTextを使用しています。使用方法は次のとおりです。

pdf = PDF::Merger.new
pdf.add_file "foo.pdf"
pdf.add_file "bar.pdf"
pdf.save_as "combined.pdf"
于 2010-10-20T17:31:40.923 に答える
2

Rubyで素晴らしいオプションを見たことがありません。

system "pdftk #{file_1} multistamp #{file_2} output #{file_combined}"
于 2014-01-11T17:02:21.800 に答える
0

2008 年よりは近づいていますが、まだ完全ではありません。

Prawn の最新の開発バージョンでは、既存の PDF をテンプレートとして使用できますが、ページを追加するときにテンプレートを何度も使用する必要はありません。

于 2010-08-17T08:28:14.057 に答える
0

iText を介して、これは機能しますが、フィールド名の競合を避けるために、フォームをマージする前にフォームを平坦化する必要があります。それか、一度に 1 ページずつフィールドの名前を変更します。

PDF 内では、同じ名前のフィールドは値を共有します。これは通常、望ましい動作ではありませんが、便利な場合もあります。

(Javaで)の行に沿ったもの:

PdfCopy mergedPDF = new PdfCopy( new Document(), new FileOutputStream( outPath );

for (String path : paths ) {
  PdfReader reader = new PdfReader( path );
  ByteArrayOutputStream curFormOut = new ByteArrayOutputStream();
  PdfStamper stamper = new PdfStamper( reader, curFormOut );

  stamper.setField( name, value ); // ad nauseum

  stamper.setFlattening(true); // flattening setting only takes effect during close()
  stamper.close();

  byte curFormBytes = curFormOut.toByteArray();
  PdfReader combineMe = new PdfReader( curFormBytes );

  int pages = combineMe .getNumberOfPages();
  for (int i = 1; i <= pages; ++i) { // "1" is the first page
    mergedForms.addPage( mergedForms.getImportedPage( combineMe, i );
  }
}

mergedForms.close();
于 2010-10-18T22:57:18.117 に答える
0

任意のテンプレート (macOS Pages または Google Docs によって作成された) を追加したい場合は、combine_pdf ジェムを使用して、これを試すことができます。

final_pdf = CombinePDF.new
company_template = CombinePDF.load(template_file.pdf).pages[0]
pdf = CombinePDF.load (content_file.pdf)
pdf.pages.each {|page| final_pdf << (company_template << page)} 
final_pdf.save "final_document.pdf"
于 2018-09-11T11:51:40.653 に答える