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,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# EmbeddedFileParameterDictionary (s7.11.3.1). Per /EF entry
|
|
7
|
+
# /Params dict — checksum, size, dates, mac creator.
|
|
8
|
+
class EmbeddedFileParameter < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def size; self[:Size]; end
|
|
10
|
+
def creation_date; self[:CreationDate]; end
|
|
11
|
+
def modification_date; self[:ModDate]; end
|
|
12
|
+
def mac; self[:Mac]; end
|
|
13
|
+
def checksum; self[:CheckSum]; end
|
|
14
|
+
|
|
15
|
+
def has_checksum?
|
|
16
|
+
!!checksum
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def creation_time
|
|
20
|
+
time = creation_date
|
|
21
|
+
return nil unless time
|
|
22
|
+
|
|
23
|
+
time.is_a?(Time) ? time : parse_pdf_date(time.to_s)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def modification_time
|
|
27
|
+
time = modification_date
|
|
28
|
+
return nil unless time
|
|
29
|
+
|
|
30
|
+
time.is_a?(Time) ? time : parse_pdf_date(time.to_s)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def parse_pdf_date(str)
|
|
36
|
+
match = str.to_s.match(/^D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?/)
|
|
37
|
+
return nil unless match
|
|
38
|
+
|
|
39
|
+
Time.new(match[1].to_i, match[2].to_i, match[3].to_i,
|
|
40
|
+
(match[4] || 0).to_i, (match[5] || 0).to_i, (match[6] || 0).to_i,
|
|
41
|
+
"+00:00")
|
|
42
|
+
rescue StandardError
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -6,6 +6,44 @@ module Pdfrb
|
|
|
6
6
|
# Public-key security handler encryption dict (s7.6.5.1).
|
|
7
7
|
class EncryptionPublicKey < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "EncryptionPublicKey"
|
|
9
|
+
|
|
10
|
+
def filter; self[:Filter]; end
|
|
11
|
+
def version; self[:V]; end
|
|
12
|
+
def sub_filter; self[:SubFilter]; end
|
|
13
|
+
def length; self[:Length]; end
|
|
14
|
+
def recipients; self[:Recipients]; end
|
|
15
|
+
def encrypt_metadata?; truthy?(self[:EncryptMetadata]); end
|
|
16
|
+
|
|
17
|
+
def public_key?
|
|
18
|
+
filter&.to_sym == :AdobePubSec
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def s2?
|
|
22
|
+
sub_filter&.to_sym == :S2
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def s3?
|
|
26
|
+
sub_filter&.to_sym == :S3
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def s4?
|
|
30
|
+
sub_filter&.to_sym == :S4
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def recipient_count
|
|
34
|
+
return 0 unless recipients
|
|
35
|
+
|
|
36
|
+
arr = recipients.is_a?(Pdfrb::Model::PdfArray) ? recipients.to_a : recipients
|
|
37
|
+
arr.is_a?(Array) ? arr.size : 0
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def key_length_bytes
|
|
41
|
+
((length || 40) / 8)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def aes?
|
|
45
|
+
(version || 0) >= 4
|
|
46
|
+
end
|
|
9
47
|
end
|
|
10
48
|
end
|
|
11
49
|
end
|
|
@@ -6,6 +6,74 @@ module Pdfrb
|
|
|
6
6
|
# Standard security handler encryption dict (s7.6.3.4).
|
|
7
7
|
class EncryptionStandard < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "EncryptionStandard"
|
|
9
|
+
|
|
10
|
+
def filter; self[:Filter]; end
|
|
11
|
+
def sub_filter; self[:SubFilter]; end
|
|
12
|
+
def version; self[:V]; end
|
|
13
|
+
def revision; self[:R]; end
|
|
14
|
+
def length; self[:Length]; end
|
|
15
|
+
def permissions; self[:P]; end
|
|
16
|
+
def owner_password; self[:O]; end
|
|
17
|
+
def user_password; self[:U]; end
|
|
18
|
+
def encrypt_metadata?; self[:EncryptMetadata]; end
|
|
19
|
+
def recipient_info; self[:Recipients]; end
|
|
20
|
+
|
|
21
|
+
def key_length_bytes
|
|
22
|
+
((length || 40) / 8)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def aes?
|
|
26
|
+
(version || 0) >= 4
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def rc4?
|
|
30
|
+
(version || 0) < 4
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def public_key?
|
|
34
|
+
filter&.to_sym == :AdobePubSec
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def standard?
|
|
38
|
+
filter&.to_sym == :Standard
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def metadata_encrypted?
|
|
42
|
+
value = encrypt_metadata?
|
|
43
|
+
value.nil? || !!value
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def allow_print?
|
|
47
|
+
permissions&.anybits?(4)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def allow_modify_contents?
|
|
51
|
+
permissions&.anybits?(8)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def allow_copy?
|
|
55
|
+
permissions&.anybits?(16)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def allow_annotations?
|
|
59
|
+
permissions&.anybits?(32)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def allow_fill_in?
|
|
63
|
+
permissions&.anybits?(256)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def allow_extract?
|
|
67
|
+
permissions&.anybits?(512)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def allow_assemble?
|
|
71
|
+
permissions&.anybits?(1024)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def allow_print_high_res?
|
|
75
|
+
permissions&.anybits?(2048)
|
|
76
|
+
end
|
|
9
77
|
end
|
|
10
78
|
end
|
|
11
79
|
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Field MDP Transform Parameters (s12.7.6.5). Specifies which
|
|
7
|
+
# fields are locked by a FieldMDP signature reference.
|
|
8
|
+
class FieldMDPTransformParameters < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def type; self[:Type]; end
|
|
10
|
+
def action; self[:Action]&.to_sym; end
|
|
11
|
+
def fields; self[:Fields]; end
|
|
12
|
+
|
|
13
|
+
def all_locked?; action == :All; end
|
|
14
|
+
def include_locked?; action == :Include; end
|
|
15
|
+
def exclude_locked?; action == :Exclude; end
|
|
16
|
+
|
|
17
|
+
def locked_field_names
|
|
18
|
+
return [] unless fields
|
|
19
|
+
|
|
20
|
+
arr = fields.is_a?(Pdfrb::Model::PdfArray) ? fields.to_a : fields
|
|
21
|
+
arr.is_a?(Array) ? arr : []
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# File-attachment annotation (s12.5.6.15). Embedded file displayed
|
|
7
|
+
# as a paper-clip icon.
|
|
8
|
+
class FileAttachmentAnnotation < MarkupAnnotation
|
|
9
|
+
def embedded_file; self[:FS]; end
|
|
10
|
+
def name; self[:Name]; end
|
|
11
|
+
|
|
12
|
+
def icon_name
|
|
13
|
+
(name || :PushPin).to_sym
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def has_attachment?
|
|
17
|
+
!!embedded_file
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def resolved_file_spec
|
|
21
|
+
ref = embedded_file
|
|
22
|
+
return nil unless ref && document
|
|
23
|
+
|
|
24
|
+
document.object(ref)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Filespec EF dict (s7.11.2.2). Maps variant file type to
|
|
7
|
+
# EmbeddedFile stream reference: /F (type 1), /UF (Unicode),
|
|
8
|
+
# /DOS, /Mac, /Unix.
|
|
9
|
+
class FileSpecEF < Pdfrb::Model::Cos::Dictionary
|
|
10
|
+
def primary_file; self[:F]; end
|
|
11
|
+
def unicode_file; self[:UF]; end
|
|
12
|
+
def dos_file; self[:DOS]; end
|
|
13
|
+
def mac_file; self[:Mac]; end
|
|
14
|
+
def unix_file; self[:Unix]; end
|
|
15
|
+
|
|
16
|
+
def any?
|
|
17
|
+
!!(primary_file || unicode_file || dos_file || mac_file || unix_file)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Filespec RF dict (s7.11.2.3). Related files name tree.
|
|
7
|
+
class FileSpecRF < Pdfrb::Model::Cos::Dictionary
|
|
8
|
+
def related_files; self[:Names]; end
|
|
9
|
+
|
|
10
|
+
def each_related(&block)
|
|
11
|
+
return enum_for(:each_related) unless block
|
|
12
|
+
|
|
13
|
+
return unless related_files
|
|
14
|
+
|
|
15
|
+
arr = related_files.is_a?(Pdfrb::Model::PdfArray) ? related_files.to_a : related_files
|
|
16
|
+
arr.each_slice(2, &block)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -6,6 +6,49 @@ module Pdfrb
|
|
|
6
6
|
# File specification (s7.11.2). /FS, /F, /UF, /EF, /Desc, etc.
|
|
7
7
|
class FileSpecification < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "FileSpecification"
|
|
9
|
+
register_type :Filespec
|
|
10
|
+
|
|
11
|
+
def file_system; self[:FS]; end
|
|
12
|
+
def file; self[:F]; end
|
|
13
|
+
def unicode_file; self[:UF]; end
|
|
14
|
+
def dos_file; self[:DOS]; end
|
|
15
|
+
def mac_file; self[:Mac]; end
|
|
16
|
+
def unix_file; self[:Unix]; end
|
|
17
|
+
def id; self[:ID]; end
|
|
18
|
+
def volatile; self[:V]; end
|
|
19
|
+
def embedded_file; self[:EF]; end
|
|
20
|
+
def related_files; self[:RF]; end
|
|
21
|
+
def description; self[:Desc]; end
|
|
22
|
+
def collection; self[:Collection]; end
|
|
23
|
+
def type; self[:Type]; end
|
|
24
|
+
|
|
25
|
+
def simple?
|
|
26
|
+
!!(file || unicode_file)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def url?
|
|
30
|
+
file_system&.to_sym == :URL
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def effective_filename
|
|
34
|
+
unicode_file || file || dos_file || mac_file || unix_file
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def effective_embedded_file
|
|
38
|
+
return nil unless embedded_file
|
|
39
|
+
|
|
40
|
+
mapping = if embedded_file.is_a?(Pdfrb::Model::Reference) && document
|
|
41
|
+
document.object(embedded_file)
|
|
42
|
+
else
|
|
43
|
+
embedded_file
|
|
44
|
+
end
|
|
45
|
+
return nil unless mapping.is_a?(Hash)
|
|
46
|
+
|
|
47
|
+
ref = mapping[:UF] || mapping[:F]
|
|
48
|
+
return nil unless ref && document
|
|
49
|
+
|
|
50
|
+
document.object(ref)
|
|
51
|
+
end
|
|
9
52
|
end
|
|
10
53
|
end
|
|
11
54
|
end
|
|
@@ -8,6 +8,60 @@ module Pdfrb
|
|
|
8
8
|
# /AuthCode, /AdditionalStreams, /DocChecksum.
|
|
9
9
|
class FileTrailer < Pdfrb::Model::Cos::Dictionary
|
|
10
10
|
arlington_object "FileTrailer"
|
|
11
|
+
register_type :FileTrailer
|
|
12
|
+
|
|
13
|
+
def size; self[:Size]; end
|
|
14
|
+
def prev; self[:Prev]; end
|
|
15
|
+
def root; self[:Root]; end
|
|
16
|
+
def encrypt; self[:Encrypt]; end
|
|
17
|
+
def info; self[:Info]; end
|
|
18
|
+
def id; self[:ID]; end
|
|
19
|
+
def xref_stream_offset; self[:XRefStm]; end
|
|
20
|
+
def doc_checksum; self[:DocChecksum]; end
|
|
21
|
+
|
|
22
|
+
def encrypted?
|
|
23
|
+
!!encrypt
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def incremental?
|
|
27
|
+
!!prev
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def has_id?
|
|
31
|
+
id.is_a?(Array) && id.size == 2
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def original_id
|
|
35
|
+
return nil unless has_id?
|
|
36
|
+
|
|
37
|
+
arr = id.is_a?(Pdfrb::Model::PdfArray) ? id.to_a : id
|
|
38
|
+
arr[0]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def current_id
|
|
42
|
+
return nil unless has_id?
|
|
43
|
+
|
|
44
|
+
arr = id.is_a?(Pdfrb::Model::PdfArray) ? id.to_a : id
|
|
45
|
+
arr[1] || arr[0]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def resolved_root
|
|
49
|
+
return nil unless root && document
|
|
50
|
+
|
|
51
|
+
document.object(root)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def resolved_info
|
|
55
|
+
return nil unless info && document
|
|
56
|
+
|
|
57
|
+
document.object(info)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def resolved_encrypt
|
|
61
|
+
return nil unless encrypt && document
|
|
62
|
+
|
|
63
|
+
document.object(encrypt)
|
|
64
|
+
end
|
|
11
65
|
end
|
|
12
66
|
end
|
|
13
67
|
end
|
|
@@ -3,10 +3,81 @@
|
|
|
3
3
|
module Pdfrb
|
|
4
4
|
module Model
|
|
5
5
|
module Type
|
|
6
|
-
# Base Font dict (s9.6.2). Concrete subclasses: FontType1,
|
|
7
|
-
# FontTrueType, FontType0, CIDFont, FontType3.
|
|
8
6
|
class Font < Pdfrb::Model::Cos::Dictionary
|
|
9
7
|
arlington_object "FontMap"
|
|
8
|
+
|
|
9
|
+
def subtype; self[:Subtype]; end
|
|
10
|
+
def base_font; self[:BaseFont]; end
|
|
11
|
+
def encoding; self[:Encoding]; end
|
|
12
|
+
def first_char; self[:FirstChar]; end
|
|
13
|
+
def last_char; self[:LastChar]; end
|
|
14
|
+
def widths; self[:Widths]; end
|
|
15
|
+
def to_unicode; self[:ToUnicode]; end
|
|
16
|
+
|
|
17
|
+
def font_descriptor
|
|
18
|
+
ref = self[:FontDescriptor]
|
|
19
|
+
return nil unless ref
|
|
20
|
+
|
|
21
|
+
document ? document.object(ref) : ref
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def embedded?
|
|
25
|
+
fd = font_descriptor
|
|
26
|
+
return false unless fd
|
|
27
|
+
|
|
28
|
+
!!(fd.value[:FontFile] || fd.value[:FontFile2] || fd.value[:FontFile3])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def font_file
|
|
32
|
+
fd = font_descriptor
|
|
33
|
+
return nil unless fd
|
|
34
|
+
|
|
35
|
+
fd.value[:FontFile2] || fd.value[:FontFile3] || fd.value[:FontFile]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def simple?
|
|
39
|
+
[:Type1, :TrueType, :MMType1].include?(subtype&.to_sym)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def cid?
|
|
43
|
+
subtype&.to_sym == :Type0
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def type3?
|
|
47
|
+
subtype&.to_sym == :Type3
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def descendant_font
|
|
51
|
+
return nil unless cid?
|
|
52
|
+
|
|
53
|
+
ref = self[:DescendantFonts]
|
|
54
|
+
return nil unless ref
|
|
55
|
+
|
|
56
|
+
arr = if ref.is_a?(Pdfrb::Model::Reference) && document
|
|
57
|
+
document.object(ref)
|
|
58
|
+
else
|
|
59
|
+
ref
|
|
60
|
+
end
|
|
61
|
+
return nil unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
62
|
+
|
|
63
|
+
first = arr[0]
|
|
64
|
+
return nil unless first
|
|
65
|
+
|
|
66
|
+
if first.is_a?(Pdfrb::Model::Reference) && document
|
|
67
|
+
document.object(first)
|
|
68
|
+
else
|
|
69
|
+
first
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def glyph_width(char_code)
|
|
74
|
+
return nil unless widths && first_char && last_char
|
|
75
|
+
|
|
76
|
+
idx = char_code - first_char
|
|
77
|
+
return nil if idx.negative? || idx >= widths.length
|
|
78
|
+
|
|
79
|
+
widths[idx]
|
|
80
|
+
end
|
|
10
81
|
end
|
|
11
82
|
end
|
|
12
83
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Font CIDType0 (s9.7.3). CIDFontType0 — CID-keyed font based
|
|
7
|
+
# on CFF (Compact Font Format).
|
|
8
|
+
class FontCIDType0 < CIDFont
|
|
9
|
+
def cid_subtype; self[:Subtype]&.to_sym; end
|
|
10
|
+
|
|
11
|
+
def cff?
|
|
12
|
+
cid_subtype == :CIDFontType0
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Font CIDType2 (s9.7.3). CIDFontType2 — CID-keyed font based
|
|
7
|
+
# on TrueType outlines.
|
|
8
|
+
class FontCIDType2 < CIDFont
|
|
9
|
+
def cid_subtype; self[:Subtype]&.to_sym; end
|
|
10
|
+
|
|
11
|
+
def true_type?
|
|
12
|
+
cid_subtype == :CIDFontType2
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -6,6 +6,53 @@ module Pdfrb
|
|
|
6
6
|
# Font descriptor (s9.8). Carries metrics + embedded font file.
|
|
7
7
|
class FontDescriptor < Pdfrb::Model::Cos::Dictionary
|
|
8
8
|
arlington_object "FontDescriptorType1"
|
|
9
|
+
|
|
10
|
+
def font_name; self[:FontName]; end
|
|
11
|
+
def family_name; self[:FontFamily]; end
|
|
12
|
+
def font_stretch; self[:FontStretch]; end
|
|
13
|
+
def font_weight; self[:FontWeight]; end
|
|
14
|
+
def flags; self[:Flags]; end
|
|
15
|
+
def font_bbox; self[:FontBBox]; end
|
|
16
|
+
def italic_angle; self[:ItalicAngle]; end
|
|
17
|
+
def ascent; self[:Ascent]; end
|
|
18
|
+
def descent; self[:Descent]; end
|
|
19
|
+
def cap_height; self[:CapHeight]; end
|
|
20
|
+
def x_height; self[:XHeight]; end
|
|
21
|
+
def stem_v; self[:StemV]; end
|
|
22
|
+
def stem_h; self[:StemH]; end
|
|
23
|
+
def avg_width; self[:AvgWidth]; end
|
|
24
|
+
def max_width; self[:MaxWidth]; end
|
|
25
|
+
def missing_width; self[:MissingWidth]; end
|
|
26
|
+
def char_set; self[:CharSet]; end
|
|
27
|
+
|
|
28
|
+
def font_file; self[:FontFile]; end
|
|
29
|
+
def font_file2; self[:FontFile2]; end
|
|
30
|
+
def font_file3; self[:FontFile3]; end
|
|
31
|
+
|
|
32
|
+
def embedded?
|
|
33
|
+
!!(font_file || font_file2 || font_file3)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def font_file_reference
|
|
37
|
+
font_file2 || font_file3 || font_file
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def resolved_font_file
|
|
41
|
+
ref = font_file_reference
|
|
42
|
+
return nil unless ref && document
|
|
43
|
+
|
|
44
|
+
document.object(ref)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def fixed_pitch?; flags&.anybits?(1); end
|
|
48
|
+
def serif?; flags&.anybits?(2); end
|
|
49
|
+
def symbolic?; flags&.anybits?(4); end
|
|
50
|
+
def script?; flags&.anybits?(8); end
|
|
51
|
+
def nonsymbolic?; flags&.anybits?(32); end
|
|
52
|
+
def italic?; flags&.anybits?(64); end
|
|
53
|
+
def all_cap?; flags&.anybits?(0x10000); end
|
|
54
|
+
def small_cap?; flags&.anybits?(0x20000); end
|
|
55
|
+
def force_bold?; flags&.anybits?(0x40000); end
|
|
9
56
|
end
|
|
10
57
|
end
|
|
11
58
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Font Descriptor CIDType0 (s9.8). Specialised metrics for
|
|
7
|
+
# CIDFontType0 (CFF-based CID fonts).
|
|
8
|
+
class FontDescriptorCIDType0 < FontDescriptor
|
|
9
|
+
def cid_font_type; 0; end
|
|
10
|
+
|
|
11
|
+
def cff?; true; end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Font Descriptor CIDType2 (s9.8). Specialised metrics for
|
|
7
|
+
# CIDFontType2 (TrueType-based CID fonts).
|
|
8
|
+
class FontDescriptorCIDType2 < FontDescriptor
|
|
9
|
+
def cid_font_type; 2; end
|
|
10
|
+
|
|
11
|
+
def true_type?; true; end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Font Encoding dict (s9.6.1). Base encoding + per-glyph differences
|
|
7
|
+
# table for Type 1 fonts.
|
|
8
|
+
class FontEncoding < Pdfrb::Model::Cos::Dictionary
|
|
9
|
+
def base_encoding; self[:BaseEncoding]&.to_sym; end
|
|
10
|
+
def differences; self[:Differences]; end
|
|
11
|
+
|
|
12
|
+
def win_ansi?; base_encoding == :WinAnsiEncoding; end
|
|
13
|
+
def mac_roman?; base_encoding == :MacRomanEncoding; end
|
|
14
|
+
def mac_expert?; base_encoding == :MacExpertEncoding; end
|
|
15
|
+
def standard?; base_encoding == :StandardEncoding; end
|
|
16
|
+
|
|
17
|
+
def has_differences?
|
|
18
|
+
!!differences && (!differences.is_a?(Array) || !differences.empty?)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def each_difference(&block)
|
|
22
|
+
return enum_for(:each_difference) unless block
|
|
23
|
+
|
|
24
|
+
return unless differences.is_a?(Array)
|
|
25
|
+
|
|
26
|
+
current_code = nil
|
|
27
|
+
differences.each do |entry|
|
|
28
|
+
if entry.is_a?(Integer)
|
|
29
|
+
current_code = entry
|
|
30
|
+
else
|
|
31
|
+
yield current_code, entry
|
|
32
|
+
current_code = current_code ? current_code + 1 : nil
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def glyph_for(char_code)
|
|
38
|
+
result = nil
|
|
39
|
+
each_difference do |code, name|
|
|
40
|
+
result = name if code == char_code
|
|
41
|
+
end
|
|
42
|
+
result
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# Type 1 font file stream (s7.8.2). Holds the Type1 / Type1C
|
|
7
|
+
# font program. Referenced by FontDescriptor /FontFile.
|
|
8
|
+
class FontFile < Pdfrb::Model::Cos::Stream
|
|
9
|
+
def length1; self[:Length1]; end
|
|
10
|
+
def length2; self[:Length2]; end
|
|
11
|
+
def length3; self[:Length3]; end
|
|
12
|
+
def subtype; self[:Subtype]; end
|
|
13
|
+
|
|
14
|
+
def has_clear_text_mark?
|
|
15
|
+
!!length1 && length1.positive?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def has_encrypted_portion?
|
|
19
|
+
!!length2 && length2.positive?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def font_program
|
|
23
|
+
decoded_stream&.force_encoding(Encoding::BINARY)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Model
|
|
5
|
+
module Type
|
|
6
|
+
# TrueType font file stream (s7.8.3). Holds the TTF/OTF program.
|
|
7
|
+
# Referenced by FontDescriptor /FontFile2.
|
|
8
|
+
class FontFile2 < Pdfrb::Model::Cos::Stream
|
|
9
|
+
def length1; self[:Length1]; end
|
|
10
|
+
def subtype; self[:Subtype]; end
|
|
11
|
+
|
|
12
|
+
def font_program
|
|
13
|
+
decoded_stream&.force_encoding(Encoding::BINARY)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def magic
|
|
17
|
+
return nil unless stream
|
|
18
|
+
|
|
19
|
+
stream.byteslice(0, 4)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def truetype?
|
|
23
|
+
magic == "\x00\x01\x00\x00".b || magic == "true".b
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def opentype?
|
|
27
|
+
magic == "OTTO".b
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|