우리는 GroupDocs.Parser for Python v26.10의 출시를 기쁘게 발표합니다. 이 릴리스는 2026년 11월부터 사용할 수 있습니다. 이번 릴리스는 기본 엔진을 버전 26.8로 업그레이드하고 .NET Core 3.1에서 .NET 10.0.14로 이동했으며 System.Security.Cryptography.Pkcs의 두 가지 서비스 거부 취약점을 수정했습니다. 주요 새로운 기능으로는 주석 추출, HTML 테이블 파싱, 아랍어 및 한국어 OCR, Python 로거, 외부 리소스 처리, 미리보기 콜백을 일반 함수로 제공, 그리고 groupdocs-parser 명령줄 도구가 포함됩니다. 휠은 이제 Python 3.5 – 3.14를 대상으로 하는 순수 Python 패키지이며, 업데이트된 플랫폼 태그(manylinux_2_27_x86_64, macosx_13_0_*)와 32비트 Windows 휠이 제거되었습니다.

이번 릴리스의 새로운 기능

  • [Feature] get_annotations() 및 TextOptions.include_annotations 로 주석 추출 지원 추가 (PARSERPYTHONNET-23)
  • [Feature] groupdocs-parser 명령줄 도구 추가 (PARSERPYTHONNET-24)
  • [Feature] ILogger 를 구현하는 Python 로거 객체 지원 추가 (PARSERPYTHONNET-25)
  • [Feature] Python에서 외부 리소스 로딩 처리 지원 추가 (PARSERPYTHONNET-26)
  • [Feature] 아랍어 및 한국어 텍스트에 대한 OCR 추가 (PARSERPYTHONNET-27)
  • [Feature] HTML 문서에서 테이블 추출 지원 추가 (PARSERPYTHONNET-28)
  • [Feature] GROUPDOCS_LIC_PATH 환경 변수에서 라이선스 적용 지원 추가 (PARSERPYTHONNET-36)
  • [Enhancement] GroupDocs.Parser를 26.8로, 내장 런타임을 .NET 10.0.14로 업데이트 (PARSERPYTHONNET-29)
  • [Enhancement] 컴파일된 확장 대신 Python 3.5 – 3.14용 순수 Python 패키지 제공 (PARSERPYTHONNET-30)
  • [Enhancement] PreviewOptions에 미리보기 콜백을 일반 Python 함수로 전달 지원 (PARSERPYTHONNET-31)
  • [Enhancement] API 객체의 알 수 없는 속성 할당을 거부 (PARSERPYTHONNET-32)
  • [Enhancement] 플랫폼 태그를 glibc 2.27 및 macOS 13으로 업데이트하고 32비트 Windows 휠을 제거 (PARSERPYTHONNET-33)
  • [Enhancement] RuntimeError 대신 GroupDocsParserException 및 그 하위 클래스 발생 (PARSERPYTHONNET-34)
  • [Enhancement] System.Security.Cryptography.Pkcs를 10.0.14로 업데이트하여 두 가지 서비스 거부 취약점 수정 (PARSERPYTHONNET-37)
  • [Fix] 일부 Word 및 RTF 문서가 The document appears to be corrupted 오류 또는 누락된 SkiaSharp 3.119 어셈블리로 실패 (PARSERPYTHONNET-35)
  • [Fix] BytesIO에서 문서를 열 때마다 메모리 사용량이 증가 (PARSERPYTHONNET-38)

공개 API 변경 사항

  • 엔진 오류는 groupdocs.parser.exceptions에서 GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException 또는 UnsupportedDocumentFormatException을 발생시킵니다. 25.12에서는 모든 오류에 대해 RuntimeError를 발생시켰습니다. 해당 클래스들은 25.12에 존재했지만 Exception을 상속하지 않았으며 절대 발생하지 않았습니다. except Exception은 두 릴리스의 오류를 모두 잡습니다.
  • 알 수 없는 속성을 할당하면 AttributeError가 발생합니다.
  • 엔진이 반환하는 리스트는 len() 및 인덱싱을 지원하며, 빈 리스트는 False로 평가됩니다.

제거된 항목

  • groupdocs.parser.options.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.parser.options.IPreviewPageRender

PreviewOptions와 PreviewOptions.preview_page_render에 함수를 전달하십시오.

새로운 클래스 및 멤버

  • groupdocs.parser: Resources.
  • groupdocs.parser.data: AnnotationItem.
  • groupdocs.parser.options: CreatePageStream, ReleasePageStream, PreviewPageRender, Language, PreviewFormats.
  • Parser: get_annotations(), get_structure(), dispose().
  • Features: annotations.
  • TextOptions: include_annotations.
  • OcrOptions: language.
  • ILogger: error().
  • TocItem: extract_text().
  • PageTableArea: get() and table[row, column].
  • DocumentData, Template: get().
  • TemplateCollection: append().
  • Resources: storage_path, writable.

