РЕДАКТИРОВАТЬ CGPDFObject of pdf
Я пытаюсь долго анализировать pdf файл с кварцевым cgpdf api, но мой вопрос правдив, что CGPDF API не может редактировать объект, сохраненный в pdf?
это означает, что API используется только для чтения файлов?
2 ответа
Да, это просто для чтения файлов. Например, словари - это просто представления чего-то, что выглядит так:
3 0 obj
<< /Font
<< /F0
<< /Type /Font
/BaseFont /Times-Italic
/Subtype /Type1 >>
>>
>>
endobj
На которые можно ссылаться, что делает чтение намного проще, чем редактирование, если вы удалите определенный объект, то всю страницу, возможно, придется выложить по-другому. Я думаю, что было бы не так уж и сложно написать программу для CGPDF API, но это, конечно, нетривиально. Для написания новых PDF-файлов вы можете использовать обычные графические контексты.
(Извините за опоздание на вечеринку на год, но могут быть и другие).
Я хотел бы иметь возможность редактировать 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);
}
Но это не позволяет вам изменять существующие данные в документе. Лучшее, что вы можете сделать, это поместить сплошной прямоугольник белого цвета (или цвета фона) над объектом, который вы хотите изменить, а затем перерисовать его с помощью примитивов базовой графики.
Единственный способ сделать это правильно — использовать стороннюю библиотеку, которая поддерживает редактирование объектов PDF. Мне не удалось найти некоммерческую библиотеку PDF с открытым исходным кодом для Objective-C. Есть несколько библиотек C++, для которых не составит труда написать оболочки.
Я только собираюсь пойти по этому пути, поэтому у меня пока нет примера кода. PoDoFo выглядит наиболее перспективным для детального редактирования PDF-файлов http://podofo.sourceforge.net/ QPDF только для редактирования структуры PDF-файлов http://qpdf.sourceforge.net/