use of com.tom_roush.pdfbox.pdmodel.PDResources in project PdfBox-Android by TomRoush.
the class PDAbstractAppearanceHandler method getAppearanceEntryAsContentStream.
private PDAppearanceContentStream getAppearanceEntryAsContentStream(PDAppearanceEntry appearanceEntry, boolean compress) throws IOException {
PDAppearanceStream appearanceStream = appearanceEntry.getAppearanceStream();
setTransformationMatrix(appearanceStream);
// ensure there are resources
PDResources resources = appearanceStream.getResources();
if (resources == null) {
resources = new PDResources();
appearanceStream.setResources(resources);
}
return new PDAppearanceContentStream(appearanceStream, compress);
}
use of com.tom_roush.pdfbox.pdmodel.PDResources in project PdfBox-Android by TomRoush.
the class PDAcroFormTest method testAcroFormDefaultFonts.
/**
* PDFBOX-3732, PDFBOX-4303, PDFBOX-4393: Test whether /Helv and /ZaDb get added, but only if
* they don't exist.
*/
@Test
public void testAcroFormDefaultFonts() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDDocument doc = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);
PDAcroForm acroForm2 = new PDAcroForm(doc);
doc.getDocumentCatalog().setAcroForm(acroForm2);
PDResources defaultResources = acroForm2.getDefaultResources();
assertNull(defaultResources);
defaultResources = new PDResources();
acroForm2.setDefaultResources(defaultResources);
assertNull(defaultResources.getFont(COSName.HELV));
assertNull(defaultResources.getFont(COSName.ZA_DB));
// getting AcroForm sets the two fonts
acroForm2 = doc.getDocumentCatalog().getAcroForm();
defaultResources = acroForm2.getDefaultResources();
assertNotNull(defaultResources.getFont(COSName.HELV));
assertNotNull(defaultResources.getFont(COSName.ZA_DB));
// repeat with a new AcroForm (to delete AcroForm cache) and thus missing /DR
doc.getDocumentCatalog().setAcroForm(new PDAcroForm(doc));
acroForm2 = doc.getDocumentCatalog().getAcroForm();
defaultResources = acroForm2.getDefaultResources();
PDFont helv = defaultResources.getFont(COSName.HELV);
PDFont zadb = defaultResources.getFont(COSName.ZA_DB);
assertNotNull(helv);
assertNotNull(zadb);
doc.save(baos);
doc.close();
doc = PDDocument.load(baos.toByteArray());
acroForm2 = doc.getDocumentCatalog().getAcroForm();
defaultResources = acroForm2.getDefaultResources();
helv = defaultResources.getFont(COSName.HELV);
zadb = defaultResources.getFont(COSName.ZA_DB);
assertNotNull(helv);
assertNotNull(zadb);
// make sure that font wasn't overwritten
assertNotEquals(PDType1Font.HELVETICA, helv);
assertNotEquals(PDType1Font.ZAPF_DINGBATS, zadb);
doc.close();
}
use of com.tom_roush.pdfbox.pdmodel.PDResources in project PdfBox-Android by TomRoush.
the class PDAcroFormTest method testAddMissingInformationOnAcroFormAccess.
/*
* Test that we add missing ressouce information to an AcroForm
* when accessing the AcroForm on the PD level
* (PDFBOX-3752)
*/
@Test
public void testAddMissingInformationOnAcroFormAccess() {
try {
byte[] pdfBytes = createAcroFormWithMissingResourceInformation();
PDDocument pdfDocument = PDDocument.load(pdfBytes);
PDDocumentCatalog documentCatalog = pdfDocument.getDocumentCatalog();
// this call shall trigger the generation of missing information
PDAcroForm theAcroForm = documentCatalog.getAcroForm();
// ensure that the missing information has been generated
// DA entry
assertEquals("/Helv 0 Tf 0 g ", theAcroForm.getDefaultAppearance());
assertNotNull(theAcroForm.getDefaultResources());
// DR entry
PDResources acroFormResources = theAcroForm.getDefaultResources();
assertNotNull(acroFormResources.getFont(COSName.getPDFName("Helv")));
assertEquals("Helvetica", acroFormResources.getFont(COSName.getPDFName("Helv")).getName());
assertNotNull(acroFormResources.getFont(COSName.getPDFName("ZaDb")));
assertEquals("ZapfDingbats", acroFormResources.getFont(COSName.getPDFName("ZaDb")).getName());
pdfDocument.close();
} catch (IOException e) {
System.err.println("Couldn't create test document, test skipped");
return;
}
}
use of com.tom_roush.pdfbox.pdmodel.PDResources in project PdfBox-Android by TomRoush.
the class TestOptionalContentGroups method testOCGConsumption.
/**
* Tests OCG functions on a loaded PDF.
* @throws Exception if an error occurs
*/
public void testOCGConsumption() throws Exception {
File pdfFile = new File(testResultsDir, "ocg-generation.pdf");
if (!pdfFile.exists()) {
testOCGGeneration();
}
PDDocument doc = PDDocument.load(pdfFile);
try {
assertEquals(1.5f, doc.getVersion());
PDDocumentCatalog catalog = doc.getDocumentCatalog();
PDPage page = doc.getPage(0);
PDResources resources = page.getResources();
COSName mc0 = COSName.getPDFName("oc1");
PDOptionalContentGroup ocg = (PDOptionalContentGroup) resources.getProperties(mc0);
assertNotNull(ocg);
assertEquals("background", ocg.getName());
assertNull(resources.getProperties(COSName.getPDFName("inexistent")));
PDOptionalContentProperties ocgs = catalog.getOCProperties();
assertEquals(BaseState.ON, ocgs.getBaseState());
Set<String> names = new java.util.HashSet<String>(Arrays.asList(ocgs.getGroupNames()));
assertEquals(3, names.size());
assertTrue(names.contains("background"));
assertTrue(ocgs.isGroupEnabled("background"));
assertTrue(ocgs.isGroupEnabled("enabled"));
assertFalse(ocgs.isGroupEnabled("disabled"));
ocgs.setGroupEnabled("background", false);
assertFalse(ocgs.isGroupEnabled("background"));
PDOptionalContentGroup background = ocgs.getGroup("background");
assertEquals(ocg.getName(), background.getName());
assertNull(ocgs.getGroup("inexistent"));
Collection<PDOptionalContentGroup> coll = ocgs.getOptionalContentGroups();
assertEquals(3, coll.size());
Set<String> nameSet = new HashSet<String>();
for (PDOptionalContentGroup ocg2 : coll) {
nameSet.add(ocg2.getName());
}
assertTrue(nameSet.contains("background"));
assertTrue(nameSet.contains("enabled"));
assertTrue(nameSet.contains("disabled"));
} finally {
doc.close();
}
}
use of com.tom_roush.pdfbox.pdmodel.PDResources in project PdfBox-Android by TomRoush.
the class TestOptionalContentGroupsInstrumentationTest method testOCGGenerationSameNameCanHaveSameVisibilityOff.
/**
* PDFBOX-4496: setGroupEnabled(String, boolean) must catch all OCGs of a name even when several
* names are identical.
*
* @throws IOException
*/
@Test
public void testOCGGenerationSameNameCanHaveSameVisibilityOff() throws IOException {
Bitmap expectedImage;
Bitmap actualImage;
PDDocument doc = new PDDocument();
try {
// Create new page
PDPage page = new PDPage();
doc.addPage(page);
PDResources resources = page.getResources();
if (resources == null) {
resources = new PDResources();
page.setResources(resources);
}
// Prepare OCG functionality
PDOptionalContentProperties ocprops = new PDOptionalContentProperties();
doc.getDocumentCatalog().setOCProperties(ocprops);
// ocprops.setBaseState(BaseState.ON); //ON=default
// Create OCG for background
PDOptionalContentGroup background = new PDOptionalContentGroup("background");
ocprops.addGroup(background);
assertTrue(ocprops.isGroupEnabled("background"));
// Create OCG for enabled
PDOptionalContentGroup enabled = new PDOptionalContentGroup("science");
ocprops.addGroup(enabled);
assertFalse(ocprops.setGroupEnabled("science", true));
assertTrue(ocprops.isGroupEnabled("science"));
// Create OCG for disabled1
PDOptionalContentGroup disabled1 = new PDOptionalContentGroup("alternative");
ocprops.addGroup(disabled1);
// Create OCG for disabled2 with same name as disabled1
PDOptionalContentGroup disabled2 = new PDOptionalContentGroup("alternative");
ocprops.addGroup(disabled2);
assertFalse(ocprops.setGroupEnabled("alternative", false));
assertFalse(ocprops.isGroupEnabled("alternative"));
// Setup page content stream and paint background/title
PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.OVERWRITE, false);
PDFont font = PDType1Font.HELVETICA_BOLD;
contentStream.beginMarkedContent(COSName.OC, background);
contentStream.beginText();
contentStream.setFont(font, 14);
contentStream.newLineAtOffset(80, 700);
contentStream.showText("PDF 1.5: Optional Content Groups");
contentStream.endText();
contentStream.endMarkedContent();
font = PDType1Font.HELVETICA;
// Paint enabled layer
contentStream.beginMarkedContent(COSName.OC, enabled);
contentStream.setNonStrokingColor(AWTColor.GREEN);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(80, 600);
contentStream.showText("The earth is a sphere");
contentStream.endText();
contentStream.endMarkedContent();
// Paint disabled layer1
contentStream.beginMarkedContent(COSName.OC, disabled1);
contentStream.setNonStrokingColor(AWTColor.RED);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(80, 500);
contentStream.showText("Alternative 1: The earth is a flat circle");
contentStream.endText();
contentStream.endMarkedContent();
// Paint disabled layer2
contentStream.beginMarkedContent(COSName.OC, disabled2);
contentStream.setNonStrokingColor(AWTColor.BLUE);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(80, 450);
contentStream.showText("Alternative 2: The earth is a flat parallelogram");
contentStream.endText();
contentStream.endMarkedContent();
contentStream.close();
doc.getDocumentCatalog().setPageMode(PageMode.USE_OPTIONAL_CONTENT);
File targetFile = new File(testResultsDir, "ocg-generation-same-name-off.pdf");
doc.save(targetFile.getAbsolutePath());
doc.close();
// render PDF with science disabled and alternatives with same name enabled
doc = PDDocument.load(new File(testResultsDir, "ocg-generation-same-name-off.pdf"));
doc.getDocumentCatalog().getOCProperties().setGroupEnabled("background", false);
doc.getDocumentCatalog().getOCProperties().setGroupEnabled("science", false);
doc.getDocumentCatalog().getOCProperties().setGroupEnabled("alternative", true);
actualImage = new PDFRenderer(doc).renderImage(0, 2);
actualImage.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(new File(testResultsDir, "ocg-generation-same-name-off-actual.png")));
} finally {
doc.close();
}
// create PDF without OCGs to created expected rendering
PDDocument doc2 = new PDDocument();
try {
// Create new page
PDPage page = new PDPage();
doc2.addPage(page);
PDResources resources = page.getResources();
if (resources == null) {
resources = new PDResources();
page.setResources(resources);
}
PDPageContentStream contentStream = new PDPageContentStream(doc2, page, AppendMode.OVERWRITE, false);
PDFont font = PDType1Font.HELVETICA;
contentStream.setNonStrokingColor(AWTColor.RED);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(80, 500);
contentStream.showText("Alternative 1: The earth is a flat circle");
contentStream.endText();
contentStream.setNonStrokingColor(AWTColor.BLUE);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(80, 450);
contentStream.showText("Alternative 2: The earth is a flat parallelogram");
contentStream.endText();
contentStream.close();
expectedImage = new PDFRenderer(doc2).renderImage(0, 2);
actualImage.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(new File(testResultsDir, "ocg-generation-same-name-off-expected.png")));
} finally {
doc2.close();
}
// compare images
int height = expectedImage.getHeight();
int width = expectedImage.getWidth();
int[] expectedImagePixels = new int[width * height];
expectedImage.getPixels(expectedImagePixels, 0, width, 0, 0, width, height);
int[] actualImagePixels = new int[width * height];
actualImage.getPixels(actualImagePixels, 0, width, 0, 0, width, height);
Assert.assertArrayEquals(expectedImagePixels, actualImagePixels);
}
Aggregations