webForumDet fria alternativet

XHTML till PDF komponent

13 svar · 1 210 visningar · startad av Gildebrand

GildebrandMedlem sedan juni 2009920 inlägg
#1

Hejsan!

Jag är på jakt efter en komponent som jag kan implementera på en Asp.Net sida för att konvertera XHTML till PDF. Jag vill kunna konvertera bilder, listor och tabeller. Jag vill inte behöva ange koordinater för vart texten ska ligga. Det Vore också en fördel om man kunde "Streama" den färdiga PDFen till användaren och slippa spara den på servern. Det finns många fina såna här komponenter, men de jag har hittat kostar en massa pengar. Jag vill ha Gratis och Gott :)

hopparnMedlem sedan nov. 20011 551 inlägg
#2

Gratis: vet ej
ABCPDF gör det du vill och mer där till, kostar dock om du INTE vill göra reklam med en backlink till dem som skapat produkten.
https://www.websupergoo.com

GildebrandMedlem sedan juni 2009920 inlägg
#3

Var ju inga stora pengar det kostade dock. Kollade lite på features för ABCPdf, och verkade som att det gick att streama PDFen till webbläsaren, och konvertera från html till PDF, korrekt?

hopparnMedlem sedan nov. 20011 551 inlägg
#4

Japp, använt det många gånger då man genererar kvitton eller fakturor för att sen presentera i webbläsaren mha en handler eller bara bifoga i mail som attachment

Bygg en html sida som ser ut exakt som du vill ha pdf:en och skicka in dess adress, ut kommer en css hanterad pdf :)

Den har även stöd för det något tveksamma pagebreak:after etc så man kan göra snygga radbrytningar, t ex om man har många orderrader som ska in, räkna upp till det antal som får plats och bryt sen för ny sida... mm mm

GildebrandMedlem sedan juni 2009920 inlägg
#5

Jag har laddat ner ABCPdf 7 för .Net x64, och ska lägga in referenserna i mitt projekt. Det går bra att lägga till ABCPdf.dll, men när jag ska lägga till ABCPdfCE7.dll så får jag följande felmeddelande:

"A reference to 'c:\program files\websupergoo\ABCpdf.NET 7.0 x64\ExampleSite\bin\ABCpdfCE7.dll' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component."

hopparnMedlem sedan nov. 20011 551 inlägg
#6

hmmm, jag har faktiskt inte kört x64, även om jag har x64 så har jag installerat 32 bitars, har du provat?

GildebrandMedlem sedan juni 2009920 inlägg
#7

Ja jag provade att ta bort x64 och köra 32-bitars men fick samma fel.

hopparnMedlem sedan nov. 20011 551 inlägg
#8

Så här är det uppsatt i ett projekt jag har här på burken:
Referens till

C:\Program Files (x86)\WebSupergoo\ABCpdf .NET 7.0\Common\ABCpdf.dll

i references i mitt library

dessa båda using i min klass fil som hanterar själva pdf:erna

using WebSupergoo.ABCpdf7;
using WebSupergoo.ABCpdf7.Internal;

ett annat litet projekt jag satte upp så behövde jag referera till

C:\Program Files (x86)\WebSupergoo\ABCpdf .NET 7.0\ExampleProjects\PDFEnterpriseServices\bin\Debug\PdfEnterpriseServices.dll

och sen såklart till

C:\Program Files (x86)\WebSupergoo\ABCpdf .NET 7.0\Common\ABCpdf.dll
GildebrandMedlem sedan juni 2009920 inlägg
#9

Jag har lagt till enbart ABCpdf.dll bland referenserna.
Båda usings är med.
Jag försöker köra följande kod:

            Doc theDoc = new Doc();
            theDoc.AddImageUrl("http://www.google.se/");
            theDoc.Save(Server.MapPath("htmlimport.pdf"));
            theDoc.Clear();

Och först får jag följande felmeddelande: http://piclair.com/data/tdlty.jpg
Och sen klagar den på theDoc.AddimageUrl, "HTML render is blank."

hopparnMedlem sedan nov. 20011 551 inlägg
#10

har du provat att skapa ett simpelt först för att se om det funkar?
typ
Doc theDoc = new Doc();
theDoc.FontSize = 96;
theDoc.AddText("Hello World");
theDoc.Save(Server.MapPath("simple.pdf"));
theDoc.Clear();

hopparnMedlem sedan nov. 20011 551 inlägg
#11

kolla också rättigheterna på mappen du ska spara pdf i. Hjälper inte det så kan du läsa lite och ladda hem ett demoprojekt här: http://www.websupergoo.com/support.htm

punkt 6.7 på denna sidan innehåller liknande fel som du har.

