mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-12 12:24:54 +00:00
Editable PDF import derived characters from glyph Unicode/CID mappings even when the enclosing marked-content sequence supplied /ActualText. A span that paints "xy" but says "AB", followed by "C", imported "xyC". Track the outermost replacement owner per span (absent, explicitly empty, consumed), decode it with the existing PDF text-string decoder, emit it once at the first placeable glyph, and let the remaining glyphs of the span advance the pen without phantom character slots or inferred spaces. Authored stretches keep their logical order while adjacent ordinary text still goes through visual-to-logical reconstruction. Glyph identity still drives font matching. Depth and size are bounded; oversized or unbalanced spans fall back to glyph mappings with a warning. Outlines mode and PDF export are unchanged. Parity docs updated, scores unchanged. Fixes #6165.
51 lines
2.2 KiB
Rust
51 lines
2.2 KiB
Rust
//! PDF → Document (hayro-interpret device that builds a VectorCraft node tree).
|
|
|
|
use std::collections::{HashMap, HashSet};
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
use craft_pdf::interpret::font::Glyph;
|
|
use craft_pdf::interpret::hayro_cmap::BfString;
|
|
use craft_pdf::interpret::pattern::{Pattern, TilingPattern};
|
|
use craft_pdf::interpret::{
|
|
CacheKey, ClipPath, Context, Device, GlyphDrawMode, Image, ImageData, InterpreterCache, InterpreterSettings, InterpreterWarning, LumaData,
|
|
MaskType, PathDrawMode, SoftMask, StrokeProps,
|
|
};
|
|
use craft_pdf::syntax::object::Name;
|
|
use craft_pdf::syntax::page::Page;
|
|
use kurbo::{Affine, BezPath, PathEl, Rect, Shape};
|
|
use vectorcraft_color::{BlendMode, Color, Paint, Swatch};
|
|
use vectorcraft_doc::{
|
|
Appearance, AppearanceItem, Artboard, ColorMode, Dash, Document, FillLayer, ImageBlob, ImageObject, Knockout, LayerColor, LineCap, LineJoin,
|
|
Node, NodeId, NodeKind, OpacityMask, PatternDef, StrokeLayer,
|
|
};
|
|
use vectorcraft_geom::{FillRule, PathData};
|
|
|
|
use crate::import_color::{Colors, Native};
|
|
use crate::import_mask::{MaskSpec, contains, is_rectangle, luminance, mask_spec, white_cover};
|
|
use crate::import_scan::{FontNames, MAX_NESTING, Ocgs, Scan, TextOverprint, Walked, all_on, hides_forms, scan_page, tag_key};
|
|
use crate::import_shading::{
|
|
FunctionBudget, FunctionPaint, clipped, extend_clip, fold_stop_opacity, function_paint, gradient_shape, mesh_shading, shading_gradient,
|
|
};
|
|
use crate::import_text::{Families, LineFacts, Look, Placement, TextLine, Upright};
|
|
use crate::{CropTo, ImportOptions, ImportReport, PdfError, TextAs};
|
|
|
|
mod actual_text;
|
|
mod builder;
|
|
mod cid;
|
|
mod device;
|
|
mod entry;
|
|
mod state;
|
|
|
|
#[cfg(test)]
|
|
pub(crate) use cid::{CidText, font_chars, identify_glyph, unify_radical};
|
|
#[cfg(any(test, feature = "read-count"))]
|
|
pub use entry::imports_of;
|
|
pub use entry::{
|
|
INVISIBLE_TEXT_NOTE, OFF_ARTBOARD_NOTE, OUTLINED_TEXT_NOTE, PAST_PAGE_NOTE, UNMATCHED_GLYPHS_NOTE, UNNAMED_CHARACTERS_NOTE, holds_outlines,
|
|
import, import_opened, import_with_report, is_glyph_outlines, is_outlines_note,
|
|
};
|
|
#[cfg(test)]
|
|
pub(crate) use entry::{TEST_MAX_OBJECTS, import_with_reader_options, read};
|
|
pub(crate) use state::{closed_subpaths, round3};
|