Skip to content

extract class refactoring. #167

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: trunk
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,95 +36,100 @@
*
* @author Tilman Hausherr
*/
public final class CreatePatternsPDF
{
private CreatePatternsPDF()
{
}
public final class CreatePatternsPDF {

public static void main(String[] args) throws IOException
{
try (PDDocument doc = new PDDocument())
{
public static void main(String[] args) throws IOException {
try (PDDocument doc = new PDDocument()) {
PDPage page = new PDPage();
doc.addPage(page);
page.setResources(new PDResources());


PatternDrawer drawer = new PatternDrawer(doc, page);

// Colored pattern, i.e. the pattern content stream will set its own color(s)
try (PDPageContentStream pcs = new PDPageContentStream(doc, page))

// Table 75 spec
PDTilingPattern coloredTilingPattern = drawer.createTilingPattern(
new PDRectangle(0, 0, 10, 10),
PDTilingPattern.PAINT_COLORED,
PDTilingPattern.TILING_CONSTANT_SPACING,
10,
10);
COSName coloredTilingPatternName = page.getResources().add(coloredTilingPattern);
try (PDPatternContentStream cs = new PDPatternContentStream(coloredTilingPattern))
{
// Set color, draw diagonal line + 2 more diagonals so that corners look good
cs.setStrokingColor(Color.red);
cs.moveTo(0, 0);
cs.lineTo(10, 10);
cs.moveTo(-1, 9);
cs.lineTo(1, 11);
cs.moveTo(9, -1);
cs.lineTo(11, 1);
cs.stroke();
}
PDColorSpace coloredPatternCS = new PDPattern(null, PDDeviceRGB.INSTANCE);
PDColor patternColor = new PDColor(coloredTilingPatternName, coloredPatternCS);
drawer.drawPattern(50, 500, 200, 200, patternColor);

// Uncolored pattern - the color is passed later

PDTilingPattern uncoloredTilingPattern = drawer.createTilingPattern(
new PDRectangle(0, 0, 10, 10),
PDTilingPattern.PAINT_UNCOLORED,
PDTilingPattern.TILING_NO_DISTORTION,
10,
10);
COSName uncoloredTilingPatternName = page.getResources().add(uncoloredTilingPattern);
try (PDPatternContentStream cs = new PDPatternContentStream(uncoloredTilingPattern))
{
// Colored pattern, i.e. the pattern content stream will set its own color(s)
PDColorSpace patternCS1 = new PDPattern(null, PDDeviceRGB.INSTANCE);

// Table 75 spec
PDTilingPattern tilingPattern1 = new PDTilingPattern();
tilingPattern1.setBBox(new PDRectangle(0, 0, 10, 10));
tilingPattern1.setPaintType(PDTilingPattern.PAINT_COLORED);
tilingPattern1.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING);
tilingPattern1.setXStep(10);
tilingPattern1.setYStep(10);

COSName patternName1 = page.getResources().add(tilingPattern1);
try (PDPatternContentStream cs1 = new PDPatternContentStream(tilingPattern1))
{
// Set color, draw diagonal line + 2 more diagonals so that corners look good
cs1.setStrokingColor(Color.red);
cs1.moveTo(0, 0);
cs1.lineTo(10, 10);
cs1.moveTo(-1, 9);
cs1.lineTo(1, 11);
cs1.moveTo(9, -1);
cs1.lineTo(11, 1);
cs1.stroke();
}

PDColor patternColor1 = new PDColor(patternName1, patternCS1);

pcs.addRect(50, 500, 200, 200);
pcs.setNonStrokingColor(patternColor1);
pcs.fill();

// Uncolored pattern - the color is passed later
PDTilingPattern tilingPattern2 = new PDTilingPattern();
tilingPattern2.setBBox(new PDRectangle(0, 0, 10, 10));
tilingPattern2.setPaintType(PDTilingPattern.PAINT_UNCOLORED);
tilingPattern2.setTilingType(PDTilingPattern.TILING_NO_DISTORTION);
tilingPattern2.setXStep(10);
tilingPattern2.setYStep(10);

COSName patternName2 = page.getResources().add(tilingPattern2);
try (PDPatternContentStream cs2 = new PDPatternContentStream(tilingPattern2))
{
// draw a cross
cs2.moveTo(0, 5);
cs2.lineTo(10, 5);
cs2.moveTo(5, 0);
cs2.lineTo(5, 10);
cs2.stroke();
}

// Uncolored pattern colorspace needs to know the colorspace
// for the color values that will be passed when painting the fill
PDColorSpace patternCS2 = new PDPattern(null, PDDeviceRGB.INSTANCE);
PDColor patternColor2green = new PDColor(
new float[]{0,1,0},
patternName2,
patternCS2);

pcs.addRect(300, 500, 100, 100);
pcs.setNonStrokingColor(patternColor2green);
pcs.fill();

// same pattern again but with different color + different pattern start position
PDColor patternColor2blue = new PDColor(
new float[]{0,0,1},
patternName2,
patternCS2);
pcs.addRect(455, 505, 100, 100);
pcs.setNonStrokingColor(patternColor2blue);
pcs.fill();
// draw a cross
cs.moveTo(0, 5);
cs.lineTo(10, 5);
cs.moveTo(5, 0);
cs.lineTo(5, 10);
cs.stroke();
}

// Uncolored pattern colorspace needs to know the colorspace
// for the color values that will be passed when painting the fill
PDColorSpace uncoloredPatternCS = new PDPattern(null, PDDeviceRGB.INSTANCE);
PDColor patternColor2green = new PDColor(new float[]{0, 1, 0}, uncoloredTilingPatternName, uncoloredPatternCS);
drawer.drawPattern(300, 500, 100, 100, patternColor2green);

// same pattern again but with different color + different pattern start position
PDColor patternColor2blue = new PDColor(new float[]{0, 0, 1}, uncoloredTilingPatternName, uncoloredPatternCS);
drawer.drawPattern(455, 505, 100, 100, patternColor2blue);

doc.save("patterns.pdf");
}
}
}

final class PatternDrawer{
private final PDDocument document;
private final PDPage page;

public PatternDrawer(PDDocument document, PDPage page) {
this.document = document;
this.page = page;
}

public void drawPattern(float x, float y, float width, float height, PDColor patternColor) throws IOException {
try (PDPageContentStream pcs = new PDPageContentStream(document, page)) {
pcs.addRect(x, y, width, height);
pcs.setNonStrokingColor(patternColor);
pcs.fill();
}
}

public PDTilingPattern createTilingPattern(PDRectangle pdRectangle, int paintType, int tilingType, float xStep, float yStep){
PDTilingPattern tilingPattern = new PDTilingPattern();
tilingPattern.setBBox(pdRectangle);
tilingPattern.setPaintType(paintType);
tilingPattern.setTilingType(tilingType);
tilingPattern.setXStep(xStep);
tilingPattern.setYStep(yStep);
return tilingPattern;
}
}