Kami senang mengumumkan rilis GroupDocs.Parser for Python v26.10, tersedia sejak November 2026. Rilis ini meningkatkan mesin dasar ke versi 26.8 dan beralih dari .NET Core 3.1 ke .NET 10.0.14, memperbaiki dua kerentanan penolakan layanan di System.Security.Cryptography.Pkcs. Rilis ini memperkenalkan fitur baru utama termasuk ekstraksi anotasi, parsing tabel HTML, OCR untuk bahasa Arab dan Korea, logger Python, penanganan sumber daya eksternal, callback pratinjau sebagai fungsi biasa, dan alat baris perintah groupdocs-parser. Wheel kini menjadi paket pure-Python yang menargetkan Python 3.5 – 3.14, dengan tag platform yang diperbarui (manylinux_2_27_x86_64, macosx_13_0_*) dan penghapusan wheel Windows 32-bit.

Apa yang baru di rilis ini

  • [Fitur] Menambahkan dukungan untuk mengekstrak anotasi dengan get_annotations() dan TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [Fitur] Menambahkan alat baris perintah groupdocs-parser (PARSERPYTHONNET-24)
  • [Fitur] Menambahkan dukungan untuk objek logger Python yang mengimplementasikan ILogger (PARSERPYTHONNET-25)
  • [Fitur] Menambahkan dukungan untuk menangani pemuatan sumber daya eksternal dari Python (PARSERPYTHONNET-26)
  • [Fitur] Menambahkan OCR untuk teks Arab dan Korea (PARSERPYTHONNET-27)
  • [Fitur] Menambahkan dukungan untuk mengekstrak tabel dari dokumen HTML (PARSERPYTHONNET-28)
  • [Fitur] Menambahkan dukungan untuk menerapkan lisensi dari variabel lingkungan GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [Peningkatan] Memperbarui GroupDocs.Parser ke 26.8 dan runtime tersemat ke .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Peningkatan] Menyediakan paket pure-Python untuk Python 3.5 – 3.14 menggantikan ekstensi yang dikompilasi (PARSERPYTHONNET-30)
  • [Peningkatan] Mengirim callback pratinjau ke PreviewOptions sebagai fungsi Python biasa (PARSERPYTHONNET-31)
  • [Peningkatan] Menolak penetapan ke atribut tidak dikenal pada objek API (PARSERPYTHONNET-32)
  • [Peningkatan] Memperbarui tag platform ke glibc 2.27 dan macOS 13, serta menghapus wheel Windows 32-bit (PARSERPYTHONNET-33)
  • [Peningkatan] Menaikkan GroupDocsParserException dan subclass-nya alih-alih RuntimeError (PARSERPYTHONNET-34)
  • [Peningkatan] Memperbarui System.Security.Cryptography.Pkcs ke 10.0.14, yang memperbaiki dua kerentanan penolakan layanan (PARSERPYTHONNET-37)
  • [Perbaikan] Beberapa dokumen Word dan RTF gagal dengan The document appears to be corrupted atau assembly SkiaSharp 3.119 yang hilang (PARSERPYTHONNET-35)
  • [Perbaikan] Memori bertambah setiap kali dokumen dibuka dari BytesIO (PARSERPYTHONNET-38)

Perubahan API Publik

  • Kesalahan mesin mengangkat GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException atau UnsupportedDocumentFormatException dari groupdocs.parser.exceptions, dimana pada 25.12 semua mengangkat RuntimeError. Kelas‑kelas tersebut ada pada 25.12, tetapi tidak diturunkan dari Exception dan tidak pernah diangkat. except Exception menangkap kesalahan pada kedua rilis.
  • Menetapkan atribut yang tidak dikenal mengangkat AttributeError.
  • Daftar yang dikembalikan mesin mendukung len() dan pengindeksan, dan daftar kosong dianggap false.

Dihapus

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

Gunakan fungsi untuk PreviewOptions dan PreviewOptions.preview_page_render sebagai gantinya.

Kelas dan anggota baru

  • 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() dan table[row, column].
  • DocumentData, Template: get().
  • TemplateCollection: append().
  • Resources: storage_path, dapat ditulisi.

Fitur baru

Ekstrak anotasi

Parser.get_annotations() mengembalikan komentar dan catatan dari dokumen PDF, Word, atau PowerPoint sebagai objek AnnotationItem dengan nilai, tipe, indeks halaman, timestamp, nama penulis, dan inisial; get_annotations(page_index) membaca satu halaman. TextOptions.include_annotations menambahkan teks anotasi ke teks yang diekstrak, dan parser.features.annotations memberi tahu apakah format mendukung anotasi.

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))

Baris perintah

Wheel menginstal skrip konsol groupdocs-parser (juga python -m groupdocs.parser) dengan perintah text, info, metadata, images, annotations, dan list-formats. text menerima --page N (dihitung dari 1), --format plain|markdown|html, --ocr, --include-annotations dan -o FILE; info, metadata, dan annotations menerima --json; images menerima --out DIR; setiap perintah menerima --password. --license dan --version diletakkan sebelum perintah. Kode keluar adalah 0 bila sukses, 2 untuk kesalahan pengguna seperti file yang hilang, dan 1 untuk kesalahan mesin atau format yang tidak mendukung operasi.

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

