Put Crop Marks on a Page





Put Crop Marks on a Page

figs/expert.gif figs/hack26.gif

Commercial print shops usually require crop marks for custom-sized print pieces. This hack shows you how to include these important guides in a Word document.

With its improved graphics and typography features, many individuals and small businesses rely on Word as a standalone desktop publishing program, especially as the price of full-featured programs such as InDesign remains high.

Word does a fair job of handling layout tasks, but it still operates primarily as a word processor. It also lacks a few features essential for preparing printer-ready documents, such as the ability to insert crop marks.

Printers (the trade, not the device) use crop marks when trimming paper to a particular size. Figure shows a document with crop marks. These are most often used when the final printed piece will have smaller dimensions than a standard paper size, such as letter. It's much easier and cheaper to print a document using a standard paper size and trim it afterward than to print directly on paper that's unusually sized.

A PDF of a document that includes crop marks
figs/wrdh_0350.gif


To create crop marks in a Word document, you can use the seldom-used PRINT field, discussed in [Hack #24] .

1 The Field Code

To see how a PRINT field can put crop marks on a page, open or create a single-page document. Next, put your cursor anywhere on the page and press Ctrl-F9 to insert an empty field at the insertion point.

With your cursor still between the field braces, type the following:

PRINT \p page "

% Crop Marks

.5 setlinewidth

% bottom left

72 88 moveto

72 52 lineto

70 90 moveto

34 90 lineto



% top left

70 720 moveto

34 720 lineto

72 722 moveto

72 758 lineto



% top right

522 722 moveto

522 758 lineto

524 720 moveto

560 720 lineto



% bottom right

522 88 moveto

522 52 lineto

524 90 moveto

560 90 lineto

stroke

"

The PostScript instructions are divided into four main parts, one for each of the four corners of the document where crop marks will be inserted. Each moveto, lineto pair corresponds to one of the eight lines needed for a full set of crop marks (two perpendicular lines in each corner of the document).

After you've created the PRINT field, print your document to file [Hack #23] to save it as a PostScript file. If you have a PostScript printer, when you print the document, it will have crop marks like the ones shown in Figure.

If you print to a non-PostScript printer, the PostScript instructions will appear as text within the document.


These crop marks correspond to a 1-inch top and bottom margin and a 1.25-inch left and right margin. To accommodate different margins, adjust the PostScript instructions accordingly.

To print crop marks on every page in a document, put the PRINT field in the document header.


2 Hacking the Hack

The PostScript code shown in the previous section works if you're working with Word's default margins, but if you want crop marks on a page with different margins, you need to work out the new coordinates. As much fun as a flashback to high-school geometry might be, it's better to work out the details once and then use a macro to adjust the coordinates for different margins.

The following code creates a PRINT field with the correct coordinates based on a document's margins. The field is placed in the header of the section where the cursor is currently located. In most cases, that puts crop marks on every page of the document, though if you've explicitly defined multiple sections with different headers, you may need to adjust the macro to get the desired results.

Place these five procedures in the template of your choice [Hack #50] and run the main PlaceCropmarks procedure from the ToolsMacroMacros dialog or by putting a button for it on a menu or toolbar [Hack #1] :

Sub PlaceCropmarks( )

Dim sngLeft As Single

Dim sngRight As Single

Dim sngTop As Single

Dim sngBottom As Single

Dim sPrintField As String

Dim rng As Range

With ActiveDocument.PageSetup

    sngLeft = .LeftMargin

    sngRight = .RightMargin

    sngTop = .TopMargin

    sngBottom = .BottomMargin

End With



' Include initial field switches and PostScript instructions

sPrintField = " \p page " & Chr$(34) & " .5 setlinewidth "

' Get correct coordinates using the four functions

sPrintField = sPrintField & BottomLeft(sngLeft, sngBottom)

sPrintField = sPrintField & TopLeft(sngLeft, sngTop)

sPrintField = sPrintField & TopRight(sngRight, sngTop)

sPrintField = sPrintField & BottomRight(sngRight, sngBottom)



' Add final PostScript instruction and close the field instruction

sPrintField = sPrintField & "stroke" & Chr$(34)

Set rng = Selection.Sections.First.Headers(wdHeaderFooterPrimary).Range

rng.Collapse wdCollapseStart

rng.Fields.Add Range:=rng, _

    Type:=wdFieldPrint, _

    Text:=sPrintField, _

    PreserveFormatting:=False

End Sub



Function BottomLeft(sngLeft As Single, sngBottom As Single) As String

Dim sReturn As String

sReturn = sngLeft & " " & sngBottom - 2 & " moveto "

sReturn = sReturn & sngLeft & " " & (sngBottom - 2) - 36 & " lineto "

sReturn = sReturn & sngLeft - 2 & " " & sngBottom & " moveto "

sReturn = sReturn & (sngLeft - 2) - 36 & " " & sngBottom & " lineto "

BottomLeft = sReturn

End Function



Function TopLeft(sngLeft As Single, sngTop As Single) As String

Dim sReturn As String

sReturn = sngLeft & " " & (792 - sngTop) + 2 & " moveto "

sReturn = sReturn & sngLeft & " " & (792 - (sngTop + 2)) + 36 & " lineto "

sReturn = sReturn & sngLeft - 2 & " " & 792 - sngTop & " moveto "

sReturn = sReturn & (sngLeft - 2) - 36 & " " & 792 - sngTop & " lineto "

TopLeft = sReturn

End Function



Function TopRight(sngRight As Single, sngTop As Single) As String

Dim sReturn As String

sReturn = 612 - sngRight & " " & (792 - sngTop) + 2 & " moveto "

sReturn = sReturn & 612 - sngRight & " " & (792 - (sngTop + 2)) + 36 & " lineto "

sReturn = sReturn & (612 - sngRight) + 2 & " " & 792 - sngTop & " moveto "

sReturn = sReturn & ((612 - sngRight) + 2) + 36 & " " & 792 - sngTop & " lineto "

TopRight = sReturn

End Function



Function BottomRight(sngRight As Single, sngBottom As Single) As String

Dim sReturn As String

sReturn = 612 - sngRight & " " & sngBottom - 2 & " moveto "

sReturn = sReturn & 612 - sngRight & " " & (sngBottom - 2) - 36 & " lineto "

sReturn = sReturn & (612 - sngRight) + 2 & " " & sngBottom & " moveto "

sReturn = sReturn & ((612 - sngRight) + 2) + 36 & " " & sngBottom & " lineto "

BottomRight = sReturn

End Function

PRINT fields aren't visible in a document unless you've chosen to view field codes. To quickly see all the field codes in a document, press Alt-F9.

Dan Mueller and Andrew Savikas


     Python   SQL   Java   php   Perl 
     game development   web development   internet   *nix   graphics   hardware 
     telecommunications   C++ 
     Flash   Active Directory   Windows