Как повысить точность измерений в iTextSharp?

1

Я хочу изменить размер PDF до определенного размера, но когда я использую масштабирование, он теряет точность, потому что float округляет значение. Есть ли способ изменить размер PDF с заданной шириной и высотой? Это то, что я пробовал до сих пор:

public void PDFScalingTest11(string FileIn, string FileOut)            
    {
        // The following code opens a pdf and place it 20 times on a new pdf page
        // I want to resize the pdf before adding it

          int iQuantity = 20;
          int iCol = 3;
          int iRow = 0; 
          float fTileSpacing = 0;

          float fPrintWidth = 1200f; // Page Width 
          float fPrintHeight = 4158f; // PageHeight

          float fWidth = 400f; // output size
          float fHeight =  594f;

          float fPdfWidth = 210f;// current pdf size
          float fPdfHeight = 297f;

          float fScalingWidth = fWidth / fPdfWidth; // scaling (this value should be (1.904761904761905) but is rounded to (1.90476191)
          float fScalingHeight = fHeight / fPdfHeight; // this value is correct  

          fPrintWidth = iTextSharp.text.Utilities.MillimetersToPoints(fPrintWidth); // change mm to points         
          fPrintHeight = iTextSharp.text.Utilities.MillimetersToPoints(fPrintHeight);

          fWidth = iTextSharp.text.Utilities.MillimetersToPoints(fWidth);
          fHeight = iTextSharp.text.Utilities.MillimetersToPoints(fHeight);
          fTileSpacing = iTextSharp.text.Utilities.MillimetersToPoints(fTileSpacing);

        float x = 0;
        float y = (((fHeight + fTileSpacing) * iRow) - (fTileSpacing + fHeight));

        using (var doc = new Document(new Rectangle(fPrintWidth, fPrintHeight)))
        {
            using (var fs = new FileStream(FileOut, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (var writer = PdfWriter.GetInstance(doc, fs))
                {
                    doc.Open();
                    doc.NewPage();
                    iDraw = 0;
                    PdfReader reader = new PdfReader(FileIn);
                    PdfContentByte canvas = writer.DirectContent;
                    PdfTemplate tmp = writer.GetImportedPage(reader, 1);

                    for (int i = 0; i < iQuantity; i++)  
                        {
                            canvas.AddTemplate(tmp, fScalingWidth, 0, 0, fScalingHeight, x, y);
                            x += fTileSpacing + fWidth;
                            iDraw++;

                            if (iDraw == iCol)
                            {
                                y -= fHeight + fTileSpacing;
                                x = 0;
                                iDraw = 0;
                            }
                        }
                    doc.Close();
                    }                        
            }
        }
            System.Diagnostics.Process.Start(FileOut);
    }

    // The width of each pdf added to the new pdf page is 399mm instead of 400
Теги:
itext
itextsharp

1 ответ

1
Лучший ответ

Класс ByteBuffer имеет общедоступную статическую переменную HIGH_PRECISION. По умолчанию установлено значение false. Вы можете установить его в true чтобы вы получили 6 знаков после запятой при округлении числа:

iTextSharp.text.pdf.ByteBuffer.HIGH_PRECISION = true;

Это будет стоить вам некоторой производительности (но, возможно, вы этого не заметите), и в результате файл будет иметь больше байтов (но измерения будут более точными).

  • 0
    Спасибо миллион это сработало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню