2010-06-11 14 views
8

के साथ पीडीएफपीसेल में छवि ऑटो का आकार बदलता है iTextSharp लाइब्रेरी में छवियों के साथ मुझे एक अजीब समस्या है। मैं छवि को पीडीएफपीसेल में जोड़ रहा हूं और किसी कारण से इसे बढ़ाया जाता है। मैं इसे मूल आकार में कैसे रखूं? पीडीएफ के Here's the image पीडीएफ का 100% और चित्र मूल पैटर्न में चित्रित किया गया है। alt text http://a.yfrog.com/img697/7102/3kn.png हालांकि मुद्रित होने पर छवियां समान होंगी लेकिन तस्वीर पर अंतर मुद्रित संस्करण पर समान है। स्केलेक्सएक्स के साथ छवि को मैन्युअल रूप से स्केल करने के लिए इसे थोड़ा सा अजीब लगता है और यह अच्छा नतीजा नहीं देता है।iTextSharp

तो मैं छवि को अपने मूल आकार में किसी तालिका के पीडीएफपीसेल के अंदर कैसे स्केल कर सकता हूं?

यहाँ मेरी कोड है:

private PdfPTable CreateTestPDF() 
{ 
    PdfPTable table = new PdfPTable(1); 
    table.WidthPercentage = 100; 

    Phrase phrase = new Phrase("MY TITLE", _font24Bold); 
    table.AddCell(phrase); 

    PdfPTable nestedTable = new PdfPTable(5); 
    table.WidthPercentage = 100; 

    Phrase cellText = new Phrase("cell 1", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    cellText = new Phrase("cell 2", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    cellText = new Phrase("cell 3", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(@"d:\MyPic.jpg"); 
    image.Alignment = iTextSharp.text.Image.ALIGN_CENTER; 
    PdfPCell cell = new PdfPCell(image); 
    cell.HorizontalAlignment = PdfPCell.ALIGN_MIDDLE; 
    nestedTable.AddCell(cell); 

    cellText = new Phrase("cell 5", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    nestedTable.AddCell(""); 

    string articleInfo = "Test Text"; 
    cellText = new Phrase(articleInfo, _font8Black); 
    nestedTable.AddCell(cellText); 

    nestedTable.AddCell(""); 
    nestedTable.AddCell(""); 
    nestedTable.AddCell(""); 

    table.AddCell(nestedTable); 
    SetBorderSizeForAllCells(table, iTextSharp.text.Rectangle.NO_BORDER); 
    return table; 
} 

static BaseColor _textColor = new BaseColor(154, 154, 154); 
iTextSharp.text.Font _font8 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font8Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, BaseColor.BLACK); 
iTextSharp.text.Font _font9 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font9BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.BOLD, BaseColor.BLACK); 
iTextSharp.text.Font _font10 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font10Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, BaseColor.BLACK); 
iTextSharp.text.Font _font10BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.BOLD, BaseColor.BLACK); 
iTextSharp.text.Font _font24Bold = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 24, iTextSharp.text.Font.BOLD, _textColor); 
+0

iTextSharp किस संस्करण का उपयोग कर रहे हैं? – Stewbob

+0

मैं iTextSharp 5.0.2.0 –

+0

का उपयोग कर रहा हूं यह स्लोवेनिया में 4 बजे की तरह है। क्या तुम कभी सोये हो? :) – Stewbob

उत्तर

13

मैं iTextSharp v4.1.2 उपयोग कर रहा हूँ और मैं निम्नलिखित व्यवहार मिलता है:

इस कोड का प्रयोग, AddCell विधि के माध्यम से मेज पर सीधे छवि को जोड़ने, छवि सेल फिट करने के लिए बढ़ाया गया है: इस कोड का प्रयोग

nestedTable.AddCell(image); 

,, एक सेल करने के लिए छवि को जोड़ने तो मेज पर सेल जोड़ने, छवि अपने मूल आकार में प्रदर्शित किया जाता है:

PdfPCell cell = new PdfPCell(image); 
cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER; 
nestedTable.AddCell(cell); 



आप (टेबल के बाहर) सिर्फ तुलना करने के लिए/दोहरी जांच छवि आकार पीडीएफ दस्तावेज़ के लिए सीधे छवि जोड़ है?

document.add(image); 



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

संपादित

मैं सिर्फ v5.0.2 डाउनलोड किया है और जैसा कि ऊपर उल्लेख मैं एक ही परिणाम प्राप्त। मैंने उन छवियों के साथ कोशिश की है जो सेल के आकार की तुलना में छोटे और बड़े दोनों हैं, और व्यवहार समान है; पहली विधि छवि को स्केल करती है, दूसरी विधि नहीं होती है।

संपादित

ठीक है, जाहिरा तौर पर मैं पूरी डीपीआई चीज़ के बारे में साल के लिए गलत किया गया है जब यह छवियों के लिए आता है। मुझे लगता है कि यह छवि में डीपीआई क्या है, इस पर कोई फर्क नहीं पड़ता।
मैंने तीन अलग-अलग प्रस्तावों, 72 डीपीआई, 9 6 डीपीआई और 110 डीपीआई पर 600x400px छवि बनाई। तब मैंने इन छवियों को एक नए दस्तावेज़ में जोड़ा जो कि बिल्कुल 600x400 था।

