2016-04-08 11 views
7

У меня есть следующий упрощенный код для вытягивания существующих 8x10 PDF-файлов из нескольких мест, по возможности, их поворот (почти все должны быть), а затем их запись на одну страницу PDF 11x17 страница ...Поверните несколько PDF-файлов и напишите в один PDF-файл

while (Page < StackOne.Length) 
{ 
    Files++; 
    using (var strm = new FileStream(RenderPath + "Test_" + Page + ".pdf", FileMode.Create, FileAccess.Write, FileShare.Read)) 
    { 
     using (var MasterReport = new iTextSharp.text.Document(iTextSharp.text.PageSize._11X17)) 
     { 
      using (var writer = PdfWriter.GetInstance(MasterReport, strm)) 
      { 
       MasterReport.Open(); 
       MasterReport.NewPage(); 
       var cb = writer.DirectContent; 

       for (; Page <= NumPages * Files && Page < StackOne.Length; Page++) 
       { 
        var ProductionEntry = StackOne[Page - 1]; 

        var filepath = NetPath + ProductionEntry.UniqueProductId + ".pdf"; 
        if (File.Exists(filepath)) 
        { 
         var reader = new PdfReader(filepath); 
         var pagesize = reader.GetPageSize(1); 
         if (pagesize.Height > pagesize.Width) 
         { 
          var ExistingPage = reader.GetPageN(1); 
          var rotation = ExistingPage.GetAsNumber(PdfName.ROTATE); 
          int desiredrot = 90; 
          if (rotation != null) 
          { 
           desiredrot += rotation.IntValue; 
           desiredrot %= 360; 
          } 
          ExistingPage.Put(PdfName.ROTATE, new PdfNumber(desiredrot)); 
         } 
         cb.AddTemplate(writer.GetImportedPage(reader, 1), 50, 50); 
        } 
        MasterReport.NewPage(); 
       } 
      } 
     } 
    } 
} 

Однако страница визуализация не имеют страниц повернуто, как они должны быть, я проверил высоту> ширина ветвь действительно быть принята, но страница, возвращаемая по-прежнему 8x10 вместо 10x8 написанных на каждой странице 11x17.

Я искал вопрос по этому вопросу, но не смог найти тот, который не просто писал в другой файл или всю страницу, а не в определенное место на листе 11x17.

EDIT: Так что с Опытным и глядя на других примерах, я могу повернуть страницу 8x10 и записать его на мой 11x17, но, к сожалению, я не могу найти способ, чтобы поместить его именно там, где я хотите здесь соответствующий фрагмент кода:

var reader = new PdfReader(filepath); 
var tm = new AffineTransform(1.0F, 0, 0, 1.0F, x, y); 
if (reader.GetPageSize(1).Height > reader.GetPageSize(1).Width) 
    tm.SetTransform(0, -1f, 1f, 0, 0, reader.GetPageSize(1).Height); 
writer.DirectContent.AddTemplate(writer.GetImportedPage(reader, 1), tm); 
+0

Хотя PdfCopy - это рекомендуемый способ обойти это, я не смог найти документацию, в которой можно было бы писать несколько страниц на одну страницу, не говоря уже о ротации. DirectContent оказался единственным способом сделать это. (Также http://developers.itextpdf.com/examples/merging-pdf-documents/create-booklet-a4-document) – JasonSec

+0

'PdfCopy' рекомендуется, если вы хотите, чтобы страницы были как можно более оригинальными, но вы заинтересованы в изменении его путем масштабирования и размещения с несколькими другими страницами. – mkl

+0

@mkl Это было мое впечатление, спасибо за проверку. – JasonSec

ответ

4

Хорошо, так после того, как тонны поиска и просеивания через код он появляется ответ был довольно прост (как обычно), как показано выше моей исходной задачи было положить поворота метки на страница фактически не поворачивала страницу так, как я ожидал. После изучения о возможности определения матрицы для pdftemplate это было довольно просто вот рабочий код:

var reader = new PdfReader(filepath); 
var tm = new AffineTransform(); 
if (reader.GetPageSize(1).Height > reader.GetPageSize(1).Width) 
    tm.SetTransform(0, -1f, 1f, 0, 0, reader.GetPageSize(1).Height); 
tm.Concatenate(new AffineTransform(1f, 0, 0, 1f, y, x)); 
writer.DirectContent.AddTemplate(writer.GetImportedPage(reader, 1), tm); 

P.S. http://partners.adobe.com/public/developer/en/pdf/PDFReference.pdf P: 162 (143 в физической форме) для тех, кто не свежи из алгебры

EDIT: Как @mkl заявил ниже следующий действительно применим только для циклических сдвига вхождений 0 ° или 90 °, если у вас есть страницы при 180 ° или 270 °, этот код потребует некоторых изменений. Также любые аннотации в оригинале будут потеряны.

+0

В некоторых случаях результат может по-прежнему отличаться от ваших ожиданий: исходная страница может быть, например, иметь вход 180 ° ** Rotate **; в этом случае ваша копия будет перевернута вверх, пока исходный файл будет показан правильно.По сути ваш код хорош для источника ** Поворачивайте ** значения 0 ° и 90 °, но не для 180 ° и 270 °. Если источник использует не-default ** UserUnit **, вы, скорее всего, получите уменьшенную копию; но очень редко, чтобы изменить это значение для размеров страниц, таких как ваши. Кроме того, если вас интересуют аннотации, они будут потеряны. – mkl

+0

@mkl Это не применимо в моем случае, но я определенно вижу, где это может быть проблемой. Я добавлю его в качестве дополнения к моему ответу. – JasonSec

0

Вы можете просто добавить аффинное преобразование в процедуру AddTemplate.

Как это:

   PdfContentByte cb = stamper.getOverContent(pageNumber); 
       int rotation = reader.getPageRotation(pageNumber); 

       PdfImportedPage page = stamper.getImportedPage(reader, pageNumber); 

       if (rotation == 270) 
        cb.addTemplate(page, 0, 1f, -1f, 0, reader.getPageSizeWithRotation(pageNumber).getWidth(), 0); 
       else if (rotation == 90) { 
        cb.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(pageNumber).getHeight()); 
       } else { 
        cb.addTemplate(page, 0, 0); 
       } 

Его Java, но я думаю, что это не проблема.

+0

Ваше решение по-прежнему не учитывает надлежащую обработку корпуса на 180 °. – mkl