gpt4 book ai didi

c# - iTextSharp。为什么单元格背景图像顺时针旋转90度?

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:16 26 4
gpt4 key购买 nike

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

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 库版本:5.5.0.0

最佳答案

您正在尝试使用非常复杂的代码来实现一些非常简单的事情。这就是当您通过 Google 编码 而不是 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);
  • 或者您创建横向的 MediaBox:new Document(new Rectangle(842, 595));

关于c# - iTextSharp。为什么单元格背景图像顺时针旋转90度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com