1

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

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

4

2 回答 2

1

是的,它只是读取文件。例如,字典只是看起来像这样的东西的表示:

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

可以引用它,使阅读比编辑容易得多,如果您删除某个对象,整个页面可能需要以不同的方式布局。我想为 CGPDF API 编写器不会太难,但它肯定不是微不足道的。要编写新的 pdf,您可以使用普通的图形上下文。

(很抱歉迟到了一年,但可能还有其他人)。

于 2013-03-20T07:33:58.733 回答
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/

于 2021-01-06T12:57:55.477 回答