在PDFDocument和CGPDFContext之间移动数据?

时间:2018-04-01 11:04:06

标签: python macos quartz cgpdfcontext

我想在PDFKit的PDFDocument和Core Graphics的CGPDFContext之间移动数据,但我看不出怎么做。我正在使用python,但任何显示使用哪些方法和对象的代码都是受欢迎的 使用CGPDFDocument很容易,但有理由我需要使用PDFDocument。你认为他们将成为无人值守的桥梁。

  1. 从PDF文档创建上下文。

    pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL)
    pdfData = pdfDoc.dataRepresentation()
    CGPDFContextCreate(pdfData, None, metaDict)
    
  2. 但我得到:'deflateEnd:错误-3 :( null)。'

    1. 我可以使用drawWithBox ToContext将PDFPage添加到CGPDFContext,但这只是10.12及以上。我试过这个:

      page = pdfDoc.pageAtIndex_(0)
      writeContext = CGPDFContextCreateWithURL(myURL, None, dictarray)
      CGContextBeginPage(writeContext, mbox)
      CGContextDrawPDFPage(writeContext, page.pageRef)
      
    2. 这给了我一个分段错误。 (通过注释掉drawPDF行,或将page替换为CGPDFPage对象而不是PDFPage来解决此问题。

      1. 使用CGPDFContext中的Data初始化PDFDocument对象。
      2. 我可能不得不以某种方式使用CGDataProviders和消费者,但是没有线索。

1 个答案:

答案 0 :(得分:1)

我已经将您的代码与我一直在处理的一些 PDF 代码混合在一起,并想出了将 PDF 页面绘制到 CGContext 中的方法。

我也在使用我的“Arguments”类,它只为我处理命令行选项。应该是不言自明的。

我已经在几个不同的 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];
}