2010-06-14 10 views
6

Próbuję renderować zawartość PDF do kontekstu urządzenia GDI (dokładniej do mapy bitowej 24-bitowej). Analizowanie strumienia PDF do obiektów PDF i renderowanie poleceń PDF ze słownika treści działa dobrze, w tym renderowania czcionek.Zmiana osadzonej czcionki TrueType, aby była możliwa do użycia przez system Windows GDI

Czcionki osadzone są dekompresowane z ich strumieni FontFile i "ładowane" przy użyciu AddFontMemResourceEx. Teraz niektóre osadzone czcionki usuwają niektóre tabele TrueType, które są wymagane przez GDI, takie jak tablica "nazwa". Z tego powodu próbowałem zmodyfikować czcionkę, analizując czcionkę podzestawu TrueType w jej tabelach i modyfikując te tabele, które mają brakujące/brakujące tabele danych, są regenerowane z możliwie jak najdokładniejszymi informacjami.

Używam narzędzia Microsoft Font Validator, aby zobaczyć, jak "poprawna" jest generowana czcionka. Nadal dostaję kilka błędów, jak w przypadku tabeli maxp wartości maksymalne są zwykle zbyt duże (jest to podzbiór) lub pole xAvgCharWidth nie jest równe obliczonej wartości tabeli "OS/2" nie jest poprawne, ale to nie Zatrzymaj inne czcionki osadzone, aby były przydatne. Czcionki osadzone za pomocą PDFCreatora są problematyczne.

Pytania:

  1. Jak mogę określić, co muszę zmiany do pliku czcionki w celu GDI, aby móc z niego korzystać?
  2. Czy istnieją inne narzędzia do sprawdzania poprawności czcionek , które mogą dać mi wgląd w to, co jest nadal nie tak z plikiem czcionki ?

W razie potrzeby: Mogę utworzyć oryginalny plik czcionek i zmieniony plik czcionek dostępny do pobrania.

Co modyfikacje są wykonane do tej pory:

  • Upewnij się, że jest 'głowa', 'hhea', 'maxp' i '/ OS 2' sekcja.
  • Jeśli posiadamy czcionkę symbolu, wyczyść pola Panose i Unicode w sekcji "OS/2"
  • Wpisz prawidłowe wartości WInAscent/Desc i TypoAsc/Desc, jeśli mamy zero.
  • Wypełnij akceptowalne wartości dla pozycji/rozmiarów sup/dolny/podkreślenia.
  • Zeskanuj wszystkie glify, które pozostały wypełnione wartościami X/Y min/maks. W głowie.
  • Odbuduj sekcję nazw informacjami z pliku PDF, z którego pochodzi.
+0

PDFCreator opiera się na Ghostscript w celu utworzenia pliku PDF. Dane wejściowe PDFCreator to PostScript, który (w systemie Windows) zazwyczaj pochodzi z wyjścia sterownika drukarki PostScript (najczęściej z sterownika PS firmy Adobe). Pytanie brzmi: czy w pełni kontrolujesz przepływ pracy? Czy musisz przetwarzać pliki PDF wygenerowane przez program PDFCreator, gdzieś poza kontrolą? Jeśli masz pełną kontrolę, możesz skonfigurować przepływ pracy PDFCreator w celu osadzenia oryginalnych czcionek TrueType używanych w oryginalnym (nie-PostScriptowym) formacie dokumentu, zamiast przekonać, że przepływ pracy przekształca czcionki na PS Type1. –

+0

@pipitas: Źródłowe pliki PDF są uważane za "poza naszą kontrolą". Obecnie mamy wytyczną, która mówi: podczas korzystania z PDFCreator, nie używaj osadzonych czcionek. Głównym powodem, dla którego * naprawdę * chcę rozwiązać ten problem, jest pełne zrozumienie wymagań ładowania czcionek w systemie Windows. Jeśli mogę użyć GDI do narysowania mojego tekstu, mogę uniknąć zależności od innych bibliotek dll, bibliotek z ich licencjami i patentami itp. Ale ostatecznie podoba mi się rozwiązać ten dokuczliwy problem, chociaż jest on teraz niższy na liście prio do wytycznej. –

+0