jag har kört detta på 32 bit winxp vs2005 samt xp 64 bit vs2008, så jag är inte så insatt i om det kan vara något med ett ev annat operativ eller version av vs :)

GildebrandMedlem sedan juni 2009920 inlägg
#12

Det var bara google det inte funkade med verkar det som. För nu lyckades jag skapa en PDF från Webforum.nu.

Hur gör man för att streama pdfen till webbläsaren?

hopparnMedlem sedan nov. 20011 551 inlägg
#13

tja, det här är ett sätt:

protected void DoCreatePDF(object sender, CommandEventArgs e)
		{
			// Create url of print template and pass the key for cache
			string templatePath = String.Format("http://{0}{1}?rt=1&ft={3}&t={4}&hi={5}&guid={2}", Request.Url.Host, VirtualPathUtility.ToAbsolute("~/Templates/Report.aspx"), id, tbPerArrivalFrom.Text + '-' + tbPerArrivalTo.Text, DateTime.Now.Ticks, Page.Hotel.HotelId);

			var startPageFullUrl = String.Format("http://{0}{1}?ts={2}", Request.Url.Host, VirtualPathUtility.ToAbsolute("~/Templates/ReportFirstPage.aspx"), DateTime.Now.Ticks);

			// Create PDF from template
			var manager = new PDFManager();
			byte[] pdf = manager.GeneratePDF(templatePath, startPageFullUrl, PDFManager.PdfRotation.Landscape, PDFManager.SourceDocumentType.HTML, true);
			// Create filename
			string fileName = String.Format("Report_{0}-{1}.pdf", DateTime.Now.Date.ToShortDateString(), DateTime.Now.ToShortTimeString());

			// Clear the response, add file and change the content type
			Response.ClearHeaders();
			Response.ContentType = "application/pdf";
			Response.Clear();
			Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName));
			Response.BinaryWrite(pdf);
			Response.End();
		}

och generatepdf ungefär dåhär... inte så vacker kanske men jag orkar inte mecka om den. Denna har ju som du ser lite andra saker, som försättsblad och sidhuvud sidfot etc, men du kan ju utgå från den, copy paste funkar nog inte rakt av :)

public byte[] GeneratePDF(string sourceDocumentFullUrl, string startPageFullUrl, PdfRotation pdfRotation, SourceDocumentType sourceDocumentType, bool addStartPage)
		{
			Doc mainDocument = new Doc();
			int pageID;
            
			mainDocument.HtmlOptions.DoMarkup = true;
			mainDocument.HtmlOptions.PageCacheEnabled = false;
            
			if (addStartPage){
                //// Set text to first page
				string firstPageText = string.Format("Rapport {0}", DateTime.Now.ToShortDateString());
				mainDocument.Font = mainDocument.AddFont("Verdana");
				mainDocument.HPos = 0.5;
				mainDocument.VPos = 0.75;
				mainDocument.AddHtml(firstPageText);
                mainDocument.AddImageUrl(startPageFullUrl);
			}

			pageID = mainDocument.AddPage();

			if (pdfRotation == PdfRotation.Landscape)
				RotateDocument(mainDocument);

			mainDocument.Page = pageID;
			pageID = mainDocument.AddImageUrl(sourceDocumentFullUrl);
			while (true){
				if (!mainDocument.Chainable(pageID))
					break;
				mainDocument.Page = mainDocument.AddPage();
				pageID = mainDocument.AddImageToChain(pageID);
			}

            for (int i = 1; i <= mainDocument.PageCount; i++){
				mainDocument.PageNumber = i;
				mainDocument.Flatten();
				if (i > 1){
					// Footer
					mainDocument.Rect.Width = 600;
					mainDocument.Rect.Height = 30;
					mainDocument.Rect.Inset(0, 0);
					mainDocument.Rect.Position(0, 0.3);
					mainDocument.HPos = 0.5;
					mainDocument.VPos = 0.5;
					mainDocument.AddText(string.Format("Report Yieldmanager {0} / {1}", i - 1, mainDocument.PageCount - 1));
				}
			}
            byte[] generatedPDF = mainDocument.GetData();
            mainDocument.Clear();
			mainDocument.Dispose();
            return generatedPDF;
		}

det du frågar efter är EGENTLIGEN bara det sista i första metoden...
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.Clear();
Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName));
Response.BinaryWrite(pdf);
Response.End();

lycka till

GildebrandMedlem sedan juni 2009920 inlägg
#14

Tack! Nu funkar det också :)
Om jag nu skapar en PDF från en sida. Säg Sweclockers, så blir den bara att se ut såhär: http://piclair.com/data/vl58n.jpg

Som du ser så är det vitt längst ner på sidan, och den fångar inte resterande "sidor" av hemsida heller, utan bara en sida. Vet du varför det är så?

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)