Переместить данные между PDFDocument и CGPDFContext?

Я хочу переместить данные между PDFDocument в PDFKit и CGPDFContext в Core Graphics, но не понимаю, как это сделать. Я использую Python, но любой код, который показывает, какие методы и объекты для использования будет приветствоваться.
Использовать CGPDFDocument было бы легко, но есть причины, по которым мне нужно использовать PDFDocument. Вы могли бы подумать, что они будут соединены бесплатно.

  1. Создание контекста из PDFDocument.

    pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL)
    pdfData = pdfDoc.dataRepresentation()
    CGPDFContextCreate(pdfData, None, metaDict)
    

но я получаю: 'deflateEnd: ошибка -3: (ноль).'

  1. Я могу добавить PDFPage к CGPDFContext с drawWithBox ToContext, но это только 10.12 и выше. Я попробовал это:

    page = pdfDoc.pageAtIndex_(0)
    writeContext = CGPDFContextCreateWithURL(myURL, None, dictarray)
    CGContextBeginPage(writeContext, mbox)
    CGContextDrawPDFPage(writeContext, page.pageRef)
    

Это дает мне ошибку сегментации. (Что исправлено, закомментировав строку drawPDF или заменив page с CGPDFPage объект, а не PDFPage,

  1. Инициализируйте объект PDFDocument с данными из CGPDFContext.

Я, вероятно, должен как-то использовать CGDataProviders и Consumers для этого, но понятия не имею.

1 ответ

Я взял ваш код и смешал его с некоторым кодом PDF, над которым я работал, и придумал это, которое рисует страницу PDF в CGContext.

Я также использую свой класс «Аргументы», который просто обрабатывает параметры командной строки для меня. Должно быть понятно.

Я проверил это на нескольких разных PDF-файлах и получил одну страницу в новом PDF-файле.

      #import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <Quartz/Quartz.h>


#import "ArgumentsObj.h"

int main (int argc,  char*const* argv)
{

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    Arguments* aa = [Arguments argumentsWithCount:argc values:argv];
    
    if ([aa countPositionalArguments] == 2) {
        NSURL* furl = [NSURL fileURLWithPath:[aa positionalArgumentAt:0]];
        PDFDocument* pdfd = [[PDFDocument alloc] initWithURL:furl];

        PDFPage* pp = [pdfd pageAtIndex:0];
        PDFRect mediabox = [pp boundsForBox:kPDFDisplayBoxMediaBox];

        NSURL* nsfn = [NSURL fileURLWithPath:[aa positionalArgumentAt:1]];
        NSDictionary* aux = [NSDictionary dictionaryWithObjectsAndKeys:@"main",kCGPDFContextCreator, nil];

        CGContextRef cgpdf = CGPDFContextCreateWithURL((CFURLRef)nsfn,&mediabox,(CFDictionaryRef)aux);
    
        CGPDFContextBeginPage(cgpdf, NULL);

        CGContextDrawPDFPage(cgpdf, [pp pageRef]);
                       
        CGPDFContextEndPage(cgpdf);
        CGPDFContextClose(cgpdf);

    }
    [pool release];
}
Другие вопросы по тегам