2016-04-13 6 views
0

У меня есть файл PDF, и я хочу добавить простое число на каждую страницу.itext добавить текст в pdf увеличить размер файла

Вот мой код:

reader = new PdfReader(fileOut); 
Document final = new Document(reader.GetPageSize(1)); 
PdfWriter w = PdfWriter.GetInstance(final, new FileStream(finalFile, FileMode.Create, FileAccess.Write)); 
w.SetFullCompression(); 

final.Open(); 

for (int i = 1; i <= reader.NumberOfPages; i++) 
{ 
    final.NewPage(); 
    PdfContentByte cb = w.DirectContent; 
    ControlNumberTimes(cb, "C"+i, 560, 725, 270, Element.ALIGN_LEFT); 
    cb.AddTemplate(w.GetImportedPage(reader, i), 0, 0); 
} 

final.Close(); 
reader.Close(); 



private static void ControlNumberTimes(PdfContentByte cb1, string control, int x, int y, int rotation, int allign) 
{ 
    cb1.BeginText(); 

    cb1.SetColorFill(BaseColor.BLACK); 
    cb1.SetFontAndSize(BaseFont.CreateFont("C:\\windows\\Fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED), 7.5f); 
    cb1.ShowTextAligned(allign, control, x, y, rotation); 
    cb1.EndText(); 
} 

Перед добавлением этого текста, размер PDF файл 3,6 Мб, после того, как размер 11 Мб. Что я делаю неправильно?

Это мой код прямо сейчас:

string finalFile = System.IO.Path.GetDirectoryName(fileOut) + "\\" + 
          System.IO.Path.GetFileNameWithoutExtension(fileOut) + "_num.pdf"; 

     reader = new PdfReader(fileOut); 

     using (FileStream fs = new FileStream(finalFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
     { 
      using (PdfStamper stamper = new PdfStamper(reader, fs)) 
      { 
       int pageCount = reader.NumberOfPages; 
       for (int i = 1; i <= pageCount; i++) 
       { 
        ColumnText.ShowTextAligned(stamper.GetUnderContent(i), Element.ALIGN_CENTER, new Phrase(
         $"C{i}"), 560, 725, 0); 
       } 
      } 
     } 

Ф файл я не могу разделить из-за конфиденциальную информацию.

+0

Возможный дубликат [указать номер страницы при создании PDF с помощью iTextSharp] (http://stackoverflow.com/questions/22807292/put-page-number-when-create-pdf-with-itextsharp) –

+0

* Файл в формате pdf Я не могу поделиться конфиденциальной информацией. * - Жаль, потому что код на первый взгляд выглядит нормально, поэтому, скорее всего, ваша проблема связана с некоторой особенностью этого файла. – mkl

+0

Я пробовал другие pdf-файлы, и размер возвращаемого файла теперь одобрен. Я думаю, что проблема была в исходном файле ввода pdf. Огромное спасибо за помощь. – Razvan

ответ

3

Это совершенно неправильно: «Я копирование файла с помощью Document, PdfWriter, PdfImportedPage и AddTemplate, почему мой файл увеличения размеров»

reader = new PdfReader(fileOut); 
Document final = new Document(reader.GetPageSize(1)); 
PdfWriter w = PdfWriter.GetInstance(final, new FileStream(finalFile, FileMode.Create, FileAccess.Write)); 
w.SetFullCompression(); 
final.Open(); 
for (int i = 1; i <= reader.NumberOfPages; i++) 
{ 
    final.NewPage(); 
    PdfContentByte cb = w.DirectContent; 
    ControlNumberTimes(cb, "C"+i, 560, 725, 270, Element.ALIGN_LEFT); 
    cb.AddTemplate(w.GetImportedPage(reader, i), 0, 0); 
} 
final.Close(); 

Высказывание как просить: «Я ударил себя в живот острым ножом, почему я истекаю кровью?»

Если вы хотите добавить номера страниц в существующий документ, вы должны использовать PdfStamper, как описано в chapter 6 of my book.

Вы хотите, чтобы manipulate an existing PDF, точнее, вы хотите добавить номера страниц в нижнем колонтитуле. Это делается так:

PdfReader reader = new PdfReader(outputFile); 
using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None)) { 
    using (PdfStamper stamper = new PdfStamper(reader, fs)) { 
     int PageCount = reader.NumberOfPages; 
     for (int i = 1; i <= PageCount; i++) { 
      ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0} of {1}", i, PageCount)), 560, 725, 270); 
     } 
    } 
} 

Некоторые замечания:

  • Вы используете абсолютные координаты (X = 560, Y = 725). Было бы лучше использовать координаты относительно размера страницы, как описано в официальной документации: How to position text relative to page?
  • Вы используете BeginText() ... EndText(), но вам может быть проще использовать ColumnText.ShowTextAligned().
  • Вы думаете, что используете шрифт, который не встроен, когда вы создаете BaseFont вот так BaseFont.CreateFont("C:\\windows\\Fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED). Это не правда. Как указано, BaseFont.NOT_EMBEDDED игнорируется при использовании BaseFont.IDENTITY_H. См. Why is iText embedding a font even when I specify not to embed? Если требуется небольшой размер файла, я предлагаю вам не вставлять шрифт.

Основная проблема с вашим кодом заключается в том, что вы не манипулируете файлом правильным способом. Я думаю, что это вызвано тем фактом, что вы копируете/вставляете свой код из плохо написанного учебника. Пожалуйста, не копируйте код от людей, которые не знают, что они делают.

+0

Я изменил свой код на основе вашего примера, но размер файла результата тот же. – Razvan

+0

@ Razvan, пожалуйста, поделитесь своим текущим кодом и вашим вводом PDF, чтобы мы могли воспроизвести вашу проблему. – mkl