代码之家  ›  专栏  ›  技术社区  ›  Paul Schreiber Jon Lin

如何在ruby中组合PDF?

  •  16
  • Paul Schreiber Jon Lin  · 技术社区  · 14 年前

    这是 asked in 2008 . 希望现在有更好的答案。

    如何在ruby中组合pdf?

    我用的是 pdf-stamper gem 以PDF格式填写表格。我想要一个 n PDF,在每个PDF中填写表格,并将结果保存为 -页面文档。

    你能用像对虾这样的本地图书馆来做这个吗?你能用rjb和iText做这个吗?pdf stamper是iText上的包装器。

    如果可能的话,我希望避免使用两个库(即pdftk和iText)。

    8 回复  |  直到 7 年前
        1
  •  20
  •   Evan Closson    12 年前

    从2013年起,您可以使用对虾合并PDF。主旨: 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
    
        2
  •  17
  •   Myst    10 年前

    在对纯Ruby解决方案进行了长时间的搜索之后,我最终从头开始编写代码来解析和合并PDF文件。

    (我觉得现在的工具太乱了——我想要点什么 本地的 但他们似乎都有不同的问题和依赖性。。。即使是明虾也放弃了他们曾经拥有的模板支持)

    我贴了宝石 online GitHub 也。

    您可以通过以下方式安装:

    gem install combine_pdf
    

    例如,这里有一个“一行”:

    (CombinePDF.load("file1.pdf") << CombinePDF.load("file2.pdf") << CombinePDF.load("file3.pdf")).save("out.pdf")
    

    如果你发现任何问题,请让我知道,我会努力解决。

        3
  •  11
  •   0x4a6f4672 pat    13 年前

    使用ghostscript组合PDF:

     options = "-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite"
     system "gs #{options} -sOutputFile=result.pdf file1.pdf file2.pdf"
    
        4
  •  5
  •   Paul Schreiber Jon Lin    14 年前

    我写了一个红宝石来做这个 PDF::Merger . 它使用iText。以下是使用方法:

    pdf = PDF::Merger.new
    pdf.add_file "foo.pdf"
    pdf.add_file "bar.pdf"
    pdf.save_as "combined.pdf"
    
        5
  •  2
  •   Yarin    11 年前

    在Ruby中还没有很好的选择-我得到了最好的结果 pdftk

    system "pdftk #{file_1} multistamp #{file_2} output #{file_combined}"
    
        6
  •  0
  •   James Healy    14 年前

    我们比2008年更接近了,但还没有完全达到。

    Prawn的最新开发版本允许您使用现有的PDF作为模板,但不能在添加更多页面时反复使用模板。

        7
  •  0
  •   Mark Storer    14 年前

    通过iText,这将起作用。。。不过,在合并表单之前,应该将表单展平,以避免字段名冲突。或者一次重命名一页字段。

    在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();
    
        8
  •  0
  •   Tottish    6 年前

    合并pdf gem 然后你可以试试这个:

    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"