Obsługa kompresji JBIG2

Omówienie

HotPDF obejmuje teraz pełną obsługę kompresji JBIG2 (Joint Bi-level Image Experts Group 2) JBIG2 to stratny lub bezstratny standard kompresji zaprojektowany specjalnie dla obrazów dwupoziomowych (monochromatycznych), często używanych w dokumentach PDF dla zeskanowanych stron tekstowych i rysunków kreskowych

Najważniejsze funkcje

  • Wysokowydajna kompresja obrazów dwupoziomowych
  • Obsługa trybów kompresji stratnej i bezstratnej
  • Optymalizacja pod kątem kompresji tekstu i rysunków kreskowych
  • Znaczne zmniejszenie rozmiaru pliku w porównaniu z tradycyjnymi metodami kompresji
  • Pełna obsługa zgodności z PDF/A
  • Obsługa dokumentów wielostronicowych ze współdzielonymi słownikami
  • Ograniczone budżety stron i pikseli z opcjonalnym natywnym fallbackiem Pascal

Korzyści kompresji

  • Lepsze współczynniki kompresji: Do 3-5 razy lepsza kompresja niż Group 4 CCITT
  • Dopasowywanie symboli: Z UseSymbolDictionary powtarzające się czarne spójne składowe są zapisywane raz jako symbole, a LossyLevel pozwala niemal identycznym składowym współdzielić jeden symbol
  • Oszczędność pamięci: Zoptymalizowane do przetwarzania dużych skanowanych dokumentów

Typowe zastosowania

  • Skanowane dokumenty tekstowe
  • Rysunki techniczne i plany
  • Formularze i faktury
  • Mapy i diagramy
  • Dokumenty o mieszanej treści z tekstem i grafiką

Implementacja techniczna

Obsługa JBIG2 jest zaimplementowana w module HPDFJBIG2.pas, który udostępnia:

  • THPDFJBIG2Decoder: Główna klasa dekodera dla danych skompresowanych JBIG2
  • Przetwarzanie strumieni: Wydajna obsługa strumieni danych JBIG2
  • Obsługa słowników globalnych: Współdzielone słowniki symboli dla dokumentów wielostronicowych
  • Dostęp do linii skanu: Dostęp do danych wiersz po wierszu dla oszczędnego pamięciowo przetwarzania
  • Obsługa słowników globalnych: współdzielone i wielopoziomowe łańcuchowe słowniki symboli z identyfikatorami segmentów 1-, 2- albo 4-bajtowymi
  • Enkoder wsadowy międzystronicowy: THPDFJBIG2Encoder.EncodePagesToByteArrays trenuje na całej partii i zwraca jeden strumień strony na wejście plus współdzielone dane globalne
  • Kontrakt partii: TJBIG2BatchPage opisuje jedną spakowaną stronę, TJBIG2BatchEncodeBackend identyfikuje wybraną implementację, a TJBIG2BatchEncodeCallback definiuje zewnętrzne integracje wsadowe
  • Integracja z dokumentem: THotPDF.AddJBIG2ImageBatch i THotPDF.AddJBIG2BitmapBatch kodują przed mutacją grafu PDF, podpinają współdzielony strumień /JBIG2Globals i zwracają indeksy obrazów w kolejności wejścia
  • Telemetria partii: TJBIG2BatchEncodeStatistics raportuje wybrany backend, rozmiary wejścia i wyjścia, liczbę symboli natywnych oraz odrzucenia z budżetu
  • Odzyskiwanie backendu: HPDFJBIG2EncRegisterBackends przywraca oba wbudowane callbacki enkodera po wyczyszczeniu tymczasowych nadpisania przez aplikację
  • HPDFJBIG2SplitSymbolDictionaryGlobals: rozdziela sekwencyjny strumień osadzony na słowniki globalne i segmenty obrazu stron, zachowując nagłówki zależności w formie długiej
  • Dekodowanie widocznego regionu: THPDFJBIG2Decoder.LoadRegionFromByteArray alokuje tylko żądane okno, rozwiązuje jego przechodnie zależności słownikowe, składa przecinające się regiony strony z przycinaniem i pomija niezależne regiony poza oknem przed dekodowaniem entropijnym
  • Telemetria dekodowania regionów: LastRegionDecodeStats raportuje liczby regionów zdekodowanych i pominiętych plus zdekodowane piksele źródłowe, a UsedIncrementalRegionDecode odróżnia natywną ścieżkę oknową od fallbacku pełnego dekodowania
  • Dostęp skanliniowy: dostęp do danych wiersz po wierszu dla przetwarzania oszczędnego pamięciowo

