我希望细胞背景使用它的自然尺寸,如果它们不适合细胞 - 应该裁剪图像。 当我使用图案填充图像实际上是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度,为什么?
图片是:
实际结果单元格为:
C#iTextSharp lib版本:5.5.0.0
答案 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);
MediaBox
:new Document(new Rectangle(842, 595));