【发布时间】:2015-01-12 16:24:49
【问题描述】:
我看到很多帖子帮助我到达了现在的位置,我是编程新手。我的意图是获取目录“sourceDir”中的文件并查找正则表达式匹配。当它找到匹配时,我想创建一个以匹配为名称的新文件。如果代码找到具有相同匹配项的另一个文件(该文件已存在),则在该文档中创建一个新页面。
现在代码可以工作,但是它没有添加新页面,而是覆盖了文档的第一页。注意:目录中的每个文档只有一页!
string sourceDir = @"C:\Users\bob\Desktop\results\";
string destDir = @"C:\Users\bob\Desktop\results\final\";
string[] files = Directory.GetFiles(sourceDir);
foreach (string file in files)
{
using (var pdfReader = new PdfReader(file.ToString()))
{
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
var text = new StringBuilder();
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
var currentText =
PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
text.Append(currentText);
Regex reg = new Regex(@"ABCDEFG");
MatchCollection matches = reg.Matches(currentText);
foreach (Match m in matches)
{
string newFile = destDir + m.ToString() + ".pdf";
if (!File.Exists(newFile))
{
using (PdfReader reader = new PdfReader(File.ReadAllBytes(file)))
{
using (Document doc = new Document(reader.GetPageSizeWithRotation(page)))
{
using (PdfCopy copy = new PdfCopy(doc, new FileStream(newFile, FileMode.Create)))
{
var importedPage = copy.GetImportedPage(reader, page);
doc.Open();
copy.AddPage(importedPage);
doc.Close();
}
}
}
}
else
{
using (PdfReader reader = new PdfReader(File.ReadAllBytes(newFile)))
{
using (Document doc = new Document(reader.GetPageSizeWithRotation(page)))
{
using (PdfCopy copy = new PdfCopy(doc, new FileStream(newFile, FileMode.OpenOrCreate)))
{
var importedPage = copy.GetImportedPage(reader, page);
doc.Open();
copy.AddPage(importedPage);
doc.Close();
}
}
}
}
}
}
}
}
【问题讨论】:
-
您似乎经常覆盖您的文件。您应该在外循环中创建
PdfCopy实例。实际上,我不明白你的代码。它似乎与您想要的不匹配。您能否记录您的代码(例如,通过向其中添加描述您想要做什么的 cmets)? -
您是指 PdfCopy、PdfReader、Document 吗?此时我什至需要 PdfReader 吗?我正在尝试将文件(具有正则表达式匹配)添加为最终文档中的第二页、第三页等。
-
我的目标是在最终文档中添加一个页面而不是覆盖它
-
好的,但如果我正确理解您的代码,您当前正在使用
PdfCopy创建单页 PDF,每次遇到需要添加的新页面时都会丢弃旧版本。这没有意义,不是吗?将Document和PdfCopy移出内部循环。 -
如果我没看错,我猜我需要对 copy.AddPage(importedPage); 做一些不同的事情。 else 语句中的行。
标签: c# pdf itextsharp