1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#!/usr/bin/perl
#
# PDF::Create - Test Script
#
# Copyright 2010- Markus Baertschi <markus@markus.org>
#
# Please see the CHANGES and Changes file for the detailed change log
#
# As example we draw a parabola which can be used to focus wifi signals
#
# This has not much to do with testing, but I like it, so it remains :-).
#
use strict; use warnings;
use PDF::Create;
use Test::More tests => 1;
my $pdfname = $0;
$pdfname =~ s/\.t/\.pdf/;
my $pdf = PDF::Create->new( 'filename' => "$pdfname",
'Version' => 1.2,
'PageMode' => 'UseOutlines',
'Author' => 'Markus Baertschi',
'Title' => 'Parabolic WiFi Antenna'
);
my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') );
# Prepare 2 fonts
my $f1 = $pdf->font( 'Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica'
);
my $f2 = $pdf->font( 'Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica-Bold'
);
# Add a page which inherits its attributes from $root
my $page = $root->new_page;
# Write the title
$page->stringc( $f2, 25, 300, 770, 'Parabolic WiFi Reflector Template' );
$page->stringc( $f1, 12, 300, 740, 'Markus Baertschi (markus@markus.org)' );
# General parameters
my $dy = 310; # y offset from page origin
my $ay = 280; # y amplitude
my $dx = 100; # x offset from page origin
my $p = 100; # distance from back to focal point
$page->stringl( $f2, 10, 100, 710, 'Introduction' );
$page->stringl( $f1, 10, 100, 700,
'This template allows you to build a simple, but effective WiFi range extender. The reflector described' );
$page->stringl( $f1, 10, 100, 690,
'here will concentrate the signal of your access point in one direction. THe range in this direction will' );
$page->stringl( $f1, 10, 100, 680, 'be much better at the expense of the range in all other directions.' );
# Write instructions
$page->stringl( $f2, 10, 100, 660, 'Instructions:' );
$page->stringl( $f1, 10, 100, 650, '- Make square or rectangular reflector from metallic material (Tin foil, etc)' );
$page->stringl( $f1, 10, 100, 640, '- Bend reflector to parabolic shape' );
$page->stringl( $f1, 10, 100, 630, '- Fix reflector with the antenna at the focal point' );
# Write the labels
$page->stringl( $f1, 12, $dx + $p + 10, 460, 'Parabola (The reflector must be shaped like this)' );
$page->stringl( $f1, 10, $dx + $p + 30, $ay - 10, 'Focal Point (Antenna goes here)' );
# Draw the focal point
my $l = 30; # Length of cross
$page->line( $dx + $p - $l, $dy, $dx + $p + $l, $dy );
$page->line( $dx + $p, $dy - $l, $dx + $p, $dy + $l );
$page->newpath;
$page->set_width(0.5);
$page->setrgbcolorstroke( 0, 0, 0 );
$page->moveto( $dx + $p - $l / 2, $dy );
$page->curveto( $dx + $p - $l / 2, $dy + $l / 2 * 0.55, $dx + $p - $l / 2 * 0.55, $dy + $l / 2, $dx + $p, $dy + $l / 2 );
$page->curveto( $dx + $p + $l / 2 * 0.55, $dy + $l / 2, $dx + $p + $l / 2, $dy + $l / 2 * 0.55, $dx + $p + $l / 2, $dy );
$page->curveto( $dx + $p + $l / 2, $dy - $l / 2 * 0.55, $dx + $p + $l / 2 * 0.55, $dy - $l / 2, $dx + $p, $dy - $l / 2 );
$page->curveto( $dx + $p - $l / 2 * 0.55, $dy - $l / 2, $dx + $p - $l / 2, $dy - $l / 2 * 0.55, $dx + $p - $l / 2, $dy );
$page->stroke;
$ay = 50; # y amplitude
$dy = 100; # y offset from page origin
$dx = 300; # x offset from page origin
$p = 10; # distance from back to focal point
$page->newpath;
$page->set_width(2);
$page->setrgbcolorstroke( 0.1, 0.2, 1 );
$page->moveto( $ay * $ay / ( 4 * $p ), -$ay );
for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) {
my $x = $y * $y / ( 4 * $p );
$page->lineto( $x + $dx, $y + $dy );
}
$page->stroke;
my $i = 0;
$page->newpath;
$page->set_width(1);
$page->setrgbcolorstroke( 0.1, 0.2, 1 );
$page->moveto( $ay * $ay / ( 4 * $p ), -$ay );
for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) {
my $x = $y * $y / ( 4 * $p );
$page->lineto( $x + $dx + $i, $y + $dy );
$i++;
$i++;
}
$page->stroke;
$page->newpath;
$i = 0;
$page->moveto( $ay * $ay / ( 4 * $p ), -$ay );
for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) {
my $x = $y * $y / ( 4 * $p );
$page->lineto( $x + $dx + $i, $y + $dy + $ay * 2 );
$i++;
$i++;
}
$page->stroke;
$page->line( $dx + $ay + 12, $dy - $ay, $dx + $ay + 12, $dy + $ay );
$page->line( $dx + $ay - 10, $dy - $ay + 30, $dx + $ay - 10, $dy + $ay + 30 );
$page->line( $dx + $ay * 3 + 12, $dy + $ay, $dx + $ay * 3 + 12, $dy + $ay * 3 );
$page->set_width(3);
$page->line( $dx + $ay * 2, $dy, $dx + $ay * 2, $dy + $ay * 2 );
# Wrap up the PDF and close the file
$pdf->close;
################################################################
#
# Check the resulting pdf for errors with pdftotext
#
SKIP: {
skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext');
my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`;
ok( $out eq "", "pdftotext $out");
}
|