Przykład użycia


// Przykład Delphi - przetwarzanie danych skompresowanych JBIG2
procedure ProcessJBIG2Data;
var
  PDF: THotPDF;
  Decoder: THPDFJBIG2Decoder;
  ImageData: TBytesArray;
  ScanlineData: TBytesArray;
  Row: Integer;
begin
  PDF := THotPDF.Create(nil);
  Decoder := THPDFJBIG2Decoder.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    // Wczytaj skompresowane dane obrazu JBIG2
    if Decoder.LoadFromByteArray(ImageData) then
    begin
      // Przetwarzaj linia po linii dla oszczędności pamięci
      for Row := 0 to Decoder.Height - 1 do
      begin
        if Decoder.GetScanline(Row, ScanlineData) then
        begin
          // Przetwarzaj dane linii skanu zgodnie z potrzebami
          // Dodaj do strony PDF
        end;
      end;
    end;

    PDF.EndDoc;
  finally
    Decoder.Free;
    PDF.Free;
  end;
end;
        

Opcje enkodera i backendy

  • THotPDF.JBIG2Options: THPDFJBIG2Options dokumentu, które AddImage(..., icJBIG2) zamienia na TJBIG2EncodeOptions. Wartości domyślne pasują do skanów: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True i BlackDotSize=3
  • Usuwanie drobnych plam: Dopóki RemoveIsolatedBlackPixels jest True, czarne spójne składowe o szerokości i wysokości mniejszych niż BlackDotSize są czyszczone przed kodowaniem, więc domyślne ustawienia usuwają kropki 2 x 2 piksele i mniejsze. Ustaw False, gdy wyjście ma zgadzać się z bitmapą piksel w piksel
  • Wybór enkodera: UseExternalEncoder (domyślnie True) używa zarejestrowanego wydajnego enkodera arytmetycznego; gdy jest wyłączony, nieobecny albo zawodzi, zapisywany jest wbudowany bezstratny region ogólny MMR. UseNativeArithmeticFallback=True przed MMR próbuje wbudowanego kodera arytmetycznego w Pascalu, a przy UseSymbolDictionary=True najpierw próbuje słownika symboli z regionami tekstu
  • DefaultJBIG2EncodeOptions: Opcje używane przez samodzielny THPDFJBIG2Encoder: bezstratne, z LossyLevel=0 i bez usuwania plam
  • Wybór dekodera: THotPDF.UseExternalJBIG2Decoder (domyślnie True) dekoduje załadowane obrazy /JBIG2Decode wydajnym backendem, gdy jest dostępny; False używa wbudowanego dekodera w Pascalu
  • Własne backendy: RegisterJBIG2EncoderBackend i RegisterJBIG2DecoderBackend instalują callbacki aplikacji, IsJBIG2EncoderBackendAvailable i IsJBIG2DecoderBackendAvailable raportują ich obecność, a ClearJBIG2Backends usuwa je

Opis klasy

THPDFJBIG2Decoder

  • LoadFromByteArray: Wczytuje dane JBIG2 z tablicy bajtów; zwraca False, gdy dane są niekompletne albo niewspierane
  • GetScanline: Pobiera dane określonej linii skanu
  • Width/Height: Właściwości wymiarów obrazu

Optymalizacja wydajności

  • Oszczędne pamięciowo przetwarzanie linii skanu
  • Zoptymalizowane do obsługi dużych dokumentów
  • Minimalne użycie pamięci podczas dekompresji
  • Zoptymalizowane pod obsługę dużych dokumentów
  • Minimalny ślad pamięciowy podczas dekompresji
  • Przetwarzanie scanline oszczędne pod względem pamięci

Zgodność ze standardami

  • Zgodność ze standardem ITU-T T.88
  • Obsługa standardu ISO/IEC 14492
  • Image XObjects w PDF 1.4 lub nowszym z /JBIG2Decode i /JBIG2Globals
  • HotPDF nie zapisuje JBIG2, gdy aktywne jest wyjście PDF/A: AddImage(..., icJBIG2) zapisuje zamiast tego icCCITT42, a wstawianie wsadowe zwraca False
  • Spójność między platformami

Zobacz też