use of com.itextpdf.kernel.pdf.PdfDictionary in project i7j-pdfsweep by itext.
the class FilteredImagesCacheTest method assertNumberXObjects.
private void assertNumberXObjects(String output, int n) throws IOException {
PdfDocument doc = new PdfDocument(new PdfReader(output));
int xObjCount = 0;
for (int i = 0; i < doc.getNumberOfPdfObjects(); ++i) {
PdfObject pdfObject = doc.getPdfObject(i);
if (pdfObject != null && pdfObject.isStream()) {
PdfDictionary dict = (PdfDictionary) pdfObject;
if (PdfName.Image.equals(dict.getAsName(PdfName.Subtype)) && dict.containsKey(PdfName.Width) && dict.containsKey(PdfName.Height)) {
++xObjCount;
}
}
}
Assert.assertEquals(n, xObjCount);
}
use of com.itextpdf.kernel.pdf.PdfDictionary in project i7j-pdfsweep by itext.
the class PdfCleanUpTool method extractLocationsFromSingleRedactAnnotation.
/**
* Note: annotation can consist not only of one area specified by the RECT entry, but also of multiple areas specified
* by the QuadPoints entry in the annotation dictionary.
*/
private void extractLocationsFromSingleRedactAnnotation(PdfRedactAnnotation redactAnnotation) {
List<Rectangle> regions;
PdfArray quadPoints = redactAnnotation.getQuadPoints();
if (quadPoints != null && !quadPoints.isEmpty()) {
regions = translateQuadPointsToRectangles(quadPoints);
} else {
regions = new ArrayList<>();
regions.add(redactAnnotation.getRectangle().toRectangle());
}
redactAnnotations.put(redactAnnotation, regions);
int page = pdfDocument.getPageNumber(redactAnnotation.getPage());
Color cleanUpColor = redactAnnotation.getInteriorColor();
PdfDictionary ro = redactAnnotation.getRedactRolloverAppearance();
if (ro != null) {
cleanUpColor = null;
}
for (Rectangle region : regions) {
addCleanupLocation(new PdfCleanUpLocation(page, region, cleanUpColor));
}
}
use of com.itextpdf.kernel.pdf.PdfDictionary in project i7j-pdfsweep by itext.
the class PdfCleanUpTool method drawOverlayText.
private void drawOverlayText(PdfCanvas canvas, String overlayText, Rectangle annotRect, PdfBoolean repeat, PdfString defaultAppearance, int justification) throws IOException {
Map<String, List> parsedDA;
try {
parsedDA = parseDAParam(defaultAppearance);
} catch (NullPointerException npe) {
throw new PdfException(CleanupExceptionMessageConstant.DEFAULT_APPEARANCE_NOT_FOUND);
}
PdfFont font;
float fontSize = 12;
List fontArgs = parsedDA.get("Tf");
PdfDictionary formDictionary = pdfDocument.getCatalog().getPdfObject().getAsDictionary(PdfName.AcroForm);
if (fontArgs != null && formDictionary != null) {
font = getFontFromAcroForm((PdfName) fontArgs.get(0));
fontSize = ((PdfNumber) fontArgs.get(1)).floatValue();
} else {
font = PdfFontFactory.createFont();
}
if (pdfDocument.isTagged()) {
canvas.openTag(new CanvasArtifact());
}
Canvas modelCanvas = new Canvas(canvas, annotRect, false);
Paragraph p = new Paragraph(overlayText).setFont(font).setFontSize(fontSize).setMargin(0);
TextAlignment textAlignment = TextAlignment.LEFT;
switch(justification) {
case 1:
textAlignment = TextAlignment.CENTER;
break;
case 2:
textAlignment = TextAlignment.RIGHT;
break;
default:
}
p.setTextAlignment(textAlignment);
List strokeColorArgs = parsedDA.get("StrokeColor");
if (strokeColorArgs != null) {
p.setStrokeColor(getColor(strokeColorArgs));
}
List fillColorArgs = parsedDA.get("FillColor");
if (fillColorArgs != null) {
p.setFontColor(getColor(fillColorArgs));
}
modelCanvas.add(p);
if (repeat != null && repeat.getValue()) {
boolean hasFull = modelCanvas.getRenderer().hasProperty(Property.FULL);
boolean isFull = hasFull ? (boolean) modelCanvas.getRenderer().getPropertyAsBoolean(Property.FULL) : false;
while (!isFull) {
p.add(overlayText);
LayoutArea previousArea = modelCanvas.getRenderer().getCurrentArea().clone();
modelCanvas.relayout();
if (modelCanvas.getRenderer().getCurrentArea().equals(previousArea)) {
// Avoid infinite loop. This might be caused by the fact that the font does not support the text we want to show
break;
}
hasFull = modelCanvas.getRenderer().hasProperty(Property.FULL);
isFull = hasFull ? (boolean) modelCanvas.getRenderer().getPropertyAsBoolean(Property.FULL) : false;
}
}
modelCanvas.getRenderer().flush();
if (pdfDocument.isTagged()) {
canvas.closeTag();
}
}
use of com.itextpdf.kernel.pdf.PdfDictionary in project i7j-pdfsweep by itext.
the class PdfCleanUpTool method getFontFromAcroForm.
private PdfFont getFontFromAcroForm(PdfName fontName) {
PdfDictionary formDictionary = pdfDocument.getCatalog().getPdfObject().getAsDictionary(PdfName.AcroForm);
PdfDictionary resources = formDictionary.getAsDictionary(PdfName.DR);
PdfDictionary fonts = resources.getAsDictionary(PdfName.Font);
return PdfFontFactory.createFont(fonts.getAsDictionary(fontName));
}
use of com.itextpdf.kernel.pdf.PdfDictionary in project i7j-pdfsweep by itext.
the class CleanUpImagesCompareTool method extractImagesFromPdf.
private Map<Integer, PageImageObjectsPaths> extractImagesFromPdf(String pdf, String outputPath) throws IOException, InterruptedException {
try (PdfReader readerPdf = new PdfReader(pdf);
PdfDocument pdfDoc = new PdfDocument(readerPdf)) {
Map<Integer, PageImageObjectsPaths> imageObjectDatas = new HashMap<>();
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
PdfPage page = pdfDoc.getPage(i);
PageImageObjectsPaths imageObjectData = new PageImageObjectsPaths(page.getPdfObject().getIndirectReference());
Stack<LocalPathItem> baseLocalPath = new Stack<LocalPathItem>();
PdfResources pdfResources = page.getResources();
if (pdfResources.getPdfObject().isIndirect()) {
imageObjectData.addIndirectReference(pdfResources.getPdfObject().getIndirectReference());
} else {
baseLocalPath.push(new DictPathItem(PdfName.Resources));
}
PdfDictionary xObjects = pdfResources.getResource(PdfName.XObject);
if (xObjects == null) {
continue;
}
if (xObjects.isIndirect()) {
imageObjectData.addIndirectReference(xObjects.getIndirectReference());
baseLocalPath.clear();
} else {
baseLocalPath.push(new DictPathItem(PdfName.XObject));
}
boolean isPageToGsExtract = false;
for (PdfName objectName : xObjects.keySet()) {
if (!xObjects.get(objectName).isStream() || !PdfName.Image.equals(xObjects.getAsStream(objectName).getAsName(PdfName.Subtype))) {
continue;
}
PdfImageXObject pdfObject = new PdfImageXObject(xObjects.getAsStream(objectName));
baseLocalPath.push(new DictPathItem(objectName));
if (!useGs) {
String extension = pdfObject.identifyImageFileExtension();
String fileName = outputPath + objectName + "_" + i + "." + extension;
createImageFromPdfXObject(fileName, pdfObject);
} else {
isPageToGsExtract = true;
}
Stack<LocalPathItem> reversedStack = new Stack<>();
reversedStack.addAll(baseLocalPath);
Stack<LocalPathItem> resultStack = new Stack<>();
resultStack.addAll(reversedStack);
imageObjectData.addLocalPath(resultStack);
baseLocalPath.pop();
}
if (useGs && isPageToGsExtract) {
String fileName = "Page_" + i;
ghostscriptHelper.runGhostScriptImageGeneration(pdf, outputPath, fileName, String.valueOf(i));
}
ImageRenderListener listener = new ImageRenderListener();
PdfCanvasProcessor parser = new PdfCanvasProcessor(listener);
parser.processPageContent(page);
ignoredImagesAreas.put(i, listener.getImageRectangles());
imageObjectDatas.put(i, imageObjectData);
}
return imageObjectDatas;
}
}
Aggregations