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
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Media Offset Time (s13.3.6.5). Time-based media offset.
|
|
7
|
+
class MediaOffsetTime < Pdfrb::Model::Cos::Dictionary
|
|
8
|
+
def subtype; self[:S]&.to_sym; end
|
|
9
|
+
def timespan; self[:T]; end
|
|
10
|
+
|
|
11
|
+
def time_offset
|
|
12
|
+
return nil unless timespan
|
|
13
|
+
|
|
14
|
+
timespan.is_a?(Pdfrb::Model::Cos::Dictionary) ? timespan[:V] : timespan
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Media Offset Frame (s13.3.6.5). Frame-based media offset.
|
|
19
|
+
class MediaOffsetFrame < Pdfrb::Model::Cos::Dictionary
|
|
20
|
+
def subtype; self[:S]&.to_sym; end
|
|
21
|
+
def frame_number; self[:F]; end
|
|
22
|
+
def time; self[:T]; end
|
|
23
|
+
|
|
24
|
+
def has_frame?
|
|
25
|
+
!!frame_number
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Media Offset Marker (s13.3.6.5). Marker-based media offset.
|
|
30
|
+
class MediaOffsetMarker < Pdfrb::Model::Cos::Dictionary
|
|
31
|
+
def subtype; self[:S]&.to_sym; end
|
|
32
|
+
def marker_name; self[:M]; end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Media Player Info (s13.3.5.5). Identifies which players can
|
|
36
|
+
# render the rendition.
|
|
37
|
+
class MediaPlayerInfo < Pdfrb::Model::Cos::Dictionary
|
|
38
|
+
def player_identifier; self[:PID]; end
|
|
39
|
+
def must_honor; self[:MH]; end
|
|
40
|
+
def best_effort; self[:BE]; end
|
|
41
|
+
|
|
42
|
+
def has_constraints?
|
|
43
|
+
!!must_honor || !!best_effort
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def resolved_player_identifier
|
|
47
|
+
ref = player_identifier
|
|
48
|
+
return nil unless ref && document
|
|
49
|
+
|
|
50
|
+
document.object(ref)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Media Players (s13.3.5.5). Player info lists.
|
|
55
|
+
class MediaPlayers < Pdfrb::Model::Cos::Dictionary
|
|
56
|
+
def must_use; self[:MU]; end
|
|
57
|
+
def alternate; self[:A]; end
|
|
58
|
+
def never_use; self[:NU]; end
|
|
59
|
+
|
|
60
|
+
def must_use_count
|
|
61
|
+
return 0 unless must_use
|
|
62
|
+
|
|
63
|
+
arr = must_use.is_a?(Pdfrb::Model::PdfArray) ? must_use.to_a : must_use
|
|
64
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def never_use_count
|
|
68
|
+
return 0 unless never_use
|
|
69
|
+
|
|
70
|
+
arr = never_use.is_a?(Pdfrb::Model::PdfArray) ? never_use.to_a : never_use
|
|
71
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Media Screen Parameters (s13.3.5.4). Controls how media is
|
|
76
|
+
# displayed on the screen annotation.
|
|
77
|
+
class MediaScreenParameters < Pdfrb::Model::Cos::Dictionary
|
|
78
|
+
def must_honor; self[:MH]; end
|
|
79
|
+
def best_effort; self[:BE]; end
|
|
80
|
+
def fit; self[:FIT]; end
|
|
81
|
+
|
|
82
|
+
def fit_meet?; fit == :Meet; end
|
|
83
|
+
def fit_slice?; fit == :Slice; end
|
|
84
|
+
def fit_fill?; fit == :Fill; end
|
|
85
|
+
def fit_hidden?; fit == :Hidden; end
|
|
86
|
+
def fit_tiled?; fit == :Tiled; end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Media Criteria (s13.3.5.5). Constraints when selecting players.
|
|
90
|
+
class MediaCriteria < Pdfrb::Model::Cos::Dictionary
|
|
91
|
+
def must_honor; self[:MH]; end
|
|
92
|
+
def best_effort; self[:BE]; end
|
|
93
|
+
def bit_rate; self[:Rate]; end
|
|
94
|
+
def bandwidth; self[:RateBS]; end
|
|
95
|
+
def cpu; self[:RateCpu]; end
|
|
96
|
+
def ram; self[:RateRam]; end
|
|
97
|
+
def language; self[:Lang]; end
|
|
98
|
+
def mime_type; self[:MimeType]; end
|
|
99
|
+
|
|
100
|
+
def has_bit_rate_constraint?
|
|
101
|
+
!!bit_rate
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -9,9 +9,33 @@ module Pdfrb
|
|
|
9
9
|
arlington_object "Metadata"
|
|
10
10
|
register_type :Metadata
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
def type; self[:Type]; end
|
|
13
|
+
def subtype; self[:Subtype]; end
|
|
14
|
+
def filter; self[:Filter]; end
|
|
15
|
+
def associated_files; self[:AF]; end
|
|
16
|
+
|
|
17
|
+
def xml?
|
|
18
|
+
subtype&.to_sym == :XML
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def xmp?
|
|
22
|
+
return false unless xml? && stream
|
|
23
|
+
|
|
24
|
+
data = stream.to_s
|
|
25
|
+
data.include?("<x:xmpmeta") || data.include?("xmlns:x=")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def xmp_packet?
|
|
29
|
+
return false unless stream
|
|
30
|
+
|
|
31
|
+
stream.to_s.include?("<?xpacket")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def xmp_string
|
|
35
|
+
return nil unless stream
|
|
36
|
+
|
|
37
|
+
stream.to_s.force_encoding(Encoding::UTF_8)
|
|
38
|
+
end
|
|
15
39
|
end
|
|
16
40
|
end
|
|
17
41
|
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Border array [horizontal_radius vertical_radius width_dash
|
|
7
|
+
# ...] Deprecated; use BorderStyling instead (s7.7.3.3).
|
|
8
|
+
# Encapsulated as a thin struct.
|
|
9
|
+
class BorderArray < Pdfrb::Model::PdfArray
|
|
10
|
+
def horizontal_radius
|
|
11
|
+
self[0] || 0
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def vertical_radius
|
|
15
|
+
self[1] || 0
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def border_width
|
|
19
|
+
self[2] || 1
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def horizontal_style
|
|
23
|
+
(self[3]&.to_s || :S).to_sym
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Lab Range Array [a_min a_max b_min b_max]. Used inside the
|
|
28
|
+
# Lab color space dict (s8.6.3.4).
|
|
29
|
+
class LabRangeArray < Pdfrb::Model::PdfArray
|
|
30
|
+
def a_min; self[0]; end
|
|
31
|
+
def a_max; self[1]; end
|
|
32
|
+
def b_min; self[2]; end
|
|
33
|
+
def b_max; self[3]; end
|
|
34
|
+
|
|
35
|
+
def default?
|
|
36
|
+
a_min == -100 && a_max == 100 && b_min == -100 && b_max == 100
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Dest Output Profile Ref (s7.9.6, optional indirect reference).
|
|
41
|
+
# Used by PDF PostScript/XMP reference forms.
|
|
42
|
+
class DestOutputProfileRef < Pdfrb::Model::Reference
|
|
43
|
+
def resolved
|
|
44
|
+
document&.object(self)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Output Intents array (s14.11.5). Container for the Catalog
|
|
49
|
+
# /OutputIntents array — convenience wrapper that just forwards
|
|
50
|
+
# to the type.
|
|
51
|
+
class OutputIntentsContainer < Pdfrb::Model::Cos::Dictionary
|
|
52
|
+
def intent_type; self[:S]; end
|
|
53
|
+
|
|
54
|
+
def pdfx?
|
|
55
|
+
intent_type&.to_sym == :GTS_PDFX
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def pdfa?
|
|
59
|
+
intent_type&.to_sym == :GTS_PDFA
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# CMapStream (s9.7.5.3). CMap stream definition embedded in a PDF.
|
|
64
|
+
class CMapStream < Pdfrb::Model::Cos::Stream
|
|
65
|
+
def type; self[:Type]; end
|
|
66
|
+
def base_font; self[:BaseFont]; end
|
|
67
|
+
def encoding; self[:Encoding]; end
|
|
68
|
+
|
|
69
|
+
def cmap_data
|
|
70
|
+
decoded_stream&.force_encoding(Encoding::BINARY)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Movie dictionary (s13.4). Deprecated since PDF 2.0 but still
|
|
7
|
+
# appears in legacy PDFs. Use Screen + Rendition actions instead.
|
|
8
|
+
class Movie < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def type; self[:Type]; end
|
|
10
|
+
def file_spec; self[:F]; end
|
|
11
|
+
def aspect; self[:Aspect]; end
|
|
12
|
+
def rotate; self[:Rotate] || 0; end
|
|
13
|
+
def poster; self[:Poster]; end
|
|
14
|
+
|
|
15
|
+
def has_poster?
|
|
16
|
+
!!poster
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def resolved_file_spec
|
|
20
|
+
ref = file_spec
|
|
21
|
+
return nil unless ref && document
|
|
22
|
+
|
|
23
|
+
document.object(ref)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -8,6 +8,57 @@ module Pdfrb
|
|
|
8
8
|
# /EmbeddedFiles, /AlternatePresentations, /Renditions.
|
|
9
9
|
class Names < Pdfrb::Model::Cos::Dictionary
|
|
10
10
|
arlington_object "Name"
|
|
11
|
+
register_type :Names
|
|
12
|
+
|
|
13
|
+
def destinations; self[:Dests]; end
|
|
14
|
+
def ap; self[:AP]; end
|
|
15
|
+
def javascript; self[:JavaScript]; end
|
|
16
|
+
def pages; self[:Pages]; end
|
|
17
|
+
def templates; self[:Templates]; end
|
|
18
|
+
def urls; self[:URLS]; end
|
|
19
|
+
def embedded_files; self[:EmbeddedFiles]; end
|
|
20
|
+
def alternate_presentations; self[:AlternatePresentations]; end
|
|
21
|
+
def renditions; self[:Renditions]; end
|
|
22
|
+
|
|
23
|
+
def has_embedded_files?
|
|
24
|
+
!!embedded_files
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def has_javascript?
|
|
28
|
+
!!javascript
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def has_destinations?
|
|
32
|
+
!!destinations
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def each_embedded_file(&block)
|
|
36
|
+
return enum_for(:each_embedded_file) unless block
|
|
37
|
+
return unless embedded_files && document
|
|
38
|
+
|
|
39
|
+
walk_name_tree(embedded_files, &block)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def walk_name_tree(node_ref, &block)
|
|
45
|
+
node = if node_ref.is_a?(Pdfrb::Model::Reference) && document
|
|
46
|
+
document.object(node_ref)
|
|
47
|
+
else
|
|
48
|
+
node_ref
|
|
49
|
+
end
|
|
50
|
+
return unless node
|
|
51
|
+
|
|
52
|
+
if node[:Names]
|
|
53
|
+
arr = node[:Names]
|
|
54
|
+
arr = arr.to_a if arr.is_a?(Pdfrb::Model::PdfArray)
|
|
55
|
+
arr.each_slice(2, &block)
|
|
56
|
+
elsif node[:Kids]
|
|
57
|
+
arr = node[:Kids]
|
|
58
|
+
arr = arr.to_a if arr.is_a?(Pdfrb::Model::PdfArray)
|
|
59
|
+
arr.each { |kid| walk_name_tree(kid, &block) }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
11
62
|
end
|
|
12
63
|
end
|
|
13
64
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Namespace dictionary (s14.7.6.1, PDF 2.0). Namespaces for
|
|
7
|
+
# structure element types in tagged PDF documents.
|
|
8
|
+
class Namespace < Cos::Dictionary
|
|
9
|
+
register_type :Namespace
|
|
10
|
+
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def namespace_name; self[:NS]; end
|
|
13
|
+
def role_map_ns; self[:RoleMapNS]; end
|
|
14
|
+
|
|
15
|
+
def has_role_map?
|
|
16
|
+
!!role_map_ns
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def mapped_role(custom_name)
|
|
20
|
+
return nil unless role_map_ns.is_a?(Hash)
|
|
21
|
+
|
|
22
|
+
role_map_ns[custom_name.to_sym] || role_map_ns[custom_name.to_s]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Object reference dict (s14.7.6). Used in structure trees to
|
|
7
|
+
# refer to a content item without including it directly.
|
|
8
|
+
class ObjectReference < Cos::Dictionary
|
|
9
|
+
register_type :ObjRef
|
|
10
|
+
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def page; self[:Pg]; end
|
|
13
|
+
def object; self[:Obj]; end
|
|
14
|
+
|
|
15
|
+
def resolved_page
|
|
16
|
+
ref = page
|
|
17
|
+
return nil unless ref && document
|
|
18
|
+
|
|
19
|
+
document.object(ref)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def resolved_object
|
|
23
|
+
ref = object
|
|
24
|
+
return nil unless ref && document
|
|
25
|
+
|
|
26
|
+
document.object(ref)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -8,6 +8,44 @@ module Pdfrb
|
|
|
8
8
|
class ObjectStream < Pdfrb::Model::Cos::Stream
|
|
9
9
|
arlington_object "ObjectStream"
|
|
10
10
|
register_type :ObjStm
|
|
11
|
+
|
|
12
|
+
def type; self[:Type]; end
|
|
13
|
+
def number_of_objects; self[:N]; end
|
|
14
|
+
def first_byte_offset; self[:First]; end
|
|
15
|
+
def extends; self[:Extends]; end
|
|
16
|
+
def filter; self[:Filter]; end
|
|
17
|
+
|
|
18
|
+
def has_parent?
|
|
19
|
+
!!extends
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def compressed_count
|
|
23
|
+
number_of_objects || 0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def each_object_reference
|
|
27
|
+
return enum_for(:each_object_reference) unless block_given?
|
|
28
|
+
return unless number_of_objects && first_byte_offset
|
|
29
|
+
|
|
30
|
+
stream_data = decoded_stream
|
|
31
|
+
return unless stream_data
|
|
32
|
+
|
|
33
|
+
offset = 0
|
|
34
|
+
number_of_objects.times do
|
|
35
|
+
space_idx = stream_data.index(" ", offset)
|
|
36
|
+
return if space_idx.nil?
|
|
37
|
+
|
|
38
|
+
oid = stream_data[offset...space_idx].to_i
|
|
39
|
+
|
|
40
|
+
newline_idx = stream_data.index(/\s/, space_idx + 1)
|
|
41
|
+
return if newline_idx.nil?
|
|
42
|
+
|
|
43
|
+
byte_offset = stream_data[(space_idx + 1)...newline_idx].to_i
|
|
44
|
+
|
|
45
|
+
yield oid, byte_offset + first_byte_offset
|
|
46
|
+
offset = newline_idx + 1
|
|
47
|
+
end
|
|
48
|
+
end
|
|
11
49
|
end
|
|
12
50
|
end
|
|
13
51
|
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Optional Content Usage Application dict (s8.11.4.1). Decides
|
|
7
|
+
# which OCGs to enable when the user views/prints/exports the
|
|
8
|
+
# document.
|
|
9
|
+
class OptContentUsageApplication < Pdfrb::Model::Cos::Dictionary
|
|
10
|
+
def event; self[:Event]&.to_sym; end
|
|
11
|
+
def ocgs; self[:OCGs]; end
|
|
12
|
+
def category; self[:Category]; end
|
|
13
|
+
|
|
14
|
+
def view_event?; event == :View; end
|
|
15
|
+
def print_event?; event == :Print; end
|
|
16
|
+
def export_event?; event == :Export; end
|
|
17
|
+
|
|
18
|
+
def each_ocg
|
|
19
|
+
return enum_for(:each_ocg) unless block_given?
|
|
20
|
+
return unless ocgs && document
|
|
21
|
+
|
|
22
|
+
arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
|
|
23
|
+
arr.each do |ref|
|
|
24
|
+
obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
|
|
25
|
+
yield obj if obj
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Optional Content Creator Info dict (s8.11.2.2). Attribution
|
|
31
|
+
# for who created a layer.
|
|
32
|
+
class OptContentCreatorInfo < Pdfrb::Model::Cos::Dictionary
|
|
33
|
+
def creator; self[:Creator]; end
|
|
34
|
+
def subtitle; self[:Subtitle]; end
|
|
35
|
+
def creator_app_version; self[:CreatorAppVersion]; end
|
|
36
|
+
|
|
37
|
+
def has_creator?
|
|
38
|
+
!!creator
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Optional Content Export dict (s8.11.2.3). Specific OCG toggle
|
|
43
|
+
# for the export workflow.
|
|
44
|
+
class OptContentExport < Pdfrb::Model::Cos::Dictionary
|
|
45
|
+
def export_ocgs; self[:ExportOCGs]; end
|
|
46
|
+
def intent; self[:Intent]&.to_sym; end
|
|
47
|
+
|
|
48
|
+
def visible_only?
|
|
49
|
+
intent == :Visible
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def all_export?
|
|
53
|
+
intent == :All
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Optional Content Print dict (s8.11.2.4). Similar to Export but
|
|
58
|
+
# for the printing workflow.
|
|
59
|
+
class OptContentPrint < Pdfrb::Model::Cos::Dictionary
|
|
60
|
+
def print_ocgs; self[:PrintOCGs]; end
|
|
61
|
+
def print_state; self[:PrintState]&.to_sym; end
|
|
62
|
+
|
|
63
|
+
def on_printed?; print_state == :On; end
|
|
64
|
+
def off_printed?; print_state == :Off; end
|
|
65
|
+
def leave_unchanged?; print_state == :Unchanged; end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Optional Content View dict (s8.11.2.5). Per-view OCG visibility.
|
|
69
|
+
class OptContentView < Pdfrb::Model::Cos::Dictionary
|
|
70
|
+
def view_name; self[:Name]; end
|
|
71
|
+
def view_state_name; self[:ViewState]; end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Optional Content Language dict (s8.11.2.6). Maps OCG to natural
|
|
75
|
+
# language for preference-based visibility.
|
|
76
|
+
class OptContentLanguage < Pdfrb::Model::Cos::Dictionary
|
|
77
|
+
def language_string; self[:Lang]; end
|
|
78
|
+
def ocgs; self[:OCGs]; end
|
|
79
|
+
def preferred; self[:Preferred] || 0; end
|
|
80
|
+
|
|
81
|
+
def each_ocg
|
|
82
|
+
return enum_for(:each_ocg) unless block_given?
|
|
83
|
+
return unless ocgs && document
|
|
84
|
+
|
|
85
|
+
arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
|
|
86
|
+
arr.each do |ref|
|
|
87
|
+
obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
|
|
88
|
+
yield obj if obj
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Opt Content Page Element (s8.11). Marks page elements for
|
|
7
|
+
# automatic optional-content group creation.
|
|
8
|
+
class OptContentPageElement < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def subtype; self[:Subtype]&.to_sym; end
|
|
10
|
+
def ocgs; self[:OCGs]; end
|
|
11
|
+
|
|
12
|
+
def has_ocgs?
|
|
13
|
+
!!ocgs && (!ocgs.is_a?(Array) || !ocgs.empty?)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Optional Content Configuration (s8.11.4.1). Per-view configuration
|
|
7
|
+
# of OCG visibility, intent, and locking.
|
|
8
|
+
class OptionalContentConfiguration < Cos::Dictionary
|
|
9
|
+
register_type :OCConfig
|
|
10
|
+
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def name; self[:Name]; end
|
|
13
|
+
def creator; self[:Creator]; end
|
|
14
|
+
def base_state; (self[:BaseState] || :ON).to_sym; end
|
|
15
|
+
def on; self[:ON]; end
|
|
16
|
+
def off; self[:OFF]; end
|
|
17
|
+
def intent; self[:Intent]; end
|
|
18
|
+
def list_mode; self[:ListMode]&.to_sym || :AllPages; end
|
|
19
|
+
def rb_groups; self[:RBGroups]; end
|
|
20
|
+
def locked; self[:Locked]; end
|
|
21
|
+
|
|
22
|
+
def all_on?; base_state == :ON; end
|
|
23
|
+
def all_off?; base_state == :OFF; end
|
|
24
|
+
def unchanged?; base_state == :Unchanged; end
|
|
25
|
+
|
|
26
|
+
def has_intent?
|
|
27
|
+
!!intent
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def view_intent?
|
|
31
|
+
return true unless intent
|
|
32
|
+
|
|
33
|
+
arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
|
|
34
|
+
arr = [arr] unless arr.is_a?(Array)
|
|
35
|
+
arr.map(&:to_sym).include?(:View)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def print_intent?
|
|
39
|
+
return false unless intent
|
|
40
|
+
|
|
41
|
+
arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
|
|
42
|
+
arr = [arr] unless arr.is_a?(Array)
|
|
43
|
+
arr.map(&:to_sym).include?(:Print)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def locked_groups?
|
|
47
|
+
!!locked
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def radio_button_groups?
|
|
51
|
+
!!rb_groups
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -7,18 +7,43 @@ module Pdfrb
|
|
|
7
7
|
class OptionalContentGroup < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "OptContentGroup"
|
|
9
9
|
register_type :OCG
|
|
10
|
-
end
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
def type; self[:Type]; end
|
|
12
|
+
def name; self[:Name]; end
|
|
13
|
+
def intent; self[:Intent]; end
|
|
14
|
+
def usage; self[:Usage]; end
|
|
15
|
+
|
|
16
|
+
def view_intent?
|
|
17
|
+
return true unless intent
|
|
18
|
+
|
|
19
|
+
arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
|
|
20
|
+
arr = [arr] unless arr.is_a?(Array)
|
|
21
|
+
arr.map(&:to_sym).include?(:View)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def print_intent?
|
|
25
|
+
return false unless intent
|
|
26
|
+
|
|
27
|
+
arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
|
|
28
|
+
arr = [arr] unless arr.is_a?(Array)
|
|
29
|
+
arr.map(&:to_sym).include?(:Print)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def export_intent?
|
|
33
|
+
return false unless intent
|
|
34
|
+
|
|
35
|
+
arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
|
|
36
|
+
arr = [arr] unless arr.is_a?(Array)
|
|
37
|
+
arr.map(&:to_sym).include?(:Export)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def default_visible?
|
|
41
|
+
usage && usage[:View] && usage[:View][:ViewState]&.to_sym == :ON
|
|
42
|
+
end
|
|
18
43
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
44
|
+
def has_usage?
|
|
45
|
+
!!usage
|
|
46
|
+
end
|
|
22
47
|
end
|
|
23
48
|
end
|
|
24
49
|
end
|
|
@@ -3,10 +3,44 @@
|
|
|
3
3
|
module Pdfrb
|
|
4
4
|
module Model
|
|
5
5
|
module Type
|
|
6
|
-
#
|
|
7
|
-
#
|
|
6
|
+
# Optional Content Membership (s8.11.4.2). Boolean combination
|
|
7
|
+
# of OCG visibility states.
|
|
8
8
|
class OptionalContentMembership < Pdfrb::Model::Cos::Dictionary
|
|
9
9
|
arlington_object "OptContentMembership"
|
|
10
|
+
register_type :OCMD
|
|
11
|
+
|
|
12
|
+
def ocfgs; self[:OCGs]; end
|
|
13
|
+
def policy; self[:P]; end
|
|
14
|
+
def expression; self[:VE]; end
|
|
15
|
+
|
|
16
|
+
def all_on_policy?
|
|
17
|
+
(policy || 1) == 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def any_on_policy?
|
|
21
|
+
policy == 2
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def any_off_policy?
|
|
25
|
+
policy == 3
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def has_expression?
|
|
29
|
+
!!expression
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def each_ocg
|
|
33
|
+
return enum_for(:each_ocg) unless block_given?
|
|
34
|
+
return unless ocfgs && document
|
|
35
|
+
|
|
36
|
+
arr = ocfgs.is_a?(Pdfrb::Model::Reference) ? document.object(ocfgs) : ocfgs
|
|
37
|
+
return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
38
|
+
|
|
39
|
+
arr.each do |ref|
|
|
40
|
+
obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
|
|
41
|
+
yield obj if obj
|
|
42
|
+
end
|
|
43
|
+
end
|
|
10
44
|
end
|
|
11
45
|
end
|
|
12
46
|
end
|