edgeparse 0.1.1__tar.gz → 0.2.0__tar.gz

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.
Files changed (221) hide show
  1. {edgeparse-0.1.1 → edgeparse-0.2.0}/Cargo.lock +161 -6
  2. {edgeparse-0.1.1 → edgeparse-0.2.0}/Cargo.toml +2 -2
  3. {edgeparse-0.1.1 → edgeparse-0.2.0}/PKG-INFO +1 -1
  4. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/Cargo.toml +7 -5
  5. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/lib.rs +87 -0
  6. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/mod.rs +1 -0
  7. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/loader.rs +34 -0
  8. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/mod.rs +1 -0
  9. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/parallel.rs +51 -12
  10. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/reading_order.rs +13 -2
  11. edgeparse-0.1.1/crates/pdf-cos/Cargo.lock +0 -2262
  12. {edgeparse-0.1.1 → edgeparse-0.2.0}/README.md +0 -0
  13. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/README.md +0 -0
  14. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/api/batch.rs +0 -0
  15. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/api/config.rs +0 -0
  16. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/api/config_loader.rs +0 -0
  17. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/api/filter.rs +0 -0
  18. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/api/mod.rs +0 -0
  19. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/hybrid.rs +0 -0
  20. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/bbox.rs +0 -0
  21. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/chunks.rs +0 -0
  22. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/content.rs +0 -0
  23. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/document.rs +0 -0
  24. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/enums.rs +0 -0
  25. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/list.rs +0 -0
  26. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/mod.rs +0 -0
  27. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/semantic.rs +0 -0
  28. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/table.rs +0 -0
  29. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/models/text.rs +0 -0
  30. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/csv.rs +0 -0
  31. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/docx.rs +0 -0
  32. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/html.rs +0 -0
  33. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/json.rs +0 -0
  34. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/legacy_json.rs +0 -0
  35. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/markdown.rs +0 -0
  36. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/text.rs +0 -0
  37. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/output/toc_builder.rs +0 -0
  38. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/annotation_enrichment.rs +0 -0
  39. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/annotation_extractor.rs +0 -0
  40. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/bookmark_extractor.rs +0 -0
  41. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/chunk_parser.rs +0 -0
  42. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/data/glyphlist.txt +0 -0
  43. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/encryption.rs +0 -0
  44. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/font.rs +0 -0
  45. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/form_extractor.rs +0 -0
  46. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/graphics_state.rs +0 -0
  47. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/hyperlink_extractor.rs +0 -0
  48. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/image_extractor.rs +0 -0
  49. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/line_extractor.rs +0 -0
  50. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/metadata_writer.rs +0 -0
  51. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/page_info.rs +0 -0
  52. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/raster_table_ocr.rs +0 -0
  53. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pdf/text_extractor.rs +0 -0
  54. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/error_recovery.rs +0 -0
  55. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/logging.rs +0 -0
  56. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/mod.rs +0 -0
  57. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/orchestrator.rs +0 -0
  58. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/boxed_heading_promoter.rs +0 -0
  59. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/caption_linker.rs +0 -0
  60. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/cluster_table_detector.rs +0 -0
  61. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/column_detector.rs +0 -0
  62. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/content_filter.rs +0 -0
  63. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/content_sanitizer.rs +0 -0
  64. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/cross_page_linker.rs +0 -0
  65. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/figure_detector.rs +0 -0
  66. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/footnote_detector.rs +0 -0
  67. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/footnote_linker.rs +0 -0
  68. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/header_footer.rs +0 -0
  69. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/heading_detector.rs +0 -0
  70. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/id_assignment.rs +0 -0
  71. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/list_detector.rs +0 -0
  72. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/list_pass2.rs +0 -0
  73. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/mod.rs +0 -0
  74. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/nesting_level.rs +0 -0
  75. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/output_builder.rs +0 -0
  76. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/paragraph_detector.rs +0 -0
  77. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/table_content_assigner.rs +0 -0
  78. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/table_detector.rs +0 -0
  79. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/text_block_grouper.rs +0 -0
  80. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/text_line_grouper.rs +0 -0
  81. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/toc_detector.rs +0 -0
  82. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/pipeline/stages/watermark_detector.rs +0 -0
  83. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/tagged/mod.rs +0 -0
  84. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/tagged/processor.rs +0 -0
  85. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/tagged/struct_tree.rs +0 -0
  86. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/diff.rs +0 -0
  87. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/font_metrics_cache.rs +0 -0
  88. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/image_dedup.rs +0 -0
  89. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/language_detector.rs +0 -0
  90. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/layout_analysis.rs +0 -0
  91. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/mod.rs +0 -0
  92. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/page_range.rs +0 -0
  93. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/sanitizer.rs +0 -0
  94. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/statistics.rs +0 -0
  95. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/text_normalizer.rs +0 -0
  96. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/xref_index.rs +0 -0
  97. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/src/utils/xycut.rs +0 -0
  98. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/tests/integration_tests.rs +0 -0
  99. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-core/tests/perf_benchmarks.rs +0 -0
  100. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-python/Cargo.toml +0 -0
  101. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/edgeparse-python/src/lib.rs +0 -0
  102. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.cargo_vcs_info.json +0 -0
  103. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.chglog/CHANGELOG.tpl.md +0 -0
  104. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.chglog/config.yml +0 -0
  105. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.editorconfig +0 -0
  106. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.gitattributes +0 -0
  107. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.github/workflows/ci.yml +0 -0
  108. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.gitignore +0 -0
  109. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.vscode/launch.json +0 -0
  110. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/.vscode/settings.json +0 -0
  111. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/CHANGELOG.md +0 -0
  112. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/Cargo.toml +0 -0
  113. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/LICENSE +0 -0
  114. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/README.md +0 -0
  115. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/pdf_icon.jpg +0 -0
  116. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/L16.png +0 -0
  117. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/L8.jpg +0 -0
  118. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/La16.png +0 -0
  119. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/La8.png +0 -0
  120. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/Rgb16.png +0 -0
  121. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/Rgb8.jpg +0 -0
  122. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/Rgba16.png +0 -0
  123. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/assets/supported_color_type/Rgba8.png +0 -0
  124. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/benches/datetime.rs +0 -0
  125. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/benches/parse.rs +0 -0
  126. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/add_barcode.rs +0 -0
  127. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/analyze_object_streams.rs +0 -0
  128. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/analyze_page_contents.rs +0 -0
  129. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/analyze_pdf.rs +0 -0
  130. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/analyze_references.rs +0 -0
  131. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/check_raw_objstream.rs +0 -0
  132. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/compress_existing_pdf.rs +0 -0
  133. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/create.rs +0 -0
  134. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/create_text_heavy_pdf.rs +0 -0
  135. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/debug_compression_detailed.rs +0 -0
  136. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/debug_compression_full.rs +0 -0
  137. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/debug_object_stream.rs +0 -0
  138. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/debug_save_with_objstreams.rs +0 -0
  139. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/decrypt.rs +0 -0
  140. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/encrypt.rs +0 -0
  141. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/extract_text.rs +0 -0
  142. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/extract_toc.rs +0 -0
  143. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/final_compression_test.rs +0 -0
  144. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/inspect_object_stream.rs +0 -0
  145. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/merge.rs +0 -0
  146. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/object_streams.rs +0 -0
  147. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/print_annotations.rs +0 -0
  148. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/replace_partial_text.rs +0 -0
  149. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/rotate.rs +0 -0
  150. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_better_compression.rs +0 -0
  151. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_decryption.rs +0 -0
  152. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_direct_objstream.rs +0 -0
  153. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_filter_roundtrip.rs +0 -0
  154. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_metadata.rs +0 -0
  155. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_object_stream_creation.rs +0 -0
  156. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_object_stream_roundtrip.rs +0 -0
  157. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_real_pdf_compression_with_fix.rs +0 -0
  158. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/test_structural_compression.rs +0 -0
  159. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/verify_decryption.rs +0 -0
  160. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/verify_page_compression.rs +0 -0
  161. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/verify_pdf.rs +0 -0
  162. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/examples/verify_trailer_compression_fix.rs +0 -0
  163. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/rustfmt.toml +0 -0
  164. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/bookmarks.rs +0 -0
  165. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/cmap_section.rs +0 -0
  166. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/common_data_structures/mod.rs +0 -0
  167. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/content.rs +0 -0
  168. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/creator.rs +0 -0
  169. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/datetime.rs +0 -0
  170. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/destinations.rs +0 -0
  171. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/document.rs +0 -0
  172. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encodings/cmap.rs +0 -0
  173. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encodings/glyphnames.rs +0 -0
  174. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encodings/mappings.rs +0 -0
  175. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encodings/mod.rs +0 -0
  176. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encryption/algorithms.rs +0 -0
  177. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encryption/crypt_filters.rs +0 -0
  178. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encryption/pkcs5.rs +0 -0
  179. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encryption/rc4.rs +0 -0
  180. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/encryption.rs +0 -0
  181. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/error.rs +0 -0
  182. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/filters/mod.rs +0 -0
  183. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/filters/png.rs +0 -0
  184. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/font.rs +0 -0
  185. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/incremental_document.rs +0 -0
  186. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/lib.rs +0 -0
  187. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/object.rs +0 -0
  188. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/object_stream.rs +0 -0
  189. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/outlines.rs +0 -0
  190. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/parser/cmap_parser.rs +0 -0
  191. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/parser/mod.rs +0 -0
  192. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/parser_aux.rs +0 -0
  193. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/processor.rs +0 -0
  194. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/reader.rs +0 -0
  195. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/save_options.rs +0 -0
  196. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/toc.rs +0 -0
  197. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/writer.rs +0 -0
  198. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/xobject.rs +0 -0
  199. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/src/xref.rs +0 -0
  200. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/annotation.rs +0 -0
  201. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/catalog_compression_integration_test.rs +0 -0
  202. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/decryption.rs +0 -0
  203. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/extract_test.rs +0 -0
  204. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/font_test.rs +0 -0
  205. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/incremental_document.rs +0 -0
  206. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/metadata_test.rs +0 -0
  207. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/modify.rs +0 -0
  208. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/object_stream_comprehensive_test.rs +0 -0
  209. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/object_stream_edge_cases_test.rs +0 -0
  210. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/object_stream_methods_test.rs +0 -0
  211. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/object_stream_performance_test.rs +0 -0
  212. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/resources/fonts/Montserrat-Regular.ttf +0 -0
  213. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/simple_object_stream_test.rs +0 -0
  214. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/trailer_reference_compression_test.rs +0 -0
  215. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/unicode.rs +0 -0
  216. {edgeparse-0.1.1 → edgeparse-0.2.0}/crates/pdf-cos/tests/utils.rs +0 -0
  217. {edgeparse-0.1.1 → edgeparse-0.2.0}/edgeparse/__init__.py +0 -0
  218. {edgeparse-0.1.1 → edgeparse-0.2.0}/edgeparse/_types.py +0 -0
  219. {edgeparse-0.1.1 → edgeparse-0.2.0}/edgeparse/cli.py +0 -0
  220. {edgeparse-0.1.1 → edgeparse-0.2.0}/edgeparse/py.typed +0 -0
  221. {edgeparse-0.1.1 → edgeparse-0.2.0}/pyproject.toml +0 -0
