2016-04-08 22 views
7

Birden çok konumdan varolan 8x10 PDF'leri çekmek için aşağıdaki basitleştirilmiş bir koda sahibim, gerekiyorsa bunları döndürün (hemen hemen hepsi gerekir), sonra bunları tek bir 11x17 PDF sayfasına yazarak sayfa ... olması gerektiği gibi sayfaları yok render sayfa, ben> width şube gerçekten götürülüyor yüksekliği doğrulandıktan döndürülmüş ancak döndürülen sayfalar halen ancak Birden çok PDF'yi döndürün ve tek bir PDF'ye yazdırın

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

yerine 10x8 ait 8x10 her 11x17 sayfada yazılmıştır.

Bu özel bir soruyu araştırdım, ancak 11x17 sayfasındaki belirli bir konuma değil, başka bir dosyaya veya sayfanın tamamına yazmıyordu.

DÜZENLEME: Ben tam olarak nerede yerleştirmek için bir yol bulmak için 8x10 sayfasını döndürmek ve benim 11x17 bunu yazmak ama ne yazık ki gibi olamaz açabiliyorum biraz Deneme yaparken ve diğer örneklere bakarak yüzden o (her zamanki gibi) oldukça basit bir cevabı oldu görünür arama ton sonra ve kod eleme yüzden benim ilk problem, yukarıda gösterildiği gibi,

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 bu konuda tavsiye edilen bir yol olsa da, tek bir sayfaya birden çok sayfa yazmayı destekleyen herhangi bir belge bulamadım. DirectContent bunu yapmanın tek yolu gibi görünüyordu. (Ayrıca http://developers.itextpdf.com/examples/merging-pdf-documents/create-booklet-a4-document) – JasonSec

+0

'PdfCopy' sayfaların mümkün olduğunca orijinal olmasını istiyorsanız önerilir, ancak ilgilenirsiniz diğer birçok sayfa ile ölçekleme ve düzenleme yaparak değiştirerek. – mkl

+0

@mkl Bu benim de izlenimimdi, doğrulama için teşekkürler. – JasonSec

cevap

4

Tamam bir döndürme etiketi koyarak edildi: burada alakalı kod snippet'ine istiyorum sayfa aslında sayfayı beklediğim gibi döndürmedi. pdftemplate için bir matris belirtme seçeneği öğrendikten sonra burada oldukça basitti çalışma kod:

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

Not; http://partners.adobe.com/public/developer/en/pdf/PDFReference.pdf P: 162 (fiziksel formda 143) DÜZENLEME

cebri

üzerinden taze olanlar için: @mkl aşağıdaki aşağıda belirtilen olduğu gibi çok 0 ° ya da 90 ° eğer döndürme girişler için geçerlidir 180 ° veya 270 ° 'lik sayfalarınız varsa bu kodun bazı değişikliklere ihtiyacı olacaktır. Orijinaldeki tüm ek açıklamalar da kaybolacak.

+0

Bazı durumlarda sonuç hala beklentilerinizden farklı olabilir: Kaynak sayfa, örn. 180 ° ** Döndürme ** girişine sahip olmak; Bu durumda, orijinal dosya doğru şekilde gösterilirken kopyanız baş aşağı çizilir.Esasen kodunuz kaynak için iyidir. ** 0 ° ve 90 ° döndürün, ancak 180 ° ve 270 ° için değil. Kaynak varsayılan olmayan bir ** UserUnit ** kullanıyorsa, büyük olasılıkla küçültülmüş bir kopya elde edersiniz; Yine de, sizinki gibi sayfa boyutları için bu değeri değiştirmek çok nadirdir. Ayrıca, ek açıklamalarla ilgileniyorsanız, bunlar kaybolur. – mkl

+0

@mkl Bu benim durumumda geçerli değil ama kesinlikle sorunun nerede olabileceğini görüyorum. Bunu cevabımın bir eki olarak ekleyeceğim. – JasonSec

0

AddTemplate prosedürüne basitçe affine dönüşümü ekleyebilirsiniz.

Bunun gibi

:

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

Onun java, ama bu bir sorun olmadığını düşünüyorum.

+0

Çözümünüz hala 180 ° durumun uygun şekilde tedavi edilmesini özlüyor. – mkl

İlgili konular