5

ウィジェットやリンクなどの注釈を含むコードで PDF を生成しようとしています。PDF を生成し、ドキュメント情報とページの MediaBox を変更できますが、注釈に追加する方法がわかりません。ページ辞書に追加しようとしましたが、何らかの理由で PDF がそれを受け入れません。

新しく作成された PDF に注釈を追加する方法を知っている人はいますか? 以下は、PDF を生成するために必要なコードと、それに追加しようとしているテスト注釈辞書です。

-(void) createPDFFile: (CGPDFPageRef) pageRef{

CGContextRef pdfContext;

CFStringRef path;

CFURLRef url;


CFMutableDictionaryRef myDictionary = NULL;

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
 NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
 const char *filepath = [[documentsDirectory stringByAppendingString:@"/fileTest.pdf"] UTF8String];

path = CFStringCreateWithCString (NULL, filepath, kCFStringEncodingUTF8);

url = CFURLCreateWithFileSystemPath (NULL, path,  kCFURLPOSIXPathStyle, 0);

CFRelease (path);

myDictionary = CFDictionaryCreateMutable(NULL, 0,

                                         &kCFTypeDictionaryKeyCallBacks,

                                         &kCFTypeDictionaryValueCallBacks); 

CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));

CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));

CGRect pageRect = self.bounds;
pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); // 5

CFRelease(myDictionary);

CFRelease(url);

CGRect mediaBox;
mediaBox = CGRectMake (0, 0, pageRect.size.width, 100);
CFStringRef myKeys[1];

CFTypeRef myValues[1];

myKeys[0] = CFSTR("MediaBox");

myValues[0] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect));

CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys,
                                                    (const void **) myValues, 1,
                                                    &kCFTypeDictionaryKeyCallBacks,
                                                    & kCFTypeDictionaryValueCallBacks);
CFMutableDictionaryRef pageDictionaryMutable = CFDictionaryCreateMutableCopy(NULL, 0, pageDictionary);

CFMutableDictionaryRef  metaDataDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks,&kCFTypeDictionaryValueCallBacks); 

CFDictionarySetValue(metaDataDictionary, CFSTR("DA"), CFSTR("/Helvetica 10 Tf 0 g"));
CFDictionarySetValue(metaDataDictionary, CFSTR("F"), CFSTR("4"));
CFDictionarySetValue(metaDataDictionary, CFSTR("FT"), CFSTR("Tx"));
CFDictionarySetValue(metaDataDictionary, CFSTR("Subtype"), CFSTR("Widget"));
CFDictionarySetValue(metaDataDictionary, CFSTR("T"), CFSTR("undefined"));
CFDictionarySetValue(metaDataDictionary, CFSTR("Type"), CFSTR("Annot"));
CFDictionarySetValue(metaDataDictionary, CFSTR("V"), CFSTR(""));
CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault,0, &kCFTypeArrayCallBacks);
CFArrayInsertValueAtIndex(array, 0, metaDataDictionary);

CFDictionarySetValue(pageDictionaryMutable, CFSTR("Annots"), array);


CGPDFContextBeginPage (pdfContext, pageDictionaryMutable);


CGPDFContextEndPage (pdfContext);

CGContextRelease (pdfContext);

CFRelease(pageDictionary);}

CFMutableDictionary pageDictionaryMutable を印刷すると、Annots ディクショナリを MediaBox だけでなく PDF にも追加する必要があることがわかります。

(gdb) po pageDictionaryMutable
{
    Annots =     (
                {
            DA = "/Helvetica 10 Tf 0 g";
            F = 4;
            FT = Tx;
            Subtype = Widget;
            T = undefined;
            Type = Annot;
            V = "";
        }
    );
    MediaBox = <00000000 00000000 00008044 0000c842>;
}

Media Box はかかりますが、Annots はかかりません。誰か助けてください!

4

1 に答える 1

2

PoDoFo ライブラリを見てみましょう: http://podofo.sourceforge.net

PoDoFo は GPL と LGPL の下で部分的にライセンスされています。

これを使用して、pdf ファイルを変更し、注釈を追加できます。iOSに移植可能です。必要なものを処理できる場合は、ドキュメントを見て、それがどのように機能するかを確認してください。

興味がある場合は、GitHub でこのサンプル プロジェクトを確認することもできます。そこで、ライブラリを iOS プロジェクトに統合し、iPad を使用して FreeText と Square Annotations を追加できます。

于 2013-02-24T21:18:23.680 に答える