Logger Python

Objek Python biasa dengan metode trace(message), warning(message), dan error(message, exception) dapat diberikan ke ParserSettings sebagai logger, dan mesin akan memanggilnya dengan apa yang ditemui selama ekstraksi, misalnya file yang rusak. Fungsi log(level, message, exception) juga dapat digunakan.

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)

Kontrol pemuatan sumber daya eksternal

Mesin meminta penangan sumber daya eksternal sebelum memuat setiap gambar yang dirujuk oleh dokumen HTML atau MHTML. Penangan dapat berupa fungsi, objek dengan metode on_loading(args), atau subclass ExternalResourceHandler; menetapkan args.skipped = True akan melewatkan sumber daya tersebut. ParserSettings menerima penangan ini sebagai 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 untuk Bahasa Arab dan Korea

OcrOptions.language memilih alfabet yang dikenali OCR, defaultnya Bahasa Inggris. Language.ARA dan Language.KOR baru pada mesin ini. Model pengenalan merupakan bagian dari mesin: panggilan OCR pertama mengekstraknya, sekitar 80 MB, ke folder aspose_data di direktori kerja, tanpa unduhan. Untuk memilih folder, tetapkan Resources.storage_path (from groupdocs.parser import Resources) sebelum panggilan OCR pertama.

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)))

Tabel dari dokumen HTML

get_tables() kini menemukan tabel pada dokumen HTML, sebagaimana pada PDF, Word, dan spreadsheet; pada 25.12 tidak ada yang ditemukan. Sel tabel diakses dengan table[row, column], atau 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)])

Lisensi dari lingkungan

Setel GROUPDOCS_LIC_PATH ke jalur file lisensi, atau ke URL yang menyediakannya, dan lisensi akan diterapkan pada pemanggilan Parser pertama, tanpa kode lisensi; pada 25.12 variabel ini tidak dibaca. Jika lisensi tidak dapat diterapkan (file hilang, langganan kedaluwarsa, lisensi untuk produk lain), setiap pemanggilan Parser mengangkat LicenseError, menyebutkan variabel dan alasan mesin, sampai License().set_license() menerapkan lisensi. Setel GROUPDOCS_LIC_STRICT=0 untuk mendapatkan satu LicenseWarning dan mode evaluasi sebagai gantinya.

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>

Callback pratinjau sebagai fungsi biasa

PreviewOptions(create_page_stream, release_page_stream) menerima fungsi biasa, begitu pula PreviewOptions.preview_page_render. create_page_stream(page_number) mengembalikan stream yang dapat ditulisi, misalnya file yang dibuka dengan "wb" atau io.BytesIO; halaman dinomori mulai dari 1. Mesin menutup file yang diberikan, dan memanggil release_page_stream(page_number) setelah halaman selesai ditulis. Pada 25.12 ini merupakan kelas ICreatePageStream, IReleasePageStream, dan 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)

Atribut yang salah eja menimbulkan AttributeError

Menetapkan properti yang tidak dimiliki objek API mengangkat AttributeError dengan petunjuk “Apakah maksud Anda”. Pada 25.12 penetapan diterima, disimpan sebagai atribut khusus Python, dan pengaturan mesin tidak berubah.

from groupdocs.parser.options import TextOptions

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

Satu wheel untuk Python 3.5 – 3.14

Pada 25.12 terdapat ekstensi yang dikompilasi, dengan satu modul biner per versi Python dan runtime .NET Core 3.1. Versi 26.10 adalah satu wheel py3-none-<platform> per platform, Python murni di atas runtime .NET 10 yang tersemat, dan menyatakan python_requires=">=3.5,<3.15". Python 3.14 baru ditambahkan: 25.12 menyatakan <3.14. Sebagian besar kode 25.12 berjalan tanpa perubahan, dan semua 129 contoh Docs yang berjalan pada 25.12 juga berjalan pada 26.10. get_text() dan get_formatted_text() masih mengembalikan str, yang kini juga mendukung read_to_end().

Tag platform yang diperbarui dan wheel Windows 64-bit

Wheel Linux ditandai manylinux_2_27_x86_64, glibc tertua yang didukung oleh runtime .NET 10 tersemat, dan wheel macOS macosx_13_0_x86_64 serta macosx_13_0_arm64. Tidak ada lagi wheel Windows 32-bit. Instalasi memerlukan pip 20.3 atau lebih baru.

Contoh kode

Ekstrak anotasi dari dokumen Word dan sertakan dalam teks yang diekstrak:

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))

Cara mendapatkan pembaruan

PyPI

Instal atau perbarui menggunakan PyPI:

groupdocs-parser-net 26.10.0 di PyPI

pip install groupdocs-parser-net==26.10.0

Unduhan langsung

Unduh wheel spesifik platform dari halaman rilis GroupDocs.Parser for Python via .NET 26.10:

Sumber daya