Dim pSize As Rectangle = New Rectangle(600, 1000) 
Dim document As Document = New Document(pSize, 0, 0, 0, 0) 

तीन छवि फ़ाइलों में से प्रत्येक के लिए, जब

document.add(image) 

साथ दस्तावेज़ करने के लिए जोड़ा अलग डीपीआई सेटिंग्स के लिए कोई मतभेद के साथ वे दस्तावेज पूरी तरह से फिट,।

+0

मैंने पीडीएफपीसेल सेल = नई पीडीएफपीसेल (छवि) की कोशिश की है; और डॉक्टर। जोड़ें (छवि); (दस्तावेज़ जोड़ने के लिए सीधे) और वे एक ही आकार के परिणाम देते हैं। क्या यह संभव है कि डीपीआई के साथ कुछ करना है? –

+0

हां। पेंट.नेट में जो भी प्रदर्शित किया जाएगा, उसकी कई छवियां 96 डीपीआई (या कुछ और) हैं। iTextSharp हमेशा 72 डीपीआई का उपयोग करता है। मुझे पता है कि अगर आपकी छवि का डीपीआई 72 से अलग है, तो आपको अलग-अलग परिणाम मिल सकते हैं। मैं इसके बारे में भूल गया था, क्योंकि मैं हमेशा 72 डीपीआई पर 'पीडीएफ' छवियों में उपयोग के लिए अपना 'बना देता हूं। – Stewbob

+0

72? यहां स्वीकार किए गए उत्तर में यह 110 है: http://stackoverflow.com/questions/2752789/how-to-calculate-the-correct-image-size-in-out-pdf-using-itextsharp या क्या मैंने गलत समझा है वह जवाब? –

2

तो तुम PdfPCell में छवि का आकार mantain करने के लिए है, तो आप कर सकते हैं Loock इस कोड पर:

   iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageFilePath); 

       // Save the image width 
       float width = image.Width; 
       PdfPCell cell = new PdfPCell(); 
       cell.AddElement(image); 


       // Now find the Image element in the cell and resize it 
       foreach (IElement element in cell.CompositeElements) 
       { 
        // The inserted image is stored in a PdfPTable, so when you find 
        // the table element just set the table width with the image width, and lock it. 
        PdfPTable tblImg = element as PdfPTable; 
        if (tblImg != null) 
        { 
         tblImg.TotalWidth = width; 
         tblImg.LockedWidth = true; 
        } 
       } 
9

@ Stewbob का जवाब काम करता है, लेकिन यह केवल संयोग तालिका के तरीकों से संबंधित है।

iTextSharp के साथ यह बात यह है कि यह आपके द्वारा उपयोग किए जाने वाले कन्स्ट्रक्टर के आधार पर अलग-अलग व्यवहार करेगा। यह होगा (annoyingly) ऊपर छवि सेल को भरने के लिए बड़े पैमाने:

PdfPCell c = new PdfPCell(); 
c.Add(image); 
c.setHorizontalAlignment(Element.ALIGN_CENTER); // this will be ignored 

लेकिन इस आकार आप इसे सेट पर छवि छोड़ देंगे (और संरेखण के लिए अनुमति देते हैं):

PdfPCell c = new PdfPCell(image); 
c.setHorizontalAlignment(Element.ALIGN_CENTER); 

मैं डॉन ' टी पता है कि यह क्यों है, सेल को 'टेक्स्ट मोड' में होने के साथ कुछ करना है यदि आप इसे 'समग्र मोड' बनाते हुए कन्स्ट्रक्टर बनाम 'समग्र मोड' में छवि जोड़ते हैं (जिस स्थिति में प्रत्येक ऑब्जेक्ट की देखभाल की जाती है यह स्वयं का संरेखण है)।

कुछ अधिक जानकारी (जावा में, लेकिन अभी भी लागू होता है) http://tutorials.jenkov.com/java-itext/table.html#cell-modes

+0

यह अजीब विशेषता हो सकती है कि मैंने कभी देखा नहीं है। बहुत धन्यवाद – Tommy

+0

इस उत्तर को ऊपर उठाना क्योंकि यह मुझे एक ही समस्या के लिए समाधान खोजने की अनुमति देता है। लेकिन मुझे एक पूरी तरह से अलग व्यवहार का सामना करना पड़ा - AddElement विधि आपके द्वारा सेट किए गए आकार पर छवि को छोड़ देता है लेकिन कन्स्ट्रक्टर छवि का आकार बदलता है। मैं iTextSharp 5.5.3.0 का उपयोग कर रहा हूँ। –

1

समारोह एक संपत्ति छवि फिट करने के लिए है। केवल जोड़ने के एक सच

cell.AddElement(image,true); 
+4

itextsharp का कौन सा संस्करण या किस प्रकार का चर 'सेल' आप उपयोग करते हैं? मेरे (टाइप पीडीएफपीसेल) में मैं केवल विधि पा सकता हूं: AddElement (IElement element) – Bronek

+0

मेरे पास यह अधिभार नहीं है - iTextSharp 5.5.9 का उपयोग कर। – rumblefx0