J
James A. Fortune
This might be of help to some people.
I have been producing some PDF reports lately directly from Access
using the basic techniques found here:
http://groups.google.com/group/comp.databases.ms-access/msg/a49f0ddea9315902
The rotation technique I use below can only be used when Access
creates the PDF file directly or when Access uses some PDF creation
tool that allows the developer to insert additional PDF commands. I
don't think that the Access 2007 PDF Add-in from Microsoft allows such
customization. Even if you can find an appropriate place to put the
PDF commands within the output from the Add-in, it would throw off the
byte counts used by the PDF file to index where the PDF objects are
contained within the file.
Some of my reports represent data grouped by month and presented along
the X-Axis. Since the user can choose any number of months for their
date range, I eventually want to group by months if there are less
than or equal to 24 months, by quarters if there are less than or
equal to six years and by years if over six years. Right now, I just
have the capability to have months on the X-Axis. If I have only a
few months, I might widen the width of the data rectangles and, either
way, the date labels can be placed horizontally along the X-Axis. If
I have lots of months, I find that I can squeeze more in if I rotate
the month labels counterclockwise. Here are some A97 code examples
that illustrate the basic idea:
N = DateDiff("m", txtStartDate.Value, txtEndDate.Value) + 1
C = 1#
dblLabelComfort = 0.75
dtStart = CDate(txtStartDate.Value)
dtEnd = CDate(txtEndDate.Value)
For I = 1 To N
MonthCount(I) = 0
MonthTitle(I) = DateAdd("m", I - 1, DateSerial(Year(dtStart), Month
(dtStart), 1))
Next intI
....
'Determine whether to use flat or rotated date labels:
For I = 1 To N
DateLabelWidth(I) = GetFontWidth(Format(MonthTitle(I), "mmm yy"),
"HelveticaBold", dblDateLabelFontSize)
If DateLabelWidth(I) > dblMaxDateLabelWidth Then
dblMaxDateLabelWidth = DateLabelWidth(I)
iMax = I
End If
Next I
'boolAngledDates - Compare the column width available to the date
width of the first month
If dblMaxDateLabelWidth / dblSpacerPlusBarWidth <= dblLabelComfort
Then
boolAngledDates = False
Else
boolAngledDates = True
End If
....
'Calculate horizonatal offsets to align the right side of the date
labels
If boolAngledDates = True Then
For intI = 1 To N
dblDateLabelOffset(intI) = DateLabelWidth(iMax) - DateLabelWidth
(intI)
Next intI
End If
....
'Rotate and place the date labels on the graph
'dblDateLabelRotateAngle = 60
For I = 1 To N
'Determine centerline of column
dblColClx = 216 + (C + 1) * dblSpacerWidth / 2 + (I - 1) *
dblSpacerPlusBarWidth
strStream = strStream & "q" & strCR
strStream = strStream & "BT" & strCR
strStream = strStream & "1 0 0 1 " & CStr(dblColClx -
dblDateLabelFontSize) & " " & CStr(155) & " cm" & strCR
strStream = strStream & "0.5 0.866 -0.866 0.5 0 0 cm" & strCR
strStream = strStream & "/F4 " & CStr(dblDateLabelFontSize) & "
Tf" & strCR
strStream = strStream & CStr(Round(dblDateLabelOffset(I), 3)) &
" 0 Td" & strCR
strStream = strStream & "(" & Format(MonthTitle(I), "mmm yy") &
") Tj" & strCR
strStream = strStream & "ET" & strCR
strStream = strStream & "Q" & strCR
Next intI
produces for 'Mar 09':
q
BT
1 0 0 1 308.166666666667 155 cm
0.5 0.866 -0.866 0.5 0 0 cm
/F4 12 Tf
2.004 0 Td
(Mar 09) Tj
ET
Q
q - keep graphics environmental settings local
BT - begin text
Set a new graphics origin at 308.17, 155
Rotate the graphics coordinate system 60 degrees
Use the font /F4 which has been previously assigned to Helvetica-Bold
sized to 12 pt.
In the new coordinate system, move in the X-Axis 2.004 pts using the
precomputed offset
Print the text value "Mar 09" at the current location
ET - end text
Q - restore the global graphics environmental settings
As can be seen when viewing the PDF file using, say NotePad, the
layout (static) part of the graph contains the following PDF commands
to rotate the Y-Axis text 90 degrees counterclockwise:
q
1 0 0 1 140 234.503 cm
0 1 -1 0 0 0 cm
BT
/F4 16 Tf
0 0 Td
(Number of Discrepancies) Tj
ET
Q
A sample output PDF file (produced from A97) is available at:
https://files.oakland.edu/users/fortune/web/Discrepancy.pdf
Note that the graph is in Landscape mode and requires that the page
PDF object contain:
/MediaBox [0 0 792 612]
instead of
/MediaBox [0 0 612 792]
When rotating text labels in any presentation system there is no
guarantee that the tops will be aligned perfectly because the bounding
box values are used to calculate the offsets rather than the actual
character boundaries with allowance for rotation changing the
distances to the edges, but the results seem to be adequate, at least
for now.
James A. Fortune
(e-mail address removed)
I have been producing some PDF reports lately directly from Access
using the basic techniques found here:
http://groups.google.com/group/comp.databases.ms-access/msg/a49f0ddea9315902
The rotation technique I use below can only be used when Access
creates the PDF file directly or when Access uses some PDF creation
tool that allows the developer to insert additional PDF commands. I
don't think that the Access 2007 PDF Add-in from Microsoft allows such
customization. Even if you can find an appropriate place to put the
PDF commands within the output from the Add-in, it would throw off the
byte counts used by the PDF file to index where the PDF objects are
contained within the file.
Some of my reports represent data grouped by month and presented along
the X-Axis. Since the user can choose any number of months for their
date range, I eventually want to group by months if there are less
than or equal to 24 months, by quarters if there are less than or
equal to six years and by years if over six years. Right now, I just
have the capability to have months on the X-Axis. If I have only a
few months, I might widen the width of the data rectangles and, either
way, the date labels can be placed horizontally along the X-Axis. If
I have lots of months, I find that I can squeeze more in if I rotate
the month labels counterclockwise. Here are some A97 code examples
that illustrate the basic idea:
N = DateDiff("m", txtStartDate.Value, txtEndDate.Value) + 1
C = 1#
dblLabelComfort = 0.75
dtStart = CDate(txtStartDate.Value)
dtEnd = CDate(txtEndDate.Value)
For I = 1 To N
MonthCount(I) = 0
MonthTitle(I) = DateAdd("m", I - 1, DateSerial(Year(dtStart), Month
(dtStart), 1))
Next intI
....
'Determine whether to use flat or rotated date labels:
For I = 1 To N
DateLabelWidth(I) = GetFontWidth(Format(MonthTitle(I), "mmm yy"),
"HelveticaBold", dblDateLabelFontSize)
If DateLabelWidth(I) > dblMaxDateLabelWidth Then
dblMaxDateLabelWidth = DateLabelWidth(I)
iMax = I
End If
Next I
'boolAngledDates - Compare the column width available to the date
width of the first month
If dblMaxDateLabelWidth / dblSpacerPlusBarWidth <= dblLabelComfort
Then
boolAngledDates = False
Else
boolAngledDates = True
End If
....
'Calculate horizonatal offsets to align the right side of the date
labels
If boolAngledDates = True Then
For intI = 1 To N
dblDateLabelOffset(intI) = DateLabelWidth(iMax) - DateLabelWidth
(intI)
Next intI
End If
....
'Rotate and place the date labels on the graph
'dblDateLabelRotateAngle = 60
For I = 1 To N
'Determine centerline of column
dblColClx = 216 + (C + 1) * dblSpacerWidth / 2 + (I - 1) *
dblSpacerPlusBarWidth
strStream = strStream & "q" & strCR
strStream = strStream & "BT" & strCR
strStream = strStream & "1 0 0 1 " & CStr(dblColClx -
dblDateLabelFontSize) & " " & CStr(155) & " cm" & strCR
strStream = strStream & "0.5 0.866 -0.866 0.5 0 0 cm" & strCR
strStream = strStream & "/F4 " & CStr(dblDateLabelFontSize) & "
Tf" & strCR
strStream = strStream & CStr(Round(dblDateLabelOffset(I), 3)) &
" 0 Td" & strCR
strStream = strStream & "(" & Format(MonthTitle(I), "mmm yy") &
") Tj" & strCR
strStream = strStream & "ET" & strCR
strStream = strStream & "Q" & strCR
Next intI
produces for 'Mar 09':
q
BT
1 0 0 1 308.166666666667 155 cm
0.5 0.866 -0.866 0.5 0 0 cm
/F4 12 Tf
2.004 0 Td
(Mar 09) Tj
ET
Q
q - keep graphics environmental settings local
BT - begin text
Set a new graphics origin at 308.17, 155
Rotate the graphics coordinate system 60 degrees
Use the font /F4 which has been previously assigned to Helvetica-Bold
sized to 12 pt.
In the new coordinate system, move in the X-Axis 2.004 pts using the
precomputed offset
Print the text value "Mar 09" at the current location
ET - end text
Q - restore the global graphics environmental settings
As can be seen when viewing the PDF file using, say NotePad, the
layout (static) part of the graph contains the following PDF commands
to rotate the Y-Axis text 90 degrees counterclockwise:
q
1 0 0 1 140 234.503 cm
0 1 -1 0 0 0 cm
BT
/F4 16 Tf
0 0 Td
(Number of Discrepancies) Tj
ET
Q
A sample output PDF file (produced from A97) is available at:
https://files.oakland.edu/users/fortune/web/Discrepancy.pdf
Note that the graph is in Landscape mode and requires that the page
PDF object contain:
/MediaBox [0 0 792 612]
instead of
/MediaBox [0 0 612 792]
When rotating text labels in any presentation system there is no
guarantee that the tops will be aligned perfectly because the bounding
box values are used to calculate the offsets rather than the actual
character boundaries with allowance for rotation changing the
distances to the edges, but the results seem to be adequate, at least
for now.
James A. Fortune
(e-mail address removed)