簡體   English   中英

C#PDF文檔中的尖銳位置

[英]C# PDF Sharp position in document

您好我使用PDF sharp將用戶輸入打印到模板文檔中的位置。

數據(字段)從用戶(網頁)收集並使用抽繩方法寫在文檔上的適當位置。

目前我通過反復試驗找到每個模板中每個模板化字段的像素位置。如果有一種方法可以確定pdf頁面中每個字段的像素位置,那將會容易得多。

任何建議都會有所幫助。

謝謝

我和你有同樣的問題,josephj1989,我找到了我認為是我們的答案。

根據PDFSharp文檔中的這個頁面

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渲染!

當我使用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));

並輸出: 模擬渲染的輸出

最后,我敢肯定,你是知道的,但有PdfSharp樣的一個很好的資源在這里

PDF文件沒有像素,也沒有像素位置。
您可以打印PDF頁面(使用“實際尺寸”大小選項)並使用標尺測量位置(這對我們的打印機非常有用)。
或者,您可以使用Adobe Acrobat測量PDF頁面上項目的位置。

一些試驗和錯誤仍然存​​在,因為您可能需要給予或采取半毫米。
根據您的標尺,您可以使用XUnit.FromMillimeter或XUnit.FromInch來獲取PDFsharp的點位置(但點不是像素)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM