In my django project i have to create a pdf file from my html.
For this purpose i use xhtml2pdf and in my html section i write:
<style type="text/css">
body {margin:0;padding:0;background-color:#FAFAFA;font:8pt "Tahoma";}
* {box-sizing:border-box;-moz-box-sizing:border-box;}
th, td {border:1px solid black;border-collapse:collapse;}
#page {
size: a4 portrait;
margin: 1cm auto;
padding: 1cm;
margin: 1cm auto;
border: 1px #D3D3D3 solid;
border-radius: 5px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
table {
-pdf-keep-in-frame-mode: shrink;
border:1px solid black;
border-collapse:collapse;
}
p {margin:0;padding:0;line-height:1.4em}
.column-50-left {width:49.5%;display:inline-block;vertical-align:top;padding-right:15px}
.column-50-right {width:49.5%;display:inline-block;vertical-align:top;padding-left:15px}
.invoice {font-size:6pt}
.invoice td {height:50px;vertical-align:top;padding:5px;}
.destinatario td {height:120px;vertical-align:top;padding:5px;font-size:6pt}
.description th {height: 30px}
.description td {height: 50px}
.top-10 {margin-top:10px}
.top-15 {margin-top:15px}
.top-20 {margin-top:20px}
.padding-top-4 {padding-top:4px}
.padding-bottom-15 {padding-bottom:15px}
.padding-bottom-30 {padding-bottom:30px}
.border-top {border-top:1px solid #000000}
</style>
but when i use my attributes on elements for apply the styles nothing appen for example:
<table style="width:80%" class="invoice top-10">
or
<div class="border-top top-10 invoice padding-top-4 padding-bottom-15"><p>PORTO / <em>Freight</em></p></div>
How can i apply my class style to my pdf output in xhtml2pdf?
So many thanks in advance
Related
I have got a triangle shaped div containing text
It is within a body and section header.
It fits a triangle shape but cuts off most the text and I can't get the text to fill the width of the triangle and cut off appropriately.
I'm not sure if the problem is needing the contents to fit the div, or the div to change to the contents, I've been experimenting with white-space, display, and overflow but can't figure it out.
body { background-color: grey; }
.text-wrapper {
display: block;
width: 100%;
height: 100%;
border-width: 50% 0 50% 100%;
border-color: transparent transparent transparent red;
clip-path: polygon(0 0, 100% 0, 50% 100%);
text-align: center;
color: white;
white-space: pre-wrap;
overflow: auto;
line-height: 1;
}
.main-header {
color: #256D85;
font-size: 7.5rem;
font-family: "Montserrat", sans-serif;
font-weight: 600;
}
.sub-header {
color: #26B6E8;
background-color: #06283D;
font-size: 6rem;
font-family: "Montserrat", sans-serif;
font-weight: 600;
}
<div class="text-wrapper">
<p class="main-header">Text header</p>
<p class="sub-header">Text sub-header</p>
<p>description here</p>
</div>
Hi I've been trying to learn how to build an ecommerce site and am getting stuck with the Django Stripe integration for a custom pay flow. I can get the pre built checkout to work but can't for custom pay flow.
Stripe seems to have updated the code on their docs a few months ago so when I try to look up tutorials, they all don't seem to have the same code and I can't seem to figure out how to get it to work. I'm self taught and just a beginner/intermediate maybe so might be missing something obvious.
I'm using the code from this page https://stripe.com/docs/payments/integration-builder and trying to convert it into Django.
This is my views.py
from django.shortcuts import render
import stripe
from django.http import JsonResponse
import json
# Create your views here.
from django.views import View
stripe.api_key = "xxxxxxxxx"
class StripeIntentView(View):
def post(self, request, *args, **kwargs):
try:
intent = stripe.PaymentIntent.create(
amount=2000,
currency='usd'
)
return JsonResponse({
'clientSecret': intent['client_secret']
})
except Exception as e:
return JsonResponse({'error':str(e)})
def payment_method_view(request):
return render(request, 'custom-landing.html')
This is my urls.py
from django.contrib import admin
from django.urls import path
from products.views import payment_method_view,StripeIntentView
urlpatterns = [
path('admin/', admin.site.urls),
path('custom-landing/', payment_method_view, name='custom-landing-page'),
path('create-payment-intent/', StripeIntentView.as_view(), name='create-payment-intent'),
]
This is my Landing-page.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Accept a card payment</title>
<meta name="description" content="A demo of a card payment on Stripe" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="global.css" />
<script src="https://js.stripe.com/v3/"></script>
<script src="https://polyfill.io/v3/polyfill.min.js?version=3.52.1&features=fetch"></script>
<script src='{% static "js/client.js" %}'></script>
<style>
/* Variables */
* {
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 16px;
-webkit-font-smoothing: antialiased;
display: flex;
justify-content: center;
align-content: center;
height: 100vh;
width: 100vw;
}
form {
width: 30vw;
min-width: 500px;
align-self: center;
box-shadow: 0px 0px 0px 0.5px rgba(50, 50, 93, 0.1),
0px 2px 5px 0px rgba(50, 50, 93, 0.1), 0px 1px 1.5px 0px rgba(0, 0, 0, 0.07);
border-radius: 7px;
padding: 40px;
}
input {
border-radius: 6px;
margin-bottom: 6px;
padding: 12px;
border: 1px solid rgba(50, 50, 93, 0.1);
height: 44px;
font-size: 16px;
width: 100%;
background: white;
}
.result-message {
line-height: 22px;
font-size: 16px;
}
.result-message a {
color: rgb(89, 111, 214);
font-weight: 600;
text-decoration: none;
}
.hidden {
display: none;
}
#card-error {
color: rgb(105, 115, 134);
text-align: left;
font-size: 13px;
line-height: 17px;
margin-top: 12px;
}
#card-element {
border-radius: 4px 4px 0 0;
padding: 12px;
border: 1px solid rgba(50, 50, 93, 0.1);
height: 44px;
width: 100%;
background: white;
}
#payment-request-button {
margin-bottom: 32px;
}
/* Buttons and links */
button {
background: #5469d4;
color: #ffffff;
font-family: Arial, sans-serif;
border-radius: 0 0 4px 4px;
border: 0;
padding: 12px 16px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
display: block;
transition: all 0.2s ease;
box-shadow: 0px 4px 5.5px 0px rgba(0, 0, 0, 0.07);
width: 100%;
}
button:hover {
filter: contrast(115%);
}
button:disabled {
opacity: 0.5;
cursor: default;
}
/* spinner/processing state, errors */
.spinner,
.spinner:before,
.spinner:after {
border-radius: 50%;
}
.spinner {
color: #ffffff;
font-size: 22px;
text-indent: -99999px;
margin: 0px auto;
position: relative;
width: 20px;
height: 20px;
box-shadow: inset 0 0 0 2px;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
}
.spinner:before,
.spinner:after {
position: absolute;
content: "";
}
.spinner:before {
width: 10.4px;
height: 20.4px;
background: #5469d4;
border-radius: 20.4px 0 0 20.4px;
top: -0.2px;
left: -0.2px;
-webkit-transform-origin: 10.4px 10.2px;
transform-origin: 10.4px 10.2px;
-webkit-animation: loading 2s infinite ease 1.5s;
animation: loading 2s infinite ease 1.5s;
}
.spinner:after {
width: 10.4px;
height: 10.2px;
background: #5469d4;
border-radius: 0 10.2px 10.2px 0;
top: -0.1px;
left: 10.2px;
-webkit-transform-origin: 0px 10.2px;
transform-origin: 0px 10.2px;
-webkit-animation: loading 2s infinite ease;
animation: loading 2s infinite ease;
}
#-webkit-keyframes loading {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#keyframes loading {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#media only screen and (max-width: 600px) {
form {
width: 80vw;
}
}
</style>
</head>
<body>
<!-- Display a payment form -->
<form id="payment-form">
<div id="card-element"><!--Stripe.js injects the Card Element--></div>
<button id="submit">
<div class="spinner hidden" id="spinner"></div>
<span id="button-text">Pay now</span>
</button>
<p id="card-error" role="alert"></p>
<p class="result-message hidden">
Payment succeeded, see the result in your
Stripe dashboard. Refresh the page to pay again.
</p>
</form>
</body>
</html>
This is what shows up on my http://127.0.0.1:8000/custom-landing/
I'm not sure why but the card elements aren't showing up.
I've only changed the python code. The javascript, html and CSS code are the same as on the Stripe docs.
Any idea on how I can get the card element to load?
And any feedback on whether the the django code is views is much appreciated.
Thanks
edit: This is the code that shows in my browser console.
line 10 of the client.js is
document.querySelector("button").disabled = true;
<?php
// $command=escapeshellcmd("D:\Wamp64\www\demo.py");
// $output=shell_exec($command);
// echo $output;
?>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1"><title>File Arrangement Portal</title>
<style>
/* .div2 {
width: 400px;
background-color:black;
height: 100px;
padding: 250px;
border: 1px solid grey;
position:absolute;
left:50%;
top:60%;
transform:translate(-50%,-50%)
}
p2{
background-color: grey;
left:100px;
top:100px:
} */
.button1{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:195%;
left:30%
}
.button2{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:210%;
left:33%
}
.button3{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:210%;
left:32%
}
.button4{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:220%;
left:31%
}
.button5{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:190%;
left:31%
}
.button6{
background-color: #4CAF50; /* Green */
position:absolute;
border: none;
color: white;
padding: 10px 22px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
top:190%;
left:31%
}
.hello{
color:grey;
position:absolute;
top:0.5%;
left:32%;
}
.hello1{
color:grey;
position:absolute;
top:17%;
left:22%;
}
.hello2{
color:grey;
position:absolute;
top:34%;
left:32%;
}
.hello3{
color:grey;
position:absolute;
top:51%;
left:36%;
}
.hello4{
color:grey;
position:absolute;
top:67%;
left:35%;
}
.hello5{
color:grey;
position:absolute;
top:83%;
left:35%;
}
body {background-color: #5C5858;}
h1 {color: black;}
/* p {color: blue;} */
.rectangle {
height: 40px;
width: device-widthpx;
background-color: black;
}
</style></head>
<body>
<div class="rectangle"><h1 style="font-family:Times New Roman;text-align:center";><font color="white">File Arrangement Portal</font></h1></div>
<div style="position: absolute;top:63%; left: 50%;padding:260px;transform:translate(-50%,-50%);width: 450px; height: 100px; background: black; border: 1px solid black">
<h2 class='hello'>To Arrange the files and Run a Check<button class="button button1">Click Me!</button></h2>
<h2 class='hello1'>To Arrange the files from root folder and Run a check again<button class="button button2">Click Me!</button></h2>
<h2 class='hello2'>To Creation of PPT and ZIP File<button class="button button3">Click Me!</button></h2>
<h2 class='hello3'>To Copy the Files<button class="button button4">Click Me!</button></h2>
<h2 class='hello4'>To Paste the Files<button class="button button5">Click Me!</button></h2>
<h2 class='hello5'>Run a QC for Single File<button class="button button6">Click Me!</button></h2>
</div>
<!-- <h1>This is a Heading</h1> -->
<!-- <div class="div2"><p2 style="left:120px; top:100px";><font color="white">Click on one of the text labels to toggle the related control:</font></p2></div> -->
<script>
// console.log(<?php echo $output ?>);
</script>
</body>
</html>
I am just now started Learning HTML with online support i create this UI, I know this is poor but i want to know how can i improve with lesser code and improve the looks as well. And how can i replace the existing ui with better organised code.
I need help also like i want to trigger around 6 python code whenever user clicks respective six buttons.
Thanks in advance....
To run commands with PHP you should use escapeshellcmd("path to.py") and shell_exec() https://www.php.net/manual/en/function.escapeshellcmd.php
Just an example:
echo shell_exec(escapeshellcmd("path to.py"));
"echo .." outputs the result of the .py
In order to achieve this in few minutes you should wrap your buttons in a form (Use POST if you don't want show the parameters in the address bar) and give them a name="".
The action of the form can be empty, action="", so it will refresh the actual page.
Then at the top of the page you check if there's POST, with if($_POST){} and which button has been pressed, with if($_POST["name given to the button"]){}. This is just a raw example.
What you wanna achieve is quite advanced if you just started HTML so be aware! Good Luck.
Complete example:
<?php
if($_POST){
if($_POST["button1"]){
echo shell_exec(escapeshellcmd("path to.py"));
}
}
?>
<form action="" method="POST">
<button name="button1" class="button button1">Click Me!</button>
<form>
I am using this code to go though a list of p tags that is much longer that in my example with 1 or more span tags in it. I know even span tag from the list has the font-style attribute. I'm stuck trying to figure out if the specific span tag that I'm looking at font-style attribute has a value of italic. Is there a way to get the value of the font-style attribute or return a bool if the font-style is italic?
content = "<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">a</span>
</p>,
<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: italic; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">b</span>
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">c</span>
</p>,
<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">d</span>
<span style="color: rgb(0, 0, 0); font-style: italic; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">e</span>
</p>"
soup = BeautifulSoup(test, 'html.parser')
page = {}
ital = []
i = 1
p = 1
for par in soup:
page[i] = {}
for x in par.find_all('span'):
if x['font-style'] == 'italic': #stuck here trying to figure out if font-style value is italic or not
ital.append(p)
par = 'par_{}'.format(p)
page[i].update({par:x.next})
p += 1
page[i].update({'ital':ital})
ital = []
i += 1
p = 1
UPDATE:
my goal is to get all the content in between the span tags in order on page and know what part of the content is italic.
after running this page should look like this
print(page)
{
1: {'ital': [],
'par_1':'a'},
2: {'ital': [1],
'par_1':'b',
'par_2':'c'},
3: {'ital': [2],
'par_1':'d',
'par_2':'e'}
}
currently this code prints
print(page)
{
1: {'ital': [],
'par_1':'a'},
2: {'ital': [],
'par_1':'b',
'par_2':'c'},
3: {'ital': [],
'par_1':'d',
'par_2':'e'}
}
Yes, you can use lambdas in BeautifulSoup's find_all() function. This example will find all span tags with 'italize' in style attribute:
from bs4 import BeautifulSoup
content = '''"<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">a</span>
</p>,
<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: italize; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">d</span>
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">b</span>
</p>,
<p dir="ltr">
<span style="color: rgb(0, 0, 0); font-style: normal; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">c</span>
<span style="color: rgb(0, 0, 0); font-style: italize; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">d</span>
</p>"'''
soup = BeautifulSoup(content, 'lxml')
for span in soup.find_all('span', style=lambda s: 'italize' in s):
print(span)
Prints:
<span style="color: rgb(0, 0, 0); font-style: italize; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">d</span>
<span style="color: rgb(0, 0, 0); font-style: italize; background-color: transparent; font-weight: 400; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap">d</span>
Everything in the span tag is one attribute and that attribute's name is style. Everything else is a string within style. It is impossible to get the value of font-style attribute because it isn't a attribute.if 'font-style: italic' in x['style']: is how you check if font-style is italic or not. x['style'] returns the value of the style attribute as a string. Then its just checking if the 'font-style: italic' exists within the string that x['style'] returns.
Update:
I just discovered this inside the postfix configuration documents. Any ideas on how I could include my graphic in this message and not encounter the character limit issue would be great.
I've written a Python-based milter for postfix that extracts attachments and replaces them with an HTML file with links to where those attachments are. For "branding" purposes (so that my users don't think they're being spammed), I've embedded a base64 encoded image into the CSS portion of this HTML file.
When I run tests and just output the HTML file to my filesystem (rather than e-mail it) and open it in a web browser, the graphic appears with no issue. When the message is actually sent through postfix with the HTML attachment, the long base64 portion is split over many lines rather than one continuous line as it is supposed to be.
This is what the HTML file SHOULD look like when received:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="content-type content=" text="" html;="" charset="ISO-8859-1"" />
<style type="text/css" media="screen">
#logo {
background-color: #ffffff;
color: #000000;
font-family: Arial,Helvetica,sans-serif;
font-style: normal;
font-variant: normal;
font-weight: normal;
font-size: 100%;
line-height: 1;
font-size-adjust: none;
font-stretch: normal;
}
#logo {
padding: 1em;
}
#logo h1, #logo h2 {
margin: 0;
}
#logo h1 {
height: 100px;
}
#logo h1 span {
float: left;
height: 100%;
}
#logo h1 #EARS {
# background: transparent url(images/WRTgreendot.jpg) no-repeat scroll left top;
background: transparent url(data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QSqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5JbGx1c3RyYXRvcjwveG1wOkNyZWF0b3JUb29sPgogIDx4bXA6Q3JlYXRlRGF0ZT4yMDA3LTEyLTIxVDEzOjU2OjI2LTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICA8eG1wOk1vZGlmeURhdGU+MjAwNy0xMi0yMVQxODo1Njo0NVo8L3htcDpNb2RpZnlEYXRlPgogIDx4bXA6TWV0YWRhdGFEYXRlPjIwMDctMTItMjFUMTM6NTY6MjYtMDU6MDA8L3htcDpNZXRhZGF0YURhdGU+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcE1NPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vJz4KICA8eG1wTU06RG9jdW1lbnRJRCByZGY6cmVzb3VyY2U9J3V1aWQ6NUFDQTZFNkVGNkFGREMxMThERDBGNEI0RUVBODk1NzUnIC8+CiAgPHhtcE1NOkluc3RhbmNlSUQ+dXVpZDo1QkNBNkU2RUY2QUZEQzExOEREMEY0QjRFRUE4OTU3NTwveG1wTU06SW5zdGFuY2VJRD4KICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0nUmVz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) no-repeat scroll left top;
width: 100px;
text-indent: -1000em;
height: 100px;
text-transform: uppercase;
color: #3366ff;
font-size: 100px;
}
#logo h1 #WRT {
# background: transparent url(images/WRTgreendot.jpg) no-repeat scroll left top;
width: 100px;
height: 100px;
text-indent: -1000em;
font-size: 100px;
text-transform: uppercase;
color: #cc0000;
}
#EARS_desc {
text-align: left;
font-family: Arial,Helvetica,sans-serif;
font-weight: normal;
}
#EARS_files {
text-align: left;
font-weight: bold;
font-family: "Courier New",Courier,monospace;
font-size: 14pt;
}
</style>
<title>EARS</title>
</head>
<body>
<div id="logo">
<h1><span id="WRT">WRT</span>
<span id="EARS"> EARS</span>
</h1>
<h2>E-mail Attachment Retrieval System</h2>
</div>
<hr>
<div id="EARS_desc">
You have been sent an e-mail that exceeds WRT's allowed e-mail attachment size.<p>
Attachments to this message have been removed and saved to a <b>TEMPORARY</b> storage location<br>
where they will be <b>PERMANENTLY REMOVED</b> after 30 days.<p>
To retrieve the attachments, right-click on the filename listed below and choose <b>Save As...</b>
</div>
<hr>
<div id="EARS_files">
<ul>
<li> file1
<li> file2
</ul>
</div>
</body></html>
but this is what it is appearing as via e-mail:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="content-type content=" text="" html;="" charset="ISO-8859-1"" />
<style type="text/css" media="screen">
#logo {
background-color: #ffffff;
color: #000000;
font-family: Arial,Helvetica,sans-serif;
font-style: normal;
font-variant: normal;
font-weight: normal;
font-size: 100%;
line-height: 1;
font-size-adjust: none;
font-stretch: normal;
}
#logo {
padding: 1em;
}
#logo h1, #logo h2 {
margin: 0;
}
#logo h1 {
height: 100px;
}
#logo h1 span {
float: left;
height: 100%;
}
#logo h1 #EARS {
# background: transparent url(images/WRTgreendot.jpg) no-repeat scroll left top;
background: transparent url(data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QSqaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5JbGx1c3RyYXRvcjwveG1wOkNyZWF0b3JUb29sPgogIDx4bXA6Q3JlYXRlRGF0ZT4yMDA3LTEyLTIxVDEzOjU2OjI2LTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICA8eG1wOk1vZGlmeURhdGU+MjAwNy0xMi0yMVQxODo1Njo0NVo8L3htcDpNb2RpZnlEYXRlPgogIDx4bXA6TWV0YWRhdGFEYXRlPjIwMDctMTItMjFUMTM6NTY6MjYtMDU6MDA8L3htcDpNZXRhZGF0YURhdGU+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcE1NPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv
bW0vJz4KICA8eG1wTU06RG9jdW1lbnRJRCByZGY6cmVzb3VyY2U9J3V1aWQ6NUFDQTZFNkVGNkFGREMxMThERDBGNEI0RUVBODk1NzUnIC8+CiAgPHhtcE1NOkluc3RhbmNlSUQ+dXVpZDo1QkNBNkU2RUY2QUZEQzExOEREMEY0QjRFRUE4OTU3NTwveG1wTU06SW5zdGFuY2VJRD4KICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0nUmVzb3VyY2UnCiAgIHhtbG5zOnN0UmVmPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjJz4KICAgPHN0UmVmOmluc3RhbmNlSUQ+dXVpZDo5ODY2NUZDMUZCNzBEQzExQjJFN0FFRjg0RTUxRTk3Qzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgPHN0UmVmOmRvY3VtZW50SUQ+dXVpZDo5NzY2NUZDMUZCNzBEQzExQjJFN0FFRjg0RTUxRTk3Qzwvc3RSZWY6ZG9jdW1lbnRJRD4KICA8L3htcE1NOkRlcml2ZWRGcm9tPgogPC9yZGY6RGVzY3JpcHRpb24+Cgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSdyJz8+Cv/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAGQAZAMBIgACEQEDEQH/xAAcAAEBAAIDAQEAAAAAAAAAAAAABgUHAgMEAQj/xAA8EAABAwMBAwgHBwMFAAAAAAABAAIDBAURBhIhMRMiQVFhocHRF
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) no-repeat scroll left top;
width: 100px;
text-indent: -1000em;
height: 100px;
text-transform: uppercase;
color: #3366ff;
font-size: 100px;
}
#logo h1 #WRT {
# background: transparent url(images/WRTgreendot.jpg) no-repeat scroll left top;
width: 100px;
height: 100px;
text-indent: -1000em;
font-size: 100px;
text-transform: uppercase;
color: #cc0000;
}
#EARS_desc {
text-align: left;
font-family: Arial,Helvetica,sans-serif;
font-weight: normal;
}
#EARS_files {
text-align: left;
font-weight: bold;
font-family: "Courier New",Courier,monospace;
font-size: 14pt;
}
</style>
<title>EARS</title>
</head>
<body>
<div id="logo">
<h1><span id="WRT">WRT</span>
<span id="EARS"> EARS</span>
</h1>
<h2>E-mail Attachment Retrieval System</h2>
</div>
<hr>
<div id="EARS_desc">
You have been sent an e-mail that exceeds WRT's allowed e-mail attachment size.<p>
Attachments to this message have been removed and saved to a <b>TEMPORARY</b> storage location<br>
where they will be <b>PERMANENTLY REMOVED</b> after 30 days.<p>
To retrieve the attachments, right-click on the filename listed below and choose <b>Save As...</b>
</div>
<hr>
<div id="EARS_files">
<ul>
<li> Lorem Ipsum - All the facts - Lipsum generator.html
</ul>
</div>
</body></html>
As you should be able to see, the base64
text has been split over multiple lines which, in turn, does not allow for the graphic(s) to be displayed.