Cóż, jeśli twój problem występuje głównie z danymi wyjściowymi PDFCreatora, ale nie możesz "naprawić" przyczyny tego problemu w swoim katalogu głównym (przez głupie wytyczne, które mówią: "Nie rób tego dla swoich plików PDF, jakie są wszystkie najnowsze wysiłki normalizacyjne [ PDF/X, PDF/A] zalecane [a mianowicie, osadzanie czcionek]! ", A następnie jestem zakłopotany ... –

Odpowiedz

3

Prawie rok późno, ale znalazłem odpowiedź:

rodzaj czcionki (symbol lub nie) powinny być takie same dla tabeli „CMAP” oraz tabeli „nazwa”. Więc jeśli cmap ma 3,0,4 cmap (MS, symbol, kodowanie delta segmentu), a tabela nazw zawiera wpisy 3,1, 0409 (MS, Unicode, enUS), czcionka się nie załaduje.

Wygląda na to, że obecność "symbolu cmap" określa, czy czcionka jest uważana za czcionkę symbolu w systemie Windows; flagi w "OS/2" nie wydają się mieć znaczenia.

Jeśli więc czcionka wydaje się być poprawna przy użyciu "Microsoft Font Validator", sprawdź, czy pola symbol/unicode są wyrównane w tabelach "cmap" i "nazwa".

+0

Właśnie się rozglądałem i wygląda na to, że WPF może mieć to również w .NET 4.0, używając 'PresentationCore' jako odnośnika: http://msdn.microsoft.com/en-us/library/system.windows.media.glyphtypeface .symbol.aspx –

+0

Nie mam dużego doświadczenia z WPF, ale wygląda na to, że możesz używać czcionek OpenType, które nie mają cmap i adresujesz glify na glifie. Jeśli spróbujesz to zrobić w GDI, to nie zadziała. Dziękuję za wskazanie. –

+0

Nie zagłębiałem się w to wszystko, ale natknąłem się na [ten dokument na temat wyboru czcionki w WPF] (http://blogs.msdn.com/b/text/archive/2007/04/23/wpf -font-selection-model.aspx), który jest bardzo szczegółowy, pokazując, jak WPF określa czcionki z tabel. To interesująca lektura. –

3

Z AddMemoryFont w GDI + można sprawdzić to Status za jakiekolwiek błędy w czcionce pamięci, jak NotTrueTypeFont na przykład.

Jedną z opcji dla GDI może być próba wczytania osadzonej czcionki do dokumentu/formularza samodzielnie za pomocą TTLoadEmbeddedFont, a następnie sprawdzenie wszystkich błędów zwróconych przez użytkownika error messages. Jedynymi funkcjami, które dostarczają więcej informacji niż ta, są CreateFontPackage/MergeFontPackage i ich error codes, ale nie widzę, w jaki sposób można ich użyć w danej sytuacji.

Odrzucając to wszystko, czy miałeś okazję przejrzeć dokument PDFCreator: source code (zakładając, że korzystasz z wersji o otwartym kodzie źródłowym, a nie komercyjnej)?

+0

Ta funkcja/kody stanu nie dostarczają wystarczającej ilości informacji, aby zobaczyć, dlaczego nie jest ona uważana za prawidłową czcionkę. Próbuję dostarczyć program czcionek truetype, który spełnia wymagania (wszystkie wymagane tabele są obecne itp.), Ale jakoś nie mogę zobaczyć, co brakuje/źle. Ponadto używam GDI, a nie GDI +, ale gdybym mógł uzyskać informacje, co muszę zmienić na czcionkę i sprawić, żeby wszystko działało ... Gdzieś w implementacji GDI do ładowania czcionek typu truetype jest odrzucony program czcionki i chcę wiedzieć, dlaczego więc mogę go zmienić i użyć osadzonej czcionki. –

+0

Ach, przepraszam za GDI +. Tak, GDI sprawdza tylko pewną liczbę rzeczy. Zaktualizowałem powyższą odpowiedź. –

+0

Próbowałem MergeFontPackage, aby uzyskać pożądaną czcionkę lub uzyskać wskazówki, co jest z nią nie tak. I voila .. żadnych błędów mamy nowy plik czcionki. Niestety to nie zadziałało; jeszcze lepiej, że utworzony pakiet czcionek był tym samym bajtem dla bajtu. To nie dało mi wglądu w to, co było nie tak z programem do czcionek oraz nie dało czytelnego programu czcionki. Spróbuję TTLoadEmbedded, aby zobaczyć, co przyniesie mi jutro. –

Powiązane problemy