gpt4 book ai didi

java - 使用 iText 计算 PDF 上的附件数量

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:06 25 4
gpt4 key购买 nike

我正在尝试计算 PDF 上的附件数量,以验证我们的附件代码。我的代码大部分时间都有效,但最近当附件数量和附件大小增加时,它开始失败。示例:我有一个包含 700 个附件的 PDF,总共 1.6 GB。另一个包含 65 个附件,大小约为 10mb。 65 的计数是逐步完成的。我们已经逐个文件地构建了它。对于 64 个文件(大约 9.8mb),该例程表现良好。添加文件 65(大约 0.5mb)并且例程失败。

这是在 jre1.8.0_162 下的 itextpdf-5.5.9.jar 上

我们仍在测试文件数量和大小的不同组合,看看哪里出了问题。

private static String CountFiles() throws IOException, DocumentException {

Boolean errorFound = new Boolean(true);
PdfDictionary root;
PdfDictionary names;
PdfDictionary embeddedFiles;
PdfReader reader = null;
String theResult = "unknown";

try {
if (!theBaseFile.toLowerCase().endsWith(".pdf"))
theResult = "file not PDF";
else {
reader = new PdfReader(theBaseFile);
root = reader.getCatalog();
names = root.getAsDict(PdfName.NAMES);
if (names == null)
theResult = "0";
else {
embeddedFiles = names.getAsDict(PdfName.EMBEDDEDFILES);
PdfArray namesArray = embeddedFiles.getAsArray(PdfName.NAMES);
theResult = String.format("%d", namesArray.size() / 2);
}
reader.close();
errorFound = false;
}
}
catch (Exception e) {
theResult = "unknown";
}
finally {
if (reader != null)
reader.close();
}
if (errorFound)
sendError(theResult);
return theResult;
}

private static String AttachFileInDir() throws IOException, DocumentException {

String theResult = "unknown";
String outputFile = theBaseFile.replaceFirst("(?i).pdf$", ".attach.pdf");
int maxFiles = 1000;
int fileCount = 1;

PdfReader reader = null;
PdfStamper stamper = null;

try {
if (!theBaseFile.toLowerCase().endsWith(".pdf"))
theResult = "basefile not PDF";
else if (theFileDir.length() == 0)
theResult = "no attach directory";
else if (!Files.isDirectory(Paths.get(theFileDir)))
theResult = "invalid attach directory";
else {
reader = new PdfReader(theBaseFile);
stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
stamper.getWriter().setPdfVersion(PdfWriter.VERSION_1_7);
Path dir = FileSystems.getDefault().getPath(theFileDir);
DirectoryStream<Path> stream = Files.newDirectoryStream(dir);
for (Path path : stream) {
stamper.addFileAttachment(null, null, path.toFile().toString(), path.toFile().getName());
if (++fileCount > maxFiles) {
theResult = "maxfiles exceeded";
break;
}
}
stream.close();
stamper.close();
reader.close();
theResult = "SUCCESS";
}
}
catch (Exception e) {
theResult = "unknown";
}
finally {
if (stamper != null)
stamper.close();
if (reader != null)
reader.close();
}
if (theResult != "SUCCESS")
sendError(theResult);
return theResult;
}

我希望返回简单的附件计数。似乎正在发生的事情是名称数组返回空值。结果仍然是“未知”。我怀疑名称数组试图保存所有文件并因大小而窒息。

注意:文件是使用 AttachFileInDir 过程附加的。转储目录中的所有文件并运行 AttachFileInDir。是的,AttachFileInDir 中的错误捕获需要工作。

任何帮助将不胜感激或欢迎其他方法

最佳答案

我终于明白了。事实证明,每个 KID 都是一本 NAMES 字典……

每个 NAMES 包含 64 个文件引用。在 65 个文件及以上,它创建了一个 KIDS 姓名字典数组。因此 279 个文件 = ( 8*64 +46 )/2 (总共 9 个 KIDS 数组元素)。

有一件事我必须补偿。如果删除 pdf 中的所有附件,它会留下工件,这与从未有附件的 PDF 不同

private static String CountFiles() throws IOException, DocumentException {

Boolean errorFound = new Boolean(true);
int totalFiles = 0;
PdfArray filesArray;
PdfDictionary root;
PdfDictionary names;
PdfDictionary embeddedFiles;
PdfReader reader = null;
String theResult = "unknown";

try {
if (!theBaseFile.toLowerCase().endsWith(".pdf"))
theResult = "file not PDF";
else {
reader = new PdfReader(theBaseFile);
root = reader.getCatalog();
names = root.getAsDict(PdfName.NAMES);
if (names == null){
theResult = "0";
errorFound = false;
}
else {
embeddedFiles = names.getAsDict(PdfName.EMBEDDEDFILES);
filesArray = embeddedFiles.getAsArray(PdfName.NAMES);
if (filesArray != null)
totalFiles = filesArray.size();
else {
filesArray = embeddedFiles.getAsArray(PdfName.KIDS);
if (filesArray != null){
for (int i = 0; i < filesArray.size(); i++)
totalFiles += filesArray.getAsDict(i).getAsArray(PdfName.NAMES).size();
}
}
theResult = String.format("%d", totalFiles / 2);
reader.close();
errorFound = false;
}
}
}
catch (Exception e) {
theResult = "unknown" + e.getMessage();
}
finally {
if (reader != null)
reader.close();
}
if (errorFound)
sendError(theResult);
return theResult;
}

关于java - 使用 iText 计算 PDF 上的附件数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54451832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com