दिलचस्प पोस्ट
सीएसएस या जावास्क्रिप्ट का उपयोग कर वेबपेज में कर्सर छिपाना संभव है? क्या जेएलैबल के लिए एक "शब्द लपेटो" संपत्ति है? एक पायथन ईएनटी को बाइट्स की एक बड़ी-एंडियन स्ट्रिंग में कनवर्ट करें सूचना लेआउट बदलें क्या कंसोल में सिस्टम शेल चलाने के लिए एक एक्लिप्स प्लगइन है? संकलन / लिंकिंग प्रक्रिया कैसे काम करती है? एंड्रॉइड एकाधिक चयन सूची और पाठ दृश्य IOS 8 UITableView विभाजक inset 0 काम नहीं कर रहा है एंड्रॉइड एक्शन बार अतिप्रवाह नहीं दिखा रहा है मैं विंडोज 7 में एक फ़ोल्डर में लिखने के लिए asp.net अनुमति कैसे दे सकता हूँ? सी में संदर्भ द्वारा एक सरणी उत्तीर्ण? एचटीएमएल टैग निकालें लेकिन अंदरूनी HTML रखें उपयोगकर्ता टाइमज़ोन प्राप्त करें serialize और अतिरिक्त डेटा के साथ jQuery पोस्ट () स्विफ्ट एक्सटेंशन में ओवरराइड करने के तरीकों

Itextsharp: बिल्कुल एक पृष्ठ पर 2 तत्वों को समायोजित करें

इसलिए, मुझे सी # (.NET 4.0 + WinForms) और iTextSharp 5.1.2 का उपयोग करने में यह समस्या हो रही है।

मेरे पास कुछ स्कैन की गई छवियां हैं जो एक डीबी पर संग्रहीत हैं और उन छवियों के साथ पीडीएफ को उड़ाने की जरूरत है। कुछ फ़ाइलों में सिर्फ एक पृष्ठ है और अन्य सैकड़ों लोग हैं यह ठीक काम कर रहा है:

