2010-08-11 6 views
0

J'ai un document PDF qui est créé en créant NSImages avec la taille en 72 ppp pts, chacun a une seule représentation qui est mesurée en pixels. J'ai ensuite mis ces images dans PDFPages avec initWithImage, puis enregistrez le document. Lorsque j'ouvre le document, j'ai besoin de la résolution de l'image d'origine. Cependant, tous les rectangles que PDFPage me donne sont mesurés en points, pas en pixels.résolution d'un PDFPage?

Je sais que l'information est là, et je suppose que je peux essayer d'analyser les données PDF moi-même, en passant par l'exemple voyeur.app ... mais c'est beaucoup d'efforts pour faire quelque chose qui devrait être assez normal ...

Existe-t-il un moyen plus facile de faire cela?

Ajouté:

J'ai essayé deux techniques:

  1. obtenir les données de PDFRepresentation la page et l'utiliser pour faire une nouvelle NSImage via initWithData. Ce fonctionne, cependant, l'image a à la fois taille et taille de pixel en 72 dpi. Dessinez le PDFPage dans un nouveau contexte hors écran , puis obtenez une image CG à partir de cela. Le problème est que quand je fais le contexte, il semble que j'ai besoin de connaître la taille en pixels déjà, ce qui va à l'encontre partie du but ...

Répondre

3

Il y a quelques choses vous devez comprendre au sujet de PDF:

  • Le PDF système de coordonnées en points (1/72 pouce) par défaut.

  • Le système de coordonnées PDF est dépourvu de résolution. (Ceci est un mensonge blanc - la résolution est effectivement la limite des nombres à virgule flottante de 32 bits).

  • Les images au format PDF ne sont intrinsèquement associées à aucune résolution (c'est un mensonge blanc - les images compressées avec JPEG2000 ont toujours une résolution dans leurs métadonnées incorporées). Une image au format PDF est représentée par un objet qui contient une série d'échantillons stockés à l'aide d'un filtre de compression.

  • Les objets d'image peuvent être rendus sur une page plusieurs fois à n'importe quelle taille.

Depuis la résolution est définie comme étant le nombre de pixels (ou échantillons) par unité de distance, la résolution signifie que quelque chose pour un rendu particulier d'une image sur une page. Donc, si vous êtes rendu une image particulière pour remplir la page, la résolution en dpi est

xdpi = image_width/(pageWidthInPoints/72.0); 
ydpi = image_height/(pageHeightInPoints/72.0); 

Si l'image n'est pas rendu à la pleine taille de la page, une solution complète est très délicate.Adobe prescrit que les images doivent être traitées comme étant 1x1 et que vous modifiez la matrice de transformation de page pour déterminer comment les rendre. Le moyen que vous auriez besoin de la matrice au point de rendre l'image et vous auriez besoin de pousser les points (0,0), (0, 1), (1,0) à travers la matrice. La distance euclidienne entre (0, 0) 'et (1, 0)' vous donnera la largeur en points et la distance euclidienne entre (0, 0) 'et (0, 1)' vous donnera la hauteur en points.

Alors, comment obtenez-vous cette matrice? Eh bien, vous avez besoin du flux de contenu pour la page et vous devez écrire un interpréteur PDF capable d'extraire le flux de contenu et de suivre les modifications apportées à la CTM. Lorsque vous atteignez votre image, vous en extrayez le CTM. Pour ce faire, la dernière étape devrait être d'environ une heure avec une boîte à outils PDF décente, à condition que vous connaissiez la boîte à outils. L'écriture de cette boîte à outils représente plusieurs années de travail.