Dne 19.9.2013 10:19, Sebastian Haag napsal(a):
> I managed to embed a file (or file content/string) into a
> PdfMemDocument. Now I want to extract it again and don“t find a way...
Hi,
it's tricky, or slightly complicated. I do it through traversing the
actual object hierarchy (see below, it asks for data of an attachment at
index 'index').
Bye, zyx
PdfNamesTree *names = document->GetNamesTree(false);
if (names) {
PdfObject *pObj =
names->GetObject()->GetIndirectKey("EmbeddedFiles");
if (pObj) {
const PdfObject *kidsKey = pObj->GetIndirectKey("Kids");
if (kidsKey) {
const PdfArray &kids = kidsKey->GetArray();
PdfArray::const_iterator kit, kend = kids.end();
for (kit = kids.begin(); kit != kend; kit++) {
const PdfObject *obj = &(*kit);
if (obj->IsReference()) {
obj =
document->GetObjects()->GetObject(obj->GetReference());
if (!obj) {
continue;
}
}
const PdfObject *namesKey =
obj->GetIndirectKey("Names");
if (namesKey) {
const PdfArray &names = namesKey->GetArray();
// pair of PdfString/PdfObject, thus divide
by two
if (names.GetSize() / 2 > index) {
PdfArray::const_iterator nit, nend =
names.end();
for (nit = names.begin(); nit != nend;) {
if (index == 0) {
nit++;
pdf_int64 streamSize = 0;
const PdfStream *stream = NULL;
obj = &(*nit);
if (obj->IsReference()) {
obj =
document->GetObjects()->GetObject(obj->GetReference());
}
if (obj) {
const PdfDictionary &dict =
obj->GetDictionary();
if (dict.HasKey("Type") &&
dict.GetKey("Type")->GetName() == PdfName("Filespec") &&
dict.HasKey("EF") &&
dict.GetKey("EF")->GetDictionary().HasKey("F")) {
obj =
dict.GetKey("EF")->GetDictionary().GetKey("F");
if (obj &&
obj->IsReference()) {
obj =
document->GetObjects()->GetObject(obj->GetReference());
}
} else {
obj = NULL;
}
}
if (obj) {
const PdfDictionary &dict =
obj->GetDictionary();
if (dict.HasKey("Type") &&
dict.GetKey("Type")->GetName() == PdfName("EmbeddedFile") &&
dict.HasKey("Params") &&
dict.GetKey("Params")->GetDictionary().HasKey("Size") &&
dict.GetKey("Params")->GetDictionary().GetKey("Size")->IsNumber() &&
obj->HasStream()) {
// get the stream
streamSize =
dict.GetKey("Params")->GetDictionary().GetKey("Size")->GetNumber();
stream = obj->GetStream();
}
}
if (!obj) {
// Failed to get embedded
file object
return FALSE;
}
if (!stream) {
// Failed to get embedded
file stream
return FALSE;
}
char *buff = NULL;
pdf_long buffLength = 0;
stream->GetFilteredCopy(&buff, &buffLength);
// the buffLength is supposed
to match streamSize
// do something with the
buff/buffLength
return TRUE;
}
index--;
nit++;
nit++;
}
break;
} else {
index -= names.GetSize() / 2;
}
}
}
}
}
}
------------------------------------------------------------------------------
LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/22/13.
http://pubads.g.doubleclick.net/gampad/clk?id=64545871&iu=/4140/ostg.clktrk
_______________________________________________
Podofo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users