새로운 기능

주석 추출

Parser.get_annotations()는 PDF, Word 또는 PowerPoint 문서의 주석 및 메모를 AnnotationItem 객체로 반환하며, 값, 유형, 페이지 인덱스, 타임스탬프, 작성자 이름 및 이니셜을 포함합니다; get_annotations(page_index)는 한 페이지만 읽습니다. TextOptions.include_annotations는 추출된 텍스트에 주석 텍스트를 추가하고, parser.features.annotations는 형식이 주석을 지원하는지 여부를 알려줍니다.

from groupdocs.parser import Parser
from groupdocs.parser.options import TextOptions

with Parser("reviewed.docx") as parser:
    for note in parser.get_annotations() or []:
        print(note.page_index + 1, note.annotation_type, note.author_name, note.value.strip())

    options = TextOptions()
    options.include_annotations = True
    print(parser.get_text(options))

명령줄

휠은 groupdocs-parser 콘솔 스크립트(또는 python -m groupdocs.parser)를 설치하며, text, info, metadata, images, annotations, list-formats 명령을 제공합니다. text는 --page N(1부터 시작), --format plain|markdown|html, --ocr, --include-annotations, -o FILE를 받으며, info, metadata, annotations는 --json을, images는 --out DIR를 받습니다. 모든 명령은 --password를 지원합니다. --license와 --version은 명령 앞에 위치합니다. 성공 시 종료 코드는 0, 파일 누락 등 사용자 오류 시 2, 엔진 오류 또는 지원되지 않는 형식일 경우 1을 반환합니다.

groupdocs-parser text report.pdf --page 2 -o page2.txt
groupdocs-parser text report.docx --format markdown
groupdocs-parser info report.pdf --json
groupdocs-parser annotations reviewed.docx --json
groupdocs-parser --license license.lic text protected.pdf --password secret

Python 로거

trace(message), warning(message), error(message, exception) 메서드를 가진 일반 Python 객체를 ParserSettings에 로거로 전달할 수 있으며, 엔진은 파일 손상 등 상황에서 이를 호출합니다. log(level, message, exception) 함수도 사용할 수 있습니다.

from groupdocs.parser import Parser
from groupdocs.parser.options import ParserSettings


class PrintLogger:
    def trace(self, message):
        print("TRACE:", message)

    def warning(self, message):
        print("WARNING:", message)

    def error(self, message, exception):
        print("ERROR:", message, exception)


with Parser("document.pdf", ParserSettings(PrintLogger())) as parser:
    print(parser.get_document_info().page_count)

외부 리소스 로딩 제어

엔진은 HTML 또는 MHTML 문서가 참조하는 각 이미지 로드 전에 외부 리소스 핸들러에 요청합니다. 핸들러는 함수, on_loading(args) 메서드를 가진 객체, 또는 ExternalResourceHandler의 서브클래스일 수 있으며, args.skipped = True 로 설정하면 해당 리소스를 건너뜁니다. ParserSettings는 이를 external_resource_handler 매개변수로 받습니다.

from groupdocs.parser import Parser
from groupdocs.parser.options import ParserSettings


def skip_remote(args):
    args.skipped = args.uri.startswith("http")


with Parser("page.html", ParserSettings(external_resource_handler=skip_remote)) as parser:
    print(len(parser.get_images() or []))

아랍어 및 한국어 OCR

OcrOptions.language는 OCR이 인식할 알파벳을 선택하며 기본값은 영어입니다. Language.ARA와 Language.KOR가 이번 엔진에 새롭게 추가되었습니다. 인식 모델은 엔진에 포함되어 있어 첫 OCR 호출 시 작업 디렉터리의 aspose_data 폴더에 약 80 MB를 풀어놓습니다. 폴더를 지정하려면 첫 OCR 호출 전에 Resources.storage_path(from groupdocs.parser import Resources)를 설정하십시오.

from groupdocs.parser import Parser
from groupdocs.parser.options import Language, OcrOptions, TextOptions

ocr_options = OcrOptions()
ocr_options.language = Language.KOR
with Parser("scan.jpg") as parser:
    print(parser.get_text(TextOptions(False, True, ocr_options)))

HTML 문서의 테이블

get_tables()가 이제 PDF, Word, 스프레드시트 문서와 마찬가지로 HTML 문서의 테이블을 찾습니다; 25.12에서는 찾지 못했습니다. 셀은 table[row, column] 또는 table.get(row, column)으로 접근합니다.

from groupdocs.parser import Parser

