pdfrb 0.2.1 → 0.6.0
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 +24 -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 +48 -0
- 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 +312 -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 +217 -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.rb +21 -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/form_xobject.rb +68 -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 +31 -257
- 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_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 +286 -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.rb +3 -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 +25 -53
- 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 +312 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 3 font file stream — the modern container used for CFF
|
|
7
|
+
# (Compact Font Format), OpenType, and CID-keyed fonts.
|
|
8
|
+
# Referenced by FontDescriptor /FontFile3.
|
|
9
|
+
class FontFile3 < Pdfrb::Model::Cos::Stream
|
|
10
|
+
def subtype; self[:Subtype]&.to_sym; end
|
|
11
|
+
|
|
12
|
+
def font_program
|
|
13
|
+
decoded_stream&.force_encoding(Encoding::BINARY)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def cid_font_type0?; subtype == :CIDFontType0C; end
|
|
17
|
+
def open_type?; subtype == :OpenType; end
|
|
18
|
+
def type1c?; subtype == :Type1C; end
|
|
19
|
+
def truetype?; subtype == :TrueType; end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# MultipleMaster Type 1 font (s9.6.2.3). Type 1 font with
|
|
7
|
+
# additional design axes between masters. Deprecated in PDF 2.0.
|
|
8
|
+
class FontMultipleMaster < Font
|
|
9
|
+
def subtype; self[:Subtype]&.to_sym; end
|
|
10
|
+
def name; self[:Name]; end
|
|
11
|
+
def first_char; self[:FirstChar]; end
|
|
12
|
+
def last_char; self[:LastChar]; end
|
|
13
|
+
def widths; self[:Widths]; end
|
|
14
|
+
def font_descriptor; self[:FontDescriptor]; end
|
|
15
|
+
def encoding; self[:Encoding]; end
|
|
16
|
+
def blend_axis_types; self[:BlendAxisTypes]; end
|
|
17
|
+
|
|
18
|
+
def mm_type1?
|
|
19
|
+
subtype == :MMType1
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def first_char_or_default
|
|
23
|
+
first_char || 0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def last_char_or_default
|
|
27
|
+
last_char || 255
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def char_range
|
|
31
|
+
[first_char_or_default, last_char_or_default]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# CharProcMap (s9.6.4). Mapping from character names to the
|
|
36
|
+
# content-stream procedures that draw them, used by Type 3 fonts.
|
|
37
|
+
# The actual procedures live as streams under their names in a
|
|
38
|
+
# Tiling pattern's Resources.
|
|
39
|
+
class CharProcMap < Pdfrb::Model::Cos::Dictionary
|
|
40
|
+
def entries
|
|
41
|
+
value.each
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def each_procedure(&block)
|
|
45
|
+
return enum_for(:each_procedure) unless block
|
|
46
|
+
|
|
47
|
+
value.each(&block)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def procedure_for(char_name)
|
|
51
|
+
value[char_name.to_sym] || value[char_name.to_s]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def has_glyph?(char_name)
|
|
55
|
+
!!procedure_for(char_name)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -5,7 +5,7 @@ module Pdfrb
|
|
|
5
5
|
module Type
|
|
6
6
|
# Type 3 glyph font (s9.6.5). /Subtype /Type3, /CharProcs,
|
|
7
7
|
# /Resources, /FontBBox, /FontMatrix, /Encoding, /Widths.
|
|
8
|
-
class FontType3 < Pdfrb::Model::
|
|
8
|
+
class FontType3 < Pdfrb::Model::Type::Font
|
|
9
9
|
arlington_object "FontType3"
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
class Field < Cos::Dictionary
|
|
7
|
+
register_type :Field
|
|
8
|
+
|
|
9
|
+
def field_type; self[:FT]; end
|
|
10
|
+
def field_name; self[:T]; end
|
|
11
|
+
def alternate_field_name; self[:TU]; end
|
|
12
|
+
def mapping_field_name; self[:TM]; end
|
|
13
|
+
def field_value; self[:V]; end
|
|
14
|
+
def default_value; self[:DV]; end
|
|
15
|
+
def kids; self[:Kids]; end
|
|
16
|
+
def parent; self[:Parent]; end
|
|
17
|
+
def flags; self[:Ff] || 0; end
|
|
18
|
+
def additional_actions; self[:AA]; end
|
|
19
|
+
def appearance_characteristics; self[:MK]; end
|
|
20
|
+
|
|
21
|
+
def button?; field_type&.to_sym == :Btn; end
|
|
22
|
+
def text?; field_type&.to_sym == :Tx; end
|
|
23
|
+
def choice?; field_type&.to_sym == :Ch; end
|
|
24
|
+
def signature?; field_type&.to_sym == :Sig; end
|
|
25
|
+
|
|
26
|
+
def read_only?; flags & 1 != 0; end
|
|
27
|
+
def required?; flags & 2 != 0; end
|
|
28
|
+
def no_export?; flags & 4 != 0; end
|
|
29
|
+
|
|
30
|
+
def has_kids?
|
|
31
|
+
kids && (!kids.is_a?(Array) || !kids.empty?)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def terminal_field?
|
|
35
|
+
!has_kids?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def resolved_parent
|
|
39
|
+
ref = parent
|
|
40
|
+
return nil unless ref && document
|
|
41
|
+
|
|
42
|
+
document.object(ref)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def root_field
|
|
46
|
+
cur = self
|
|
47
|
+
while cur&.parent
|
|
48
|
+
parent_ref = cur.parent
|
|
49
|
+
cur = if parent_ref.is_a?(Pdfrb::Model::Reference) && document
|
|
50
|
+
document.object(parent_ref)
|
|
51
|
+
else
|
|
52
|
+
parent_ref
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
cur
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def fully_qualified_name
|
|
59
|
+
parts = []
|
|
60
|
+
cur = self
|
|
61
|
+
while cur
|
|
62
|
+
parts << cur.field_name if cur.field_name
|
|
63
|
+
parent_ref = cur.parent
|
|
64
|
+
break unless parent_ref && document
|
|
65
|
+
|
|
66
|
+
cur = document.object(parent_ref)
|
|
67
|
+
end
|
|
68
|
+
parts.reverse.join(".")
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Free-text annotation (s12.5.6.6). Text shown directly on the page.
|
|
7
|
+
class FreeTextAnnotation < MarkupAnnotation
|
|
8
|
+
def default_appearance; self[:DA]; end
|
|
9
|
+
def q; self[:Q]; end
|
|
10
|
+
def rc; self[:RC]; end
|
|
11
|
+
def ds; self[:DS]; end
|
|
12
|
+
def cl; self[:CL]; end
|
|
13
|
+
def it; self[:IT]; end
|
|
14
|
+
def be; self[:BE]; end
|
|
15
|
+
def rd; self[:RD]; end
|
|
16
|
+
def style_string; default_appearance; end
|
|
17
|
+
|
|
18
|
+
def text_alignment
|
|
19
|
+
case q
|
|
20
|
+
when 1 then :center
|
|
21
|
+
when 2 then :right
|
|
22
|
+
when 3 then :justify
|
|
23
|
+
else :left
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def callout?
|
|
28
|
+
!!cl
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def border_effect?
|
|
32
|
+
!!be
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# PDF Function dictionary (s8.9.1). Functions map input values to
|
|
7
|
+
# output values; used by shadings, color spaces, and other
|
|
8
|
+
# computational graphics primitives.
|
|
9
|
+
#
|
|
10
|
+
# Four function types exist (s8.9.4..7):
|
|
11
|
+
# * Type 0: Sampled (N-dimensional lookup table)
|
|
12
|
+
# * Type 2: Exponential (C0 + (C1 - C0) * t^r)
|
|
13
|
+
# * Type 3: Stitching (concatenation of multiple subfunctions)
|
|
14
|
+
# * Type 4: PostScript calculator (most flexible)
|
|
15
|
+
class Function < Pdfrb::Model::Cos::Dictionary
|
|
16
|
+
def function_type; self[:FunctionType]; end
|
|
17
|
+
|
|
18
|
+
def domain; self[:Domain]; end
|
|
19
|
+
def range; self[:Range]; end
|
|
20
|
+
|
|
21
|
+
def sampled?; function_type.zero?; end
|
|
22
|
+
def exponential?; function_type == 2; end
|
|
23
|
+
def stitching?; function_type == 3; end
|
|
24
|
+
def postscript?; function_type == 4; end
|
|
25
|
+
|
|
26
|
+
def input_dimension
|
|
27
|
+
return nil unless domain
|
|
28
|
+
|
|
29
|
+
arr = domain.is_a?(Pdfrb::Model::PdfArray) ? domain.to_a : domain
|
|
30
|
+
arr.is_a?(Array) ? arr.size / 2 : nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def output_dimension
|
|
34
|
+
return nil unless range
|
|
35
|
+
|
|
36
|
+
arr = range.is_a?(Pdfrb::Model::PdfArray) ? range.to_a : range
|
|
37
|
+
arr.is_a?(Array) ? arr.size / 2 : nil
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 2 Exponential interpolation function (s8.9.4).
|
|
7
|
+
# Maps +t+ ∈ [0,1] to C0 + (C1 - C0) * t^N.
|
|
8
|
+
# Commonly used for 2-color linear gradients.
|
|
9
|
+
class FunctionExponential < Function
|
|
10
|
+
def c0; self[:C0]; end
|
|
11
|
+
def c1; self[:C1]; end
|
|
12
|
+
def exponent; self[:N] || 1; end
|
|
13
|
+
|
|
14
|
+
def linear?
|
|
15
|
+
exponent == 1
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def evaluate(t)
|
|
19
|
+
return nil unless c0 && c1
|
|
20
|
+
|
|
21
|
+
arr0 = c0.is_a?(Pdfrb::Model::PdfArray) ? c0.to_a : c0
|
|
22
|
+
arr1 = c1.is_a?(Pdfrb::Model::PdfArray) ? c1.to_a : c1
|
|
23
|
+
n = exponent.to_f
|
|
24
|
+
arr0.each_with_index.map do |a, i|
|
|
25
|
+
a.to_f + ((arr1[i].to_f - a.to_f) * (t**n))
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 4 PostScript calculator function (s8.9.6). Carries a
|
|
7
|
+
# PostScript program in the stream payload that computes the
|
|
8
|
+
# output values from input values.
|
|
9
|
+
class FunctionPostScript < Pdfrb::Model::Cos::Stream
|
|
10
|
+
def function_type; self[:FunctionType] || 4; end
|
|
11
|
+
|
|
12
|
+
def domain; self[:Domain]; end
|
|
13
|
+
def range; self[:Range]; end
|
|
14
|
+
|
|
15
|
+
def postscript?
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def program
|
|
20
|
+
decoded_stream&.force_encoding(Encoding::BINARY)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 0 Sampled function (s8.9.3). N-dimensional lookup table
|
|
7
|
+
# with interpolation. Carries sample data in the stream payload.
|
|
8
|
+
class FunctionSampled < Pdfrb::Model::Cos::Stream
|
|
9
|
+
def function_type; self[:FunctionType] || 0; end
|
|
10
|
+
|
|
11
|
+
def domain; self[:Domain]; end
|
|
12
|
+
def range; self[:Range]; end
|
|
13
|
+
def size; self[:Size]; end
|
|
14
|
+
def bits_per_sample; self[:BitsPerSample]; end
|
|
15
|
+
def encode; self[:Encode]; end
|
|
16
|
+
def decode; self[:Decode]; end
|
|
17
|
+
|
|
18
|
+
def sampled?
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def input_dimension
|
|
23
|
+
return nil unless domain
|
|
24
|
+
|
|
25
|
+
arr = domain.is_a?(Pdfrb::Model::PdfArray) ? domain.to_a : domain
|
|
26
|
+
arr.is_a?(Array) ? arr.size / 2 : nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def output_dimension
|
|
30
|
+
return nil unless range
|
|
31
|
+
|
|
32
|
+
arr = range.is_a?(Pdfrb::Model::PdfArray) ? range.to_a : range
|
|
33
|
+
arr.is_a?(Array) ? arr.size / 2 : nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def sample_count
|
|
37
|
+
return 1 unless size
|
|
38
|
+
|
|
39
|
+
arr = size.is_a?(Pdfrb::Model::PdfArray) ? size.to_a : size
|
|
40
|
+
return 1 unless arr.is_a?(Array) && !arr.empty?
|
|
41
|
+
|
|
42
|
+
arr.reduce(1) { |product, n| product * n.to_i }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def bit_depth_8?
|
|
46
|
+
bits_per_sample == 8
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def bit_depth_16?
|
|
50
|
+
bits_per_sample == 16
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 3 Stitching function (s8.9.5). Concatenates multiple
|
|
7
|
+
# sub-functions over a stitched input domain.
|
|
8
|
+
class FunctionStitching < Function
|
|
9
|
+
def sub_functions; self[:Functions]; end
|
|
10
|
+
def bounds; self[:Bounds]; end
|
|
11
|
+
def encode; self[:Encode]; end
|
|
12
|
+
|
|
13
|
+
def subfunction_count
|
|
14
|
+
return 0 unless sub_functions
|
|
15
|
+
|
|
16
|
+
arr = sub_functions.is_a?(Pdfrb::Model::PdfArray) ? sub_functions.to_a : sub_functions
|
|
17
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def each_subfunction
|
|
21
|
+
return enum_for(:each_subfunction) unless block_given?
|
|
22
|
+
return unless sub_functions && document
|
|
23
|
+
|
|
24
|
+
arr = sub_functions.is_a?(Pdfrb::Model::PdfArray) ? sub_functions.to_a : sub_functions
|
|
25
|
+
arr.each do |ref|
|
|
26
|
+
obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
|
|
27
|
+
yield obj if obj
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
class GenericAppearance
|
|
7
|
+
attr_reader :annotation, :document
|
|
8
|
+
|
|
9
|
+
def initialize(annotation, document)
|
|
10
|
+
@annotation = annotation
|
|
11
|
+
@document = document
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def create_appearance
|
|
15
|
+
rect = annotation[:Rect]
|
|
16
|
+
return nil unless rect.is_a?(::Array) && rect.length == 4
|
|
17
|
+
|
|
18
|
+
x0, y0, x1, y1 = rect
|
|
19
|
+
width = (x1 - x0).abs
|
|
20
|
+
height = (y1 - y0).abs
|
|
21
|
+
return nil if width.zero? || height.zero?
|
|
22
|
+
|
|
23
|
+
stream = document.add(
|
|
24
|
+
{
|
|
25
|
+
Type: :XObject,
|
|
26
|
+
Subtype: :Form,
|
|
27
|
+
BBox: [0, 0, width, height],
|
|
28
|
+
Matrix: [1, 0, 0, 1, 0, 0],
|
|
29
|
+
Length: 0,
|
|
30
|
+
},
|
|
31
|
+
type: Pdfrb::Model::Cos::Stream
|
|
32
|
+
)
|
|
33
|
+
stream.stream = "q Q\n"
|
|
34
|
+
annotation[:AP] = { N: Pdfrb::Model::Reference.new(stream.oid, stream.gen) }
|
|
35
|
+
stream
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -11,6 +11,75 @@ module Pdfrb
|
|
|
11
11
|
class GraphicsStateParameter < Pdfrb::Model::Cos::Dictionary
|
|
12
12
|
arlington_object "GraphicsStateParameter"
|
|
13
13
|
register_type :ExtGState
|
|
14
|
+
|
|
15
|
+
def line_width; self[:LW]; end
|
|
16
|
+
def line_cap; self[:LC]; end
|
|
17
|
+
def line_join; self[:LJ]; end
|
|
18
|
+
def miter_limit; self[:ML]; end
|
|
19
|
+
def dash_pattern; self[:D]; end
|
|
20
|
+
def rendering_intent; self[:RI]; end
|
|
21
|
+
def stroke_adjustment?; truthy?(self[:SA]); end
|
|
22
|
+
def blend_mode; self[:BM]; end
|
|
23
|
+
def stroking_alpha; self[:CA]; end
|
|
24
|
+
def nonstroking_alpha; self[:ca]; end
|
|
25
|
+
def alpha_source?; truthy?(self[:AIS]); end
|
|
26
|
+
def overprint?; truthy?(self[:OP]); end
|
|
27
|
+
def nonstroking_overprint?; truthy?(self[:op]); end
|
|
28
|
+
def overprint_mode; self[:OPM]; end
|
|
29
|
+
def text_knockout?; truthy?(self[:TK]); end
|
|
30
|
+
def font; self[:Font]; end
|
|
31
|
+
def transfer_function; self[:TR]; end
|
|
32
|
+
def transfer_function2; self[:TR2]; end
|
|
33
|
+
def halftone; self[:HT]; end
|
|
34
|
+
def flatness; self[:FL]; end
|
|
35
|
+
def black_point_compensation; self[:UseBlackPtComp]; end
|
|
36
|
+
def soft_mask; self[:SMask]; end
|
|
37
|
+
|
|
38
|
+
def font_name
|
|
39
|
+
return nil unless font
|
|
40
|
+
|
|
41
|
+
arr = font.is_a?(Pdfrb::Model::PdfArray) ? font.to_a : font
|
|
42
|
+
arr.is_a?(Array) ? arr[0] : nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def font_size
|
|
46
|
+
return nil unless font
|
|
47
|
+
|
|
48
|
+
arr = font.is_a?(Pdfrb::Model::PdfArray) ? font.to_a : font
|
|
49
|
+
arr.is_a?(Array) ? arr[1] : nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def has_soft_mask?
|
|
53
|
+
!!soft_mask
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def has_transparency?
|
|
57
|
+
(stroking_alpha && stroking_alpha != 1) ||
|
|
58
|
+
(nonstroking_alpha && nonstroking_alpha != 1) ||
|
|
59
|
+
!!blend_mode || !!soft_mask
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def has_font?
|
|
63
|
+
!!font
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def dash_array
|
|
67
|
+
return nil unless dash_pattern
|
|
68
|
+
|
|
69
|
+
arr = dash_pattern.is_a?(Pdfrb::Model::PdfArray) ? dash_pattern.to_a : dash_pattern
|
|
70
|
+
return nil unless arr.is_a?(Array) && arr.size >= 1
|
|
71
|
+
|
|
72
|
+
arr[0]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def dash_phase
|
|
76
|
+
return nil unless dash_pattern
|
|
77
|
+
|
|
78
|
+
arr = dash_pattern.is_a?(Pdfrb::Model::PdfArray) ? dash_pattern.to_a : dash_pattern
|
|
79
|
+
return nil unless arr.is_a?(Array) && arr.size >= 2
|
|
80
|
+
|
|
81
|
+
arr[1]
|
|
82
|
+
end
|
|
14
83
|
end
|
|
15
84
|
end
|
|
16
85
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Halftone dictionary (s8.7.4). Halftones control how continuous
|
|
7
|
+
# tones are simulated via dot patterns for printing. Six halftone
|
|
8
|
+
# types exist in the PDF spec.
|
|
9
|
+
class Halftone < Pdfrb::Model::Cos::Dictionary
|
|
10
|
+
def halftone_type; self[:HalftoneType]; end
|
|
11
|
+
def halftone_name; self[:HalftoneName]; end
|
|
12
|
+
|
|
13
|
+
def type1?; halftone_type == 1; end
|
|
14
|
+
def type5?; halftone_type == 5; end
|
|
15
|
+
def type6?; halftone_type == 6; end
|
|
16
|
+
def type10?; halftone_type == 10; end
|
|
17
|
+
def type16?; halftone_type == 16; end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 1 halftone: a 1-bit tile sampled from a halftone screen
|
|
7
|
+
# cell defined by frequency, angle, and spot function.
|
|
8
|
+
class HalftoneType1 < Halftone
|
|
9
|
+
def frequency; self[:Frequency]; end
|
|
10
|
+
def angle; self[:Angle]; end
|
|
11
|
+
def spot_function; self[:SpotFunction]; end
|
|
12
|
+
def accurate_screens?; truthy?(self[:AccurateScreens]); end
|
|
13
|
+
def transfer_function; self[:TransferFunction]; end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 10 halftone: mesh-based continuous-tone (PDF 1.4+, mostly
|
|
7
|
+
# used for non-square pixel grids).
|
|
8
|
+
class HalftoneType10 < HalftoneType6
|
|
9
|
+
def xsquarestep; self[:Xsquarestep]; end
|
|
10
|
+
def ysquarestep; self[:Ysquarestep]; end
|
|
11
|
+
def center_x; self[:CenterX]; end
|
|
12
|
+
def center_y; self[:CenterY]; end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 5 halftone: a dictionary mapping colorant name → HalftoneType1.
|
|
7
|
+
class HalftoneType5 < Halftone
|
|
8
|
+
def halftones; self[:Halftones]; end
|
|
9
|
+
def default; self[:Default]; end
|
|
10
|
+
|
|
11
|
+
def colorant_count
|
|
12
|
+
return 0 unless halftones
|
|
13
|
+
|
|
14
|
+
obj = if halftones.is_a?(Pdfrb::Model::Reference) && document
|
|
15
|
+
document.object(halftones)
|
|
16
|
+
else
|
|
17
|
+
halftones
|
|
18
|
+
end
|
|
19
|
+
obj.is_a?(Pdfrb::Model::Cos::Dictionary) ? obj.value.size : obj&.size || 0
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 6 halftone: continuous-tone cell (PDF 1.4+).
|
|
7
|
+
class HalftoneType6 < Halftone
|
|
8
|
+
def width; self[:Width]; end
|
|
9
|
+
def height; self[:Height]; end
|
|
10
|
+
def width2; self[:Width2]; end
|
|
11
|
+
def height2; self[:Height2]; end
|
|
12
|
+
def transfer_function; self[:TransferFunction]; end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|