범위가 제한된 문단 편집

HPDFParagraphReflow는 명시적 소스 사각형 안에서 로드된 글리프 중심을 선택하고, 같은 페이지의 명시적 대상 사각형 안에 새로 측정한 문단을 기록합니다

인수 프로필은 Delphi Win32/Win64와 Windows FPC/Lazarus를 다루고, 실측 폰트 생성은 기존 문서 appearance 빌더와 설치 폰트 지원을 그대로 씁니다

선택, 레이아웃, 보존

좌표는 회전하지 않은 PDF 페이지 사용자 공간 포인트이고 y축은 위쪽입니다. 두 사각형 모두 유한해야 하고 각 변이 14400포인트 이하의 양수여야 하며 페이지 MediaBox 안에 들어와야 합니다

선택 영역은 여러 원본 베이스라인과 여러 페이지 콘텐츠 스트림에 걸칠 수 있습니다. literal, hexadecimal, TJ, 홑따옴표, 겹따옴표 텍스트 피연산자는 선택된 문자 코드 경계에서 다시 씁니다

남겨 두는 접두부와 접미부, 텍스트 어드밴스, 원본 수치 커닝 조정은 제자리에 유지되고, 소스 텍스트는 배경 사각형으로 가리는 게 아니라 실제 피연산자에서 제거됩니다

중첩된 Form XObject는 자체 Matrix와 BBox를 사용하고, 선택된 각 invocation과 조상 리소스는 비공개로 복사되어 원본 Form을 공유하는 다른 invocation과 다른 페이지를 보존합니다

Form BBox 밖의 글리프 중심은 제외됩니다. 일부만 걸친 소스 글리프는 기본적으로 거절되고, RejectPartialSourceGlyphs = False를 주면 중심이 선택된 문자 코드 전체의 제거를 명시적으로 허용합니다

Appearance는 설치 폰트, 스타일, 크기, 색, 패딩, 정렬, 넘침 정책을 고릅니다. 대상 너비가 줄바꿈을 결정하고 shrink-to-fit은 실제 EffectiveFontSize를 보고합니다

생성된 글리프 지오메트리는 독립적으로 해석해 대상 사각형과 대조하고, 이 범위 제한 헬퍼에서 회전은 0, 불투명도는 1로 고정입니다

빈 대체 텍스트는 선택한 소스 텍스트를 삭제합니다. 빈 소스 영역에 문단을 삽입하려면 RequireSourceText = False로 설정하세요

충돌 근거

선택하지 않은 공백이 아닌 텍스트, XObject와 인라인 이미지, 그려진 경로 경계, 어노테이션 사각형을 생성된 대체 글리프 경계와 비교합니다

각 충돌은 종류, 페이지 공간 경계, 선택적 인접 텍스트, 대체 글리프 인덱스를 알려주고, 반환된 충돌 목록이 상한에 닿아도 전체 개수는 유지됩니다

경로 제어점, 변환된 Form 클립 경계, 선 두께와 마이터 한도는 보수적인 박스를 만들고, 칠해진 범위를 알 수 없는 shading은 보수적으로 대상 사각형 전체를 차지합니다

이 지오메트리 검사는 투명 이미지, 칠하지 않은 어노테이션 영역, 곡선, 클립된 경로, 회전된 Form 외곽을 과하게 보고할 수 있습니다. 픽셀 단위 잉크 분리를 증명하지도, 임의의 클리핑 경로나 블렌드 합성, 폰트 아웃라인을 들여다보지도 않습니다

RejectCollisions = True는 겹치는 대체를 문서를 바꾸지 않고 거절하고, false로 두면 호출자가 의도한 겹침 정책을 허용하면서 리포트는 그대로 남깁니다

프리뷰, 커밋, 롤백

HPDFPreviewParagraphReflow는 호출자 소유의 봉인된 플랜, 의미 대체 레이아웃, 지문, 충돌 근거를 반환한 뒤 생성된 문서 객체를 롤백합니다

HPDFCommitParagraphReflow는 범위 제한 분석을 반복하고, 소스 콘텐츠, Form 경계, 어노테이션 지오메트리, 대체 폰트 지오메트리가 프리뷰와 여전히 일치할 때만 플랜을 원자적으로 적용합니다