@@ -170,6 +170,17 @@ dependencies = [
170
170
  "stable_deref_trait",
171
171
  ]
172
172
 
173
+ [[package]]
174
+ name = "async-trait"
175
+ version = "0.1.89"
176
+ source = "registry+https://github.com/rust-lang/crates.io-index"
177
+ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
178
+ dependencies = [
179
+ "proc-macro2 1.0.106",
180
+ "quote 1.0.45",
181
+ "syn",
182
+ ]
183
+
173
184
  [[package]]
174
185
  name = "atomic-waker"
175
186
  version = "1.1.2"
@@ -306,6 +317,12 @@ version = "1.11.1"
306
317
  source = "registry+https://github.com/rust-lang/crates.io-index"
307
318
  checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
308
319
 
320
+ [[package]]
321
+ name = "cast"
322
+ version = "0.3.0"
323
+ source = "registry+https://github.com/rust-lang/crates.io-index"
324
+ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
325
+
309
326
  [[package]]
310
327
  name = "cbc"
311
328
  version = "0.1.2"
@@ -422,6 +439,17 @@ dependencies = [
422
439
  "wasm-bindgen",
423
440
  ]
424
441
 
442
+ [[package]]
443
+ name = "console_log"
444
+ version = "1.0.0"
445
+ source = "registry+https://github.com/rust-lang/crates.io-index"
446
+ checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f"
447
+ dependencies = [
448
+ "log",
449
+ "wasm-bindgen",
450
+ "web-sys",
451
+ ]
452
+
425
453
  [[package]]
