pdfrb 0.3.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +51 -0
- data/Gemfile +1 -0
- data/PROPOSAL.canvas-clip.md +92 -0
- data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
- data/PROPOSAL.canvas-rich-text.md +103 -0
- data/PROPOSAL.canvas-text-lines.md +77 -0
- data/PROPOSAL.canvas-transparency.md +106 -0
- data/PROPOSAL.external-font-metrics.md +129 -0
- data/PROPOSAL.font-embedding-fontfile2.md +88 -0
- data/PROPOSAL.font-resolver-ttc.md +105 -0
- data/PROPOSAL.font-resolver.md +96 -0
- data/PROPOSAL.font-subsetting.md +98 -0
- data/PROPOSAL.gradient-shadings.md +110 -0
- data/PROPOSAL.page-mediabox-setter.md +66 -0
- data/PROPOSAL.per-glyph-width.md +91 -0
- data/PROPOSAL.stringio-require.md +53 -0
- data/PROPOSAL.struct-tree-root.md +102 -0
- data/PROPOSAL.text-measurement.md +93 -0
- data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
- data/RELEASE.md +61 -0
- data/data/pdfrb/afm/Courier-Bold.afm +342 -342
- data/data/pdfrb/afm/Courier-BoldOblique.afm +342 -342
- data/data/pdfrb/afm/Courier-Oblique.afm +342 -342
- data/data/pdfrb/afm/Courier.afm +342 -342
- data/data/pdfrb/afm/Helvetica-Bold.afm +2827 -2827
- data/data/pdfrb/afm/Helvetica-BoldOblique.afm +2827 -2827
- data/data/pdfrb/afm/Helvetica-Oblique.afm +3051 -3051
- data/data/pdfrb/afm/Helvetica.afm +3051 -3051
- data/data/pdfrb/afm/Symbol.afm +213 -213
- data/data/pdfrb/afm/Times-Bold.afm +2588 -2588
- data/data/pdfrb/afm/Times-BoldItalic.afm +2384 -2384
- data/data/pdfrb/afm/Times-Italic.afm +2667 -2667
- data/data/pdfrb/afm/Times-Roman.afm +2419 -2419
- data/data/pdfrb/afm/ZapfDingbats.afm +225 -225
- data/lib/pdfrb/action/base.rb +21 -0
- data/lib/pdfrb/action/types.rb +178 -0
- data/lib/pdfrb/action.rb +55 -0
- data/lib/pdfrb/annotation/base.rb +79 -0
- data/lib/pdfrb/annotation/types.rb +222 -0
- data/lib/pdfrb/annotation.rb +78 -0
- data/lib/pdfrb/appearance/generator.rb +216 -0
- data/lib/pdfrb/appearance.rb +11 -0
- data/lib/pdfrb/arlington/object_definition.rb +2 -2
- data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
- data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
- data/lib/pdfrb/arlington/predicate.rb +1 -5
- data/lib/pdfrb/cli/batch.rb +18 -0
- data/lib/pdfrb/cli/debug_info.rb +18 -0
- data/lib/pdfrb/cli/files.rb +16 -0
- data/lib/pdfrb/cli/fonts.rb +16 -0
- data/lib/pdfrb/cli/form.rb +18 -0
- data/lib/pdfrb/cli/image2pdf.rb +18 -0
- data/lib/pdfrb/cli/images.rb +34 -0
- data/lib/pdfrb/cli/info.rb +20 -0
- data/lib/pdfrb/cli/inspect.rb +18 -0
- data/lib/pdfrb/cli/merge.rb +18 -0
- data/lib/pdfrb/cli/modify.rb +18 -0
- data/lib/pdfrb/cli/optimize.rb +18 -0
- data/lib/pdfrb/cli/split.rb +21 -0
- data/lib/pdfrb/cli/watermark.rb +18 -0
- data/lib/pdfrb/cli.rb +291 -7
- data/lib/pdfrb/color/color_space.rb +259 -0
- data/lib/pdfrb/color/icc_profile.rb +90 -0
- data/lib/pdfrb/color.rb +12 -0
- data/lib/pdfrb/compare/comparator.rb +244 -0
- data/lib/pdfrb/compare/report.rb +78 -0
- data/lib/pdfrb/compare.rb +42 -0
- data/lib/pdfrb/composer.rb +161 -0
- data/lib/pdfrb/conformance/pdf_a.rb +317 -56
- data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
- data/lib/pdfrb/conformance/pdf_x.rb +247 -0
- data/lib/pdfrb/conformance/rule.rb +78 -0
- data/lib/pdfrb/conformance/structure_elements.rb +174 -0
- data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
- data/lib/pdfrb/conformance.rb +7 -3
- data/lib/pdfrb/content/canvas.rb +354 -72
- data/lib/pdfrb/content/color_space.rb +157 -0
- data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
- data/lib/pdfrb/content/operator.rb +21 -1
- data/lib/pdfrb/content/operators/clipping.rb +36 -0
- data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
- data/lib/pdfrb/content/operators/inline_image.rb +53 -0
- data/lib/pdfrb/content/operators.rb +22 -0
- data/lib/pdfrb/content/shading/base.rb +139 -0
- data/lib/pdfrb/content/shading.rb +17 -0
- data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
- data/lib/pdfrb/content/tiling_pattern.rb +78 -0
- data/lib/pdfrb/content/transformation_matrix.rb +61 -0
- data/lib/pdfrb/content.rb +7 -26
- data/lib/pdfrb/destination/fit.rb +185 -0
- data/lib/pdfrb/destination.rb +13 -0
- data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
- data/lib/pdfrb/digital_signature/signing.rb +107 -11
- data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
- data/lib/pdfrb/digital_signature/verification.rb +88 -9
- data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
- data/lib/pdfrb/digital_signature.rb +26 -2
- data/lib/pdfrb/document/annotations.rb +120 -3
- data/lib/pdfrb/document/associated_files.rb +104 -0
- data/lib/pdfrb/document/colors.rb +95 -0
- data/lib/pdfrb/document/destinations.rb +127 -5
- data/lib/pdfrb/document/display.rb +84 -0
- data/lib/pdfrb/document/fonts.rb +417 -45
- data/lib/pdfrb/document/form.rb +338 -0
- data/lib/pdfrb/document/graphics_state.rb +91 -0
- data/lib/pdfrb/document/images.rb +4 -4
- data/lib/pdfrb/document/info.rb +102 -0
- data/lib/pdfrb/document/layers.rb +62 -0
- data/lib/pdfrb/document/metadata.rb +12 -5
- data/lib/pdfrb/document/output_intents.rb +91 -0
- data/lib/pdfrb/document/page_labels.rb +80 -0
- data/lib/pdfrb/document/pages.rb +68 -19
- data/lib/pdfrb/document/portfolio.rb +119 -0
- data/lib/pdfrb/document/shadings.rb +159 -0
- data/lib/pdfrb/document/stamps.rb +68 -0
- data/lib/pdfrb/document/structure.rb +242 -0
- data/lib/pdfrb/document.rb +73 -4
- data/lib/pdfrb/encryption/identity.rb +13 -0
- data/lib/pdfrb/encryption/password_verification.rb +53 -8
- data/lib/pdfrb/encryption/security_handler.rb +8 -5
- data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
- data/lib/pdfrb/encryption.rb +17 -0
- data/lib/pdfrb/error.rb +2 -2
- data/lib/pdfrb/filter/brotli_decode.rb +32 -0
- data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
- data/lib/pdfrb/filter/crypt.rb +2 -2
- data/lib/pdfrb/filter/dct_decode.rb +18 -0
- data/lib/pdfrb/filter/flate_decode.rb +4 -18
- data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
- data/lib/pdfrb/filter/jpx_decode.rb +18 -0
- data/lib/pdfrb/filter/lzw_decode.rb +3 -2
- data/lib/pdfrb/filter/png_predictor.rb +94 -0
- data/lib/pdfrb/filter.rb +26 -13
- data/lib/pdfrb/font/afm_parser.rb +50 -26
- data/lib/pdfrb/font/cmap/writer.rb +9 -0
- data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
- data/lib/pdfrb/font/encoding.rb +32 -3
- data/lib/pdfrb/font/metrics_helper.rb +121 -0
- data/lib/pdfrb/font/true_type/file.rb +10 -1
- data/lib/pdfrb/font/true_type/glyf.rb +82 -0
- data/lib/pdfrb/font/true_type/kern.rb +58 -0
- data/lib/pdfrb/font/true_type/loca.rb +42 -0
- data/lib/pdfrb/font/true_type/maxp.rb +44 -0
- data/lib/pdfrb/font/true_type/name.rb +53 -0
- data/lib/pdfrb/font/true_type/post.rb +93 -0
- data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
- data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
- data/lib/pdfrb/font/true_type.rb +7 -0
- data/lib/pdfrb/font.rb +2 -0
- data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
- data/lib/pdfrb/font_loader/from_file.rb +20 -0
- data/lib/pdfrb/font_loader/standard14.rb +20 -0
- data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
- data/lib/pdfrb/font_loader.rb +4 -0
- data/lib/pdfrb/font_resolver.rb +138 -0
- data/lib/pdfrb/image/audit.rb +94 -0
- data/lib/pdfrb/image/downsampler.rb +124 -0
- data/lib/pdfrb/image.rb +13 -0
- data/lib/pdfrb/image_loader/jpeg.rb +39 -58
- data/lib/pdfrb/image_loader/png.rb +82 -251
- data/lib/pdfrb/layout/bidi.rb +198 -0
- data/lib/pdfrb/layout/box.rb +49 -0
- data/lib/pdfrb/layout/box_fitter.rb +54 -0
- data/lib/pdfrb/layout/column_box.rb +71 -0
- data/lib/pdfrb/layout/container_box.rb +45 -0
- data/lib/pdfrb/layout/frame.rb +67 -0
- data/lib/pdfrb/layout/image_box.rb +44 -0
- data/lib/pdfrb/layout/inline_box.rb +25 -0
- data/lib/pdfrb/layout/line.rb +55 -0
- data/lib/pdfrb/layout/list_box.rb +87 -0
- data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
- data/lib/pdfrb/layout/page_style.rb +65 -0
- data/lib/pdfrb/layout/style.rb +62 -0
- data/lib/pdfrb/layout/table_box.rb +66 -0
- data/lib/pdfrb/layout/text_box.rb +38 -0
- data/lib/pdfrb/layout/text_fragment.rb +45 -0
- data/lib/pdfrb/layout/text_layouter.rb +123 -0
- data/lib/pdfrb/layout.rb +28 -0
- data/lib/pdfrb/linearization/hint_stream.rb +93 -0
- data/lib/pdfrb/linearization/writer.rb +259 -0
- data/lib/pdfrb/linearization.rb +21 -0
- data/lib/pdfrb/model/cos/dictionary.rb +12 -0
- data/lib/pdfrb/model/pdf_array.rb +2 -2
- data/lib/pdfrb/model/type/action.rb +42 -0
- data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
- data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
- data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
- data/lib/pdfrb/model/type/action_goto.rb +34 -0
- data/lib/pdfrb/model/type/action_hide.rb +26 -0
- data/lib/pdfrb/model/type/action_import_data.rb +18 -0
- data/lib/pdfrb/model/type/action_java_script.rb +18 -0
- data/lib/pdfrb/model/type/action_launch.rb +22 -0
- data/lib/pdfrb/model/type/action_movie.rb +22 -0
- data/lib/pdfrb/model/type/action_named.rb +23 -0
- data/lib/pdfrb/model/type/action_nop.rb +12 -0
- data/lib/pdfrb/model/type/action_rendition.rb +28 -0
- data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
- data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
- data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
- data/lib/pdfrb/model/type/action_set_state.rb +14 -0
- data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
- data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
- data/lib/pdfrb/model/type/action_thread.rb +23 -0
- data/lib/pdfrb/model/type/action_trans.rb +30 -0
- data/lib/pdfrb/model/type/action_uri.rb +30 -0
- data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
- data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
- data/lib/pdfrb/model/type/annotation.rb +49 -10
- data/lib/pdfrb/model/type/appearance.rb +41 -0
- data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
- data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
- data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
- data/lib/pdfrb/model/type/border_effect.rb +25 -0
- data/lib/pdfrb/model/type/border_styling.rb +38 -0
- data/lib/pdfrb/model/type/box_color_info.rb +21 -0
- data/lib/pdfrb/model/type/box_style.rb +19 -0
- data/lib/pdfrb/model/type/button.rb +17 -0
- data/lib/pdfrb/model/type/cal_gray.rb +17 -0
- data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
- data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
- data/lib/pdfrb/model/type/catalog.rb +99 -16
- data/lib/pdfrb/model/type/choice.rb +21 -0
- data/lib/pdfrb/model/type/cid_font.rb +52 -1
- data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
- data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
- data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
- data/lib/pdfrb/model/type/collection.rb +27 -0
- data/lib/pdfrb/model/type/collection_field.rb +24 -0
- data/lib/pdfrb/model/type/collection_item.rb +19 -0
- data/lib/pdfrb/model/type/collection_schema.rb +25 -0
- data/lib/pdfrb/model/type/collection_sort.rb +13 -0
- data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
- data/lib/pdfrb/model/type/device_n.rb +37 -0
- data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
- data/lib/pdfrb/model/type/device_n_process.rb +13 -0
- data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
- data/lib/pdfrb/model/type/document_security_store.rb +55 -0
- data/lib/pdfrb/model/type/embedded_file.rb +19 -0
- data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
- data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
- data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
- data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
- data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
- data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
- data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
- data/lib/pdfrb/model/type/file_specification.rb +43 -0
- data/lib/pdfrb/model/type/file_trailer.rb +54 -0
- data/lib/pdfrb/model/type/font.rb +73 -2
- data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
- data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
- data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
- data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
- data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
- data/lib/pdfrb/model/type/font_encoding.rb +47 -0
- data/lib/pdfrb/model/type/font_file.rb +28 -0
- data/lib/pdfrb/model/type/font_file2.rb +32 -0
- data/lib/pdfrb/model/type/font_file3.rb +23 -0
- data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
- data/lib/pdfrb/model/type/font_true_type.rb +1 -1
- data/lib/pdfrb/model/type/font_type0.rb +1 -1
- data/lib/pdfrb/model/type/font_type1.rb +1 -1
- data/lib/pdfrb/model/type/font_type3.rb +1 -1
- data/lib/pdfrb/model/type/form_field.rb +73 -0
- data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
- data/lib/pdfrb/model/type/function.rb +42 -0
- data/lib/pdfrb/model/type/function_exponential.rb +31 -0
- data/lib/pdfrb/model/type/function_postscript.rb +25 -0
- data/lib/pdfrb/model/type/function_sampled.rb +55 -0
- data/lib/pdfrb/model/type/function_stitching.rb +33 -0
- data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
- data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
- data/lib/pdfrb/model/type/halftone.rb +21 -0
- data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
- data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
- data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
- data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
- data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
- data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
- data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
- data/lib/pdfrb/model/type/icon_fit.rb +31 -0
- data/lib/pdfrb/model/type/indexed.rb +32 -0
- data/lib/pdfrb/model/type/info.rb +44 -0
- data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
- data/lib/pdfrb/model/type/interactive_form.rb +36 -0
- data/lib/pdfrb/model/type/interior_color.rb +12 -0
- data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
- data/lib/pdfrb/model/type/lab.rb +27 -0
- data/lib/pdfrb/model/type/line_annotation.rb +44 -0
- data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
- data/lib/pdfrb/model/type/link_annotation.rb +41 -0
- data/lib/pdfrb/model/type/link_appearance.rb +9 -0
- data/lib/pdfrb/model/type/mark_information.rb +23 -0
- data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
- data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
- data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
- data/lib/pdfrb/model/type/measure.rb +39 -0
- data/lib/pdfrb/model/type/media_clip.rb +28 -0
- data/lib/pdfrb/model/type/media_offset.rb +106 -0
- data/lib/pdfrb/model/type/metadata.rb +27 -3
- data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
- data/lib/pdfrb/model/type/movie.rb +28 -0
- data/lib/pdfrb/model/type/names.rb +51 -0
- data/lib/pdfrb/model/type/namespace.rb +27 -0
- data/lib/pdfrb/model/type/object_reference.rb +31 -0
- data/lib/pdfrb/model/type/object_stream.rb +38 -0
- data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
- data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
- data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
- data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
- data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
- data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
- data/lib/pdfrb/model/type/outline.rb +40 -6
- data/lib/pdfrb/model/type/outline_item.rb +45 -0
- data/lib/pdfrb/model/type/output_intent.rb +30 -0
- data/lib/pdfrb/model/type/page.rb +127 -0
- data/lib/pdfrb/model/type/page_label.rb +68 -0
- data/lib/pdfrb/model/type/page_piece_info.rb +58 -0
- data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
- data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
- data/lib/pdfrb/model/type/pattern.rb +16 -0
- data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
- data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
- data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
- data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
- data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
- data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
- data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
- data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
- data/lib/pdfrb/model/type/rendition.rb +31 -0
- data/lib/pdfrb/model/type/resources.rb +59 -14
- data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
- data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
- data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
- data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
- data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
- data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
- data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
- data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
- data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
- data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
- data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
- data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
- data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
- data/lib/pdfrb/model/type/separation.rb +25 -0
- data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
- data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
- data/lib/pdfrb/model/type/signature.rb +65 -0
- data/lib/pdfrb/model/type/signature_build.rb +86 -0
- data/lib/pdfrb/model/type/signature_field.rb +17 -0
- data/lib/pdfrb/model/type/software_identifier.rb +19 -0
- data/lib/pdfrb/model/type/sound.rb +38 -0
- data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
- data/lib/pdfrb/model/type/square_annotation.rb +24 -0
- data/lib/pdfrb/model/type/square_circle.rb +13 -0
- data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
- data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
- data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
- data/lib/pdfrb/model/type/struct_elem.rb +75 -0
- data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
- data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
- data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
- data/lib/pdfrb/model/type/text_annotation.rb +25 -0
- data/lib/pdfrb/model/type/text_appearance.rb +9 -0
- data/lib/pdfrb/model/type/text_field.rb +21 -0
- data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
- data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
- data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
- data/lib/pdfrb/model/type/three_d_background.rb +28 -0
- data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
- data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
- data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
- data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
- data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
- data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
- data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
- data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
- data/lib/pdfrb/model/type/three_d_node.rb +37 -0
- data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
- data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
- data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
- data/lib/pdfrb/model/type/three_d_units.rb +18 -0
- data/lib/pdfrb/model/type/three_d_view.rb +40 -0
- data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
- data/lib/pdfrb/model/type/transition.rb +68 -0
- data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
- data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
- data/lib/pdfrb/model/type/uri_dict.rb +18 -0
- data/lib/pdfrb/model/type/url_alias.rb +19 -0
- data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
- data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
- data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
- data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
- data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
- data/lib/pdfrb/model/type/xobject_form.rb +41 -0
- data/lib/pdfrb/model/type/xobject_image.rb +56 -0
- data/lib/pdfrb/model/type/xref_stream.rb +37 -0
- data/lib/pdfrb/model/type.rb +289 -6
- data/lib/pdfrb/serializer.rb +2 -2
- data/lib/pdfrb/source/tokenizer.rb +0 -2
- data/lib/pdfrb/task/benchmark.rb +83 -0
- data/lib/pdfrb/task/extract_text.rb +1 -1
- data/lib/pdfrb/task/generate_corpus.rb +130 -0
- data/lib/pdfrb/task/memory_profile.rb +84 -0
- data/lib/pdfrb/task/optimize.rb +97 -7
- data/lib/pdfrb/task/regenerate_appearances.rb +98 -0
- data/lib/pdfrb/task.rb +4 -3
- data/lib/pdfrb/test_utils.rb +112 -0
- data/lib/pdfrb/validator.rb +82 -0
- data/lib/pdfrb/version.rb +1 -1
- data/lib/pdfrb/writer.rb +117 -27
- data/lib/pdfrb/xmp/packet.rb +122 -0
- data/lib/pdfrb/xmp/schemas.rb +96 -0
- data/lib/pdfrb/xmp.rb +44 -0
- data/lib/pdfrb/xref_section.rb +2 -2
- data/lib/pdfrb.rb +24 -54
- data/pdfrb.gemspec +45 -0
- data/script/apply_fixes.sh +843 -0
- data/script/make_jpeg_fixture.rb +53 -0
- data/script/make_png_fixture.rb +25 -0
- metadata +319 -4
|
@@ -3,9 +3,24 @@
|
|
|
3
3
|
module Pdfrb
|
|
4
4
|
module Model
|
|
5
5
|
module Type
|
|
6
|
-
#
|
|
6
|
+
# Optional Content Properties (s8.11.1). Catalog /OCProperties.
|
|
7
7
|
class OptionalContentProperties < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "OptContentProperties"
|
|
9
|
+
|
|
10
|
+
def ocgs; self[:OCGs]; end
|
|
11
|
+
def default_config; self[:D]; end
|
|
12
|
+
def configs; self[:Configs]; end
|
|
13
|
+
def list_mode; self[:ListMode]; end
|
|
14
|
+
|
|
15
|
+
def has_configs?
|
|
16
|
+
!!configs
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def base_state
|
|
20
|
+
return :ON_UNLESS_OFF unless default_config
|
|
21
|
+
|
|
22
|
+
default_config[:BaseState]&.to_sym || :ON_UNLESS_OFF
|
|
23
|
+
end
|
|
9
24
|
end
|
|
10
25
|
end
|
|
11
26
|
end
|
|
@@ -7,13 +7,47 @@ module Pdfrb
|
|
|
7
7
|
class Outline < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "Outline"
|
|
9
9
|
register_type :Outlines
|
|
10
|
-
end
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def first; self[:First]; end
|
|
13
|
+
def last; self[:Last]; end
|
|
14
|
+
def count; self[:Count]; end
|
|
15
|
+
|
|
16
|
+
def empty?
|
|
17
|
+
!first
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def has_items?
|
|
21
|
+
!!first
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def resolved_first
|
|
25
|
+
ref = first
|
|
26
|
+
return nil unless ref && document
|
|
27
|
+
|
|
28
|
+
document.object(ref)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def resolved_last
|
|
32
|
+
ref = last
|
|
33
|
+
return nil unless ref && document
|
|
34
|
+
|
|
35
|
+
document.object(ref)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def each_item(&block)
|
|
39
|
+
return enum_for(:each_item) unless block
|
|
40
|
+
return unless first && document
|
|
41
|
+
|
|
42
|
+
cur_ref = first
|
|
43
|
+
while cur_ref
|
|
44
|
+
item = document.object(cur_ref)
|
|
45
|
+
break unless item
|
|
46
|
+
|
|
47
|
+
yield item
|
|
48
|
+
cur_ref = item[:Next]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
17
51
|
end
|
|
18
52
|
end
|
|
19
53
|
end
|
|
@@ -7,6 +7,51 @@ module Pdfrb
|
|
|
7
7
|
# path matches the TSV-derived class name.
|
|
8
8
|
class OutlineItem < Pdfrb::Model::Cos::Dictionary
|
|
9
9
|
arlington_object "OutlineItem"
|
|
10
|
+
|
|
11
|
+
def title; self[:Title]; end
|
|
12
|
+
def parent; self[:Parent]; end
|
|
13
|
+
def prev; self[:Prev]; end
|
|
14
|
+
def next; self[:Next]; end
|
|
15
|
+
def first; self[:First]; end
|
|
16
|
+
def last; self[:Last]; end
|
|
17
|
+
def count; self[:Count]; end
|
|
18
|
+
def dest; self[:Dest]; end
|
|
19
|
+
def action; self[:A]; end
|
|
20
|
+
def se; self[:SE]; end
|
|
21
|
+
def c; self[:C]; end
|
|
22
|
+
def f; self[:F]; end
|
|
23
|
+
|
|
24
|
+
def color
|
|
25
|
+
c if c && (!c.is_a?(Array) || !c.empty?)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def bold?
|
|
29
|
+
f&.anybits?(1)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def italic?
|
|
33
|
+
f&.anybits?(2)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def has_children?
|
|
37
|
+
!!(count && count.nonzero?)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def open?
|
|
41
|
+
return true unless count
|
|
42
|
+
|
|
43
|
+
count.positive?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def child_count
|
|
47
|
+
return 0 unless count
|
|
48
|
+
|
|
49
|
+
count.abs
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def destination
|
|
53
|
+
dest || (action && action[:D])
|
|
54
|
+
end
|
|
10
55
|
end
|
|
11
56
|
end
|
|
12
57
|
end
|
|
@@ -4,8 +4,38 @@ module Pdfrb
|
|
|
4
4
|
module Model
|
|
5
5
|
module Type
|
|
6
6
|
# Output intent (s14.11.5) — ICC profile + condition metadata.
|
|
7
|
+
# Required for PDF/X and PDF/A conformance.
|
|
7
8
|
class OutputIntent < Pdfrb::Model::Cos::Dictionary
|
|
8
9
|
arlington_object "OutputIntents"
|
|
10
|
+
register_type :OutputIntent
|
|
11
|
+
|
|
12
|
+
def type; self[:Type]; end
|
|
13
|
+
def output_intent_type; self[:S]; end
|
|
14
|
+
def output_condition; self[:OutputCondition]; end
|
|
15
|
+
def output_condition_identifier; self[:OutputConditionIdentifier]; end
|
|
16
|
+
def registry_name; self[:RegistryName]; end
|
|
17
|
+
def info; self[:Info]; end
|
|
18
|
+
def dest_output_profile; self[:DestOutputProfile]; end
|
|
19
|
+
def dest_output_profile_ref; self[:DestOutputProfileRef]; end
|
|
20
|
+
|
|
21
|
+
def pdfx?
|
|
22
|
+
output_intent_type&.to_sym == :GTS_PDFX
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def pdfa?
|
|
26
|
+
[:GTS_PDFA1, :GTS_PDFA2, :GTS_PDFA3].include?(output_intent_type&.to_sym)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def has_embedded_profile?
|
|
30
|
+
!!dest_output_profile
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def resolved_profile
|
|
34
|
+
ref = dest_output_profile
|
|
35
|
+
return nil unless ref && document
|
|
36
|
+
|
|
37
|
+
document.object(ref)
|
|
38
|
+
end
|
|
9
39
|
end
|
|
10
40
|
end
|
|
11
41
|
end
|
|
@@ -61,10 +61,137 @@ module Pdfrb
|
|
|
61
61
|
inheritable(:Resources)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
+
def media_box=(box)
|
|
65
|
+
value[:MediaBox] = box
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def bleed_box=(box)
|
|
69
|
+
value[:BleedBox] = box
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def trim_box=(box)
|
|
73
|
+
value[:TrimBox] = box
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def art_box=(box)
|
|
77
|
+
value[:ArtBox] = box
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def crop_box=(box)
|
|
81
|
+
value[:CropBox] = box
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def bleed_box
|
|
85
|
+
value[:BleedBox]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def trim_box
|
|
89
|
+
value[:TrimBox]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def art_box
|
|
93
|
+
value[:ArtBox]
|
|
94
|
+
end
|
|
95
|
+
|
|
64
96
|
def rotate
|
|
65
97
|
inheritable(:Rotate) || 0
|
|
66
98
|
end
|
|
67
99
|
|
|
100
|
+
def parent
|
|
101
|
+
ref = value[:Parent]
|
|
102
|
+
return nil unless ref && document
|
|
103
|
+
|
|
104
|
+
document.object(ref)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def annotations
|
|
108
|
+
self[:Annots]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def has_annotations?
|
|
112
|
+
!!annotations
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def user_unit
|
|
116
|
+
self[:UserUnit] || 1.0
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def duration
|
|
120
|
+
self[:Dur]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def transition
|
|
124
|
+
self[:Trans]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def thumbnail
|
|
128
|
+
self[:Thumb]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def tab_order
|
|
132
|
+
self[:Tabs]&.to_sym
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def structural_parent
|
|
136
|
+
self[:StructParents]
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def metadata
|
|
140
|
+
self[:Metadata]
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def associated_files
|
|
144
|
+
self[:AF]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def output_intents
|
|
148
|
+
self[:OutputIntents]
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def group
|
|
152
|
+
self[:Group]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def has_group?
|
|
156
|
+
!!group
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def rotated?
|
|
160
|
+
rotate != 0
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def landscape?
|
|
164
|
+
mb = media_box
|
|
165
|
+
return false unless mb.is_a?(Array) && mb.size >= 4
|
|
166
|
+
|
|
167
|
+
width = mb[2].to_f - mb[0].to_f
|
|
168
|
+
height = mb[3].to_f - mb[1].to_f
|
|
169
|
+
width > height
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def portrait?
|
|
173
|
+
mb = media_box
|
|
174
|
+
return false unless mb.is_a?(Array) && mb.size >= 4
|
|
175
|
+
|
|
176
|
+
width = mb[2].to_f - mb[0].to_f
|
|
177
|
+
height = mb[3].to_f - mb[1].to_f
|
|
178
|
+
height > width
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def each_annotation
|
|
182
|
+
return enum_for(:each_annotation) unless block_given?
|
|
183
|
+
return unless annotations && document
|
|
184
|
+
|
|
185
|
+
arr = annotations.is_a?(Pdfrb::Model::Reference) ?
|
|
186
|
+
document.object(annotations) : annotations
|
|
187
|
+
return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
188
|
+
|
|
189
|
+
arr.each do |entry|
|
|
190
|
+
obj = entry.is_a?(Pdfrb::Model::Reference) ? document.object(entry) : entry
|
|
191
|
+
yield obj if obj
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
68
195
|
private
|
|
69
196
|
|
|
70
197
|
def inheritable(key)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# PageLabel (s12.4.2). Catalog /PageLabels /Nums entry. Defines
|
|
7
|
+
# how page numbers are displayed in the viewer.
|
|
8
|
+
class PageLabel < Cos::Dictionary
|
|
9
|
+
register_type :PageLabel
|
|
10
|
+
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def style; self[:S]; end
|
|
13
|
+
def prefix; self[:P]; end
|
|
14
|
+
def start; self[:St] || 1; end
|
|
15
|
+
|
|
16
|
+
def decimal_style?; style&.to_sym == :D; end
|
|
17
|
+
def uppercase_roman_style?; style&.to_sym == :R; end
|
|
18
|
+
def lowercase_roman_style?; style&.to_sym == :r; end
|
|
19
|
+
def uppercase_letters_style?; style&.to_sym == :A; end
|
|
20
|
+
def lowercase_letters_style?; style&.to_sym == :a; end
|
|
21
|
+
|
|
22
|
+
def label_for(page_index)
|
|
23
|
+
return prefix.to_s unless style
|
|
24
|
+
|
|
25
|
+
number = start + page_index
|
|
26
|
+
case style.to_sym
|
|
27
|
+
when :D then "#{prefix}#{number}"
|
|
28
|
+
when :R then "#{prefix}#{to_roman(number).upcase}"
|
|
29
|
+
when :r then "#{prefix}#{to_roman(number).downcase}"
|
|
30
|
+
when :A then "#{prefix}#{to_letters(number).upcase}"
|
|
31
|
+
when :a then "#{prefix}#{to_letters(number).downcase}"
|
|
32
|
+
else prefix.to_s
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def to_roman(n)
|
|
39
|
+
return "0" if n <= 0
|
|
40
|
+
|
|
41
|
+
mappings = [
|
|
42
|
+
[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"],
|
|
43
|
+
[100, "C"], [90, "XC"], [50, "L"], [40, "XL"],
|
|
44
|
+
[10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]
|
|
45
|
+
]
|
|
46
|
+
result = +""
|
|
47
|
+
mappings.each do |value, symbol|
|
|
48
|
+
while n >= value
|
|
49
|
+
result << symbol
|
|
50
|
+
n -= value
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
result
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def to_letters(n)
|
|
57
|
+
result = +""
|
|
58
|
+
n -= 1
|
|
59
|
+
while n >= 0
|
|
60
|
+
result = (65 + (n % 26)).chr + result
|
|
61
|
+
n = (n / 26) - 1
|
|
62
|
+
end
|
|
63
|
+
result
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Page-piece dictionary (s14.5). Per-page metadata recording
|
|
7
|
+
# application-specific private data. The dictionary hangs off
|
|
8
|
+
# a page's /PieceInfo key and is keyed by application name;
|
|
9
|
+
# each value carries /LastModified, /Private, and (optionally)
|
|
10
|
+
# an /ASFStream reference for a stream-encoded private payload.
|
|
11
|
+
#
|
|
12
|
+
# Conforming readers MUST NOT interpret application-private
|
|
13
|
+
# data; it survives round-trips and incremental updates intact.
|
|
14
|
+
class PagePieceInfo < Pdfrb::Model::Cos::Dictionary
|
|
15
|
+
# The application-name key (e.g. :Adobe, :Pdfrb). Multiple
|
|
16
|
+
# applications may each have their own entry in the same
|
|
17
|
+
# /PieceInfo dict.
|
|
18
|
+
def application_name
|
|
19
|
+
value.key?(:Application) ? value[:Application] : nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# /LastModified — PDF date string, parsed to a Time.
|
|
23
|
+
def last_modified
|
|
24
|
+
v = value[:LastModified]
|
|
25
|
+
return nil unless v.is_a?(::String)
|
|
26
|
+
|
|
27
|
+
Pdfrb::Model::Date.parse(v)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# /Private — application-private dict. Untyped on purpose:
|
|
31
|
+
# the contents are app-defined.
|
|
32
|
+
def private_data
|
|
33
|
+
value[:Private]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Set the application's /LastModified to +time+. +time+ is
|
|
37
|
+
# converted to a PDF date string.
|
|
38
|
+
def last_modified=(time)
|
|
39
|
+
value[:LastModified] = Pdfrb::Model::Date.format(time)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Merge +hash+ into /Private. If /Private is absent, it is
|
|
43
|
+
# created from the hash.
|
|
44
|
+
def merge_private!(hash)
|
|
45
|
+
existing = value[:Private]
|
|
46
|
+
if existing.is_a?(Pdfrb::Model::Cos::Dictionary)
|
|
47
|
+
existing.value.merge!(hash)
|
|
48
|
+
elsif existing.is_a?(::Hash)
|
|
49
|
+
existing.merge!(hash)
|
|
50
|
+
else
|
|
51
|
+
value[:Private] = hash
|
|
52
|
+
end
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -12,16 +12,39 @@ module Pdfrb
|
|
|
12
12
|
arlington_object "PageTreeNode"
|
|
13
13
|
register_type :Pages
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
def
|
|
17
|
-
|
|
15
|
+
def kids; self[:Kids]; end
|
|
16
|
+
def count; self[:Count] || 0; end
|
|
17
|
+
def parent; self[:Parent]; end
|
|
18
|
+
def media_box; self[:MediaBox]; end
|
|
19
|
+
def crop_box; self[:CropBox]; end
|
|
20
|
+
def resources; self[:Resources]; end
|
|
21
|
+
def rotate; self[:Rotate]; end
|
|
22
|
+
|
|
23
|
+
def root?
|
|
24
|
+
parent.nil?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def leaf?
|
|
28
|
+
false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def each_child
|
|
32
|
+
return enum_for(:each_child) unless block_given?
|
|
33
|
+
return unless kids && document
|
|
18
34
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
35
|
+
arr = kids.is_a?(Pdfrb::Model::Reference) ? document.object(kids) : kids
|
|
36
|
+
return unless arr.is_a?(Array)
|
|
37
|
+
|
|
38
|
+
arr.each do |kid_ref|
|
|
39
|
+
obj = kid_ref.is_a?(Pdfrb::Model::Reference) ? document.object(kid_ref) : kid_ref
|
|
40
|
+
yield obj if obj
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def each_page(&block)
|
|
45
|
+
return enum_for(:each_page) unless block
|
|
24
46
|
|
|
47
|
+
each_child do |kid|
|
|
25
48
|
case kid[:Type]
|
|
26
49
|
when :Pages then kid.each_page(&block)
|
|
27
50
|
when :Page then yield kid
|
|
@@ -29,17 +52,29 @@ module Pdfrb
|
|
|
29
52
|
end
|
|
30
53
|
end
|
|
31
54
|
|
|
55
|
+
def pages
|
|
56
|
+
each_page.to_a
|
|
57
|
+
end
|
|
58
|
+
|
|
32
59
|
def page_count
|
|
33
|
-
|
|
60
|
+
count
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def first_page
|
|
64
|
+
each_page.first
|
|
34
65
|
end
|
|
35
|
-
end
|
|
36
66
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
67
|
+
def last_page
|
|
68
|
+
each_page.to_a.last
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def page_at(index)
|
|
72
|
+
return nil if index.negative? || index >= page_count
|
|
73
|
+
|
|
74
|
+
each_page.with_index do |page, i|
|
|
75
|
+
return page if i == index
|
|
76
|
+
end
|
|
77
|
+
end
|
|
43
78
|
end
|
|
44
79
|
end
|
|
45
80
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# The root of the page tree — same shape as PageTreeNode but
|
|
7
|
+
# linked directly from the Catalog's /Pages. Tracked separately
|
|
8
|
+
# so type-dispatch can distinguish root from interior nodes
|
|
9
|
+
# (some validation rules apply only to the root).
|
|
10
|
+
class PageTreeNodeRoot < PageTreeNode
|
|
11
|
+
arlington_object "PageTreeNodeRoot"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Pattern dictionary base (s8.7.2). Patterns tile or shade to fill
|
|
7
|
+
# graphics. Two pattern types: tiling (Type 1) and shading (Type 2).
|
|
8
|
+
class Pattern < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def pattern_type; self[:PatternType]; end
|
|
10
|
+
|
|
11
|
+
def tiling?; pattern_type == 1; end
|
|
12
|
+
def shading?; pattern_type == 2; end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 2 shading pattern (s8.7.4.1). Fills with a Shading dict.
|
|
7
|
+
class PatternShading < Pattern
|
|
8
|
+
def shading; self[:Shading]; end
|
|
9
|
+
def matrix; self[:Matrix]; end
|
|
10
|
+
def ext_g_state; self[:ExtGState]; end
|
|
11
|
+
|
|
12
|
+
def has_matrix?
|
|
13
|
+
!!matrix
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def resolved_shading
|
|
17
|
+
ref = shading
|
|
18
|
+
return nil unless ref && document
|
|
19
|
+
|
|
20
|
+
document.object(ref)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 1 tiling pattern (s8.7.3). Repeats a graphical cell.
|
|
7
|
+
class PatternTiling < Pattern
|
|
8
|
+
def paint_type; self[:PaintType]; end
|
|
9
|
+
def tiling_type; self[:TilingType]; end
|
|
10
|
+
def bbox; self[:BBox]; end
|
|
11
|
+
def x_step; self[:XStep]; end
|
|
12
|
+
def y_step; self[:YStep]; end
|
|
13
|
+
def resources; self[:Resources]; end
|
|
14
|
+
def matrix; self[:Matrix]; end
|
|
15
|
+
|
|
16
|
+
def colored?; paint_type == 1; end
|
|
17
|
+
def uncolored?; paint_type == 2; end
|
|
18
|
+
|
|
19
|
+
def constant_spacing?; tiling_type == 1; end
|
|
20
|
+
def no_distortion?; tiling_type == 2; end
|
|
21
|
+
def constant_spacing_no_distortion?; tiling_type == 3; end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Polygon annotation (s12.5.6.9). Closed polygon shape.
|
|
7
|
+
class PolygonAnnotation < MarkupAnnotation
|
|
8
|
+
def vertices; self[:Vertices]; end
|
|
9
|
+
def line_endings; self[:LE]; end
|
|
10
|
+
def interior_color; self[:IC]; end
|
|
11
|
+
def border_style; self[:BS]; end
|
|
12
|
+
def border; self[:Border]; end
|
|
13
|
+
def measure; self[:Measure]; end
|
|
14
|
+
def intent; self[:IT]; end
|
|
15
|
+
|
|
16
|
+
def vertex_count
|
|
17
|
+
return 0 unless vertices
|
|
18
|
+
|
|
19
|
+
arr = vertices.is_a?(Pdfrb::Model::PdfArray) ? vertices.to_a : vertices
|
|
20
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def has_measure?
|
|
24
|
+
!!measure
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
class PolygonPolyline < Annotation
|
|
7
|
+
def vertices; self[:Vertices]; end
|
|
8
|
+
def line_ending_styling; self[:LE]; end
|
|
9
|
+
def interior_color; self[:IC]; end
|
|
10
|
+
def fill?; self[:Subtype] == :Polygon; end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Polyline annotation (s12.5.6.9). Open polyline (not closed).
|
|
7
|
+
class PolylineAnnotation < MarkupAnnotation
|
|
8
|
+
def vertices; self[:Vertices]; end
|
|
9
|
+
def line_endings; self[:LE]; end
|
|
10
|
+
def interior_color; self[:IC]; end
|
|
11
|
+
def border_style; self[:BS]; end
|
|
12
|
+
def border; self[:Border]; end
|
|
13
|
+
def measure; self[:Measure]; end
|
|
14
|
+
def intent; self[:IT]; end
|
|
15
|
+
|
|
16
|
+
def vertex_count
|
|
17
|
+
return 0 unless vertices
|
|
18
|
+
|
|
19
|
+
arr = vertices.is_a?(Pdfrb::Model::PdfArray) ? vertices.to_a : vertices
|
|
20
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def has_measure?
|
|
24
|
+
!!measure
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|