When we presented Web Share API Primer Tutorial some time back we remember palpable excitement that a means by which email attachments could be linked to โaโ link โmailto:โ looking user controlled email sending (as well as several other sharing options, adding to โMailโ, those being โMessagesโ, โAirDropโ, โNotesโ, โRemindersโ, โSimulatorโ, โNotesโ, โMoreโฆโ here on this macOS MacBook Air, that you might not have thought of to use, all presented on a menu created by the Web Share API) could be at hand. Alas, this โWeb Share APIโ methodology is not supported on all browsers and platforms and protocols. Nonetheless, we want to incorporate it where usable because we have the idea, now, to set up web application design scenarios such as โฆ
Grandparent (download to MAMP document root) |
Parent (download to MAMP HTMLCSS folder off document root) |
Child (download to MAMP document root) |
---|---|---|
todayโschanged php_calls_pdfimages |
todayโschanged client_browsing |
todayโschanged web_share_api_test |
can help define email and SMS wording via &wording=[title and text words] | call child external Javascript, and if supervised, can resize grandparent iframe and when file(s) selected can move Web Share API button just below File API button into the iframe โviewโ, ready for a click that activates Web Share API functionality | performs the Web Share API functionality |
โฆ which can build on yesterdayโs Pdfimages PDF Media Share Tutorial, but also a whole lot of other web applications that use the โParentโ above in an iframe window with similar CSS characteristics, for example ourtweaked โGrandparentโ tutorial_to_animated_gifphp inhouse animated GIF creator.
Previous relevant Pdfimages PDF Media Share Tutorial is shown below.
Itโs time to get into โsharingโ, following on from yesterdayโs work interfacing to Pdfimages using web application of Pdfimages Input PDF File Protocol Link Tutorial.
Now, as good as the cache is, it cannot be used to be the data for an email attachment or SMS image, because a cache only helps out the webpage it is associated with, nothing beyond. We could do lots of alternative approaches such as โฆ
- store and recall in Cookies or window.localStorage
- store and recall from a web server file
- store and recall in a database
- store and recall via the PHP codebase itself
- store and recall via element global data attributes available via window.parent iframe element interfacing
- pre-prepare a PHP mail based attachment set
โฆ to help out with media sharing via email or SMS. But none of those are what we are doing today, because for the case of โฆ
- user enters an all uppercase output media file(s) prefix โฆ there are no issues with sharing anyway โฆ so we think we should just do special arrangements for โฆ
- user enters an output media file(s) prefix with some lowercase characters โฆ
โฆ and for these, weโve decided to offer a user controlling way for them to click a button in time enough to delay the deletion of media files off the web server, and during this โstay of executionโ, sharing is available as if the prefix was all uppercase. We use email (📧 ) and SMS (📟
) emoji (โaโ โmailto:โ and โsms:โ prefixed link) buttons with event logic โฆ
<?php echo โ
var gfirstparam=false, gsecondparam='', defem='" . $defdef . "', defs='" . $defdef . "', gblurb='';
function emailit(inais) {
event.stopPropagation();
if (gfirstparam) { delit(gfirstparam, gsecondparam); }
var ext='.mp4';
if (defem == '') { defem=' '; }
if (('' + inais.id + 'v').substring(0,1).toLowerCase() == 'a') { ext='.gif'; }
if (('' + inais.id + 'v').substring(0,1).toLowerCase() == 'p') { ext='.pdf ( or perhaps you want original PDF at " . $infile . " )'; }
//var em=prompt('Please enter email address to send to for an email message to which you might attach " . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . strtoupper($outp) . "' + ext, '');
var em=prompt('Please enter email address to send to for an email message to which you might attach " . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . strtoupper($outp) . "' + ext + ' (or other " . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . strtoupper($outp) . "*.* prefixing' + ' image or other media files, and note that right clicking images below is another sharing possibility)' + gblurb, defem.trim());
if (em == null) { em=''; }
if (em.indexOf('@') != -1) {
if (em.trim() != em && gblurb.trim() != '') {
gblurb=' ';
setTimeout(tryagain, 120000);
}
defem=em.trim();
document.getElementById('dimap').innerHTML=\"<a style=display:none; id=theaemail target=_blank href='mailto:\" + em + \"?subject=Media%20Share'>Email</a>\";
document.getElementById('theaemail').click();
} else if (em.trim() == '' && em != '') {
if (em.trim() != em && gblurb.trim() != '') {
gblurb=' ';
setTimeout(tryagain, 120000);
}
}
return false;
}
function smsit(inais) {
event.stopPropagation();
if (gfirstparam) { delit(gfirstparam, gsecondparam); }
var ext='.mp4';
if (defs == '') { defs=' '; }
if (('' + inais.id + 'v').substring(0,1).toLowerCase() == 'a') { ext='.gif'; }
if (('' + inais.id + 'v').substring(0,1).toLowerCase() == 'p') { ext='.pdf ( or perhaps you want original PDF at " . $infile . " )'; }
var em=prompt('Please enter SMS number to send to for an SMS message to which you might attach " . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . strtoupper($outp) . "' + ext + ' (or other " . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . strtoupper($outp) . "*.* prefixing' + ' image or other media files, and note that right clicking images below is another sharing possibility)' + gblurb, defs.trim());
if (em == null) { em=''; }
if (em.trim() != '') {
if (em.trim() != em && gblurb.trim() != '') {
gblurb=' ';
setTimeout(tryagain, 120000);
}
if (em.trim() != '') {
defs=em.trim();
document.getElementById('dimap').innerHTML=\"<a style=display:none; id=theasms target=_blank href='sms:\" + em + \"'>SMS</a>\";
document.getElementById('theasms').click();
}
}
return false;
}
function tryagain() {
ajdone=false;
delit(false, gsecondparam);
}
function delit(istouch, ioissrc) {
var doit=false;
var thingos=ioissrc.split('#');
var zhr = new XMLHttpRequest();
var zform=new FormData();
var dgebih='<iframe name=ifdf id=ifdf style=display:none; src=./php_calls_pdfimages.php></iframe><form target=ifdf style=display:none; method=POST action=./php_calls_pdfimages.php><input type=submit id=divformb value=Submit></input></form>';
if (!istouch && gblurb == '') {
gfirstparam=true;
gsecondparam=ioissrc;
gblurb='. Add spaces to say that it is okay, that in two minutes, will tidy up media files, as first requested.';
}
if (thingos[0].length > 0) {
doit=true;
zform.append('delp', ioissrc.split('#')[0]);
dgebih=dgebih.replace('<input type=submit', '<input type=hidden name=delp id=delp value=\"' + ioissrc.split('#')[0] + '\"></input><input type=submit');
}
if (thingos.length > 1) {
if (thingos[1].indexOf('.mp4') != -1) {
doit=true;
zform.append('delv', thingos[1]);
dgebih=dgebih.replace('<input type=submit', '<input type=hidden name=delv id=delv value=\"' + thingos[1] + '\"></input><input type=submit');
} else if (thingos[1].indexOf('.gif') != -1) {
doit=true;
zform.append('dela', thingos[1]);
dgebih=dgebih.replace('<input type=submit', '<input type=hidden name=dela id=dela value=\"' + thingos[1] + '\"></input><input type=submit');
}
}
if (thingos.length > 2) {
if (thingos[2].indexOf('.mp4') != -1) {
doit=true;
zform.append('delv', thingos[2]);
dgebih=dgebih.replace('<input type=submit', '<input type=hidden name=delv id=delv value=\"' + thingos[2] + '\"></input><input type=submit');
} else if (thingos[2].indexOf('.gif') != -1) {
doit=true;
zform.append('dela', thingos[2]);
dgebih=dgebih.replace('<input type=submit', '<input type=hidden name=dela id=dela value=\"' + thingos[2] + '\"></input><input type=submit');
}
}
if (istouch) {
zform.append('touch', 'y');
}
if (doit && (!ajdone || istouch)) {
if (!istouch) {
document.getElementById('dpf').innerHTML=dgebih;
document.getElementById('divformb').click();
//alert('0:' + dgebih);
} else {
zhr.open('post', document.URL.split('?')[0].split('#')[0], true);
zhr.send(zform);
}
}
ajdone=true;
}
โ; ?>
โฆ bordered by a dotted border to indicate time is running out for the user to indicate interest in โmedia sharingโ in their session.
Along the way, we had an idea to improve the chances any videos created will reach the cache. We start using the autoplay attribute when a userโs prefix contains lowercase characters in todayโschanged php_calls_pdfimagesphp MAMP local Apache/PHP/MySql web serverโs document root ( ie. using a MAMP macOS URL HTTP://localhost:8888/php_calls_pdfimages.php and may take you there with this public domain RJM Programming link if all of above and below holds ).
Previous relevant Pdfimages Input PDF File Protocol Link Tutorial is shown below.
The usual protocol we deal with when talking about the serving of webpages is the โฆ
- http Protocol โฆ
Opens a hypertext transfer session with the specified site address.
โฆ but, today, our aims for the day take us into the woooorrrrlllldddd of the โฆ
- file Protocol โฆ
Opens a file on a local or network drive.
Why? Well, our MAMP local web server residing ideas with todayโschanged php_calls_pdfimagesphp MAMP local Apache/PHP/MySql web serverโs document root ( ie. using a MAMP macOS URL HTTP://localhost:8888/php_calls_pdfimages.php and may take you there with this public domain RJM Programming link if all of above holds ) have us, perhaps, involving browsed for input PDF files that do not sit within the MAMP document root โrealmโ. When such a situation develops and we want to add a link for the user to view the input PDF in their MAMP web browser session โฆ
- the http Protocol is unable to get to these folders and files โฆ but we can resort to โฆ
- a file Protocol way to point a URL where such an input PDF might reside
โฆ but this does not mean you can just expect such a file:// file Protocol URL to work, regarding security issues, with all the platforms and versions of modern web browser. Google Chrome, is an example of a web browser that will not allow the combination of โฆ
- file:// URL (file Protocol) โฆ of a โฆ
- PDF file pointing URL โฆ hosted in a webpage via an โฆ
- iframe element
So what can we do? Well, weโre working in PHP, so we can copy the file:// PDF file into the HTTP:// โrealmโ, temporarily, display the data, and then tidy up, leaving the (web browser) cache to keep the data intact during that web browser session. We already use the cache this way to allow for a tidy up of files should the user specify a non-all-uppercase prefix for their output media filenames.
It would be good for this arrangement to keep a webpage tab title keeping the name of the original PDF file (in its basename form (ie. not the path)), so we start, with todayโs work, also temporarily copying the PDF file into the HTTP:// realm in a new random subfolder with its original filename basename, to facilitate this wish of ours, and later, tidy up. Our other wish is to not need any new PHP code files to achieve this. All possible, and take a look at the PHP โฆ
<?php
if (isset($_GET['inurl'])) {
$mt="image";
$mprefix='<img src=';
$rpdf='pdfcopy-0-local-' . rand(0,5773354) . '.pdf';
$newp=$_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $rpdf;
$newu="http://" . $_SERVER['SERVER_NAME'] . "" . str_replace("~","",str_replace(":443~","",str_replace(":80~","",(":" . $_SERVER['SERVER_PORT'] . "~")))) . '/' . basename($rpdf);
$filename=str_replace('file://','',str_replace('+',' ',urldecode($_GET['inurl'])));
if (file_exists($filename)) {
$outext=str_replace("jpg","jpeg",strtolower(explode(".", $filename)[-1 + sizeof(explode(".", $filename))]));
if (strtolower($outext) == 'mp4') { $mt='video'; $mprefix='<video controls><source src='; }
if (strtolower($outext) == 'pdf') {
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . explode('.pdf',$rpdf)[0] )) {
mkdir($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . explode('.pdf',$rpdf)[0] );
$rpdf=explode('.pdf',$rpdf)[0] . DIRECTORY_SEPARATOR;
$rpdf.=str_replace(' ','+',basename($filename));
$newp=$_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $rpdf;
$newu="http://" . $_SERVER['SERVER_NAME'] . "" . str_replace("~","",str_replace(":443~","",str_replace(":80~","",(":" . $_SERVER['SERVER_PORT'] . "~")))) . '/' . $rpdf;
}
copy($filename, $newp);
$mt='application'; $mprefix='<iframe style=width:100%;height:90%; src=';
}
$datau='data:' . $mt . '/' . $outext . ';base64,' . base64_encode(file_get_contents($filename));
if (strtolower($outext) == 'pdf') { $datau='./' . $rpdf; }
$dw=$mprefix . $datau . '></' . str_replace('video', 'source></video', explode(' ',substr($mprefix,1))[0]) . '>';
if (strtolower($outext) == 'pdf') {
sleep(3);
echo "<html><head><title>" . str_replace('+',' ',basename($filename)) . "</title></head><body onload=\"var woisa=window.open('" . $datau . "#" . str_replace('+',' ',basename($filename)) . "', '_self'); woisa.title='" . basename($filename) . "'; \"></body></html>";
} else {
echo "<html><head><title>" . str_replace('+',' ',basename($filename)) . "</title></head><body onload=\"var woisa=window.open('', '_self'); woisa.document.write('" . $dw . "');\"><iframe id=myif style=display:none; src=./php_calls_pdfimages.php?nopdfurl=y></iframe></body></html>";
}
}
exit;
} else if (isset($_GET['nopdfurl'])) {
sleep(37);
foreach (glob('pdfcopy-0-local-' . '*.pdf') as $filename) {
try {
unlink($filename);
} catch (Exception $werty) { }
}
foreach (glob('pdfcopy-0-local-*' . DIRECTORY_SEPARATOR . '*.pdf') as $filename) {
try {
unlink($filename);
} catch (Exception $werty) { }
try {
rmdir(explode(basename($filename), $filename)[0]);
} catch (Exception $werty) { }
}
exit;
}
$pdfprotocol='file://';
function oururlencode($whata) {
global $pdfprotocol;
if (strpos('~' . strtolower($whata), '~http') !== false) { return str_replace(urlencode(DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR, urlencode($whata)); }
$newwhata=str_replace($_SERVER['DOCUMENT_ROOT'], "//" . $_SERVER['SERVER_NAME'] . "" . str_replace("~","",str_replace(":443~","",str_replace(":80~","",(":" . $_SERVER['SERVER_PORT'] . "~")))), $whata);
if ($newwhata == $whata || 1 == 1) {
//file_put_contents('xaa.xaa', 'whata=' . $whata . ' and retval=' . urlencode($whata) . ' versus ' . str_replace(urlencode(DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR, urlencode($whata)));
if (1 == 1) {
$pdfprotocol='file://';
$pdfprotocol='./';
return 'php_calls_pdfimages.php?inurl=' . 'file://' . str_replace(urlencode(DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR, urlencode($whata));
} else {
$pdfprotocol='file://';
return str_replace(urlencode(DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR, urlencode($whata));
//return urlencode($whata);
}
}
$pdfprotocol=explode($_SERVER['SERVER_NAME'], $newwhata)[0];
return str_replace(urlencode(DIRECTORY_SEPARATOR), '/', str_replace(urlencode('/'), '/', urlencode(explode($pdfprotocol, $newwhata)[1])));
}
?>
โฆ regarding this modest additional functionality onto yesterdayโs Pdfimages PDF Image Extraction PHP Ffmpeg ImageMagick Tutorial, that is more of interest regarding issues where โdesktopโ meets โonlineโ woooooorrrrrrlllllddds. What seems straightforward is not always a given.
Previous relevant Pdfimages PDF Image Extraction PHP Ffmpeg ImageMagick Tutorial is shown below.
You might call us โname droppersโ with todayโs blog posting title, but these names โฆ
โฆ are brilliant Open Source products worth knowing. We know them here on our local MacBook Air with its MAMP local Apache/PHP/MySql web server, and have a lot of fun working these products amongst their โmedia darlingsโ โฆ
- Ffmpeg is great at creating Videos or Animated GIFs from Image input
- ImageMagick is great at creating PDFs from Image input (and, as we have already alluded to, creating Images of PDF pages)
โฆ that you might think is overkill, here, with this Pdfimages (is great at creating Images extracted from PDF) work, until the day somebody says โฆ
Oh! By the way! We want this in Such and Such format. Weโre sure thatโs no trouble, so have a great day. See ya!
And so, moving on from yesterdayโs Pdfimages PDF Image Extraction PHP Browsing Tutorial we would like you to install these on your local MAMP environment (by visiting links above, or interpreting PHP code below) โฆ
<?php
if (isset($_POST['install'])) {
if ($_POST['install'] == 'pdfimages') {
if (PHP_OS == "Darwin") {
putenv('PATH=/usr/local/bin');
$x="<p>Regarding ...<br><br>brew install popper<br><br>If errors below, you should try command above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('brew install poppler 2> huh.jnk');
if (file_exists('huhjunk.jnk')) {
$x.=file_get_contents('huhjnk.jnk');
unlink('huh.jnk');
}
echo "<html><body><pre>" . $x . "</pre></body></html>";
} else if (PHP_OS =='WINNT' || PHP_OS =='WIN32' || PHP_OS =='Windows') {
$x="<p>Regarding ...<br><br>sudo apt-get update <br>sudo apt-get install poppler-utils<br><br>If errors below, you should try commands above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('sudo apt-get update');
$x.=shell_exec('sudo apt-get install poppler-utils');
echo "<html><body><pre>" . $x . "</pre></body></html>";
}
} else if ($_POST['install'] == 'ffmpeg') {
if (PHP_OS == "Darwin") {
putenv('PATH=/usr/local/bin');
$x="<p>Regarding ...<br><br>brew install ffmpeg<br><br>If errors below, you should try command above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('brew install ffmpeg 2> huh.jnk');
if (file_exists('huhjunk.jnk')) {
$x.=file_get_contents('huhjnk.jnk');
unlink('huh.jnk');
}
echo "<html><body><pre>" . $x . "</pre></body></html>";
} else if (PHP_OS =='WINNT' || PHP_OS =='WIN32' || PHP_OS =='Windows') {
$x="<p>Regarding ...<br><br>sudo apt update -y <br>sudo apt install ffmpeg -y<br><br>If errors below, you should try commands above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('sudo apt update -y');
$x.=shell_exec('sudo apt install ffmpeg -y');
echo "<html><body><pre>" . $x . "</pre></body></html>";
}
} else if ($_POST['install'] == 'imagemagick') {
if (PHP_OS == "Darwin") {
putenv('PATH=/usr/local/bin');
$x="<p>Regarding ...<br><br>brew install imagemagick<br><br>If errors below, you should try command above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('brew install imagemagick 2> huh.jnk');
if (file_exists('huhjunk.jnk')) {
$x.=file_get_contents('huhjnk.jnk');
unlink('huh.jnk');
}
echo "<html><body><pre>" . $x . "</pre></body></html>";
} else if (PHP_OS =='WINNT' || PHP_OS =='WIN32' || PHP_OS =='Windows') {
$x="<p>Regarding ...<br><br>sudo apt update<br>sudo apt install imagemagick<br><br>If errors below, you should try commands above, yourself, on command line ...<br><br><br>";
$x.=shell_exec('sudo apt update');
$x.=shell_exec('sudo apt install imagemagick');
echo "<html><body><pre>" . $x . "</pre></body></html>";
}
}
exit;
}
?>
โฆ and have the chance to have fun using our three new checkboxes for โฆ
- Video
- Animated GIF
- Image PDF
โฆ additional media output options off the Pdfimages start you make, whether that be via filled in textboxes or the browsing mechanisms to define your input PDF containing this Image input data (youโll be wanting to refer to as โslidesโ soon enough).
So, why not re-download thechanged php_calls_pdfimagesphp MAMP local Apache/PHP/MySql web serverโs document root ( ie. using a MAMP macOS URL HTTP://localhost:8888/php_calls_pdfimages.php and may take you there with this public domain RJM Programming link if all of above holds ). You still need to follow the client_browsing.htm download instructions, as of yesterdayโs work, for local File API browsing.
Previous relevant Pdfimages PDF Image Extraction PHP Browsing Tutorial is shown below.
Yesterdayโs Pdfimages PDF Image Extraction PHP Tutorial โฆ
- asked a lot of the user as far as interactive entry goes having to specify โฆ
- input PDF file path
- input PDF file name
- when, in this day and age with the HTML5 and the File API we can browse for that PDF file using a look like those dialogue boxes from the early Windows and Mac OS X desktop application days
We donโt reinvent the wheel here, but tweak our oft-changed inhouse client_browsinghtm (which weโd like you to download to your MAMP local Apache/PHP/MySql web server HTMLCSS folder, you create, off its document root) interfacing to the File API, allowing the interface, within the parent window nested in an iframe element, return โฆ
- file base name
- file size
โฆ not pushing any barrows chasing the non-generic file path data members available on a rare platform (to fill in our input PDF file path), instead, writing some PHP to try to glean that input PDF file path ourselves, knowing the two pieces of information above โฆ
<?php
function rsearch($folder, $pattern, $size) { // thanks, anyway, to https://stackoverflow.com/questions/17160696/php-glob-scan-in-subfolders-for-a-file
$didea='';
if (PHP_OS == "Darwin") {
//file_put_contents("x.ksh", "find " . $folder . " -type f -name \"" . $pattern . "\" 2> /dev/null -exec wc -c {} + | egrep '^ " . $size . " ' | sed '/ " . $size . " /s///g'");
if ($folder == DIRECTORY_SEPARATOR) {
$didea=shell_exec("find \$HOME/Downloads -type f -name \"" . $pattern . "\" 2> /dev/null -exec wc -c {} + | egrep '^ " . $size . " ' | sed '/ " . $size . " /s///g'");
//file_put_contents("xx.ksh", $didea);
if ($didea != '') { return $didea; }
$didea=shell_exec("find " . dirname(__FILE__) . DIRECTORY_SEPARATOR . " -type f -name \"" . $pattern . "\" 2> /dev/null -exec wc -c {} + | egrep '^ " . $size . " ' | sed '/ " . $size . " /s///g'");
//file_put_contents("xxx.ksh", $didea);
if ($didea != '') { return $didea; }
}
return shell_exec("find " . $folder . " -type f -name \"" . $pattern . "\" 2> /dev/null -exec wc -c {} + | egrep '^ " . $size . " ' | sed '/ " . $size . " /s///g'");
}
//$iti = new RecursiveDirectoryIterator($folder);
//foreach (new RecursiveIteratorIterator($iti) as $file) {
//foreach (glob($folder . $pattern) as $file) {
// if (strpos($file , $pattern) !== false && filesize($file) == $size) {
// return $file;
// }
//}
return '';
}
?>
โฆ so far just for Mac OS X or macOS โฆ sorrrryyyyy!
Along the way, we now offer, as far as image displays go, the choices of โฆ
- images from left to right (as with yesterday) โฆ and now โฆ
- images from top to bottom
- images that fill screen width, as far as they can fit
The images can be clicked to open individually in new web browser tabs, should that interest.
So, why not download thechanged php_calls_pdfimagesphp MAMP local Apache/PHP/MySql web serverโs document root ( ie. using a MAMP macOS URL HTTP://localhost:8888/php_calls_pdfimages.php and may take you there with this public domain RJM Programming link if all of above holds ).
Previous relevant Pdfimages PDF Image Extraction PHP Tutorial is shown below.
Today weโre building on yesterdayโs Pdfimages PDF Image Extraction Primer Tutorialโs โฆ
- macOS command line use of thanks, that the great Pdfimages suite of software works in to extract the images contained within a PDF โฆ by allowing โฆ
- a combination of โฆ
- macOS
- MAMP local Apache/PHP/MySql web server
- inhouse PHP php_calls_pdfimages
php downloaded to document root of MAMP web server
- PHP exec
โฆ can present a form a MAMP webpage user uses to find the input PDF and suggest a prefixing part to the filenames, which will end up creating images from that PDF file as per โฆ [userPrefix]-0.jpg [userPrefix]-1.jpg [userPrefix]-2.jpg etcetera etcetera etcetera
So hereโs our source code for php_calls_pdfimagesphp as it sits for this first incarnation ( ie. using a MAMP macOS URL HTTP://localhost:8888/php_calls_pdfimages.php and may take you there with this public domain RJM Programming link if all of above holds ).
Previous relevant Pdfimages PDF Image Extraction Primer Tutorial is shown below.
When we presented PDF via Slide Images and Back Again via ImageMagick Primer Tutorial we referenced โฆ
- the great ImageMagick suite of software capable of extracting PDF pages as an image โฆ as distinct from our curiosity today โฆ
- we discovered, thanks, that the great Pdfimages suite of software can extract the images contained within a PDF
And so, today, we show with todayโs animated GIF presentation โฆ
- installing Pdfimages on macOS via โฆ
brew install poppler - using a macOS command line (via Terminal application) issued command โฆ
pdfimages -j "September 22 record.pdf" ideas -png
โฆ to extract the 242 images (curiously, as jpeg images) contained within our input PDF.
Interesting, huh?
Previous relevant PDF via Slide Images and Back Again via ImageMagick Primer Tutorial is shown below.
Does todayโs blog posting title sound familiar to you? If so, Iโm impressed. If not, get the whole picture, in context (we hope), today of โฆ
- todayโs โPDF via Slide Images and Back Again via ImageMagick Primer Tutorialโ โฆ gets its cues from a โฆ
- previous โVideo via Slide Images and Back Again via ffmpeg Primer Tutorialโ โฆ so that โฆ
- PDF is the output file format as distinct from a Video Format such as *.mov or *.mp4
- ImageMagick is the conduit to that work as distinct from ffmpeg
โฆ and that what is a common denominator here to be able to convert between Video and PDF and vice versa, is a set of image slides (or frames) of the animation concerned, todayโs being, again, that Ant Video we took on our iPhone (that became the โStar Ant Videoโ), and that today takes as its startingpoint โฆ
- image slides (or frames) from Video via Slide Images and Back Again via ffmpeg Primer Tutorial our MacBook Pro (via an email attachment download) โฆ a listing of which looks like โฆ
$ ls -l image-000*.jpeg
-rw-r--r-- 1 user admin 170993 26 Jul 11:20 image-0001.jpeg
-rw-r--r-- 1 user admin 205565 26 Jul 11:20 image-0002.jpeg
-rw-r--r-- 1 user admin 218950 26 Jul 11:20 image-0003.jpeg
-rw-r--r-- 1 user admin 164271 26 Jul 11:20 image-0004.jpeg
-rw-r--r-- 1 user admin 171662 26 Jul 11:20 image-0005.jpeg
-rw-r--r-- 1 user admin 155528 26 Jul 11:20 image-0006.jpeg
-rw-r--r-- 1 user admin 53193 26 Jul 11:20 image-0007.jpeg - gets converted to an original (input) PDF (antsoriginal.pdf) (with slideshow capabilities via applications like Mac OS Xโs Preview or Adobe Acrobat Reader) via Mac OS X Terminal application command lineโs ImageMagick executable convert command โฆ
convert image-000*.jpeg -density 4096 antsoriginal.pdf
โฆ and then we act as though this PDF was our original source of data and decide to โฆ - break that PDF into its constituent image slides (or frames) via โฆ
convert -density 900 antsoriginal.pdf image_pdf.jpeg
โฆ and then use ImageMagick convert commands again to โฆ - crop those image slides via Mac OS X Terminal application command lineโs ImageMagick executable convert commands (thanks to this great advice) โฆ
$ convert image_pdf-0.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-0.jpg
$ convert image_pdf-1.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-1.jpg
$ convert image_pdf-2.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-2.jpg
$ convert image_pdf-3.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-3.jpg
$ convert image_pdf-4.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-4.jpg
$ convert image_pdf-5.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-5.jpg
$ convert image_pdf-6.jpeg -crop 3000x6000+4000+4000 -gravity center image_pdf-6.jpg
โฆ into new PDF slide images (or frames) that can be converted to (output) PDF (antscentral.pdf) via ImageMagick executable convert command โฆ
convert image_pdf*.jpg antscentral.pdf
โฆ to see โฆ - we end up with the (relevant) file listing โฆ
$ ls -l image-000*.jpeg image_pdf*.jp*g ants*l.pdf
-rw-r--r--@ 1 user admin 17405330 15 Aug 12:00 antscentral.pdf
-rw-r--r--@ 1 user admin 1350686 15 Aug 11:53 antsoriginal.pdf
-rw-r--r-- 1 user admin 170993 26 Jul 11:20 image-0001.jpeg
-rw-r--r-- 1 user admin 205565 26 Jul 11:20 image-0002.jpeg
-rw-r--r-- 1 user admin 218950 26 Jul 11:20 image-0003.jpeg
-rw-r--r-- 1 user admin 164271 26 Jul 11:20 image-0004.jpeg
-rw-r--r-- 1 user admin 171662 26 Jul 11:20 image-0005.jpeg
-rw-r--r-- 1 user admin 155528 26 Jul 11:20 image-0006.jpeg
-rw-r--r-- 1 user admin 53193 26 Jul 11:20 image-0007.jpeg
-rw-r--r-- 1 user admin 17643304 15 Aug 11:18 image_pdf-0.jpeg
-rw-r--r-- 1 user admin 2906716 15 Aug 11:56 image_pdf-0.jpg
-rw-r--r-- 1 user admin 18521373 15 Aug 11:18 image_pdf-1.jpeg
-rw-r--r-- 1 user admin 3022841 15 Aug 11:58 image_pdf-1.jpg
-rw-r--r-- 1 user admin 17394312 15 Aug 11:18 image_pdf-2.jpeg
-rw-r--r-- 1 user admin 2762837 15 Aug 11:58 image_pdf-2.jpg
-rw-r--r-- 1 user admin 13963420 15 Aug 11:19 image_pdf-3.jpeg
-rw-r--r-- 1 user admin 2215533 15 Aug 11:58 image_pdf-3.jpg
-rw-r--r-- 1 user admin 16076730 15 Aug 11:19 image_pdf-4.jpeg
-rw-r--r-- 1 user admin 2597147 15 Aug 11:59 image_pdf-4.jpg
-rw-r--r-- 1 user admin 16544272 15 Aug 11:19 image_pdf-5.jpeg
-rw-r--r-- 1 user admin 2840288 15 Aug 11:59 image_pdf-5.jpg
-rw-r--r-- 1 user admin 6870989 15 Aug 11:19 image_pdf-6.jpeg
-rw-r--r-- 1 user admin 1030314 15 Aug 11:59 image_pdf-6.jpg - install ImageMagick via that previous linkโs relevant download link โฆ then at Terminal application command line โฆ
sudo -k ln -s /opt/ImageMagick/bin/convert /usr/bin/convert - install GhostScript via that previous linkโs relevant download link โฆ then at Terminal application command line โฆ
sudo -k ln -s /opt/Ghostscript/bin/gs /usr/local/bin/gs
- install XQuartz via via XQuartz download page, thanks
- the queen ant (often just one per ant colony) is not a leader as such in thinking out strategies โฆ believe it or not โฆ
- it is believed ant colony strategies are worked by what we might call โgroupthinkโ
- ants march in line often and the scent that the ants leave behind is pheromone, that non-leader ants follow off that left behind by the โleader antโ โฆ ie. โleaderโ of position, rather than โleaderโ of hierarchy
- break the video into its component parts โฆ just like animations like โBugs Bunnyโ โฆ a series of (slide, or frame) images
- edit those (slide) images to add the (weโve decided should be) red ringing of our โStar Antโ โฆ who weโve decided you, the user can call whatever you so desire โฆ aaaaaaarrrrrrr
- reconstitute a new video from some new (slide) image components
- animated GIF
- slideshow
- video
- create the video data there and then via โFFmpegโ and PHPโs exec method โฆ or โฆ
- provide instructions to be able to create the video back at your client computer (that has โFFmpegโ perhaps) โฆ to suit the โฆ
ffmpeg -r 1 -i %03d.jpg video.mp4
โฆ to create a video called video.mp4 with 1 second delays between (input) slides named 001.jpg then 002.jpg then 003.jpg etcetera โฆ thanks useful webpage for the help โฆ that in the command line can sometimes be played via โฆ
open video.mp4
โฆ or used in some HTML as per โฆ
<video controls id=ivideo type='video/mp4'><source src='video.mp4'></source></video>
โฆ that we show you, below, the Mac OS X local MAMP (Apache/PHP/MySql) web server running of todayโs PHP to create โฆ
- slideshow creation (using our inhouse methods) which defaults to a horizontal (hashtag type of) navigation โฆ as well as adding a โฆ
- slideshow creation, with Data URI image data, using functionality as if CSS z-index (ie. slides stacked on top of each other in โoverlayโ style) was being used, but actually isnโt โฆ
- future mobile development web form navigation benefits from their usage
- the use of data URIs make your web pages independent of web server location issues, so make your web data more portable, and flexible
- normal run with HTML form which posts back to itself โฆ live
run
- example GET parameters run (like our tutorial picture)
Just as we decided to reinstall ffmpeg due to that disk crash, we decided to reinstall ImageMagick to this MacBook Pro here, and found, thanks to great advice, we found that we needed to โฆ
All animations, different forms (or formats), all presentation facilitators, is the message here today.
Previous relevant Video via Slide Images and Back Again via ffmpeg Primer Tutorial is shown below.
Reading yesterdayโs LibreOffice Spreadsheet via dBase Primer Tutorial you canโt say I didnโt warn you about my interest in ants (and bees)? Glad you asked?
Did you know?
So seeing some ants walking in line up a power pole, used an iPhone to capture a very short video (short enough to use the iPhoneโs Photo appโs Share via Mail (attachment) method of emailing to the MacBook Pro, and then (Gmail website) downloading) of this, and later, buck the โantโ trend, and โanthropomorphiseโ a โstar antโ, by honing in on an ant in this video and ring it (and its movement) before creating another โStar Ant Videoโ.
There are video editing approaches you could use, but what got us interested was the thought of โฆ
Thatโs where one of our favourite Mac Os X friendly media players, which is also a command line โplayerโ (yayyyyyy!) comes to the fore, for us. Itโs the wonderful ffmpeg which weโve had for a long time now on this MacBook Pro until a disk crash mentioned some weeks back. Could get it back off restore, but decided to reconsitute โฆ
โฆ as a fairly straightforward exercise (given you have Xcode installed already) via a How to install FFmpeg on Mac OS X webpage by Renรฉ Calles, thanks, heaps, we discovered the commands that worked well for us that go โฆ
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc --with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with-tools
โฆ to (re)install ffmpeg so that, then โฆ
ffmpeg -i IMG_0738.MOV -r 1 image-%04d.jpeg
โฆ could create those original 7 (slide) images, though the use of a value bigger than 1 frames per second for the โ-rโ switch could be on the cards for your usages.
How to edit those images? We just used the Mac OS X version of PaintBrush and lined a lot of these images side by side across the screen to try to track our โStar Antโ and award it the โRed Ellipse PaintBrush Order of Meritโ (for individualism โฆ tee hee).
Reconstituting the new slides into a new video we remember was another talent of ffmpeg and found this useful webpage, thanks, on the topic of taking raw (slide) images to create a video via ffmpeg. Actually, though, we also had our previous very useful Animated GIF and Video via PHP Writing PHP Data URI Tutorial (presented below) to turn to to end up with the Mac OS X (Terminal session command line command โฆ
ffmpeg -r 1 -i image-%04d.jpg ants.mp4
There are no worries with video file โworkingsโ to do with uppercase and lowercase and names, so we โฆ
cp IMG_0738.MOV ants.mov
โฆ just for some consistency purposes (and could use โmvโ to rename instead) so that we can show you โฆ
Before โฆ | After โฆ โStar Ant Videoโ |
---|---|
See a lot of all these goings on at todayโs PDFslideshow.
Previous relevant Animated GIF and Video via PHP Writing PHP Data URI Tutorial is shown below.
There is a great open source command line application called โFFmpegโ that can create video (or convert video) from image slides (for instance), and so, if we merge functionality for this into yesterdayโs Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial some โpresentationโ styles that our webapplication can process are now โฆ
As useful as โFFmpegโ is, it is not necessarily a default application existing on web server operating systems like our rjmprogramming.com.auโs CentOS server. But we do have it on our Mac OS X (MacBook Pro) operating systemโs command line, so we write our PHP determining whether to โฆ
If you are a regular at this blog and โFFmpegโ sounds a bit familiar to you, thatโs probably because youโve read FFmpeg Image Optimization Primer Tutorial on an earlier occasion โฆ by candlelight โฆ with the lights dimmed?!
See this in the context of how this PHP tutorial_to_animated_gifphp code changed for videos in thisway or try it as a live
run.
Previous relevant Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial is shown below.
To us, there are great similarities between animated GIFs and slideshows, as two forms of โpresentationโ, and so to extend yesterdayโs Animated GIF via PHP Writing PHP Data URI Tutorial animated GIF creator โPHP Writes PHPโ web application that now has the option for data URI โexportsโ we add the functionality for โฆ
โฆ that little bit different to another โstackedโ (or z-index feeling) approach we talked about with Multiple Class Slideshow Details Tutorial, where HTML element โclassโ properties were changed so that the last class defined reflects the look of the slideshow slide desired at any given time. We just use an array, and a setTimeout timer to achieve the same ends today, with our work (or โpresentationโ). If this โhorizontal versus stackโ navigation choice interests you, also take a read of HTML Input Element Types Randomized History Tutorial.
Again, with all this added functionality, because it is โhostedโ in an HTML iframe element all the existant web browser (Windows right click or Mac OS X two finger gesture) functionality can come into play, and make life quite interesting for your non-mobile users โcollectingโ data URIs โฆ there are worse hobbies!
You can see this in the context of how this PHP tutorial_to_animated_gifphp code changed for slideshows in thisway or try it as a live
run.
Previous relevant Animated GIF via PHP Writing PHP Data URI Tutorial is shown below.
The previous relevant โPHP writes PHPโ methodology animated GIF creator we talked about, first, with Animated GIF via PHP Writing PHP Primer Tutorial came back to mind yesterday with our Missing Javascript Audio on Unmute Tutorial, where we pondered on whether an animated GIF could be represented on a webpage by a data URI. Why take an interest in this? Data URIs are very important to do with โฆ
โฆ and ideally, animated GIFs are also not just a decorative part of all this web application usage (as they can be a very efficient representation of an animation that could not be a more succinct way to show that animation or presentation), and if they can be made to be like any other GIF or image data file in the ways they can be represented (and used), then that is all for the good.
So we changed the Jeroen van Wissenโs inspired PHP (โPHP writes PHPโ methodology) code tutorial_to_animated_gifphp code allow for this extra animated GIF data URI representation in a new additional HTML iframe (containing the animegif.html of code below) that when harnessing existant web browser (Windows right click or Mac OS X two finger gesture) functionality can glean for us, as required, that animated GIFโs data URI representation. But donโt get too excited about this being rocket science, in that with a bit of effort, and PHP, it could have been gleaned from what we already produced, in that (in PHP โlandโ) โฆ
$lastbitto="\$fp = fopen('animegif.gif', 'w');
\$data = \$gif->GetAnimation();
\$dataUri = 'data:image/gif;base64,' . base64_encode(\$data);
fwrite(\$fp, \$data);
fclose(\$fp);
\$fp = fopen('animegif.html', 'w');
fwrite(\$fp, '<!doctype html><html><body><h1>Data URI version below<h1><br><h4> ... via web browser (Windows right click, Mac OS X two finger gesture ...</h4><br><img src=' . \"\\n\" . \$dataUri . \"\\n\" . ' title=DataURI></img></body></html>');
fclose(\$fp);";
You can see this in the context of how this PHP code changed in thisway or try it as a liverun.
Previous relevant Animated GIF via PHP Writing PHP Primer Tutorial is shown below.
We find another very useful reason for PHP to write PHP. Today we establish a PHP web application to dynamically create Animated GIF images via some still images, like Gifpal would do.
We have some great open source PHP code to thank for the basis of the functionality we found at Jeroen van Wissenโs very useful link, thanks.
Then we added a more user friendly interface to get the information off the user we need. We present this in an HTML form, which navigates to the same PHP to do the actual assembly of the Animated GIF via techniques where PHP writes PHP โฆ and really needs to, to be useful.
Do you remember, last, when we did some PHP writing PHP functionality โฆ PHP Writes PHP Vertical TextBoxes Primer Tutorial?
And inside the PHP it makes big use of the GD and Image Functions to read and write the image data we assemble via the user information.
This Animated GIF form of animation is the easiest to implement, as it consists of just the one GIF image file, but the user has very little control over the animation settings, such as the delay between stills, one of the settings we ask about in our web application.
Our PHP source code today you could call tutorial_to_animated_gifphp and we redirect you to some live run ideas โฆ
Hope you find this tutorial useful.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.