【问题标题】:Move data between PDFDocument and CGPDFContext?在 PDFDocument 和 CGPDFContext 之间移动数据?
【发布时间】:2018-09-10 20:24:01
【问题描述】:

我想在 PDFKit 的 PDFDocument 和 Core Graphics 的 CGPDFContext 之间移动数据,但我不知道该怎么做。我正在使用 python,但欢迎任何显示要使用的方法和对象的代码。
使用 CGPDFDocument 会很容易,但我需要使用 PDFDocument 是有原因的。你会认为他们会被免费桥接。

  1. 从 PDFDocument 创建上下文。

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

但我得到:'deflateEnd: error -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)
    

这给了我一个分段错误。 (通过注释掉 drawPDF 行,或将 page 替换为 CGPDFPage 对象而不是 PDFPage 来解决此问题。

  1. 使用来自 CGPDFContext 的数据初始化 PDFDocument 对象。

我可能不得不以某种方式使用 CGDataProviders 和 Consumers,但没有任何线索。

【问题讨论】:

  • 您知道您可以使用 documentRef 实例属性从 PDFDocument 获取 CGPDFDocumentRef。见这里:developer.apple.com/documentation/pdfkit/pdfdocument/…
  • @silicontrip 哦,谢谢。我会试一试的。如果我能记得我在做什么......!
  • 您的第一段代码不起作用,因为CGPDFContextCreate 需要CGDataConsumerRef 而不是NSData。它正在寻找写入数据的地方,而不是寻找要初始化的数据。

标签: python macos quartz cgpdfcontext


【解决方案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];
}

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2021-09-20
    • 2023-04-07
    • 2016-11-29
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多