Вопрос:

Невозможно добавить поля в документе iTextSharp с изображениями

pdf itext

497 просмотра

1 ответ

595 Репутация автора

Требование: большое изображение (динамическое) необходимо разделить и показать на страницах PDF. Если изображение не может быть размещено на одной странице, то нам нужно добавить другую страницу и попытаться разместить оставшуюся часть и так далее.

Пока что я могу разделить изображение на несколько страниц, однако кажется, что они полностью игнорируют значения полей, поэтому изображения отображаются без полей.

Пожалуйста, смотрите ниже код:

string fileStringReplace = imageByteArray.Replace("data:image/jpeg;base64,", "");
        Byte[] imageByte = Convert.FromBase64String(fileStringReplace);
        iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageByte);
        float w = image.ScaledWidth;
        float h = image.ScaledHeight;
        float cropHeight = 1500f;

        iTextSharp.text.Rectangle page = new iTextSharp.text.Rectangle(1150f, cropHeight);
        var x = page.Height;
        Byte[] created;

        iTextSharp.text.Document document = new iTextSharp.text.Document(page, 20f, 20f, 20f, 40f); --This has no impact

        using (var outputMemoryStream = new MemoryStream())
        {
            PdfWriter writer = PdfWriter.GetInstance(document, outputMemoryStream);
            writer.CloseStream = false;

            document.Open();
            PdfContentByte canvas = writer.DirectContentUnder;

            float usedHeights = h;

            while (usedHeights >= 0)
            {
                usedHeights -= cropHeight;
                document.SetPageSize(new iTextSharp.text.Rectangle(1150f, cropHeight));
                canvas.AddImage(image, w, 0, 0, h, 0, -usedHeights);

                document.NewPage();
            }

            document.Close();

            created = outputMemoryStream.ToArray();

            outputMemoryStream.Write(created, 0, created.Length);
            outputMemoryStream.Position = 0;
        }
        return created;

Я также попытался установить поле в цикле document.SetMargins () - но это не работает.

Автор: TechTurtle Источник Размещён: 22.08.2016 09:20

Ответы (1)


0 плюса

65228 Репутация автора

Вы смешиваете разные вещи.

Когда вы создаете поля, будь то при создании Documentэкземпляра или с помощью setMargins()метода, вы создаете поля для случая, когда iText (Sharp) выбирает макет. То есть: поля будут соблюдаться, когда вы делаете что-то подобное document.Add(image).

Однако вы не разрешаете iText создавать макет. Вы создаете PdfContentByteименованное имя canvasи решаете добавить изображение на этот холст, используя матрицу преобразования. Это означает , что вы будете вычислить a, b, c, d, e, и fзначение , необходимое для AddImage()метода.

Вы должны делать это по математике. Если вы хотите увидеть запас, то значения w, 0, 0, h, 0, и -usedHeightsне правы, и вы не должны винить iTextSharp, вы должны винить отсутствие понимания в аналитических геометрических параметрах (это материал , вы узнаете в средней школе в возрасте из 16).

Это может быть проще для вас:

iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageByte);
float w = image.ScaledWidth;
float h = image.ScaledHeight;
// For the sake of simplicity, I don't crop the image, I just add 20 user units
iTextSharp.text.Rectangle page = new iTextSharp.text.Rectangle(w + 20, h + 20);
iTextSharp.text.Document document = new iTextSharp.text.Document(page);
PdfWriter writer = PdfWriter.GetInstance(document, outputMemoryStream);
// Please drop the line that prevents closing the output stream!
// Why are so many people making this mistake?
// Who told you you shouldn't close the output stream???
document.Open();
// We define an absolute position for the image
// it will leave a margin of 10 to the left and to the bottom
// as we created a page that is 20 user units to wide and to high,
// we will also have a margin of 10 to the right and to the top
img.SetAbsolutePosition(10, 10);
document.Add(Image);
document.Close();

Обратите внимание, что SetAbsolutePosition()также позволяет вам взять контроль, независимо от полей, в качестве альтернативы, вы можете использовать:

iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageByte);
float w = image.ScaledWidth;
float h = image.ScaledHeight;
// For the sake of simplicity, I don't crop the image, I just add 20 user units
iTextSharp.text.Rectangle page = new iTextSharp.text.Rectangle(w + 20, h + 20);
iTextSharp.text.Document document = new iTextSharp.text.Document(page, 10, 10, 10, 10);
PdfWriter writer = PdfWriter.GetInstance(document, outputMemoryStream);
// Please drop the line that prevents closing the output stream!
// Why are so many people making this mistake?
// Who told you you shouldn't close the output stream???
document.Open();
// We add the image to the document, and we let iTextSharp decide where to put it
// As there is just sufficient space to fit the image inside the page, it should fit,
// But be aware of the existence of a leading; that could create side-effects
// such as forwarding the image to the next page because it doesn't fit vertically
document.Add(Image);
document.Close();
Автор: Bruno Lowagie Размещён: 23.08.2016 06:32
32x32