|
Ulepszona obsługa metaplików EMF/WMF
Omówienie
HotPDF zapewnia teraz znacznie rozszerzoną obsługę formatów Enhanced Metafile (EMF) i Windows Metafile (WMF)
Nowa implementacja obejmuje automatyczne wykrywanie formatu, wiele opcji pozycjonowania, zaawansowane sterowanie skalowaniem,
oraz lepszą jakość renderowania grafiki wektorowej w dokumentach PDF
Najważniejsze usprawnienia
- Automatyczne wykrywanie formatu EMF/WMF i odpowiednie przetwarzanie
- Wiele opcji pozycjonowania (środek, lewy górny róg, współrzędne niestandardowe)
- Ulepszone skalowanie i kontrola proporcji
- Bezpośrednie renderowanie EMF w celu zachowania grafiki wektorowej
- Opcja konwersji do bitmapy dla zgodności
- Usprawnione zarządzanie pamięcią dla dużych metaplików
- Lepsza obsługa złożonej grafiki wektorowej i tekstu
- Lepsza obsługa złożonej grafiki wektorowej i tekstu
Opcje kontroli położenia
Ulepszona obsługa metaplików obejmuje elastyczne opcje pozycjonowania:
- mpCenter: Metaplik wyśrodkowany na stronie (zachowanie domyślne)
- mpLeftTop: Metaplik wyświetlany w lewym górnym rogu (X=0, Y=0)
- mpCustom: Metaplik wyświetlany w określonym położeniu (wymaga parametrów X, Y)
Przykłady użycia
Podstawowe użycie (domyślny widok wyśrodkowany)
// Przykład Delphi - domyślny widok wyśrodkowany
procedure ShowMetafileDefault;
var
PDF: THotPDF;
MetaFile: TMetafile;
begin
PDF := THotPDF.Create(nil);
MetaFile := TMetafile.Create;
try
PDF.BeginDoc;
PDF.AddPage;
// Wczytaj metaplik
MetaFile.LoadFromFile('diagram.emf');
// Wyświetl wyśrodkowany na stronie (domyślnie)
PDF.CurrentPage.ShowMetafile(MetaFile);
PDF.EndDoc;
finally
MetaFile.Free;
PDF.Free;
end;
end;
Użycie kontroli położenia
// Przykład Delphi - zaawansowane pozycjonowanie
procedure ShowMetafileAdvanced;
var
PDF: THotPDF;
MetaFile: TMetafile;
begin
PDF := THotPDF.Create(nil);
MetaFile := TMetafile.Create;
try
PDF.BeginDoc;
PDF.AddPage;
MetaFile.LoadFromFile('chart.wmf');
// Wyświetl w lewym górnym rogu
PDF.CurrentPage.ShowMetafile(MetaFile, mpLeftTop);
// Wyświetl w niestandardowym położeniu
PDF.CurrentPage.ShowMetafile(MetaFile, mpCustom, 100, 200);
PDF.EndDoc;
finally
MetaFile.Free;
PDF.Free;
end;
end;
Ulepszone metody
// Delphi example - Per-call options
procedure ShowMetafileWithOptions;
var
PDF: THotPDF;
MetaFile: TMetafile;
Options: THPDFEmfOptions;
begin
PDF := THotPDF.Create(nil);
MetaFile := TMetafile.Create;
Options := THPDFEmfOptions.Create;
try
Options.EmfBitmapScale := 1;
Options.ColorImageCompression := icFlate;
Options.UseScreenReferenceDC := False;
Options.CanvasOver := True;
Options.Redraw := False;
Options.UseFrame := True;
Options.ShowNullPen := True;
Options.ShowNullBrush := True;
PDF.BeginDoc;
PDF.AddPage;
MetaFile.LoadFromFile('diagram.emf');
PDF.CurrentPage.ShowMetafile(MetaFile, mpCenter, 0, 0, Options);
PDF.EndDoc;
finally
Options.Free;
MetaFile.Free;
PDF.Free;
end;
end;
Ulepszona obsługa EMF/WMF wprowadza kilka nowych metod:
Przeciążenia THPDFPage.ShowMetafile
Ulepszone metody przetwarzania
ShowMetafile(MetaFile: TMetafile) - domyślne wyświetlanie wyśrodkowaneShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition) - kontrola pozycjiShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single) - własne pozycjonowanieShowMetafile(MetaFile: TMetafile; Options: THPDFEmfOptions) - opcje renderowania per wywołanieShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single; Options: THPDFEmfOptions) - kontrola pozycji z opcjami renderowania per wywołanieShowMetafileEx(MetaFile: TMetafile; Options: THPDFEmfOptions) - bezpośrednie API strony z jednorazowym nadpisaniem opcji EMF/WMF
Metody przetwarzania rozszerzonego EnhancedShowMetafile - przetwarzanie zaawansowane z rozszerzonymi funkcjamiShowEnhancedMetafile(Page, MetaFile, Options) - helper globalny z opcjami renderowania per wywołanieShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - helper globalny z kontrolą pozycji i opcjami renderowania per wywołanieShowEnhancedMetafile(Page, FileName, Options) - helper po nazwie pliku z opcjami renderowania per wywołanieShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) - helper po nazwie pliku z kontrolą pozycji i opcjami renderowania per wywołanieRenderEmfDirect - bezpośredni render EMF z zachowaniem wektorówRenderEmfAsBitmap - konwersja do bitmapy dla kompatybilnościRenderWmfAsBitmap - render WMF do bitmapy z kontrolą pozycji
Implementacja techniczna
Ulepszona obsługa EMF/WMF jest zaimplementowana w module HPDFEmf.pas, który udostępnia:
- THPDFEmfEnhanced: Główna klasa usprawnień do przetwarzania EMF
- THPDFEmfPatcher: Klasa narzędziowa do konwersji i renderowania EMF
- THPDFMetafilePosition: Wyliczenie do kontroli położenia
- Ulepszone przetwarzanie rekordów EMF: Obsługa zaawansowanych rekordów EMF
THPDFPageHelper a granica C++
Na Delphi XE2 i nowszych przeciążenia THPDFPage.ShowMetafile i THPDFPage.EnhancedShowMetafile wymienione powyżej są wstrzykiwane przez THPDFPageHelper, class helper zadeklarowany w jednostce HPDFEmf, więc dodanie HPDFEmf do klauzuli uses wystarcza, by wywoływać je na dowolnej instancji THPDFPage
Class helpers to funkcja języka dostępna tylko w Delphi i nieosiągalna z C++Builder: wywołujący C++ używają zamiast tego globalnych helperów ShowEnhancedMetafile(Page, MetaFile, ...) wymienionych przy metodach przetwarzania rozszerzonego, dokładnie tak jak robi to demo ConvertTo
W wersjach Delphi starszych niż XE2 ta sama funkcjonalność jest wystawiona jako zwykłe procedury kompatybilności przyjmujące stronę jako pierwszy argument: THPDFPage_ShowMetafile(Page, MetaFile), THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y), THPDFPage_EnhancedShowMetafile(Page, MetaFile) i THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)
Przełącznik usprawnień
Ścieżkę rozszerzoną strzeże zmienna EmfSupportEnabled: Boolean w HPDFEmf, domyślnie True; ustawienie jej na False sprawia, że każdy wyświetlany metaplik wraca do podstawowej ścieżki renderowania
Wywołaj EnableEnhancedEmfSupport, by po rezygnacji włączyć ścieżkę rozszerzoną z powrotem — z tego wzorca korzystają dema przed swoim pierwszym wywołaniem ShowMetafile
Funkcje zaawansowane
Obsługa rekordów EMF
- EMR_BITBLT - Operacje bitmapowe
- EMR_STRETCHDIBITS - Operacje rozciągania bitmap
- EMR_ALPHABLEND - Operacje mieszania alfa
- Ulepszone renderowanie tekstu
- Operacje na złożonych ścieżkach
Opcje renderowania
- Zachowanie wektorów: Zachowuje jakość grafiki wektorowej
- Awaryjne użycie bitmapy: Automatyczne rozwiązanie awaryjne dla złożonej grafiki
- Opcje skalowania: Automatyczna i ręczna kontrola skalowania
- Kontrola jakości: Konfigurowalne ustawienia jakości renderowania
- Warstwy kanwy: ustaw
THPDFEmfOptions.CanvasOver, gdy istniejąca treść strony ma być malowana ponad odtworzoną treścią metapliku Canvas - Sterowanie Redraw: zostaw włączone
THPDFEmfOptions.Redraw dla domyślnej tymczasowej ścieżki przemalowania albo wyłącz je, by parsować oryginalny metaplik bezpośrednio - Przycinanie do ramki: ustaw
THPDFEmfOptions.UseFrame, by przyciąć wyjście EMF do ramki z nagłówka, gdy importowane metapliki opierają się na granicach ramki - Wzory pędzli hatch: pędzle hatch EMF/WMF mapują się na wzory tiling PDF, więc importowane rysunki zachowują teksturę wypełnienia
- Diagnostyka obiektów null: domyślnie utrzymuj niewidocznymi null-pióra i null-pędzle albo ustaw
THPDFEmfOptions.ShowNullPen i THPDFEmfOptions.ShowNullBrush, gdy diagnostyka potrzebuje, by te ścieżki albo wypełnienia stały się widoczne
Optymalizacje wydajności
- Oszczędne pamięciowo przetwarzanie dużych metaplików
- Zoptymalizowane parsowanie rekordów EMF
- Inteligentne buforowanie powtarzanych elementów
- Zmniejszone użycie pamięci podczas konwersji
Zgodność i standardy
- Obsługa Windows EMF 1.0 i Enhanced EMF
- Zgodność wsteczna z Windows Metafile (WMF)
- Spójność renderowania między platformami
- Zgodność ze standardami grafiki wektorowej PDF
Rozwiązywanie problemów
Typowe problemy i rozwiązania:
- Duże metapliki: Użyj renderowania bitmapowego dla bardzo dużych lub złożonych metaplików
- Renderowanie tekstu: Upewnij się, że fonty są dostępne w systemie docelowym
- Złożona grafika: Rozważ bezpośrednie renderowanie EMF dla lepszej jakości
- Problemy z pozycjonowaniem: Użyj niestandardowego pozycjonowania dla precyzyjnego umieszczenia
Zobacz też
|