2017-02-19 1 views
-1

"C:\\pdfs\\" 디렉토리에 pdf 개의 파일이 있습니다. 이 PDF 파일을 가져 와서 meta_data.txt 파일에서 메타 데이터를 삽입하고 싶습니다. iTextSharp 지식의 내 잠금 장치로,이 같은 코드 : 창조 temp 디렉토리, metadatas를 주입하고 나중에 created 디렉토리를 이동하면서페이지를 회전하고 싶지 않지만 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 파일의 인스턴스를 얻을. 나는 이것보다 더 실용적인 방법을 찾지 못한다. 어쨌든, 일부 pdf 파일 (원본 pdf 파일로 생성 됨)에는 다음과 같은 문제가 없습니다. enter image description here 그러나 일부 다른 pdf 파일 (스캔 또는 날짜가 오래된 pdf 파일에서 생성 됨)은 프로그래밍 방식으로 회전됩니다. 그리고 이것은 다음과 같이 역겨운 것처럼 보입니다. enter image description here 모두보다 나쁘지 만 문제를 해결하는 방법을 모르겠습니다. 이 문제를 어떻게 관리 할 수 ​​있는지 알려주세요.

+2

이유는 원래의 페이지의 모든 속성을 복사하지 않는 itext로 문서를 병합하는 것이 최적의 방법이 아니라는 것입니다. 왜냐하면 관련된 방법이 다른 유스 케이스에 맞게 설계 되었기 때문입니다. 'PdfWriter' 대신'PdfCopy'를 기반으로하는 병합 솔루션을 사용하십시오 (cf. [이 답변] (http://stackoverflow.com/a/15945467/1729265). – mkl

+0

공식 문서를 읽으십시오. http://developers.itextpdf.com/examples/miscellaneous/adding-metadata –

답변

2

이 질문에 대한 정답은 다음과 같습니다 : 나는 "액션에 iText를 - 두 번째 판"의 Chapter 6에 쓴

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 무시 Document, PdfWriterAddTemplate()를 사용하는 것은 잘못된 것입니다 즉 것을, 때를 하나의 기존 PDF를 조작하고 싶습니다. AddTemplate()을 사용하면 상호 작용, 구조 등과 같은 많은 기능을 버릴 수 있습니다. 또한 모든 페이지가 Form XObject로 저장되므로 차선책 인 PDF도 작성하십시오.

+0

죄송합니다. 필자는 다수의 입력 파일에 대해 반복 작업을 수행하여 병합을 원했고 'PdfCopy'를 지적했다. 실제로 그는 각 pdf를 개별적으로 조작하므로'PdfStamper'를 사용해야합니다 ... – mkl

+0

@Bruno Lowagie - 답장을 보내 주셔서 감사합니다. 다른 개발자를 오도하지 않기 위해 나는 나쁜 해결책 (또는 비 - 해결책)을 제공 한 나의 대답을 지우고있다. –