Class: HexaPDF::Layout::Style::LinkLayer
- Inherits:
-
Object
- Object
- HexaPDF::Layout::Style::LinkLayer
- Defined in:
- lib/hexapdf/layout/style.rb
Overview
The LinkLayer class provides support for linking to in-document or remote destinations for Style objects using link annotations. Typical use cases would be linking to a (named) destination on a different page or executing a URI action.
See: PDF2.0 s12.5.6.5, Layers, HexaPDF::Type::Annotations::Link
Instance Method Summary collapse
-
#call(canvas, box) ⇒ Object
Creates the needed link annotation if possible, i.e.
-
#initialize(dest: nil, uri: nil, file: nil, action: nil, border: false, border_color: nil) ⇒ LinkLayer
constructor
Creates a new LinkLayer object.
Constructor Details
#initialize(dest: nil, uri: nil, file: nil, action: nil, border: false, border_color: nil) ⇒ LinkLayer
Creates a new LinkLayer object.
The following arguments are allowed (note that only one of dest, uri, file or
action may be specified):
destThe destination array or a name of a named destination for in-document links. If neither
dest,uri,filenoractionis specified, it is assumed that the box has a custom property named 'link' which is used for the destination.uriThe URI to link to.
fileThe file that should be opened or, if it refers to an application, the application that should be launched. Can either be a string or a Filespec object. Also see: HexaPDF::Type::FileSpecification.
actionThe PDF action that should be executed.
borderIf set to
true, a standard border is used. Also accepts an array that adheres to the rules for annotation borders.border_colorDefines the border color. Can be an array with 0 (transparent), 1 (grayscale), 3 (RGB) or 4 (CMYK) values.
Examples:
LinkLayer.new(dest: [page, :XYZ, nil, nil, nil], border: true)
LinkLayer.new(uri: "https://my.example.com/path", border: [5 5 2])
LinkLayer.new # use 'link' custom box property for dest
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 |
# File 'lib/hexapdf/layout/style.rb', line 498 def initialize(dest: nil, uri: nil, file: nil, action: nil, border: false, border_color: nil) if dest && (uri || file || action) || uri && (file || action) || file && action raise ArgumentError, "Only one of dest, uri, file or action is allowed" end @dest = dest @action = if uri {S: :URI, URI: uri} elsif file {S: :Launch, F: file, NewWindow: true} elsif action action end @border = case border when false then [0, 0, 0] when true then nil when Array then border else raise ArgumentError, "Invalid value for border: #{border}" end @border_color = border_color end |
Instance Method Details
#call(canvas, box) ⇒ Object
Creates the needed link annotation if possible, i.e. if the context of the canvas is a page.
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 |
# File 'lib/hexapdf/layout/style.rb', line 521 def call(canvas, box) return unless canvas.context.type == :Page @dest = box.properties['link'] unless @dest || @action page = canvas.context matrix = canvas.graphics_state.ctm quad_points = [*matrix.evaluate(0, 0), *matrix.evaluate(box.width, 0), *matrix.evaluate(box.width, box.height), *matrix.evaluate(0, box.height)] x_minmax = quad_points.values_at(0, 2, 4, 6).minmax y_minmax = quad_points.values_at(1, 3, 5, 7).minmax border_color = case @border_color when [], nil @border_color else canvas.color_from_specification(@border_color).components end annot = { Subtype: :Link, Rect: [x_minmax[0], y_minmax[0], x_minmax[1], y_minmax[1]], QuadPoints: quad_points, Dest: @dest, A: @action, Border: @border, C: border_color, } (page[:Annots] ||= []) << page.document.add(annot) end |