iTextSharp的。为什么细胞背景图像顺时针旋转90度?

时间:2014-04-29 20:23:17

标签: c# itextsharp

我希望细胞背景使用它的自然尺寸,如果它们不适合细胞 - 应该裁剪图像。 当我使用图案填充图像实际上是90度旋转时还有一件事。所以这个问题的主要内容是为什么在添加后旋转模式图像 我用谷歌搜索答案和阅读文档,但无法找到任何解释。 这是代码:

Image img = Image.GetInstance("someImage.png");

var cell = new PdfPCell()
{
    BorderWidthTop = 0,
    BorderWidthBottom = 0,
    BorderWidthLeft = 0,
    BorderWidthRight = 0,
    Padding = 0,
    BackgroundColor = new BaseColor(244, 244, 244),
    BorderColor = new BaseColor(217, 217, 217),
    HorizontalAlignment = Element.ALIGN_CENTER
};
cell.CellEvent = new CellBackgroundEvent() {Image = img};
table.AddCell(cell)
;

这是事件处理程序类:

private class CellBackgroundEvent : IPdfPCellEvent
{
    public Image Image { get; set; }

    void IPdfPCellEvent.CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
    {
        PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
        PdfPatternPainter patternPainter = cb.CreatePattern(position.Right - position.Left, position.Top - position.Bottom);
        patternPainter.AddImage(Image, position.Right - position.Left, 0, 0, position.Top - position.Bottom, 0, 0);
        cb.SaveState();
        cb.SetPatternFill(patternPainter);
        cb.Rectangle(position.Left, position.Bottom, position.Width, position.Height);
        cb.Fill();
        cb.RestoreState();
    }
}

执行后单元格背景图像顺时针旋转90度,为什么?

图片是:enter image description here

实际结果单元格为:

enter image description here

C#iTextSharp lib版本:5.5.0.0

1 个答案:

答案 0 :(得分:1)

您正在尝试使用非常复杂的代码实现非常简单的操作。当您使用代码而不是reading the documentation来代替时,会发生这种情况!

请试试这个:

PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
Image.ScaleToFit( position.Top - position.Bottom,position.Right - position.Left);
Image.SetAbsolutePosition(position.Bottom, position.Left);
cb.AddImage(image);

现在,您正在缩放图像以适合单元格并将其添加到单元格左下角的坐标处。

更新1:

在确定你真的想要平铺图像之后,我写了一个试图重现问题的例子。由于我不理解你的代码(*),我不得不重写它的大部分内容。

无论如何,您将找到一个可用的Java样本here。生成的PDF看起来像this图像没有旋转,是吗?它看起来与您在问题中的外观完全相同。

这是相关代码:

public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
    try {
        PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
        PdfPatternPainter patternPainter = cb.createPattern(image.getScaledWidth(), image.getScaledHeight());
        image.setAbsolutePosition(0, 0);
        patternPainter.addImage(image);
        cb.saveState();
        cb.setPatternFill(patternPainter);
        cb.rectangle(position.getLeft(), position.getBottom(), position.getWidth(), position.getHeight());
        cb.fill();
        cb.restoreState();
    } catch (DocumentException e) {
        throw new ExceptionConverter(e);
    }
}

(*)请注意,您忽略了Rectangle也可以为您提供宽度和高度的事实。您首选使用AddImage()方法的难度版本。您将单元格的尺寸与图像的尺寸混淆了......

更新2:

Java示例移植到C#(使用iTextSharp 5.5.0.0):

using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ConsoleApplication1 {
    public class TiledImageBackground : IPdfPCellEvent {
        protected Image image;

        public TiledImageBackground(Image image) {
            this.image = image;
        }

        public void CellLayout(PdfPCell cell, Rectangle position,
            PdfContentByte[] canvases) {
            PdfContentByte cb = canvases[PdfPTable.BACKGROUNDCANVAS];
            PdfPatternPainter patternPainter = cb.CreatePattern(image.ScaledWidth, image.ScaledHeight);
            image.SetAbsolutePosition(0, 0);
            patternPainter.AddImage(image);
            cb.SaveState();
            cb.SetPatternFill(patternPainter);
            cb.Rectangle(position.Left, position.Bottom, position.Width, position.Height);
            cb.Fill();
            cb.RestoreState();
        }
    }


    public class TiledBackground {
        public const String DEST = "results/tables/tiled_pattern.pdf";
        public const String IMG1 = "resources/images/ALxRF.png";
        public const String IMG2 = "resources/images/bulb.gif";

        private static void Main(string[] args) {
            Directory.CreateDirectory(Directory.GetParent(DEST).FullName);
            new TiledBackground().CreatePdf(DEST);
        }

        public void CreatePdf(String dest) {
            Document document = new Document();
            PdfWriter.GetInstance(document, new FileStream(dest, FileMode.Create));
            document.Open();
            PdfPTable table = new PdfPTable(2);
            PdfPCell cell = new PdfPCell();
            Image image = Image.GetInstance(IMG1);
            cell.CellEvent = new TiledImageBackground(image);
            cell.FixedHeight = 770;
            table.AddCell(cell);
            cell = new PdfPCell();
            image = Image.GetInstance(IMG2);
            cell.CellEvent = new TiledImageBackground(image);
            cell.FixedHeight = 770;
            table.AddCell(cell);
            document.Add(table);
            document.Close();
        }
    }
}

使用此代码无法复制该问题。换句话说:iTextSharp中没有错误,功能已正确移植。

请花一点时间尝试此答案中的示例代码,以确保错误在您的代码中。如果您仍然遇到更改方向的问题,则需要查看代码中的不同内容。

更新3:

在另外发表评论之后,我们现在确定90度轮换是故意的。该文件是使用以下方式创建的:

Document document = new Document(PageSize.A4.Rotate());

在这种情况下,您创建一个宽度小于高度的文档( MediaBox 被定义为纵向的矩形),但您可以旋转该页面(添加条目等于90转到页面词典。

如果您希望图案与横向页面的方向相匹配,则有两个选项:

  • 要么旋转模式:img_pattern.setPatternMatrix(0, 1, -1, 0, 0, 0);
  • 或您在横向中创建MediaBoxnew Document(new Rectangle(842, 595));