foreach (var page in pages) { Image pageImage = Image.GetInstance(page.Image); pageImage.ScaleToFit(document.PageSize.Width,document.PageSize.Height); pageImage.Alignment = Image.ALIGN_TOP | Image.ALIGN_CENTER; document.Add(pageImage); document.NewPage(); //... } 

यह समस्या है:

मुझे आखिरी पृष्ठ के निचले भाग में एक छोटी सी तालिका जोड़ने की आवश्यकता है I

मैं कोशिश करूँगा:

  foreach (var page in pages) { Image pageImage = Image.GetInstance(page.Image); pageImage.ScaleToFit(document.PageSize.Width,document.PageSize.Height); pageImage.Alignment = Image.ALIGN_TOP | Image.ALIGN_CENTER; document.Add(pageImage); document.NewPage(); //... } Table t = new table.... document.Add(t); 

मेज सफलतापूर्वक जोड़ा गया है लेकिन अगर छवि का आकार दस्तावेज़ के पृष्ठ आकार में फिट होता है तो तालिका अगले पृष्ठ पर जोड़ दी जाती है।

तालिका के सीधे उस पृष्ठ पर (छवि के साथ) डालने के लिए मुझे दस्तावेज़ की आखिरी छवि का आकार बदलने की आवश्यकता है (यदि इसमें एकाधिक वाले हैं, या पहले केवल 1 है) और यह कि ओकूपी दोनों एक ही पृष्ठ है।

मैं छवि को प्रतिशत के आधार पर स्केल करने की कोशिश करता हूं, लेकिन यह देखते हुए कि छवि का वह छवि आकार जो अंतिम पृष्ठ पर होगा, अनजान है और यह उस पेज का सबसे बड़ा हिस्सा मुझे भरने के लिए आवश्यक है जो मुझे द्विगुणित रूप से करना चाहिए।

कोई उपाय?

वेब के समाधान से एकत्रित समाधान "Itextsharp: बिल्कुल एक पृष्ठ पर 2 तत्वों को समायोजित करें"

मैं आपको कुछ ऐसी चीजें देता हूं जो आपकी मदद कर सकती हैं और फिर मैं आपको एक पूर्ण काम करने वाला उदाहरण देता हूं कि आपको कस्टमाइज़ करने में सक्षम होना चाहिए।

पहली बात यह है कि WriteSelectedRows() पास एक विशेष पद्धति है जिसे WriteSelectedRows() कहा जाता है जो आपको एक सटीक x,y निर्देशांक पर तालिका खींचने की अनुमति देता है। इसमें छह ओवरलोड हैं, लेकिन सबसे अधिक इस्तेमाल किया जाने वाला शायद शायद है:

 PdfPTable.WriteSelectedRows(int rowStart,int rowEnd, float xPos, float yPos, PdfContentByte canvas) 

400,400 तैनात ऊपरी बाएं कोने वाला एक टेबल रखने के लिए आप कॉल करेंगे:

 t.WriteSelectedRows(0, t.Rows.Count, 400, 400, writer.DirectContent); 

इस विधि को कॉल करने से पहले आपको SetTotalWidth() का उपयोग करते हुए तालिका की चौड़ाई सेट करना आवश्यक है:

 //Set these to your absolute column width(s), whatever they are. t.SetTotalWidth(new float[] { 200, 300 }); 

दूसरी बात यह है कि मेज की ऊंचाई पूरी तालिका तक रेंडर नहीं हुई है। इसका मतलब यह है कि आप बिल्कुल नहीं जानते कि टेबल कहां जगह है, ताकि वह वास्तव में नीचे हो। इसका समाधान एक अस्थायी दस्तावेज़ को पहले तालिका में प्रस्तुत करना है और फिर ऊंचाई की गणना करना है नीचे एक ऐसा तरीका है जो मैं ऐसा करने के लिए करता हूं:

  public static float CalculatePdfPTableHeight(PdfPTable table) { using (MemoryStream ms = new MemoryStream()) { using (Document doc = new Document(PageSize.TABLOID)) { using (PdfWriter w = PdfWriter.GetInstance(doc, ms)) { doc.Open(); table.WriteSelectedRows(0, table.Rows.Count, 0, 0, w.DirectContent); doc.Close(); return table.TotalHeight; } } } } 

इसे इस तरह से बुलाया जा सकता है:

  PdfPTable t = new PdfPTable(2); //In order to use WriteSelectedRows you need to set the width of the table t.SetTotalWidth(new float[] { 200, 300 }); t.AddCell("Hello"); t.AddCell("World"); t.AddCell("Test"); t.AddCell("Test"); float tableHeight = CalculatePdfPTableHeight(t); 

इसलिए सभी के साथ यहां एक पूर्ण काम कर रहे WinForms उदाहरण iTextSharp 5.1.1.0 को लक्षित करना है (मुझे पता है कि आपने 5.1.2 कहा लेकिन यह केवल एक ही काम करना चाहिए)। यह नमूना सभी जेपीईजी को एक फ़ोल्डर में "टेस्ट" नामक डेस्कटॉप पर दिखता है यह तब उन्हें 8.5 "x11" पीडीएफ में जोड़ता है फिर पीडीएफ के आखिरी पृष्ठ पर, या अगर केवल 1 जेपीईजी को केवल एक ही पेज पर शुरू करना है, तो यह पीडीएफ की ऊँचाई फैलता है, फिर भी उस तालिका को बढ़ाता है जिसे हम जोड़ रहे हैं और फिर नीचे की तरफ टेबल रखता है कोने। अधिक स्पष्टीकरण के लिए कोड में स्वयं टिप्पणियां देखें।

 using System; using System.Text; using System.Windows.Forms; using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; namespace Full_Profile1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public static float CalculatePdfPTableHeight(PdfPTable table) { //Create a temporary PDF to calculate the height using (MemoryStream ms = new MemoryStream()) { using (Document doc = new Document(PageSize.TABLOID)) { using (PdfWriter w = PdfWriter.GetInstance(doc, ms)) { doc.Open(); table.WriteSelectedRows(0, table.Rows.Count, 0, 0, w.DirectContent); doc.Close(); return table.TotalHeight; } } } } private void Form1_Load(object sender, EventArgs e) { //Create our table PdfPTable t = new PdfPTable(2); //In order to use WriteSelectedRows you need to set the width of the table t.SetTotalWidth(new float[] { 200, 300 }); t.AddCell("Hello"); t.AddCell("World"); t.AddCell("Test"); t.AddCell("Test"); //Calculate true height of the table so we can position it at the document's bottom float tableHeight = CalculatePdfPTableHeight(t); //Folder that we are working in string workingFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test"); //PDF that we are creating string outputFile = Path.Combine(workingFolder, "Output.pdf"); //Get an array of all JPEGs in the folder String[] AllImages = Directory.GetFiles(workingFolder, "*.jpg", SearchOption.TopDirectoryOnly); //Standard iTextSharp PDF init using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { using (Document document = new Document(PageSize.LETTER)) { using (PdfWriter writer = PdfWriter.GetInstance(document, fs)) { //Open our document for writing document.Open(); //We do not want any margins in the document probably document.SetMargins(0, 0, 0, 0); //Declare here, init in loop below iTextSharp.text.Image pageImage; //Loop through each image for (int i = 0; i < AllImages.Length; i++) { //If we only have one image or we are on the second to last one if ((AllImages.Length == 1) | (i == (AllImages.Length - 1))) { //Increase the size of the page by the height of the table document.SetPageSize(new iTextSharp.text.Rectangle(0, 0, document.PageSize.Width, document.PageSize.Height + tableHeight)); } //Add a new page to the PDF document.NewPage(); //Create our image instance pageImage = iTextSharp.text.Image.GetInstance(AllImages[i]); pageImage.ScaleToFit(document.PageSize.Width, document.PageSize.Height); pageImage.Alignment = iTextSharp.text.Image.ALIGN_TOP | iTextSharp.text.Image.ALIGN_CENTER; document.Add(pageImage); //If we only have one image or we are on the second to last one if ((AllImages.Length == 1) | (i == (AllImages.Length - 1))) { //Draw the table to the bottom left corner of the document t.WriteSelectedRows(0, t.Rows.Count, 0, tableHeight, writer.DirectContent); } } //Close document for writing document.Close(); } } } this.Close(); } } } 

संपादित करें

नीचे आपकी टिप्पणियों पर आधारित एक संपादन है। मैं केवल उस लूप की सामग्री पोस्ट कर रहा हूं जो कि एकमात्र हिस्सा है जो बदल गया है। ScaleToFit कॉल ScaleToFit आपको सिर्फ tableHeight लेने की आवश्यकता होती है।

  //Loop through each image for (int i = 0; i < AllImages.Length; i++) { //Add a new page to the PDF document.NewPage(); //Create our image instance pageImage = iTextSharp.text.Image.GetInstance(AllImages[i]); //If we only have one image or we are on the second to last one if ((AllImages.Length == 1) | (i == (AllImages.Length - 1))) { //Scale based on the height of document minus the table height pageImage.ScaleToFit(document.PageSize.Width, document.PageSize.Height - tableHeight); } else { //Scale normally pageImage.ScaleToFit(document.PageSize.Width, document.PageSize.Height); } pageImage.Alignment = iTextSharp.text.Image.ALIGN_TOP | iTextSharp.text.Image.ALIGN_CENTER; document.Add(pageImage); //If we only have one image or we are on the second to last one if ((AllImages.Length == 1) | (i == (AllImages.Length - 1))) { //Draw the table to the bottom left corner of the document t.WriteSelectedRows(0, t.Rows.Count, 0, tableHeight, writer.DirectContent); } } 

बस एक विधि तालिका का उपयोग करें। CalculateHeights () यदि आप तालिका की ऊंचाई जानना चाहते हैं