2017-02-19 81 views
-1

我在"C:\\pdfs\\"目录中有pdf文件。我想要获得这些pdf文件并从meta_data.txt文件中插入元数据。用我的知识iTextSharp的锁,我编写这样的:我不想旋转页面,但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文件)没有这样的问题: enter image description here 但是一些其他pdf文件(从扫描或非常旧的pdf文件生成)以编程方式进行旋转。它似乎令人恶心的是这样的: enter image description here 比所有更糟,我不知道我是如何解决这个问题的。你能帮我解决这个问题吗?

+2

原因是您选择了一种非最佳方式将文档与itext合并,不会复制原始页面的所有属性(因为涉及的方法是为不同的用例设计的)。使用基于'PdfCopy'而不是'PdfWriter'的合并解决方案,参见[这个答案](http://stackoverflow.com/a/15945467/1729265)。 – mkl

+0

请阅读官方文档:http://developers.itextpdf.com/examples/miscellaneous/adding-metadata –

回答

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忽视了我在Chapter 6“的iText在行动 - 第二版”中写道,即使用DocumentPdfWriterAddTemplate()是错误的,当你想要操纵一个现有的PDF。通过使用AddTemplate(),可以丢弃大量的功能,如交互性,结构等。您还会创建一个不理想的PDF,因为每个页面都将被存储为Form XObject。

+0

糟糕,确实如此。我刚刚看到op对多个输入文件进行迭代,并认为他想合并,因此指向'PdfCopy'。其实他分别处理每个pdf,所以应该使用'PdfStamper' ... – mkl

+0

@Bruno Lowagie - 非常感谢您的回复。为了不误导其他开发人员,我正在清除我的答复,这些答复是服务不好的解决方案(或非解决方案)。 –