2010-08-31 12 views
5

itextsharp में रोटेशन को बनाए रखते हुए, मैं पीडीएफ पेज कैसे स्केल करूं? मैं निम्नलिखित है, लेकिन मैं खोना रोटेशन:iTextSharp के साथ अभिविन्यास बनाए रखने के दौरान मैं पीडीएफ पेज कैसे स्केल करूं?

public static void ScaleToLetter(string inPDF, string outPDF) 
    { 
     PdfReader reader = new PdfReader(inPDF); 
     Document doc = new Document(PageSize.LETTER); 
     Document.Compress = true; 
     PdfWriter writer = PdfWriter.GetInstance(doc, 
      new FileStream(outPDF, FileMode.Create)); 
     doc.Open(); 
     PdfContentByte cb = writer.DirectContent; 
     int rotation; 

     PdfImportedPage page; 
     for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) 
     { 
      page = writer.GetImportedPage(reader, pageNumber); 
      rotation = reader.GetPageRotation(pageNumber); 

      cb.AddTemplate(page, 
       PageSize.LETTER.Width/reader.GetPageSize(pageNumber).Width, 
       0, 0, 
       PageSize.LETTER.Height/reader.GetPageSize(pageNumber).Height, 
       0, 0); 
      doc.NewPage(); 
     } 
     doc.Close(); 
    } 

उत्तर

14

मैं ने वही समस्या थी, और, ऊंचाई और प्रत्येक पृष्ठ की चौड़ाई बदलने के पत्र से करने के लिए पत्र घुमाया द्वारा काम कर समझ में आ गया। दूसरे शब्दों में, यदि वर्तमान पृष्ठ पतला और लंबा है तो यह लंबवत है। लेकिन अगर यह चौड़ा और छोटा है, तो यह क्षैतिज है और मुझे पृष्ठ को घुमाने चाहिए।

अपने कोड बदल दिया गया है:

public static void ScaleToLetter(string inPDF, string outPDF) 
    { 
     PdfReader reader = new PdfReader(inPDF); 
     Document doc = new Document(PageSize.LETTER); 
     Document.Compress = true; 
     PdfWriter writer = PdfWriter.GetInstance(doc, 
      new FileStream(outPDF, FileMode.Create)); 
     doc.Open(); 
     PdfContentByte cb = writer.DirectContent; 

     PdfImportedPage page; 
     for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) 
     { 
      page = writer.GetImportedPage(reader, pageNumber); 

      if (page.Width <= page.Height) 
       doc.SetPageSize(PageSize.LETTER); 
      else 
       doc.SetPageSize(PageSize.LETTER.Rotate()); 
      doc.NewPage(); 

      cb.AddTemplate(page, 
       doc.PageSize.Width/reader.GetPageSize(pageNumber).Width, 
       0, 0, 
       doc.PageSize.Height/reader.GetPageSize(pageNumber).Height, 
       0, 0); 
     } 
     doc.Close(); 
    } 

मैं भी अनुपात विवश करने के लिए आवश्यक है, इसलिए मैं इस के साथ खत्म हुआ: मेरे लिए बहुत अच्छी तरह से

public static void ScaleToA4(string inPDF, string outPDF) 
    { 
     var reader = new PdfReader(new MemoryStream(File.ReadAllBytes(inPDF))); 
     var document = new Document(PageSize.A4); 
     var ms = new MemoryStream(); 
     var writer = PdfWriter.GetInstance(document, ms); 
     document.Open(); 
     var cb = writer.DirectContent; 

     for (var pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) 
     { 
      var page = writer.GetImportedPage(reader, pageNumber); 
      document.SetPageSize(page.Width <= page.Height ? 
       PageSize.A4 : PageSize.A4.Rotate()); 
      document.NewPage(); 

      var widthFactor = document.PageSize.Width/page.Width; 
      var heightFactor = document.PageSize.Height/page.Height; 
      var factor = Math.Min(widthFactor, heightFactor); 

      var offsetX = (document.PageSize.Width - (page.Width * factor))/2; 
      var offsetY = (document.PageSize.Height - (page.Height * factor))/2; 
      cb.AddTemplate(page, factor, 0, 0, factor, offsetX, offsetY); 
     } 
     document.Close(); 
     File.WriteAllBytes(outPDF, ms.GetBuffer()); 
    } 
+0

इस समाधान का उपयोग करते हुए काम किया है, तो के अलावा पीडीएफ में इलेक्ट्रॉनिक हस्ताक्षर है, जिसमें परिस्थिति इलेक्ट्रॉनिक हस्ताक्षर इसे आकार के पृष्ठ में नहीं लाती है। इलेक्ट्रॉनिक हस्ताक्षर सहित आकार बदलने का कोई विचार है? –

संबंधित मुद्दे