2015-03-09 3 views
0

У меня был заполненный PDF-документ (всего 2 страницы), состоящий из разных размеров страницы; первая страница - 8,5 * 11 дюймов (612 * 792), содержащая заполняемые поля; вторая страница - 9,5 * 12 дюймов (684 * 864), не содержащая заполняемых полей. Несмотря на то, что вторая страница больше, ее можно игнорировать. Другими словами, если вторая страница напечатана как A4, контент не будет разрезан.Получить PDF можно в центре страницы itextsharp

Однако, когда я выполняю конкатенацию документа (используя 612 * 792), все остальные страницы будут выстроены в левом нижнем углу страницы, делая частичное содержимое потерянным на верхнем и правом краях страницы. Несмотря на то, что полный контент может быть использован, когда применяется (684 * 864), все первые страницы выстраиваются в левом нижнем углу страницы, делая его широким пустым полям сверху и справа от страницы.

Есть ли в любом случае, что я могу писать страницы в центре страницы все время, так что я могу использовать размер 612 * 792 без потери содержимого на вторых страницах?

Ниже приведен метод конкатенации:

private static byte[] ConcatContents(List<byte[]> pdf) 
{ 
    byte[] all; 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     Document doc = new Document(new Rectangle(612, 792)); 

     PdfWriter writer = PdfWriter.GetInstance(doc, ms); 

     doc.Open(); 
     PdfContentByte cb = writer.DirectContent; 
     PdfImportedPage page; 

     PdfReader reader; 
     foreach (byte[] p in pdf) 
     { 
      reader = new PdfReader(p); 
      int pages = reader.NumberOfPages; 

      // loop over document pages 
      for (int i = 1; i <= pages; i++) 
      { 
       doc.NewPage(); 
       page = writer.GetImportedPage(reader, i); 
       cb.AddTemplate(page, 0, 0); 
      } 
     } 

     doc.Close(); 

     all = ms.ToArray(); 

     ms.Flush(); 
     ms.Dispose(); 
    } 
    return all; 
} 

[UPDATE]

Оригинал разница Размер страницы в PDF enter image description here

После Page конкатенации, некоторые из содержания потеряли, потому что кажется, как PDF был создан из левого нижнего угла вверх. Разница в размере страницы вызывает потерю содержимого страницы. Как вы можете видеть на рисунке, то первая строка содержания второй страницы

«BECUASE Эта форма используется различными государственными ...»

был отрезан, а также некоторое содержание вправо.

enter image description here

+0

Можете ли вы объяснить более о том, что вы имеете в виду под «выстраиваться». Как страницы отображаются по отношению друг к другу, имеет больше общего с приложением просмотра, а не с содержанием страницы. Для того, что это стоит, это было только после Acrobat 2, когда была поддержка непрерывного отображения страницы туалетной бумаги. – plinth

+0

@plinth Пожалуйста, дайте мне знать, если часть «обновления» имеет для вас какой-либо смысл – Marlock

+1

OK - так вы пытаетесь штамповать содержимое любой произвольной страницы на новую страницу заданного размера. Это означает, что вам нужно знать границы старой страницы и установить преобразование, которое помещает его содержимое в другое место на новой странице. Это в основном перевод, который будет (.5dx, .5dy), где dx и dy - это дельта из старой ширины/высоты страницы и новой ширины/высоты страницы, но это не гарантирует, что все содержимое будет соответствовать. – plinth

ответ

1

Ну Благодаря предложениям плинтуса, я узнал, что приведенная ниже код работа идеально отрегулировать все вторые страницы в центр страницы. Хотя это не похоже на хорошую практику, она работает в конечном итоге.

// loop over document pages 
for (int i = 1; i <= pages; i++) 
{ 
    doc.NewPage(); 
    page = writer.GetImportedPage(reader, i); 

    if (i == 1) 
    { 
     cb.AddTemplate(page, 0, 0); 
    } 
    else 
    { 
     float page1Height, page1Width, page2Height, page2Width; 
     page1Height = reader.GetPageSizeWithRotation(i - 1).Height; 
     page1Width = reader.GetPageSizeWithRotation(i - 1).Width; 
     page2Height = reader.GetPageSizeWithRotation(i).Height; 
     page2Width = reader.GetPageSizeWithRotation(i).Width; 
     cb.AddTemplate(page, (page1Width - page2Width)/2, (page1Height - page2Height)/2); 
    } 
} 

Здесь отображается результат enter image description here

+0

Для общего решения необходимо вычислить эти числа, как указано в @plinth, в виде полных разностей ширины и высоты задействованных полей. – mkl

+0

Спасибо за ваши предложения. – Marlock

Смежные вопросы