2011-03-17 24 views
15

मैं एकाधिक पीडीएफ फ़ाइलों को एक पीडीएफ में मर्ज करने के लिए iTextSharp का उपयोग कर रहा हूं। इस कार्य को पूरा करने के तरीके के लिए मुझे वेब पर code sample या two मिला।iTextSharp कैसे लैंडस्केप से पोर्ट्रेट पर पोर्ट को घुमाने/स्विच करने के लिए

वे सभी एक स्पष्ट मुद्दों के साथ काम करते हैं, क्योंकि मैं एक पीडीएफ में कई पीडीएफ फाइलों को मर्ज करने में सक्षम हूं।

मेरे पास जो मुद्दा है वह यह है कि मैं सभी पृष्ठों को पोर्ट्रेट में होना चाहूंगा, क्योंकि कुछ पीडीएफ फाइलों में लैंडस्केप में पेज हैं और मैं उन्हें पोर्ट्रेट में घूमना चाहता हूं। मुझे कोई फर्क नहीं पड़ता कि वे या तो उल्टा या किनारे पर होंगे, लेकिन वे सभी पोर्ट्रेट में होंगे।

सूचीबद्ध उदाहरण कोड वर्गों को देखते हुए:

page = writer.GetImportedPage(reader, i); 
rotation = reader.GetPageRotation(i); 

हमेशा 0 (शून्य) के रूप में पेज रोटेशन मूल्य इस प्रकार कोड खंड

if (rotation == 90 rotation == 270) 
{ 
    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, 
         reader.GetPageSizeWithRotation(i).Height); 
} 
कभी नहीं

निष्पादित हो जाता है देता है (यदि वह यह है कि पृष्ठ को घूर्णन करने के लिए क्या करना है)।

तो, 1 कोड नमूना page = writer.GetImportedPage(reader, i) मैं कैसे जाना, पोर्ट्रेट के लैंडस्केप से page के पेज लेआउट बदलने के लिए इससे पहले कि मैं cb.AddTemplate... साथ नई विलय पीडीएफ दस्तावेज़ में जोड़ने के बारे में होगा की कड़ी में कोड के आधार पर?

पीएस। निर्धारण एक पृष्ठ या तो लैंडस्केप या पोर्ट्रेट मैं code का निम्न भाग अतः से प्राप्त का उपयोग है कि क्या (कोड उदाहरण के लिए ऊपर अनुकूलित):

float pageXYRatio = page.Width/page.Height; 
if (XYRatio > 1f) 
{ 
    //page is landscape 
} 
else 
{ 
    //page is portrait 
} 

किसी भी मदद की सराहना की जाएगी।

धन्यवाद

उत्तर

6

के रूप में आप बाहर मिल गया है, तो आप हमेशा PdfReader.GetPageRotation() पर भरोसा नहीं कर सकते।

उदाहरण के लिए, दस्तावेज़ वस्तु इस तरह बनाया गया है:

Document doc = new Document(new Rectangle(792, 612)); 

PdfReader.GetPageRotation() होगा हमेशा वापसी 0.

एक वास्तव में सरलीकृत तरह से एक पेज पोर्ट्रेट या लैंडस्केप है कि क्या तय करने के लिए आपके द्वारा संयोजन किए जा रहे प्रत्येक पीडीएफ के प्रत्येक पृष्ठ की चौड़ाई और ऊंचाई की तुलना करना है। यदि चौड़ाई किसी व्यक्तिगत पृष्ठ की ऊंचाई से अधिक है, तो उस पृष्ठ में एक शब्दकोश प्रविष्टि जोड़ें और स्पष्ट रूप से इसे रोटेशन सेट करें। निम्नलिखित HTTP handler की तरह कुछ:

<%@ WebHandler Language='C#' Class='LandscapeToPortrait' %> 
using System; 
using System.IO; 
using System.Web; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

public class LandscapeToPortrait : IHttpHandler { 
    public void ProcessRequest (HttpContext context) { 
    HttpResponse Response = context.Response; 
    Response.ContentType = "application/pdf"; 
    PdfReader[] readers = { 
     new PdfReader(CreateReaderBytes(false)), 
     new PdfReader(CreateReaderBytes(true)) 
    }; 

    using (Document doc = new Document()) { 
     using (PdfCopy copy = new PdfCopy(doc, Response.OutputStream)) { 
     doc.Open(); 
     foreach (PdfReader reader in readers) { 
      int n = reader.NumberOfPages; 
      for (int page = 0; page < n;) { 
      ++page; 
      float width = reader.GetPageSize(page).Width; 
      float height = reader.GetPageSize(page).Height; 
      if (width > height) { 
       PdfDictionary pageDict = reader.GetPageN(page); 
       pageDict.Put(PdfName.ROTATE, new PdfNumber(90)); 
      } 
      copy.AddPage(copy.GetImportedPage(reader, page)); 
      } 
     }   
     } 
    } 
    } 
    public bool IsReusable { 
    get { return false; } 
    } 
    public byte[] CreateReaderBytes(bool isLandscape) { 
    using (MemoryStream ms = new MemoryStream()) { 
     Rectangle r = isLandscape 
     ? new Rectangle(792, 612) 
     : PageSize.LETTER 
     ; 
     using (Document doc = new Document(r)) { 
     PdfWriter.GetInstance(doc, ms); 
     doc.Open(); 
     for (int i = 0; i < 5; ++i) { 
      doc.Add(new Phrase("hello world")); 
      doc.NewPage(); 
     } 
     } 
     return ms.ToArray(); 
    } 
    } 
} 

