-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f6be71e
commit 6e27f03
Showing
14 changed files
with
377 additions
and
307 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,25 @@ | ||
package de.yellowant.xojtoimage.renderer.pdf; | ||
|
||
import java.io.IOException; | ||
import java.io.OutputStreamWriter; | ||
import java.util.LinkedList; | ||
import java.util.List; | ||
|
||
/** | ||
* @author Anton Schirg | ||
*/ | ||
public class PdfArray extends PdfObject { | ||
public List<PdfObject> elements = new LinkedList<>(); | ||
public List<PdfObject> elements = new LinkedList<>(); | ||
|
||
@Override | ||
public String render() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append("["); | ||
String delim = ""; | ||
for (PdfObject element : elements) { | ||
sb.append(delim).append(element.render()); | ||
delim = " "; | ||
} | ||
sb.append("]"); | ||
return sb.toString(); | ||
} | ||
@Override | ||
public void render(OutputStreamWriter out) throws IOException { | ||
out.write("["); | ||
String delim = ""; | ||
for (PdfObject element : elements) { | ||
out.write(delim); | ||
element.render(out); | ||
delim = " "; | ||
} | ||
out.write("]"); | ||
} | ||
} |
28 changes: 14 additions & 14 deletions
28
src/de/yellowant/xojtoimage/renderer/pdf/PdfDictionary.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,25 @@ | ||
package de.yellowant.xojtoimage.renderer.pdf; | ||
|
||
import java.io.IOException; | ||
import java.io.OutputStreamWriter; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
/** | ||
* @author Anton Schirg | ||
*/ | ||
public class PdfDictionary extends PdfObject { | ||
public Map<PdfName, PdfObject> dict = new HashMap<>(); | ||
public Map<PdfName, PdfObject> dict = new HashMap<>(); | ||
|
||
@Override | ||
public String render() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append("<< "); | ||
for (Map.Entry<PdfName, PdfObject> pdfObjectEntry : dict.entrySet()) { | ||
sb.append(pdfObjectEntry.getKey().render()); | ||
sb.append(" "); | ||
sb.append(pdfObjectEntry.getValue().render()); | ||
sb.append("\n"); | ||
} | ||
sb.append(">>"); | ||
return sb.toString(); | ||
} | ||
@Override | ||
public void render(OutputStreamWriter out) throws IOException { | ||
out.write("<< "); | ||
for (Map.Entry<PdfName, PdfObject> pdfObjectEntry : dict.entrySet()) { | ||
pdfObjectEntry.getKey().render(out); | ||
out.write(" "); | ||
pdfObjectEntry.getValue().render(out); | ||
out.write("\n"); | ||
} | ||
out.write(">>"); | ||
} | ||
} |
167 changes: 89 additions & 78 deletions
167
src/de/yellowant/xojtoimage/renderer/pdf/PdfDocument.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,88 +1,99 @@ | ||
package de.yellowant.xojtoimage.renderer.pdf; | ||
|
||
import java.io.IOException; | ||
import java.io.OutputStreamWriter; | ||
import java.util.LinkedList; | ||
import java.util.List; | ||
|
||
/** | ||
* @author Anton Schirg | ||
*/ | ||
public class PdfDocument { | ||
public List<PdfPage> pages = new LinkedList<>(); | ||
public List<PdfIndirectObject> fonts = new LinkedList<>(); | ||
final PdfIndirectObject rootObject; | ||
|
||
final PdfIndirectObject pagesObject; | ||
final PdfArray pagesArray; | ||
private int objectCounter = 0; | ||
private final PdfLong pageCount; | ||
|
||
public PdfDocument() { | ||
PdfDictionary catalogDict = new PdfDictionary(); | ||
catalogDict.dict.put(new PdfName("Type"), new PdfName("Catalog")); | ||
rootObject = constructIndirectObject(catalogDict); | ||
|
||
PdfDictionary pagesDict = new PdfDictionary(); | ||
pagesDict.dict.put(new PdfName("Type"), new PdfName("Pages")); | ||
pagesArray = new PdfArray(); | ||
pagesDict.dict.put(new PdfName("Kids"), pagesArray); | ||
pagesObject = constructIndirectObject(pagesDict); | ||
pageCount = new PdfLong(pagesArray.elements.size()); | ||
pagesDict.dict.put(new PdfName("Count"), pageCount); | ||
catalogDict.dict.put(new PdfName("Pages"), new PdfIndirectReference(pagesObject)); | ||
} | ||
|
||
public String render() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append("%PDF-1.0\n\n"); | ||
|
||
sb.append(rootObject.render()).append("\n\n"); | ||
|
||
sb.append(pagesObject.render()).append("\n\n"); | ||
|
||
for (PdfIndirectObject font : fonts) { | ||
sb.append(font.render()).append("\n"); | ||
} | ||
sb.append("\n"); | ||
|
||
for (PdfPage page : pages) { | ||
sb.append(page.render()).append("\n"); | ||
} | ||
sb.append("\n"); | ||
|
||
sb.append("xref\n"); | ||
sb.append("0 ").append(objectCounter + 1).append("\n\n"); //Num object incl xref | ||
|
||
sb.append("trailer\n"); | ||
PdfDictionary trailerDict = new PdfDictionary(); | ||
trailerDict.dict.put(new PdfName("Size"), new PdfLong(objectCounter + 1)); | ||
trailerDict.dict.put(new PdfName("Root"), new PdfIndirectReference(rootObject)); | ||
sb.append(trailerDict.render()).append("\n"); | ||
sb.append("startxref\n\n"); | ||
|
||
sb.append("%%EOF"); | ||
return sb.toString(); | ||
} | ||
|
||
public PdfIndirectObject constructIndirectObject(PdfObject object) { | ||
objectCounter++; | ||
return new PdfIndirectObject(object, objectCounter, 0); | ||
} | ||
|
||
public PdfPage addPage(double width, double height) { | ||
PdfPage page = new PdfPage(this,width, height); | ||
pages.add(page); | ||
pagesArray.elements.add(new PdfIndirectReference(page.page)); | ||
pageCount.value = pagesArray.elements.size(); | ||
return page; | ||
} | ||
|
||
public PdfIndirectObject addFont(String baseFont) { | ||
PdfDictionary fontDefDict = new PdfDictionary(); | ||
fontDefDict.dict.put(new PdfName("Type"), new PdfName("Font")); | ||
fontDefDict.dict.put(new PdfName("Subtype"), new PdfName("Type1")); | ||
fontDefDict.dict.put(new PdfName("BaseFont"), new PdfName(baseFont)); | ||
PdfIndirectObject indirectObject = constructIndirectObject(fontDefDict); | ||
fonts.add(indirectObject); | ||
return indirectObject; | ||
} | ||
public List<PdfPage> pages = new LinkedList<>(); | ||
public List<PdfIndirectObject> fonts = new LinkedList<>(); | ||
final PdfIndirectObject rootObject; | ||
|
||
final PdfIndirectObject pagesObject; | ||
final PdfArray pagesArray; | ||
private int objectCounter = 0; | ||
private final PdfLong pageCount; | ||
|
||
public PdfDocument() { | ||
PdfDictionary catalogDict = new PdfDictionary(); | ||
catalogDict.dict.put(new PdfName("Type"), new PdfName("Catalog")); | ||
rootObject = constructIndirectObject(catalogDict); | ||
|
||
PdfDictionary pagesDict = new PdfDictionary(); | ||
pagesDict.dict.put(new PdfName("Type"), new PdfName("Pages")); | ||
pagesArray = new PdfArray(); | ||
pagesDict.dict.put(new PdfName("Kids"), pagesArray); | ||
pagesObject = constructIndirectObject(pagesDict); | ||
pageCount = new PdfLong(pagesArray.elements.size()); | ||
pagesDict.dict.put(new PdfName("Count"), pageCount); | ||
catalogDict.dict.put(new PdfName("Pages"), new PdfIndirectReference( | ||
pagesObject)); | ||
} | ||
|
||
public void render(OutputStreamWriter out) throws IOException { | ||
out.write("%PDF-1.0\n\n"); | ||
|
||
rootObject.render(out); | ||
out.write("\n\n"); | ||
|
||
pagesObject.render(out); | ||
out.write("\n\n"); | ||
|
||
for (PdfIndirectObject font : fonts) { | ||
font.render(out); | ||
out.write("\n"); | ||
} | ||
out.write("\n"); | ||
|
||
for (PdfPage page : pages) { | ||
page.render(out); | ||
out.write("\n"); | ||
} | ||
out.write("\n"); | ||
|
||
out.write("xref\n"); | ||
out.write("0 "); | ||
out.write(objectCounter + 1); | ||
out.write("\n\n"); // Num object | ||
// incl xref | ||
|
||
out.write("trailer\n"); | ||
PdfDictionary trailerDict = new PdfDictionary(); | ||
trailerDict.dict.put(new PdfName("Size"), | ||
new PdfLong(objectCounter + 1)); | ||
trailerDict.dict.put(new PdfName("Root"), new PdfIndirectReference( | ||
rootObject)); | ||
trailerDict.render(out); | ||
out.write("\n"); | ||
out.write("startxref\n\n"); | ||
|
||
out.write("%%EOF"); | ||
} | ||
|
||
public PdfIndirectObject constructIndirectObject(PdfObject object) { | ||
objectCounter++; | ||
return new PdfIndirectObject(object, objectCounter, 0); | ||
} | ||
|
||
public PdfPage addPage(double width, double height) { | ||
PdfPage page = new PdfPage(this, width, height); | ||
pages.add(page); | ||
pagesArray.elements.add(new PdfIndirectReference(page.page)); | ||
pageCount.value = pagesArray.elements.size(); | ||
return page; | ||
} | ||
|
||
public PdfIndirectObject addFont(String baseFont) { | ||
PdfDictionary fontDefDict = new PdfDictionary(); | ||
fontDefDict.dict.put(new PdfName("Type"), new PdfName("Font")); | ||
fontDefDict.dict.put(new PdfName("Subtype"), new PdfName("Type1")); | ||
fontDefDict.dict.put(new PdfName("BaseFont"), new PdfName(baseFont)); | ||
PdfIndirectObject indirectObject = constructIndirectObject(fontDefDict); | ||
fonts.add(indirectObject); | ||
return indirectObject; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 22 additions & 17 deletions
39
src/de/yellowant/xojtoimage/renderer/pdf/PdfIndirectObject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,30 @@ | ||
package de.yellowant.xojtoimage.renderer.pdf; | ||
|
||
import java.io.IOException; | ||
import java.io.OutputStreamWriter; | ||
|
||
/** | ||
* @author Anton Schirg | ||
*/ | ||
public class PdfIndirectObject extends PdfObject { //TODO Make generic for contained object type | ||
public PdfObject object; | ||
public int number; | ||
public int generation; | ||
public class PdfIndirectObject extends PdfObject { // TODO Make generic for | ||
// contained object type | ||
public PdfObject object; | ||
public int number; | ||
public int generation; | ||
|
||
public PdfIndirectObject(PdfObject object, int number, int generation) { | ||
this.object = object; | ||
this.number = number; | ||
this.generation = generation; | ||
} | ||
public PdfIndirectObject(PdfObject object, int number, int generation) { | ||
this.object = object; | ||
this.number = number; | ||
this.generation = generation; | ||
} | ||
|
||
@Override | ||
public String render() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append(number).append(" ").append(generation).append(" obj\n"); | ||
sb.append(object.render()); | ||
sb.append("\nendobj"); | ||
return sb.toString(); | ||
} | ||
@Override | ||
public void render(OutputStreamWriter out) throws IOException { | ||
out.write(number + ""); | ||
out.write(" "); | ||
out.write(generation + ""); | ||
out.write(" obj\n"); | ||
object.render(out); | ||
out.write("\nendobj"); | ||
} | ||
} |
Oops, something went wrong.