426
454
  name = "convert_case"
427
455
  version = "0.6.0"
@@ -608,7 +636,7 @@ dependencies = [
608
636
 
609
637
  [[package]]
610
638
  name = "edgeparse-cli"
611
- version = "0.1.1"
639
+ version = "0.2.0"
612
640
  dependencies = [
613
641
  "anyhow",
614
642
  "clap",
@@ -622,7 +650,7 @@ dependencies = [
622
650
 
623
651
  [[package]]
624
652
  name = "edgeparse-core"
625
- version = "0.1.1"
653
+ version = "0.2.0"
626
654
  dependencies = [
627
655
  "anyhow",
628
656
  "base64",
@@ -646,7 +674,7 @@ dependencies = [
646
674
 
647
675
  [[package]]
648
676
  name = "edgeparse-node"
649
- version = "0.1.1"
677
+ version = "0.2.0"
650
678
  dependencies = [
651
679
  "edgeparse-core",
652
680
  "napi",
@@ -658,13 +686,30 @@ dependencies = [
658
686
 
659
687
  [[package]]
660
688
  name = "edgeparse-python"
661
- version = "0.1.1"
689
+ version = "0.2.0"
662
690
  dependencies = [
663
691
  "edgeparse-core",
664
692
  "pyo3",
665
693
  "serde_json",
666
694
  ]
667
695
 
696
+ [[package]]
697
+ name = "edgeparse-wasm"
698
+ version = "0.2.0"
699
+ dependencies = [
700
+ "console_error_panic_hook",
701
+ "console_log",
702
+ "edgeparse-core",
703
+ "js-sys",
704
+ "log",
705
+ "serde",
706
+ "serde-wasm-bindgen",
707
+ "serde_json",
708
+ "wasm-bindgen",
709
+ "wasm-bindgen-test 0.3.64",
710
+ "web-sys",
711
+ ]
712
+
668
713
  [[package]]
669
714
  name = "either"
670
715
  version = "1.15.0"
@@ -1472,6 +1517,12 @@ dependencies = [
1472
1517
  "windows-link",
1473
1518
  ]
1474
1519
 
1520
+ [[package]]
1521
+ name = "libm"
1522
+ version = "0.2.16"
1523
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1524
+ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
1525
+
1475
1526
  [[package]]
1476
1527
  name = "libredox"
1477
1528
  version = "0.1.14"
@@ -1558,6 +1609,16 @@ version = "0.3.17"
1558
1609
  source = "registry+https://github.com/rust-lang/crates.io-index"
1559
1610
  checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1560
1611
 
1612
+ [[package]]
1613
+ name = "minicov"
1614
+ version = "0.3.8"
1615
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1616
+ checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d"
1617
+ dependencies = [
1618
+ "cc",
1619
+ "walkdir",
1620
+ ]
1621
+
1561
1622
  [[package]]
1562
1623
  name = "miniz_oxide"
1563
1624
  version = "0.8.9"
@@ -1695,6 +1756,15 @@ version = "0.3.0"
1695
1756
  source = "registry+https://github.com/rust-lang/crates.io-index"
1696
1757
  checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
1697
1758
 
1759
+ [[package]]
1760
+ name = "nu-ansi-term"
1761
+ version = "0.50.3"
1762
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1763
+ checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
1764
+ dependencies = [
1765
+ "windows-sys 0.61.2",
1766
+ ]
1767
+
1698
1768
  [[package]]
1699
1769
  name = "num-bigint"
1700
1770
  version = "0.4.6"
@@ -1749,6 +1819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1749
1819
  checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1750
1820
  dependencies = [
1751
1821
  "autocfg",
1822
+ "libm",
1752
1823
  ]
1753
1824
 
1754
1825
  [[package]]
@@ -1763,6 +1834,12 @@ version = "1.70.2"
1763
1834
  source = "registry+https://github.com/rust-lang/crates.io-index"
1764
1835
  checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
1765
1836
 
1837
+ [[package]]
1838
+ name = "oorandom"
1839
+ version = "11.1.5"
1840
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1841
+ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
1842
+
1766
1843
  [[package]]
1767
1844
  name = "openssl"
1768
1845
  version = "0.10.76"
@@ -1894,7 +1971,7 @@ dependencies = [
1894
1971
  "time",
1895
1972
  "tokio",
1896
1973
  "ttf-parser",
1897
- "wasm-bindgen-test",
1974
+ "wasm-bindgen-test 0.2.50",
1898
1975
  "weezl",
1899
1976
  ]
1900
1977
 
@@ -2426,6 +2503,15 @@ version = "1.0.23"
2426
2503
  source = "registry+https://github.com/rust-lang/crates.io-index"
2427
2504
  checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
2428
2505
 
2506
+ [[package]]
2507
+ name = "same-file"
2508
+ version = "1.0.6"
2509
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2510
+ checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
2511
+ dependencies = [
2512
+ "winapi-util",
2513
+ ]
2514
+
2429
2515
  [[package]]
2430
2516
  name = "schannel"
2431
2517
  version = "0.1.29"
@@ -2486,6 +2572,17 @@ dependencies = [
2486
2572
  "serde_derive",
2487
2573
  ]
2488
2574
 
2575
+ [[package]]
2576
+ name = "serde-wasm-bindgen"
2577
+ version = "0.6.5"
2578
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2579
+ checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
2580
+ dependencies = [
2581
+ "js-sys",
2582
+ "serde",
2583
+ "wasm-bindgen",
2584
+ ]
2585
+
2489
2586
  [[package]]
2490
2587
  name = "serde_core"
2491
2588
  version = "1.0.228"
@@ -3042,6 +3139,16 @@ version = "0.9.5"
3042
3139
  source = "registry+https://github.com/rust-lang/crates.io-index"
3043
3140
  checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
3044
3141
 
3142
+ [[package]]
3143
+ name = "walkdir"
3144
+ version = "2.5.0"
3145
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3146
+ checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
3147
+ dependencies = [
3148
+ "same-file",
3149
+ "winapi-util",
3150
+ ]
3151
+
3045
3152
  [[package]]
3046
3153
  name = "want"
3047
3154
  version = "0.3.1"
@@ -3159,7 +3266,29 @@ dependencies = [
3159
3266
  "scoped-tls",
3160
3267
  "wasm-bindgen",
3161
3268
  "wasm-bindgen-futures 0.3.27",
3162
- "wasm-bindgen-test-macro",
3269
+ "wasm-bindgen-test-macro 0.2.50",
3270
+ ]
3271
+
3272
+ [[package]]
3273
+ name = "wasm-bindgen-test"
3274
+ version = "0.3.64"
3275
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3276
+ checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe"
3277
+ dependencies = [
3278
+ "async-trait",
3279
+ "cast",
3280
+ "js-sys",
3281
+ "libm",
3282
+ "minicov",
3283
+ "nu-ansi-term",
3284
+ "num-traits",
3285
+ "oorandom",
3286
+ "serde",
3287
+ "serde_json",
3288
+ "wasm-bindgen",
3289
+ "wasm-bindgen-futures 0.4.64",
3290
+ "wasm-bindgen-test-macro 0.3.64",
3291
+ "wasm-bindgen-test-shared",
3163
3292
  ]
3164
3293
 
3165
3294
  [[package]]
@@ -3172,6 +3301,23 @@ dependencies = [
3172
3301
  "quote 0.6.13",
3173
3302
  ]
3174
3303
 
3304
+ [[package]]
3305
+ name = "wasm-bindgen-test-macro"
3306
+ version = "0.3.64"
3307
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3308
+ checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd"
3309
+ dependencies = [
3310
+ "proc-macro2 1.0.106",
3311
+ "quote 1.0.45",
3312
+ "syn",
3313
+ ]
3314
+
3315
+ [[package]]
3316
+ name = "wasm-bindgen-test-shared"
3317
+ version = "0.2.114"
3318
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3319
+ checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e"
3320
+
3175
3321
  [[package]]
3176
3322
  name = "wasm-encoder"
3177
3323
  version = "0.244.0"
@@ -3222,6 +3368,15 @@ version = "0.1.12"
3222
3368
  source = "registry+https://github.com/rust-lang/crates.io-index"
3223
3369
  checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
3224
3370
 
3371
+ [[package]]
3372
+ name = "winapi-util"
3373
+ version = "0.1.11"
3374
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3375
+ checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
3376
+ dependencies = [
3377
+ "windows-sys 0.61.2",
3378
+ ]
3379
+
3225
3380
  [[package]]
3226
3381
  name = "windows-core"
3227
3382
  version = "0.62.2"
@@ -3,7 +3,7 @@ resolver = "2"
3
3
  members = ["crates/edgeparse-core", "crates/pdf-cos", "crates/edgeparse-python"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.1.1"
6
+ version = "0.2.0"
7
7
  edition = "2021"
8
8
  rust-version = "1.85"
9
9
  license = "Apache-2.0"
@@ -13,7 +13,7 @@ description = "EdgeParse — High-performance PDF-to-structured-data extraction
13
13
  [workspace.dependencies]
14
14
  # PDF parsing (local fork of lopdf 0.39.0, renamed pdf-cos for clarity)
15
15
  # Using package alias so all existing `use lopdf::...` code works unchanged.
16
- lopdf = { package = "pdf-cos", path = "crates/pdf-cos", version = "0.39.0" }
16
+ lopdf = { package = "pdf-cos", path = "crates/pdf-cos", version = "0.39.0", default-features = false }
17
17
  pdf-extract = "0.10.0"
18
18
 
19
19
  # CLI
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edgeparse
3
- Version: 0.1.1
3
+ Version: 0.2.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: Apache Software License
@@ -17,14 +17,14 @@ rustdoc-args = ["--cfg", "docsrs"]
17
17
  all-features = false
18
18
 
19
19
  [dependencies]
20
- lopdf = { workspace = true }
20
+ lopdf = { workspace = true, default-features = false, features = ["chrono", "jiff", "time"] }
21
21
  serde = { workspace = true }
22
22
  serde_json = { workspace = true }
23
23
  thiserror = { workspace = true }
24
24
  anyhow = { workspace = true }
25
25
  log = { workspace = true }
26
- rayon = { workspace = true }
27
- image = { workspace = true }
26
+ rayon = { workspace = true, optional = true }
27
+ image = { workspace = true, optional = true }
28
28
  base64 = { workspace = true }
29
29
  regex = { workspace = true }
30
30
  unicode-normalization = { workspace = true }
@@ -32,12 +32,14 @@ indexmap = { workspace = true }
32
32
  ordered-float = { workspace = true }
33
33
  ttf-parser = { workspace = true }
34
34
  euclid = { workspace = true }
35
- zip = { workspace = true }
35
+ zip = { workspace = true, optional = true }
36
36
  reqwest = { workspace = true, optional = true }
37
37
  tokio = { workspace = true, optional = true }
38
38
 
39
39
  [features]
40
- default = []
40
+ default = ["native"]
41
+ native = ["rayon", "image", "zip", "lopdf/rayon"]
42
+ wasm = ["lopdf/wasm_js"]
41
43
  hybrid = ["dep:reqwest", "dep:tokio"]
42
44
 
43
45
  [dev-dependencies]
@@ -23,6 +23,7 @@ use crate::models::content::ContentElement;
23
23
  use crate::models::document::PdfDocument;
24
24
  use crate::pdf::chunk_parser::extract_page_chunks;
25
25
  use crate::pdf::page_info;
26
+ #[cfg(not(target_arch = "wasm32"))]
26
27
  use crate::pdf::raster_table_ocr::recover_raster_table_borders;
27
28
  use crate::pipeline::orchestrator::{run_pipeline, PipelineState};
28
29
  use crate::tagged::struct_tree::build_mcid_map;
@@ -38,6 +39,7 @@ use crate::tagged::struct_tree::build_mcid_map;
38
39
  ///
39
40
  /// # Errors
40
41
  /// Returns an error if the PDF cannot be loaded or processed.
42
+ #[cfg(not(target_arch = "wasm32"))]
41
43
  pub fn convert(
42
44
  input_path: &std::path::Path,
43
45
  config: &ProcessingConfig,
@@ -127,6 +129,91 @@ pub fn convert(
127
129
  Ok(doc)
128
130
  }
129
131
 
132
+ /// Convert a PDF from an in-memory byte slice to structured data.
133
+ ///
134
+ /// This is the WASM-compatible entry point. It replaces all filesystem
135
+ /// operations with in-memory equivalents and skips raster table OCR.
136
+ ///
137
+ /// # Arguments
138
+ /// * `data` — raw PDF bytes (e.g., from a `Uint8Array` in JavaScript)
139
+ /// * `file_name` — display name (used in `PdfDocument.file_name`)
140
+ /// * `config` — processing configuration
141
+ ///
142
+ /// # Returns
143
+ /// Structured document or error.
144
+ ///
145
+ /// # Errors
146
+ /// Returns an error if the PDF cannot be parsed or processed.
147
+ pub fn convert_bytes(
148
+ data: &[u8],
149
+ file_name: &str,
150
+ config: &ProcessingConfig,
151
+ ) -> Result<PdfDocument, EdgePdfError> {
152
+ let raw_doc = pdf::loader::load_pdf_from_bytes(data, config.password.as_deref())?;
153
+
154
+ let page_info_list = page_info::extract_page_info(&raw_doc.document);
155
+
156
+ let pages_map = raw_doc.document.get_pages();
157
+ let mut page_contents = Vec::with_capacity(pages_map.len());
158
+
159
+ for (&page_num, &page_id) in &pages_map {
160
+ let page_chunks = extract_page_chunks(&raw_doc.document, page_num, page_id)?;
161
+
162
+ // Raster table OCR requires external pdfimages binary — skip in memory-only mode
163
+ let recovered_tables = Vec::new();
164
+
165
+ let mut elements: Vec<ContentElement> = page_chunks
166
+ .text_chunks
167
+ .into_iter()
168
+ .map(ContentElement::TextChunk)
169
+ .collect();
170
+
171
+ elements.extend(
172
+ page_chunks
173
+ .image_chunks
174
+ .into_iter()
175
+ .map(ContentElement::Image),
176
+ );
177
+ elements.extend(
178
+ page_chunks
179
+ .line_chunks
180
+ .into_iter()
181
+ .map(ContentElement::Line),
182
+ );
183
+ elements.extend(
184
+ page_chunks
185
+ .line_art_chunks
186
+ .into_iter()
187
+ .map(ContentElement::LineArt),
188
+ );
189
+ elements.extend(
190
+ recovered_tables
191
+ .into_iter()
192
+ .map(ContentElement::TableBorder),
193
+ );
194
+
195
+ page_contents.push(elements);
196
+ }
197
+
198
+ let mcid_map = build_mcid_map(&raw_doc.document);
199
+ let mut pipeline_state = PipelineState::with_mcid_map(page_contents, config.clone(), mcid_map)
200
+ .with_page_info(page_info_list);
201
+ run_pipeline(&mut pipeline_state)?;
202
+
203
+ let mut doc = PdfDocument::new(file_name.to_string());
204
+ doc.number_of_pages = pages_map.len() as u32;
205
+ doc.author = raw_doc.metadata.author;
206
+ doc.title = raw_doc.metadata.title;
207
+ doc.creation_date = raw_doc.metadata.creation_date;
208
+ doc.modification_date = raw_doc.metadata.modification_date;
209
+
210
+ for page in pipeline_state.pages {
211
+ doc.kids.extend(page);
212
+ }
213
+
214
+ Ok(doc)
215
+ }
216
+
130
217
  /// Top-level error type for EdgeParse operations.
131
218
  #[derive(Debug, thiserror::Error)]
132
219
  pub enum EdgePdfError {
@@ -1,6 +1,7 @@
1
1
  //! Output generators — TOC, JSON, Markdown, HTML, Text, CSV, Annotated PDF.
2
2
 
3
3
  pub mod csv;
4
+ #[cfg(not(target_arch = "wasm32"))]
4
5
  pub mod docx;
5
6
  pub mod html;
6
7
  pub mod json;
@@ -90,6 +90,40 @@ fn extract_metadata(doc: &Document) -> PdfMetadata {
90
90
  metadata
91
91
  }
92
92
 
93
+ /// Load a PDF from an in-memory byte slice.
94
+ ///
95
+ /// Uses lopdf's `Document::load_mem()` which parses PDF from `&[u8]`.
96
+ /// This is the WASM-compatible loader — no filesystem access required.
97
+ ///
98
+ /// # Arguments
99
+ /// * `data` — raw PDF bytes
100
+ /// * `_password` — optional decryption password (not yet implemented)
101
+ ///
102
+ /// # Errors
103
+ /// Returns `EdgePdfError::LoadError` if the bytes cannot be parsed as PDF.
104
+ pub fn load_pdf_from_bytes(
105
+ data: &[u8],
106
+ _password: Option<&str>,
107
+ ) -> Result<RawPdfDocument, EdgePdfError> {
108
+ if data.is_empty() {
109
+ return Err(EdgePdfError::LoadError("Empty PDF data".to_string()));
110
+ }
111
+
112
+ let document = Document::load_mem(data).map_err(|e| {
113
+ EdgePdfError::LoadError(format!("Failed to parse PDF from bytes: {e}"))
114
+ })?;
115
+
116
+ let pages = document.get_pages();
117
+ let num_pages = pages.len() as u32;
118
+ let metadata = extract_metadata(&document);
119
+
120
+ Ok(RawPdfDocument {
121
+ document,
122
+ num_pages,
123
+ metadata,
124
+ })
125
+ }
126
+
93
127
  /// Extract a string field from a PDF dictionary.
94
128
  fn extract_string_field(dict: &lopdf::Dictionary, key: &[u8]) -> Option<String> {
95
129
  dict.get(key).ok().and_then(|obj| match obj {
@@ -14,5 +14,6 @@ pub mod line_extractor;
14
14
  pub mod loader;
15
15
  pub mod metadata_writer;
16
16
  pub mod page_info;
17
+ #[cfg(not(target_arch = "wasm32"))]
17
18
  pub mod raster_table_ocr;
18
19
  pub mod text_extractor;
@@ -1,9 +1,13 @@
1
- //! Parallel page-processing utilities using rayon.
1
+ //! Parallel page-processing utilities.
2
+ //!
3
+ //! On native targets: uses rayon for data parallelism.
4
+ //! On wasm32: falls back to sequential iteration.
2
5
  //!
3
6
  //! Provides helpers that apply a per-page transformation in parallel across all
4
7
  //! pages of a document. Designed as a drop-in replacement for the sequential
5
8
  //! `for page in &mut pages { ... }` loops in the orchestrator.
6
9
 
10
+ #[cfg(not(target_arch = "wasm32"))]
7
11
  use rayon::prelude::*;
8
12
 
9
13
  use crate::models::content::ContentElement;
@@ -24,8 +28,16 @@ pub fn par_map_pages<F>(pages: &mut Vec<PageContent>, op: F)
24
28
  where
25
29
  F: Fn(Vec<ContentElement>) -> Vec<ContentElement> + Sync + Send,
26
30
  {
27
- let results: Vec<PageContent> = std::mem::take(pages).into_par_iter().map(op).collect();
28
- *pages = results;
31
+ #[cfg(not(target_arch = "wasm32"))]
32
+ {
33
+ let results: Vec<PageContent> = std::mem::take(pages).into_par_iter().map(&op).collect();
34
+ *pages = results;
35
+ }
36
+ #[cfg(target_arch = "wasm32")]
37
+ {
38
+ let results: Vec<PageContent> = std::mem::take(pages).into_iter().map(op).collect();
39
+ *pages = results;
40
+ }
29
41
  }
30
42
 
31
43
  /// Apply `op` to each page in parallel where the closure also receives a
@@ -34,12 +46,24 @@ pub fn par_map_pages_indexed<F>(pages: &mut Vec<PageContent>, op: F)
34
46
  where
35
47
  F: Fn(usize, Vec<ContentElement>) -> Vec<ContentElement> + Sync + Send,
36
48
  {
37
- let results: Vec<PageContent> = std::mem::take(pages)
38
- .into_par_iter()
39
- .enumerate()
40
- .map(|(i, page)| op(i, page))
41
- .collect();
42
- *pages = results;
49
+ #[cfg(not(target_arch = "wasm32"))]
50
+ {
51
+ let results: Vec<PageContent> = std::mem::take(pages)
52
+ .into_par_iter()
53
+ .enumerate()
54
+ .map(|(i, page)| op(i, page))
55
+ .collect();
56
+ *pages = results;
57
+ }
58
+ #[cfg(target_arch = "wasm32")]
59
+ {
60
+ let results: Vec<PageContent> = std::mem::take(pages)
61
+ .into_iter()
62
+ .enumerate()
63
+ .map(|(i, page)| op(i, page))
64
+ .collect();
65
+ *pages = results;
66
+ }
43
67
  }
44
68
 
45
69
  /// Parallel fold — map each page to a value of type `T` and collect results.
@@ -50,19 +74,34 @@ where
50
74
  T: Send,
51
75
  F: Fn(&[ContentElement]) -> T + Sync + Send,
52
76
  {
53
- pages.par_iter().map(|page| op(page)).collect()
77
+ #[cfg(not(target_arch = "wasm32"))]
78
+ {
79
+ pages.par_iter().map(|page| op(page)).collect()
80
+ }
81
+ #[cfg(target_arch = "wasm32")]
82
+ {
83
+ pages.iter().map(|page| op(page)).collect()
84
+ }
54
85
  }
55
86
 
56
87
  /// Configure the global rayon thread pool with the given number of threads.
57
88
  ///
58
- /// Returns `Ok(())` on success. Calling this more than once (after the pool is
59
- /// already initialized) returns an error which callers may ignore.
89
+ /// On WASM, this is a no-op.
90
+ #[cfg(not(target_arch = "wasm32"))]
60
91
  pub fn configure_thread_pool(num_threads: usize) -> Result<(), rayon::ThreadPoolBuildError> {
61
92
  rayon::ThreadPoolBuilder::new()
62
93
  .num_threads(num_threads)
63
94
  .build_global()
64
95
  }
65
96
 
97
+ /// Configure the global rayon thread pool with the given number of threads.
98
+ ///
99
+ /// On WASM, this is a no-op.
100
+ #[cfg(target_arch = "wasm32")]
101
+ pub fn configure_thread_pool(_num_threads: usize) -> Result<(), String> {
102
+ Ok(())
103
+ }
104
+
66
105
  #[cfg(test)]
67
106
  mod tests {
68
107
  use super::*;
@@ -10,6 +10,8 @@ use crate::models::bbox::BoundingBox;
10
10
  use crate::models::content::ContentElement;
11
11
  use crate::pdf::page_info::PageInfo;
12
12
  use crate::utils::xycut;
13
+
14
+ #[cfg(not(target_arch = "wasm32"))]
13
15
  use rayon::prelude::*;
14
16
 
15
17
  /// Sort content elements on each page into reading order.
@@ -17,7 +19,7 @@ use rayon::prelude::*;
17
19
  /// `page_info` is indexed 0..N matching `pages`. Pass an empty slice to use
18
20
  /// the A4 fallback for all pages.
19
21
  pub fn sort_reading_order(pages: &mut [Vec<ContentElement>], page_info: &[PageInfo]) {
20
- pages.par_iter_mut().enumerate().for_each(|(i, page)| {
22
+ let sort_page = |(i, page): (usize, &mut Vec<ContentElement>)| {
21
23
  let page_bbox = page_info
22
24
  .get(i)
23
25
  .map(|info| {
@@ -31,7 +33,16 @@ pub fn sort_reading_order(pages: &mut [Vec<ContentElement>], page_info: &[PageIn
31
33
  })
32
34
  .unwrap_or_else(|| BoundingBox::new(None, 0.0, 0.0, 595.0, 842.0));
33
35
  xycut::xycut_sort(page, &page_bbox);
34
- });
36
+ };
37
+
38
+ #[cfg(not(target_arch = "wasm32"))]
39
+ {
40
+ pages.par_iter_mut().enumerate().for_each(sort_page);
41
+ }
42
+ #[cfg(target_arch = "wasm32")]
43
+ {
44
+ pages.iter_mut().enumerate().for_each(sort_page);
45
+ }
35
46
  }
36
47
 
37
48
  #[cfg(test)]