webForumDet fria alternativet

Skriv ut del av sida

15 svar · 1 077 visningar · startad av leniz

lenizMedlem sedan aug. 2001676 inlägg
#1

Hej!

Jag har en knapp för utskrift av en sida. Det vanliga <A HREF="javascript:window.print();">

Problemet är att sidan består av:

Tomt utrymme till vänster (100 pixlar), text och bilder i mitten (560 pixlar), Tomt utrymme till höger (100 pixlar).

När jag skriver ut sidan så verkar den ta allt från vänster och sen så långt till höger som det ryms på sidan. Detta innebär att utskriften ser tokig ut. Det blir mycket vitt utrymme på papperet till vänster, sedan kommer text och bilder som knappt får plats.

Min fråga är hur jag kan lösa detta:

- antingen genom att skriva ut allt som ligger i en viss tabell (den i mitten med text och bilder). Kan man specificera detta på något vis?

- eller genom att ange något slags mått i pixlar (eller något annat) var på sidan utskriften ska börja. Är detta möjligt och isf hur?

Tacksam för hjälp! :)

Mvh Lena

CalippoMedlem sedan aug. 2002536 inlägg
#2

Kan du inte ha en "Skriv ut" knapp som öppnar en pop-up sida med en utskriftvänlig layout?

CalippoMedlem sedan aug. 2002536 inlägg
#3

Läste detta på http://www.experts-exchange.com/Web/Web_Languages/JavaScript/Q_21069799.html

FRÅGA:
Is there a way to have JavaScript designate one area of the screen and print that area full page? In other words, could an area be selected with up, down, bottom, top (x,y,height, width) coordinates be designated and then told to print as large as they can on the printed page?

SVAR 1:
You can designate an area of the screen by enclosing it in a div but you can not effect the users print settings. If it is a picture if it can be resized by you before sending is it be printed.

SVAR 2:
You cannot crop areas of the page like in image processing applications.
Also you cannot send not one single character to the printer.
You can only open a new window, write to that new window the part you want to print, and afterwards print the complette new window and close that new window.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Calippo skrev:

SVAR 1:
You can designate an area of the screen by enclosing it in a div but you can not effect the users print settings. If it is a picture if it can be resized by you before sending is it be printed.

Hur funkar det där?
Jag tolkar det som att jag kan ha:

<div>
text som ska skrivas ut...
</div>

Och sen skriva ut endast det som finns i div'en. Jag skulle behöva få reda på ett bra svar på det ;) Har sökt och hittat bla. den här tråden som är närmast en lösning.

Tack!

CalippoMedlem sedan aug. 2002536 inlägg
#5

Igentligen ska detta stå under CSS, men eftersom frågan är ställd här så....

Med lite CSS och DIV taggar så kan man välja vad som ska visas på skärmen och vad som ska skickas till skrivaren.

Här kommer ett snabbt exempel på kod, bara att ändra efter önskemål.

Testa att välja "Arkiv">"Skriv ut" i browsern.
Det enda som kommer med i utskriften är rubriken "Detta är ett test dokument" & texten "Detta skrivs ut när man väljer "Skriv ut" i menyn."

-------------------------------------------------------------------

<html>
<head>

<title>Skriva ut valda delar av en sida - Calippo - webForum</title>

<style type="text/css">
@media screen
{
body {font-size: 12pt; line-height: 1em; background: yellow; text-decoration: underline; }
h1 {font-size: 20pt; font-weight: bold; }
.navbar, .comments {font-size: 14pt; font-color: red; }
h2 {font-size: 8pt; font-weight: italic; }
.content {margin-left: 10%; }
}

@media print
{
body {font-size: 12pt; line-height: 1em; background: white; margin-left: 10%; }
h1 {font-size: 20pt; font-weight: bold; }
.navbar, .comments {display: none;}
h2 {font-size: 8pt; font-weight: italic; }
.content {margin-left: 10%; }
}
</style>
</head>

<body>
<h1>Detta är ett test dokument</h1>

<div class="navbar">
<table border="1" width="600">
<tr>
<td>Detta kommer inte med i utskriften</td>
</tr>
</table>
</div>

<div class="content">
<table border="1" width="600">
<tr>
<td>Detta skrivs ut när man väljer "Skriv ut" i menyn.</td>
</tr>
</table>
</div>

<div class="comments">
<table border="1" width="600">
<tr>
<td>Detta kommer inte heller med vid utskriften.</td>
</tr>
</table>
</div>
</body>
</html>

------------------------------------------------------------

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

Det där ser helbra ut, tack så mycket för hjälpen!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#7

Nu har jag stött på ett litet problem här.
Om jag har två <div> på en och samma sida, kan jag på ngt sätt välja vilken av dessa jag vill skriva ut?