PdfDictionary class पर एक नज़र डालें। और here's a good threadmailing list से यह समझाते हुए कि iText [तीव्र] प्रत्येक पृष्ठ में पृष्ठ रोटेशन कैसे संग्रहीत करता है।

और निश्चित रूप से, आप the book में निवेश करना चाहेंगे।

कि उदाहरण के साथ
+0

धन्यवाद। एक जादू की तरह काम करता है। – Riaan

10

मैंने इस तरह कुछ उपयोग किया।

cb.PdfDocument.NewPage(); 
PdfImportedPage page1 = writer.GetImportedPage(reader, i); 

Rectangle psize = reader.GetPageSizeWithRotation(i); 
switch (psize.Rotation) 
{ 
    case 0: 
     cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0); 
     break; 
    case 90: 
     cb.AddTemplate(page1, 0, -1f, 1f, 0, 0, psize.Height); 
     break; 
    case 180: 
     cb.AddTemplate(page1, -1f, 0, 0, -1f, 0, 0); 
     break; 
    case 270: 
     cb.AddTemplate(page1, 0, 1.0F, -1.0F, 0, psize.Width, 0); 
     break; 
    default: 
     break; 
} 
+0

धन्यवाद। मैंने कोशिश की है कि आयताकार मार्ग भी। जब मैं लैंडस्केप में पीडीएफ के साथ कोड चलाता हूं तो आयताकार मान हैं: आधार {iTextSharp.text.Element} = {आयताकार: 841.8898x595.2756 (सड़ांध: 0 डिग्री)} जब मैं एक ही पीडीएफ के साथ एक ही कोड चलाता हूं पोर्ट्रेट आयताकार मान हैं: आधार {iTextSharp.text.Element} = {आयत: 595x842 (सड़ांध: 0 डिग्री)} विभिन्न XY मानों से आप देख सकते हैं कि फ़ाइलें या तो लैंडस्केप या पोर्ट्रेट हैं, लेकिन रोटेशन 0 है दोनों मामलों में। – Riaan

+0

मुझे यह जोड़ना होगा कि यदि मैं अपने उदाहरण कोड के अनुसार XYRatio का उपयोग करता हूं, तो पृष्ठ उल्टा हो गया है, जो ठीक है, लेकिन यह पूरे ए 4 पृष्ठ आकार को नहीं बढ़ाया गया है, यह अधिक आधे रास्ते तक फैला हुआ है। अगर मैं केवल 'फ्लोट ए' के ​​बजाय AddTemplate के पैरामीटर के बारे में अधिक जानकारी प्राप्त कर सकता हूं ... 'फ्लोट एफ' – Riaan

+0

मेरी स्थिति में बेहतर काम करता है, कोड के लिए धन्यवाद! – VinnyG

3

http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html मैं निम्नलिखित लाइन कहा:

newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));* 

newDocument = new Document(); 
PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, outputStream); 

// START PAGE ORIENTATION FROM 1st Document 1st Page 
newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1)); 
// END PAGE ORIENTATION 
newDocument.Open(); 
PdfContentByte pdfContentByte = pdfWriter.DirectContent; 

मेरे pdfs SSRS से बनाया जाता है और वे एक ही आकार है, तो मैं 1 दस्तावेज़ के 1 पृष्ठ का उपयोग (मुझे लगता है)

+0

धन्यवाद, यह मेरी एसएसआर रिपोर्ट के साथ चाल है। – Lareau

0
// Instantiate the imported page as an Image 

const float HALF_INCH = 36f; 
// currentPosY is used to keep track of the current Y position. 

PdfImportedPage page = writer.GetImportedPage(reader, j); 
float scale = ((currentPosY - HALF_INCH - 10f)/page.Height); 
Image imgP = Image.GetInstance(page); 

if (page.Width > page.Height) { // Auto-detect landscape 
scale = ((currentPosY - HALF_INCH - 10f)/page.Width); 
imgP.RotationDegrees = 90f; // could be 270f 
} 

imgP.ScalePercent(scale * 100f); 
imgP.SetAbsolutePosition(HALF_INCH, HALF_INCH); 
imgP.CompressionLevel = 9; 
imgP.Border = Image.BOX; 
imgP.BorderWidth = 1f; 

document.Add(imgP); 
संबंधित मुद्दे