플랜은 같은 살아 있는 문서 인스턴스에 속합니다. 다 쓰면 해제하고, 도중에 문서를 계속 살려 두며, 다른 문서를 로드하거나 선택 콘텐츠를 바꾼 후에는 프리뷰를 다시 생성하세요

THPDFParagraphReflowSession은 적용된 검토 상태를 더합니다. Apply는 편집된 문서를 추출이나 렌더링에 노출하고, Commit은 발행하며, Rollback이나 파괴는 원본 그래프를 복원합니다

세션은 직렬로 쓰고, 문서는 세션보다 오래 살아 있어야 하며, Pending이 참인 동안에는 다른 그래프 트랜잭션이나 편집 호출을 끼워 넣으면 안 됩니다

롤백은 메모리 안의 문서 상태를 복원하고, 이미 저장된 외부 파일은 호출자의 책임으로 남습니다

유한한 작업량과 실패 동작

기본 한도는 디코딩 콘텐츠 64 MiB, 생성 스트림 64 MiB, 작업 단위 100000000, 글리프 100000개, 토큰 250000개, Form 깊이 12단계, Form invocation 256개, 반환 충돌 256개, 복제 리소스 노드 100000개입니다

인코딩된 문자열 바이트는 글리프 해석 전에 남은 글리프 한도와 대조되므로, 멀티바이트 문자 인코딩은 보이는 글리프 수보다 예산을 보수적으로 더 쓸 수 있습니다

디코딩·생성 한도는 이 헬퍼가 다루는 콘텐츠를 대상으로 하고, 생성 스트림 크기는 발행 전에 검사하지만 프로세스 최대 메모리 상한이 아니며 설치 폰트 빌더 할당 전부를 묶지도 않습니다

취소는 콘텐츠 토큰화와 헬퍼 루프를 따라 협력적으로 처리되고 기존 폰트 생성 호출 주변에서도 검사합니다. 호출이 끝날 때까지 토큰을 살려 두세요

소스 없음, 잘못된 입력, 충돌, 오래된 플랜, 지원하지 않는 콘텐츠, 예산 소진, 취소, 일반적인 실패는 명시적 상태와 함께 false를 반환하고 원본 객체 그래프를 보존합니다

선택된 세로쓰기 또는 singular 텍스트, 순환 또는 미해결 Form, 지원하지 않는 painted XObject 타입, 서명 필드가 있는 문서는 거절되며, 서명을 보존하는 증분 편집에는 별도 워크플로가 필요합니다

예제

Options := HPDFDefaultParagraphReflowOptions;
Options.Appearance.FontName := 'Arial';
Options.Appearance.FontSize := 11;
Source.Left := 55; Source.Bottom := 659;
Source.Right := 350; Source.Top := 714;
Target := Source;
Plan := nil;
try
  if HPDFPreviewParagraphReflow(Document, 0, Source, Target,
    'The Supplier must deliver signed monthly reports.', Options,
    Plan, Report, CancellationToken) then
    if HPDFCommitParagraphReflow(Document, Plan, Report, CancellationToken) then
      Document.SaveLoadedDocument('reviewed-contract.pdf');
finally
  Plan.Free;
end;

인수 검증과 저장 결과

전용 Delphi와 FPC 러너는 실제 로드된 PDF 픽스처로 다중 베이스라인 문단, 부분 피연산자, 중첩 공유 Form, 클립된 Form 텍스트, 너비·폰트 변경, 충돌 종류, 취소, 그래프 롤백을 검사합니다

file/file과 stream/file 저장을 반복해도 편집된 그래프가 보존되고, 새로 로드한 변경 없는 문서는 소스 바이트를 그대로 유지하며, 주입한 출력 쓰기 실패 뒤에도 재시도가 성공합니다

Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf는 문단 헬퍼 없이 저장 회귀를 분리합니다. 로드하고, 마커를 넣고, 두 번 저장한 다음 두 번째 파일을 독립적으로 읽습니다

Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 또는 Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64를 실행하고, 다른 아키텍처는 Win32를 고르세요

선택적인 Python 검증기 Tests/Fixtures/ParagraphReflow/verify_output.py는 PyMuPDF로 실제 저장된 Unicode 텍스트를 추출하고 편집된 페이지를 렌더링합니다. 모든 러너는 뷰어 자동 실행을 억제합니다

관련 항목

범위가 제한된 문단 편집 · 옵션 · 리포트