【问题标题】:How can I amend individual page sizes within a pdf using ruby?如何使用 ruby​​ 修改 pdf 中的单个页面大小?
【发布时间】:2020-01-27 02:21:12
【问题描述】:

我们将 PDF 直接发送到标签打印机进行打印。打印机有一个切刀,可以根据页面大小将连续的标签条切割成适当的长度。为了节省标签纸,我们希望减少每页的长度以去除任何空白,这因每页而异。我可以计算出要修改页面长度的点,但不知道该怎么做。

我正在使用 Ruby on Rails。我不介意我使用什么库,但我已经在使用 imagemagick 和 rghost,所以其中任何一个都很好。

【问题讨论】:

  • 你试过什么?您能否更具体地说明要删除的内容——所有空白或仅在底部?我不知道 Ruby 或 RMagick,但如果你想使用命令行删除图像中所有周围的空白,convert input -fuzz XX% -trim +repage output 会做到这一点。如果您只是想删除图像底部的一些空间,那么convert input -gravity south -chop 0x100 ouput 将切掉底部的 100 个像素。见imagemagick.org/Usage/crop
  • 这正是我为确定新页面尺寸应该做的事情。我有一份副本,每页一张图片,只是为了计算尺寸。我想做的是将这些新维度应用于原始 pdf 页面。
  • 我添加了一个赏金,所以我会清楚我正在寻找什么作为合适的答案。假设通过某个库加载 pdf。循环浏览每个页面并为每个页面应用(可能)不同的自定义维度。我只需要修改长度,但我想这并不特别重要。输出/保存修改后的pdf的东西。

标签: ruby-on-rails ruby pdf


【解决方案1】:

您可以使用combine_pdf gem 来做到这一点。

安装 gem 后,您可以在 rails 控制台中尝试我的示例代码。

以下示例为偶数页和奇数页设置不同的页面尺寸。你显然可以把你的逻辑放在那里。

让我们根据你的系统目录设置这两个变量的路径:

pdf_path = "/Users/apple/Desktop/a.pdf"
new_pdf_path = "/Users/apple/Desktop/b.pdf"

您可以按以下格式提供所需的尺寸: cropped_size = [X_min, Y_min, X_max, Y_max]

我使用了两个不同的维度数组,但您也可以在 page.crop 中使用任何动态参数

cropped_size_1 = [0, 0, 400, 400]
cropped_size_2 = [300, 300, 800, 800]

updated_pdf = CombinePDF.new(pdf_path)
updated_pdf.pages.each_with_index do |page, index|
  if index % 2 == 0
    page.crop(cropped_size_1)
  else
    page.crop(cropped_size_2)
  end
end
updated_pdf.save(new_pdf_path)

P.S:上述解决方案实际上是在掩护下进行裁剪!

【讨论】:

    【解决方案2】:

    假设每个页面都有一个图像,我尝试调整页面大小。希望我理解正确。

    我用HexaPDF

    作为 ruby​​ 项目运行:

    1. mkdir foo
    2. cd foo
    3. 捆绑初始化
    4. gem 'hexapdf' 添加到 Gemfile
    5. 捆绑
    6. 创建amend.rb文件

      # amend.rb
      require 'hexapdf'
      
      pdf = HexaPDF::Document.open(ARGV[0])
      # page_dimensions = { page_index => { w: content_width (image), h: content_height (image) } }
      page_dimensions = { 0 => { w: 323, h: 115 }, 1 => { w: 504, h: 709 }, 2 => { w: 432, h: 443 } }
      padding = 70 # You can change it if you want
      pdf.pages.each do |page|
        media_box = page.box.value.dup
        # With media_box, you can set the page dimensions.
        # [left, bottom, right, top]
        # Bottom left values: [0, 0, 0, 0]
        # A4 page dimensions: [0, 0, 595, 842]
        media_box[1] = media_box[3] - page_dimensions[page.index][:h] - 2 * padding
        media_box[2] = page_dimensions[page.index][:w] + 2 * padding
        page[:MediaBox] = media_box
      end
      pdf.write(ARGV[1])
      
    7. 将您的 PDF 文件添加到 foo 目录。我们就叫它X.pdf
    8. 运行程序

      ruby amend.rb X.pdf X_new.pdf
      
    9. 查看X_new.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多