Kan man göra på ngt liknande ätt som det här:

<div name="lager1">
.
..
...
..
.
</div>
<div name="lager2">
.
..
.
</div>

<a href="#" onClick="lager1.print();">Skriv ut lager1</a>
<a href="#" onClick="lager2.print();">Skriv ut lager2</a>

Är det möjligt att åstadkomma ngt liknande, skulle verkligen vara kanon, då jag skulle behöva ha ett sådant val.

NickemannenMedlem sedan aug. 20003 575 inlägg
#8

Du kan ju med javascript skapa en ny sida med det innehållet som finns i diven. Och skriva ut den sidan.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#9

Hmm, ok, hur skulle ett sådant javascript kunna se ut?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

Har Google'at en stund nu och hittat en grej som verkar intressant:

<!--
var gAutoPrint = false; // Flag for whether or not to automatically call the print function

function printSpecial()
{
	if (document.getElementById != null)
	{
		var html = '<HTML>\n<HEAD>\n';

		if (document.getElementsByTagName != null)
		{
			var headTags = document.getElementsByTagName("head");
			if (headTags.length > 0)
				html += headTags[0].innerHTML;
		}
		
		html += '\n</HE' + 'AD>\n<BODY>\n';
		
		var printReadyElem = document.getElementById("printReady");
		
		if (printReadyElem != null)
		{
				html += printReadyElem.innerHTML;
		}
		else
		{
			alert("Could not find the printReady section in the HTML");
			return;
		}
			
		html += '\n</BO' + 'DY>\n</HT' + 'ML>';
		
		var printWin = window.open("","printSpecial");
		printWin.document.open();
		printWin.document.write(html);
		//printWin.document.close();
		if (gAutoPrint)
			printWin.print();
	}
	else
	{
		alert("Sorry, the print ready feature is only available in modern browsers.");
	}
}
// -->

Det öppnar en viss div på en ny sida och skriver sedan ut, kanon!. Problemet är bara att jag vill ha vit bakgrundsfärg på sidan som ska öppnas.
Som det är just nu hamnar en bild som jag i CSS'en angett ska finnas på "huvudsiten", men på sidan som öppnas vill jag endast ha vit bakgrund.

Har provat att lägga till både <body bgcolor="#FFFFFF"> och <body style="background-color: #FFFFFF;"> men inget av dessa funkar.
Jag skulle alltså behöva editera scriptet ovan så att INGA <html>, <body> eller <link rel> taggar "följer med" när div'en skrivs uti popupfönstret.

Hur jag jag bära mig åt för att uppnå det här?

CalippoMedlem sedan aug. 2002536 inlägg
#11

Satt och lekte lite med iden att skriva ut olika lager.

Så jag gjorde ett litet skript som:
1. Släcker de lager som inte ska skrivas ut.
2. Flyttar upp det lagret som ska skrivas ut.
3. Skriver ut lagret.

Jag är rätt nollad igentligen när det gäller javascript och sånt men jag fick detta att funka iallafall.
Säkert många som har invändningar mot skriptet, så jag tar själv gärna emot bättre förslag....

Iallafall, här är skriptet:

REDIGERAT/
Blev lite fel av nån anledning när jag klsistrade in koden här. Ändra alla java script vid alla knappar till javascript så fungerar koden. Verkar som webForum själv byter ut orden, för det står rätt när jag är i redigeringsläget...
------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms*[n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers*.document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_showHideLayers() { //v6.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args*))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
obj.visibility=v; }
}

function moveTo(obj, x, y) {
if (document.getElementById) {
document.getElementById(obj).style.left = x;
document.getElementById(obj).style.top = y;
// document.getElementById('Layer2').style.left = x;
// document.getElementById('Layer2').style.top = y;
}
}
//-->
</script>
</head>

<body>
<div id="Layer1" style="position:absolute; width:250px; height:80px; z-index:1; left: 10px; top: 10px;">
<p>Lager 1</p>
<p>Lite text, text och text.</p>
</div>
<div id="Layer2" style="position:absolute; width:250px; height:80px; z-index:2; left: 10px; top: 100px;">
<p>Lager 2 </p>
<p>Lite text, text och text. </p>
</div>
<div id="Layer3" style="position:absolute; width:400px; height:30px; z-index:3; left: 10px; top: 200px;">
<input name="Button" type="button" onClick="MM_showHideLayers('Layer1','','show','Layer2','','hide'); javascript:moveTo('Layer1', 10, 10); window.print();" value="Skriv ut Lager 1">
<input name="Button2" type="button" onClick="MM_showHideLayers('Layer1','','hide','Layer2','','show'); javascript:moveTo('Layer2', 10, 10); window.print();" value="Skriv ut Lager 2">
<input name="Button2" type="button" onClick="MM_showHideLayers('Layer1','','show','Layer2','','show'); javascript:moveTo('Layer1', 10, 10); javascript:moveTo('Layer2', 10, 100)" value="Återställ">
</div>
</body>
</html>

