【发布时间】:2016-02-23 23:49:43
【问题描述】:
我有一个包含文件夹、子文件夹和文件的投资组合 PDF。我需要在 java 中使用 iText 提取相同的结构。我无法提取其中包含大量 pdf 的投资组合 pdf。使用少量的 pdf 文件可以正常工作。
请找到我正在使用的代码。
public void extractPortfolio(String src) {
PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.getCatalog();
PdfDictionary names = root.getAsDict(PdfName.NAMES);
System.out.println("****names names *********" + names.getKeys().toString());
PdfDictionary embedded = names.getAsDict(PdfName.EMBEDDEDFILES);
System.out.println("####embedded embedded ########" + embedded.toString());
PdfArray filespecs =null;
filespecs=embedded.getAsArray(PdfName.NAMES);//all pdfs null in case of large no of pdfs
for (int i = 0; i < filespecs.size();) {
try {
extractAttachment(reader, folders, folder, filespecs.getAsString(i++), filespecs.getAsDict(i++));
} catch (IOException e) {
e.printStackTrace();
}
}
}
protected void extractAttachment(PdfReader reader, Map<Integer, File> dirs, File dir, PdfString name, PdfDictionary filespec) throws IOException {
PRStream stream;
FileOutputStream fos;
String filename;
PdfDictionary refs = filespec.getAsDict(PdfName.EF);
File dirHere = dir;
String nameString = name.toUnicodeString();
if (nameString.startsWith("<")) {
int closing = nameString.indexOf('>');
if (closing > 0) {
int folderId = Integer.parseInt(nameString.substring(1, closing));
File folderFile = dirs.get(folderId);
System.out.println("Folder Fiel>>>"+folderFile.getName());
if (folderFile != null) {
dirHere = folderFile;
}
}
}
for (PdfName key : refs.getKeys()) {
stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject(key));
filename = filespec.getAsString(key).toString();
fos = new FileOutputStream(new File(dirHere, filename));
fos.write(PdfReader.getStreamBytes(stream));
fos.flush();
fos.close();
}
}
在 filespecs 变量的代码值中为 null。
【问题讨论】:
-
请分享有问题的 PDF 以重现问题。
-
感谢您的回复.. 请在下面找到 PDF 文件的链接 [链接] (onedrive.live.com/…)
标签: java pdf itextsharp itext portfolio