我尝试了很长时间用quartz cgpdf api解析一个pdf文件,但我的问题是CGPDF API不能编辑保存在pdf中的对象?
这是不是意味着api只用于读取文件?
发布于 2013-03-20 15:33:59
是的,它只是为了读取文件。例如,字典只是类似于下面这样的东西的表示:
3 0 obj
<< /Font
<< /F0
<< /Type /Font
/BaseFont /Times-Italic
/Subtype /Type1 >>
>>
>>
endobj
如果您删除某个对象,则整个页面可能需要不同的布局。我猜为CGPDF API编写一个编写器并不是太难,但它肯定不是微不足道的。要编写新的pdf,您可以使用普通的图形上下文。
(抱歉,我迟到了一年,但可能还有其他人)。
发布于 2021-01-06 20:57:55
我很乐意能够编辑PDFContentStreams,但这是不可能的框架在PDFKit或核心图形。所有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);
}
但这不允许您更改文档中的现有数据。你能做的最好的就是在你想要改变的对象上放置一个白色(或背景色)的实心矩形,然后使用核心图元重新绘制它。
正确执行此操作的唯一方法是使用支持编辑PDF对象的第三方库。我还没能找到objective-c的非商业开源PDF库。有几个C++库,为它们编写包装器并不太难。
我正要沿着这条路走下去,所以我还没有任何示例代码。PoDoFo看起来最有希望的详细pdf编辑http://podofo.sourceforge.net/ QPDF只是编辑一个pdf结构http://qpdf.sourceforge.net/
https://stackoverflow.com/questions/10295413
复制相似问题