2016-04-13 33 views
0

PDF sayfam var ve her sayfaya basit bir rakam eklemek istiyorum. 11 numara Mb sonraitext pdf dosyasına dosya ekle dosya boyutunu artır

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(); 
} 

bu metni eklemeden önce, PDF dosya boyutu, 3.6 Mb geçerli:

İşte benim kodudur. Neyi yanlış yapıyorum?

Bu benim kod artık geçerli:

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); 
       } 
      } 
     } 

nedeniyle gizli bilgilerin paylaşamaz pdf dosyası.

+0

Olası yinelenen [iTextSharp ile PDF oluştururken sayfa numarası koy] (http://stackoverflow.com/questions/22807292/put-page-number-when-create-pdf-with-itextsharp) –

+0

* Pdf dosyası Gizli bilgiler nedeniyle paylaşamıyorum. * - Bu üzücü bir şey çünkü ilk bakışta kod iyi görünüyor, bu yüzden büyük olasılıkla sorununuz o dosyanın bazı özelliklerinden kaynaklanıyor. – mkl

+0

Başka bir pdf dosyasını denedim ve şimdi geri dönüş dosya boyutu tamam. Problemin orijinal girdi pdf dosyası olduğunu düşünüyorum. Yardım için çok teşekkür ederim. – Razvan

cevap

3

Bu tamamen yanlıştır: "Ben Document, PdfWriter, PdfImportedPage ve AddTemplate kullanarak bir dosya kopyalama ediyorum, neden benim dosya boyutu artış yok" diyen

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(); 

"Kendimi karnında keskin bir bıçakla bıçakladım, niye kanıyorum?"

Mevcut bir belgeye sayfa numarası eklemek isterseniz, chapter 6 of my book'da açıklandığı gibi PdfStamper'u kullanmanız gerekir.

manipulate an existing PDF, özellikle, altbilgi sayfa numaralarını eklemek istiyorsunuz. Bu böyle yapılır:

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); 
     } 
    } 
} 

Bazı açıklamalar: Sen mutlak koordinatlar kullandığınız

  • (X = 560, = 725 Y). How to position text relative to page?
  • BeginText() ... EndText() kullanıyorsunuz, sayfa boyutuna göre koordinatları kullanmak daha iyi olurdu, ancak ColumnText.ShowTextAligned()'u kullanmanız daha kolay olabilir.
  • BaseFont bu BaseFont.CreateFont("C:\\windows\\Fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED) benzeri oluşturduğunuzda gömülü olmayan bir yazı tipi kullandığınızı düşünüyorsunuz. Bu doğru değil. BaseFont.IDENTITY_H kullanıldığında, belgelendiği gibi BaseFont.NOT_EMBEDDED göz ardı edilir. Bkz. Why is iText embedding a font even when I specify not to embed? Küçük bir dosya boyutu isteniyorsa, yazı tipini gömmemenizi öneririz.

Kodunuzdaki temel sorun, bir dosyayı doğru şekilde işlememenizdir. Bunun, kodunuzu kötü yazılmış bir öğreticiden kopyaladığınızdan/yapıştırdığınızdan kaynaklandığını düşünüyorum. Lütfen ne yaptıklarını bilmeyen kişilerden kod kopyalamayın.

+0

Örneğinizi örneğinize göre değiştirdim, ancak sonuç dosya boyutu aynı. – Razvan

+0

@Razvan Sorununuzu yeniden üretmemizi sağlamak için lütfen geçerli kodunuzu ve PDF girişinizi paylaşın. – mkl