编辑pdf的CGPDFObject

时间:2012-04-24 09:43:05

标签: objective-c cgpdfdocument cgpdf cgpdfcontext cgpdfdictionaryref

我尝试用石英cgpdf api解析pdf文件很长时间,但我的问题是,CGPDF API无法编辑保存在pdf中的对象吗?

这意味着api仅用于读取文件?

2 个答案:

答案 0 :(得分:1)

是的,它只是读取文件。例如,字典只是表示如下的事物:

3 0 obj 
<< /Font
    << /F0
        << /Type /Font
            /BaseFont /Times-Italic
            /Subtype /Type1 >> 
    >>
>>
endobj

可以引用哪些内容,使得阅读比编辑更容易,如果删除某个对象,整个页面可能需要以不同的方式布局。我想为CGPDF API创建一个编写器并不太难,但它肯定是非常重要的。对于编写新的pdfs,您可以使用普通的图形上下文。

(对不起,这个聚会迟到了一年,但可能还有其他人)。

答案 1 :(得分:0)

我希望能够编辑 PDFContentStreams,但这在 PDFKit 或 Core Graphics 中的框架中是不可能的。没有一个 PDF 类是可变的,也不允许您指定从备用数据源初始化它们。所有 PDFObject 类都只是引用原始 PDFDocument,不允许您替换对象或更改其数据。

您可以做的最接近的事情是创建一个 CGPDFContext 并从另一个 PDF 文档中绘制一个页面,然后向其绘制其他 Quartz 图形。沿着;

void drawPageToNewPDF (CFURLRef newpdfname, CGRect mediabox, CFDictionaryRef auxdata, PDFPage* pp)
{
    CGContextRef cgpdf = CGPDFContextCreateWithURL(newpdfname, &mediabox, auxdata);

    CGPDFContextBeginPage(cgpdf, NULL);
    CGContextDrawPDFPage(cgpdf, [pp pageRef]);
// draw extra graphics here
    CGPDFContextEndPage(cgpdf);
    CGPDFContextClose(cgpdf);
}

但这不允许您更改文档中的现有数据。您能做的最好的事情是在要更改的对象上放置一个白色(或背景色)实心矩形,然后使用 Core Graphic 基元重新绘制它。

正确执行此操作的唯一方法是使用支持编辑 PDF 对象的第 3 方库。我一直没能找到objective-c的非商业开源PDF库。有一些 C++ 库编写包装器不会太难。

我正要走这条路,所以我还没有任何示例代码。 PoDoFo 看起来最有前途 详细的 pdf 编辑 http://podofo.sourceforge.net/ QPDF 仅用于编辑 PDF 结构 http://qpdf.sourceforge.net/