Вопрос

Я пытаюсь обрезать NSImage, содержащий PDF-файл.При печати я использую drawInRect NSImage, чтобы он рисовал только то, что мне нужно — и это прекрасно работает.

Но теперь вместо этого я пытаюсь создать новый NSImage только из обрезанной области.Я некоторое время играл с ним, а затем нашел этот код на CocoaBuilder:

- (NSImage *) imageFromRect: (NSRect) rect
{
  NSAffineTransform * xform = [NSAffineTransform transform];

  // translate reference frame to map rectangle 'rect' into first quadrant
  [xform translateXBy: -rect.origin.x
                  yBy: -rect.origin.y];

  NSSize canvas_size = [xform transformSize: rect.size];

  NSImage * canvas = [[NSImage alloc] initWithSize: canvas_size];
  [canvas lockFocus];

  [xform concat];

  // Get NSImageRep of image
  NSImageRep * rep = [self bestRepresentationForDevice: nil];

  [rep drawAtPoint: NSZeroPoint];

  [canvas unlockFocus];
  return [canvas autorelease];
}

Это работает, но возвращаемый NSImage размыт и больше не пригоден для печати.Есть идеи?

Это было полезно?

Решение

lockFocus/unlockFocus выполняет растровую отрисовку в кэше изображения.Вот почему он «размыт» — у него низкое разрешение и, возможно, он неправильно зарегистрирован.Вам нужен векторный рисунок.

Используйте PDF-комплект.Сначала установите рамку обрезки каждой страницы на прямоугольник.После этого вы сможете создать обрезанный NSImage из dataRepresentation PDF-документа.

Другие советы

Вот код, выполняющий то, что ответил Питер Хози.Спасибо!

PDFDocument *thePDF = [[PDFDocument alloc] initWithData:pdfData];
PDFPage *thePage = [thePDF pageAtIndex:0];
NSRect pageCropRect = NSMakeRect(0, 100, 100, 100);

[thePage setBounds:pageCropRect forBox:kPDFDisplayBoxMediaBox];
NSImage *theCroppedImage = [[NSImage alloc] initWithData:[thePage dataRepresentation]];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top