在 PDFDocument 和 CGPDFContext 之间移动数据?
Move data between PDFDocument and CGPDFContext?
我想在 PDFKit 的 PDFDocument 和 Core Graphics 的 CGPDFContext 之间移动数据,但我不知道该怎么做。我正在使用 python,但欢迎任何显示要使用的方法和对象的代码。
使用 CGPDFDocument 很容易,但我需要改用 PDFDocument 是有原因的。你会认为他们会被免费桥接。
正在从 PDFDocument 创建上下文。
pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL)
pdfData = pdfDoc.dataRepresentation()
CGPDFContextCreate(pdfData, None, metaDict)
但我得到:'deflateEnd: error -3: (null).'
我可以使用 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
.
来修复
- 使用 CGPDFContext 中的数据初始化 PDFDocument 对象。
为此,我可能不得不以某种方式使用 CGDataProviders 和 Consumers,但一无所知。
我已经采用了您的代码并将其与我一直在处理的一些 PDF 代码混合,并提出了将 PDF 页面绘制到 CGContext 中的方法。
我也在使用我的“参数”class,它只是为我处理命令行选项。应该是不言自明的。
我已经在几个不同的 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];
}
我想在 PDFKit 的 PDFDocument 和 Core Graphics 的 CGPDFContext 之间移动数据,但我不知道该怎么做。我正在使用 python,但欢迎任何显示要使用的方法和对象的代码。
使用 CGPDFDocument 很容易,但我需要改用 PDFDocument 是有原因的。你会认为他们会被免费桥接。
正在从 PDFDocument 创建上下文。
pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL) pdfData = pdfDoc.dataRepresentation() CGPDFContextCreate(pdfData, None, metaDict)
但我得到:'deflateEnd: error -3: (null).'
我可以使用 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
.
- 使用 CGPDFContext 中的数据初始化 PDFDocument 对象。
为此,我可能不得不以某种方式使用 CGDataProviders 和 Consumers,但一无所知。
我已经采用了您的代码并将其与我一直在处理的一些 PDF 代码混合,并提出了将 PDF 页面绘制到 CGContext 中的方法。
我也在使用我的“参数”class,它只是为我处理命令行选项。应该是不言自明的。
我已经在几个不同的 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];
}