【发布时间】:2014-05-08 17:54:44
【问题描述】:
我正在尝试使用 iText 5.5 库来处理 PDF 中的信息。我想扫描 PDF 中的附件,如果它有附件,请制作它们的物理副本(不删除/编辑原始文件)。当附有 .joboptions 文件的 PDF 时,我遇到了问题。
我正在使用以下代码:
import java.io.File;
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;
import com.itextpdf.text.pdf.PdfString;
public class extractAttachments{
public extractAttachments(String src, String dir) throws IOException {
File folder = new File(dir);
folder.mkdirs();
PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.getCatalog();
PdfDictionary names = root.getAsDict(PdfName.NAMES);
PdfDictionary embedded = names.getAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs = embedded.getAsArray(PdfName.NAMES);
for (int i = 0; i < filespecs.size(); ) {
extractAttachment(reader, folder, filespecs.getAsString(i++),
filespecs.getAsDict(i++));
}
}
protected void extractAttachment(PdfReader reader, File dir, PdfString name, PdfDictionary filespec)
throws IOException {
PRStream stream;
FileOutputStream fos;
String filename;
PdfDictionary refs = filespec.getAsDict(PdfName.EF);
for (PdfName key : refs.getKeys()) {
stream = (PRStream)PdfReader.getPdfObject(refs.getAsIndirectObject(key));
filename = filespec.getAsString(key).toString();
fos = new FileOutputStream(new File(dir, filename));
fos.write(PdfReader.getStreamBytes(stream));
fos.flush();
fos.close();
}
}
}
一旦到达PdfArray filespecs = embedded.getAsArray(PdfName.NAMES);,就会返回null。我不在乎是否复制了 .joboptions 文件,但是我确实希望复制其他附件(如果有的话)。有什么想法可以解决这个问题吗?
另外,如果您想使用上述 .joboptions 文件创建 PDF,请打开 PDF 文档,转到打印菜单并将打印机更改为“Adobe PDF”。现在选择属性,单击确定,然后在主打印菜单中单击打印。这将提示您选择保存文档的位置,并且新文档将有一个 .joboptions 作为附件。
【问题讨论】:
-
您能否分享一个带有 .joboptions 文件的 pdf 文件,以便检查和重现问题?
-
@mkl 是的,这是一个带有附件的 pdf:app.box.com/s/j6jc6thn90pavbrriw05