C#PDF文档中的尖锐位置

时间:2012-11-07 04:45:48

标签: c# pdf pdfsharp

您好我正在使用PDF sharp将用户输入打印到模板文档中的位置。

数据(字段)是从用户(网页)收集的,并使用抽绳方法写在文档的适当位置。

目前我通过反复试验找到每个模板中每个模板化字段的Pixel位置。如果有一种方法可以确定pdf页面中每个字段的像素位置,那将会容易得多。

任何建议都会有所帮助。

感谢

3 个答案:

答案 0 :(得分:12)

我和你有同样的问题,josephj1989,我找到了我认为是我们的答案。

根据PDFSharp文档中的this page

  

PDFsharp的当前实现只有一个图形上下文布局。原点(0,0)位于左上角,坐标向右和向下增长。测量单位始终为点(1/72英寸)。

所以,我想要画一张距离左边3英寸,距离8.5 x 11页面顶部7.5英寸的图像,然后我会做这样的事情:

PdfDocument document = GetBlankPdfDocument();
PdfPage myPage = document.AddPage();
myPage.Orientation = PdfSharp.PageOrientation.Portrait;
myPage.Width = XUnit.FromInch(8.5);
myPage.Height = XUnit.FromInch(11);
XImage myImage = GetSampleImage();

double myX = 3 * 72;
double myY = 7.5 * 72;
double someWidth = 126;
double someHeight = 36;

XGraphics gfx = XGraphics.FromPdfPage(myPage);
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight);

我用条形码图像自己测试了这一点,我发现当你使用他们的公式来测量定位时,你可以获得一个精确度,即1/72英寸。那不错。

因此,在这一点上,为这样的测量创建某种封装是好的,这样我们就可以主要关注手头的任务,而不是转换的细节。

public static double GetCoordinateFromInch(double inches)
{
  return inches * 72;
}

我们可以用这种方式继续做其他帮助......

public static double GetCoordinateFromCentimeter(double centimeters)
{
  return centimeters * 0.39370 * 72;
}

使用这样的辅助方法,我们可以使用前面的示例代码执行此操作:

double myX = GetCoordinateFromInch(3);
double myY = GetCoordinateFromInch(7.5);
double someWidth = 126;
double someHeight = 36;

XGraphics gfx = XGraphics.FromPdfPage(myPage);
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight);

我希望这会有所帮助。我确定你会编写比我的例子更清晰的代码。此外,可能有更聪明的方法来简化这个过程,但我只想在这里放一些可以立即使用我们在文档中看到的东西。

快乐的PDF渲染!

答案 1 :(得分:5)

当我使用PDF Sharp时,我的方法是使用XUnit结构并引用文档的左上角作为X / Y位置的起点。

显然,对于PdfPage上的每个元素引用文档的左上角(0,0)都会变得混乱。为了解决这个问题,我使用了XRect类来创建元素的矩形。将XRect绘制到页面上后,您就可以通过XRect的属性引用矩形的X / Y位置。然后使用一些基本数学使用这些坐标和XRect的宽度/高度,您应该能够计算要添加到PdfPage的下一个元素的位置坐标。

按照此代码示例,我提供了最终结果的粗略草图。代码未经测试,但现在非常基于生产中的代码。

// Create a new PDF document
PdfDocument document = new PdfDocument();

// Create an empty page with the default size/orientation
PdfPage page = document.AddPage();
page.Orientation = PageOrientation.Landscape;
page.Width = XUnit.FromMillimeter(300);
page.Height = XUnit.FromMillimeter(200);

// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);

// Add the first rectangle
XUnit horizontalOffset = XUnit.FromMillimeter(5);
XUnit verticalOffset = XUnit.FromMillimeter(5);
XUnit columnWidth = XUnit.FromMillimeter(100);
XUnit columnHeight = page.Height - (2 * verticalOffset);
XRect columnRect = new XRect(horizontalOffset, verticalOffset, columnWidth, columnHeight);
gfx.DrawRectangle(XBrushes.Teal, columnRect);

// Insert an image inside the rectangle, referencing the Left and Top properties of the rectangle for image placement
XImage topLogo = XImage.FromFile(GetFilePath(@"content\img\pdfs\standard\logo-no-strapline.jpg")); // GetFilePath is a private method, not shown for brevity
gfx.DrawImage(topLogo,
    columnRect.Left + XUnit.FromMillimeter(5),
    columnRect.Top + XUnit.FromMillimeter(5),
    columnRect.Width - XUnit.FromMillimeter(10),
    XUnit.FromMillimeter(38));

输出: Mock up of the rendered output

最后,我确定你知道,但是有很好的PdfSharp样本资源here

答案 2 :(得分:0)

PDF文件没有像素,也没有像素位置 您可以打印PDF页面(使用“实际尺寸”尺寸选项)并使用标尺测量位置(这对我们的打印机非常有用)。
或者,您可以使用Adobe Acrobat来测量PDF页面上项目的位置。

仍有一些试验和错误,因为您可能需要提供或采取半毫米 根据您的标尺,您可以使用XUnit.FromMillimeter或XUnit.FromInch来获取PDFsharp的点位置(但点不是像素)。

目前的PDFsharp示例如下:
http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx