[英]Convert byte[] to PDF Sharp Document and Email as Attachment
[英]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.