我正在使用pdfbox开发.NET应用程序以从PDF中提取元数据,内容和附件。我能够提取元数据和内容,但在提取附加/嵌入文件时卡住了。
我有一个包含嵌入/附加doc文件的pdf,想要检索该文件。 我已经阅读了java示例 - http://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractEmbeddedFiles.java。但是在尝试在.Net中使用它时,我在下面的代码片段中得到了“非泛型类型'java.util.Map'不能与类型参数一起使用”
java.util.Map<String, COSObjectable> names = efTree.getNames();
所以,如果有人帮我从pdf中提取文件,我将不胜感激。
提前致谢。
答案 0 :(得分:0)
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.pdf.PRStream;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfReader;
public class PDFAttachments {
public PDFAttachments() {
}
public void extractAttachments(String src, String dest) throws IOException {
PdfReader reader = new PdfReader(src);
PdfArray array;
PdfDictionary annot;
PdfDictionary fs;
PdfDictionary refs;
String fName;
try {
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
array = reader.getPageN(i).getAsArray(PdfName.ANNOTS);
if (array == null)
continue;
for (int j = 0; j < array.size(); j++) {
annot = array.getAsDict(j);
if (PdfName.FILEATTACHMENT.equals(annot
.getAsName(PdfName.SUBTYPE))) {
fs = annot.getAsDict(PdfName.FS);
refs = fs.getAsDict(PdfName.EF);
for (PdfName name : refs.getKeys()) {
fName = dest + fs.getAsString(name).toString();
/*
* FileOutputStream fos = new
* FileOutputStream(String.format(dest,
* fs.getAsString(name).toString()));
*/
FileOutputStream fos = new FileOutputStream(fName);
fos.write(PdfReader.getStreamBytes((PRStream) refs
.getAsStream(name)));
fos.flush();
fos.close();
}
}
}
}
} catch (Exception e) {
System.err.println("exception " + e.getMessage());
}
}
}
}
答案 1 :(得分:0)
我通过省略泛型并尝试这样的事情来解决它:
java.util.Map names = efTree.getNames();
现在,我可以提取位于附件标签中的附件,但是 无法提取位于页面中的附件。在这种情况下,我得到null efTree。
PDDocumentNameDictionary namesDictionary = new PDDocumentNameDictionary(pdfDoc.getDocumentCatalog());
PDEmbeddedFilesNameTreeNode efTree=namesDictionary.getEmbeddedFiles();
因此,如果有人知道如何提取页面中附加/嵌入的文件可以帮助我在.NET应用程序中执行此操作。