-------------------------------------------------***

CalippoMedlem sedan aug. 2002536 inlägg
#12

Fan va skumt.

Testade själv att kopiera in koden jag postade här över i en html sida men då funkar det inte. Görs koden om på nåt sätt (fnuttarna flyttas eller nåt?) när man postar koden här.

Sidan jag kopierade koden ifrån funkar som den ska men inte den inklistrade koden.

Varför?

REDIGERAT/

Hittade felet, när man klistrar in koden härifrån så blir det java script istället för javascript vid alla knappar. Ändrar man det så funkar det.

CalippoMedlem sedan aug. 2002536 inlägg
#13

Vill man inte ha med knapparna vid utskriften så kombinerar man CSS skriptet längre upp med Javaskriptet ovan.

Glöm inte att ersätta java script med javascript vid knapparna (4 ställen) för att det ska fungera.

----------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<style type="text/css">
@media screen
{
.button {font-size: 14pt;}
}

@media print
{
.button {display: none;}
}
</style>

<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms*[n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers*.document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_showHideLayers() { //v6.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args*))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
obj.visibility=v; }
}

function moveTo(obj, x, y) {
if (document.getElementById) {
document.getElementById(obj).style.left = x;
document.getElementById(obj).style.top = y;
// document.getElementById('Layer2').style.left = x;
// document.getElementById('Layer2').style.top = y;
}
}
//-->
</script>
</head>

<body>
<div id="Layer1" style="position:absolute; width:250px; height:80px; z-index:1; left: 10px; top: 10px;">
<p>Lager 1</p>
<p>Lite text, text och text.</p>
</div>
<div id="Layer2" style="position:absolute; width:250px; height:80px; z-index:2; left: 10px; top: 100px;">
<p>Lager 2 </p>
<p>Lite text, text och text. </p>
</div>
<div class="button" id="Layer3" style="position:absolute; width:400px; height:30px; z-index:3; left: 10px; top: 200px;">
<input name="Button" type="button" onClick="MM_showHideLayers('Layer1','','show','Layer2','','hide'); javascript:moveTo('Layer1', 10, 10); window.print();" value="Skriv ut Lager 1">
<input name="Button2" type="button" onClick="MM_showHideLayers('Layer1','','hide','Layer2','','show'); javascript:moveTo('Layer2', 10, 10); window.print();" value="Skriv ut Lager 2">
<input name="Button2" type="button" onClick="MM_showHideLayers('Layer1','','show','Layer2','','show'); javascript:moveTo('Layer1', 10, 10); javascript:moveTo('Layer2', 10, 100)" value="Återställ">
</div>
</body>
</html>

----------------------------------------------***

MickeA.comMedlem sedan feb. 20034 441 inlägg
#14

Oj, vad grejjer jag fick att leka med nu ;)
Får tacka så mycket, ska prova efter helgen, då jag åker bort imorrn ;)

Tack & G'Natt!

lenizMedlem sedan aug. 2001676 inlägg
#15

Hej!

Försöker fila vidare på detta. Vad gör man om man t.ex. har menyn i en tabellcell till vänster, och sedan innehållet i en tabell till höger och man bara vill skriva ut innehållet och inte menyn?

Testade skriva så här:

<style type="text/css">
@media print
{
.navbar, .comments {display: none;}
.content {margin-left: 1%; }
}
</style>

Och sedan så här i själva tabellen:

<td width="200" valign="top">
<div class="navbar">
<!-- #INCLUDE FILE="meny.asp"-->
</div>
</td>
<td valign="top">
<div class="content">
Innehållet här…….
</div>
</td>

Det som hander då är att det blir en tom vit yta där menyn ligger och sedan skrivs sidinnehållet ut, eller rättare sagt det av innehållet som ryms på papperet.

Kan man på något vis få bort den vita ytan så att sidinnehållet får ta upp hela papperet istället?

Mvh Lena

J.N.Medlem sedan apr. 20031 660 inlägg
#16

HEJ!

Standardsvaret i utskriftsfall är http://www.alistapart.com/articles/goingtoprint/ och eftersom det inte är nämnt tidigare i tråden, tipsar jag om det.

På vissa sidor ser man en enkelt javascriptfunktion som endast skriver ut div:en med innehållet, som jag förstår det utan en speciell print-css.
Någon kunnig får gärna sprida ljus över detta fall.

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