Hat jemand einen CGPDFScanner verwendet, um den ToUnicode CMap-Stream-Eintrag eines Font-Dictionarys zu analysieren? Ich stoße auf einige Probleme.
Ich erhalte die CGPDFStream-Referenz aus dem Wörterbuch und versuche, einen CGPDFScanner damit zu erstellen. Das Problem ist, dass CGPDFScanner einen CGPDFContentStream als Argument nehmen, nicht einen CGPDFStream.
Wenn ich eine CGPDFPage für den Textoperator parse, kann ich den CGPDFContentStream mit CGPDFContentStreamCreateWithPage leicht erhalten, aber die Schwesterfunktion CGPDFContentStreamCreateWithStream - von der es heißt, dass "Sie diese Funktion verwenden können, um Zugriff auf den Inhalt eines Formulars, Musters, Type3-Fonts oder eines beliebigen PDF-Streams zu erhalten" - ist etwas verworren im CGPDFContentStream-Referenz und ich bin nicht in der Lage, Beispielcode zu finden.
Wie auch immer, ich übergebe den CMap-Stream als die Strom Argument, die Ressource CGPDFDictionary, die aus dem Stream mit CGPDFStreamGetDictionary als streamResources Parameter und den Seiteninhaltsstrom als Elternteil . Das Ressourcen-Wörterbuch kann leicht aus dem Stream selbst bezogen werden, warum also die Mühe machen, es überhaupt abzufragen? Darüber hinaus scheint die Übergabe von NULL als Parameter, außer dem ersten, keinerlei Wirkung zu haben.
Das Ergebnis ist immer dasselbe: Wenn ich versuche, den Inhaltsstrom mit einem Scanner zu scannen, der mit einigen Rückrufen eingerichtet wurde, erhalte ich folgende Meldungen
\`begincodespacerange' isn't an operator.
\`beginbfrange' isn't an operator.
...
\`endbfrange' isn't an operator.
für jeden in der Rückruftabelle eingestellten Operator. Dies für jede angetroffene CMap.
Ich bin mir also nicht sicher, ob der Content-Stream falsch eingestellt ist, ob die Operatoren ungültig sind oder ob der CGPDFScanner nicht zum Parsen der CMap verwendet werden kann, auch wenn es sich um ein reguläres PDF-Stream-Objekt handelt, und ich daher meinen eigenen Scanner schreiben muss, um die Stream-Daten zu parsen.