with Parser("report.html") as parser:
    for table in parser.get_tables() or []:
        for row in range(table.row_count):
            print([table[row, column].text.rstrip("\x07") for column in range(table.column_count)])

환경 변수에서 라이선스 적용

GROUPDOCS_LIC_PATH를 라이선스 파일 경로나 해당 파일을 제공하는 URL로 설정하면 첫 Parser 호출 시 라이선스가 적용됩니다(라이선스 코드 필요 없음). 25.12에서는 변수를 읽지 않았습니다. 라이선스를 적용할 수 없을 경우(파일 누락, 구독 만료, 다른 제품용 라이선스) 모든 Parser 호출이 LicenseError를 발생시키며, 변수명과 엔진 사유를 표시합니다. License().set_license()로 라이선스를 적용하기 전까지는 계속 오류가 발생합니다. GROUPDOCS_LIC_STRICT=0으로 설정하면 하나의 LicenseWarning과 평가 모드가 제공됩니다.

from groupdocs.parser import LicenseError, Parser

try:
    with Parser("report.pdf") as parser:
        print(parser.get_text())
except LicenseError as e:
    print(e)  # GROUPDOCS_LIC_PATH=... could not be applied: <reason>

미리보기 콜백을 일반 함수로

PreviewOptions(create_page_stream, release_page_stream)는 일반 함수를 받으며, PreviewOptions.preview_page_render도 마찬가지입니다. create_page_stream(page_number)는 "wb" 모드로 연 파일이나 io.BytesIO와 같은 쓰기 가능한 스트림을 반환합니다. 페이지 번호는 1부터 시작합니다. 엔진은 전달받은 파일을 닫고, 페이지가 기록되면 release_page_stream(page_number)를 호출합니다. 25.12에서는 ICreatePageStream, IReleasePageStream, IPreviewPageRender 클래스가 사용되었습니다.

from groupdocs.parser import Parser
from groupdocs.parser.options import PreviewOptions


def create_page_stream(page_number):
    return open("page-%d.png" % page_number, "wb")


def release_page_stream(page_number):
    print("page", page_number, "written")


options = PreviewOptions(create_page_stream, release_page_stream)
options.preview_page_render = lambda info: print("rendering page", info.page_number)
with Parser("document.pdf") as parser:
    parser.generate_preview(options)

잘못된 속성에 AttributeError 발생

API 객체에 존재하지 않는 속성을 할당하면 “Did you mean” 힌트와 함께 AttributeError가 발생합니다. 25.12에서는 할당을 허용하고 Python 전용 속성을 저장했으며 엔진 설정은 변경되지 않았습니다.

from groupdocs.parser.options import TextOptions

options = TextOptions()
try:
    options.include_annotation = True
except AttributeError as error:
    print(error)

Python 3.5 – 3.14용 단일 휠

25.12는 컴파일된 확장이었으며 Python 버전마다 별도의 바이너리 모듈과 .NET Core 3.1 런타임을 사용했습니다. 26.10은 플랫폼당 하나의 py3-none-<platform> 휠이며, 내장 .NET 10 런타임 위에 순수 Python을 사용하고 python_requires=">=3.5,<3.15"를 선언합니다. Python 3.14가 새롭게 지원됩니다(25.12는 <3.14 제한). 대부분의 25.12 코드가 그대로 동작하며, 25.12에서 실행된 129개의 Docs 예제가 26.10에서도 실행됩니다. get_text()와 get_formatted_text()는 여전히 str을 반환하며, 이제 read_to_end()도 지원합니다.

업데이트된 플랫폼 태그 및 64비트 Windows 휠

Linux 휠은 manylinux_2_27_x86_64 태그를 사용하며, 이는 내장 .NET 10 런타임이 시작되는 가장 오래된 glibc 버전입니다. macOS 휠은 macosx_13_0_x86_64와 macosx_13_0_arm64 태그를 사용합니다. 32비트 Windows 휠은 더 이상 제공되지 않습니다. 설치에는 pip 20.3 이상이 필요합니다.

코드 예제

Word 문서에서 주석을 추출하고 텍스트에 포함시키는 예제:

from groupdocs.parser import Parser
from groupdocs.parser.options import TextOptions

with Parser("reviewed.docx") as parser:
    for note in parser.get_annotations() or []:
        print(note.page_index + 1, note.annotation_type, note.author_name, note.value.strip())

    options = TextOptions()
    options.include_annotations = True
    print(parser.get_text(options))

업데이트 방법

PyPI

PyPI를 통해 설치 또는 업그레이드:

groupdocs-parser-net 26.10.0 on PyPI

pip install groupdocs-parser-net==26.10.0

직접 다운로드

GroupDocs.Parser for Python via .NET 26.10 릴리스 페이지에서 플랫폼별 휠을 다운로드:

리소스