我在pdf
目录中有"C:\\pdfs\\"
个文件。我想获取这些pdf文件并从meta_data.txt
文件中插入元数据。凭借我对iTextSharp知识的锁定,我编码如下:
var pdf_files = Directory.GetFiles("C:\\pdfs\\", "*.pdf");
var i = 0;
foreach (var pdf_file in pdf_files)
{
var read = new PdfReader(pdf_file);
var size = read.GetPageSizeWithRotation(1);
var document = new Document(size);
var write = PdfWriter.GetInstance(document, new FileStream("C:\\temp\\" + "file_" + i, FileMode.Create, FileAccess.Write));
var datas = File.ReadAllLines("C:\\pdfs\\" + @"meta_data.txt");
var str = datas[i].Split('@');
document.AddTitle(str[1]);
document.AddSubject(str[2]);
document.AddCreator(str[3]);
document.AddAuthor(str[4]);
document.AddKeywords(str[5]);
document.Open();
var cb = write.DirectContent;
for (var pageNum = 1; pageNum <= read.NumberOfPages; pageNum++)
{
document.NewPage();
var page = write.GetImportedPage(read, pageNum);
cb.AddTemplate(page, 0, 0);
}
document.Close();
read.Close();
File.Delete(pdf_file);
File.Move("C:\\temp\\" + "file_" + i, "C:\\created\\" + "file_" + i);
i++;
}
此代码获取主pdf文件的实例,同时创建到temp
目录,注入metadatas,然后移动created
目录。我找不到比这更实用的方法。
无论如何,在一些pdf文件(作为原始pdf文件生成)中没有这样的问题:
但是其他一些pdf文件(从扫描或非常旧的pdf文件生成)以编程方式旋转。看起来像这样恶心:
更糟糕的是,我不知道如何解决问题。你能帮我解决一下这个问题。
答案 0 :(得分:2)
这个问题的正确答案如下:
PdfReader reader = new PdfReader(src);
using (PdfStamper stamper = new PdfStamper(reader,
new FileStream("C:\\temp\\" + "file_" + i, FileMode.Create, FileAccess.Write))) {
Dictionary<String, String> info = reader.Info;
info["Title"] = "Hello World stamped";
info["Subject"] = "Hello World with changed metadata";
info["Keywords"] = "iText in Action, PdfStamper";
info["Creator"] = "Silly standalone example";
info["Author"] = "Bruno Lowagie";
stamper.MoreInfo = info;
}
Habip OĞUZ忽略了我在“动作中的iText - 第二版”的Chapter 6中所写的内容,即使用Document
,PdfWriter
和AddTemplate()
是错误的当您想要操作单个现有PDF时。通过使用AddTemplate()
,您可以丢弃大量功能,例如交互性,结构等。您还创建了一个次优的PDF,因为每个页面都将存储为Form XObject。