I have set of methods like following and I need to generate PDF/A-2b file and I need to replace the fonts in pdf if they are not embedded.
I need fix following validation errors.
-
The font programs for all fonts used for rendering within a
conforming file shall be embedded within that file, as defined in ISO
32000-1:2008, 9.9. -
If the FontDescriptor dictionary of an embedded CID font contains a
CIDSet stream, then it shall identify all CIDs which are present in
the font program, regardless of whether a CID in the font is
referenced or used by the PDF or not. -
All fonts and font programs used in a conforming file, regardless of
rendering mode usage, shall conform to the provisions in ISO
32000-1:2008, 9.6 and 9.7, as well as to the font specifications
referenced by these provisions. BaseFont – name – (Required) The
PostScript name of the font
public static byte[] convertToPDFA(InputStream inputStream) throws IOException, PdfException {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(inputStream);
PdfWriter writer = new PdfWriter(outputStream)) {
PdfADocument pdfADoc = getPdfADocument(writer);
try (PdfDocument srcDoc = new PdfDocument(reader)) {
srcDoc.copyPagesTo(1, srcDoc.getNumberOfPages(), pdfADoc);
}
pdfADoc.close();
return outputStream.toByteArray();
}
}
public static PdfADocument getPdfADocument(PdfWriter writer) throws IOException {
String iccProfilePath = ServiceLocator.getInstance().getConfigurationService().getIccProfilePath();
PdfOutputIntent outputIntent;
try (InputStream iccStream = OpenHtmlToPdfUtil.class.getResourceAsStream(iccProfilePath)) {
if (iccStream == null) {
throw new IllegalArgumentException("ICC profile not found at path: " + iccProfilePath);
}
outputIntent = new PdfOutputIntent("Custom", "",
"http://www.color.org", "sRGB IEC61966-2.1", iccStream);
}
PdfADocument pdfADoc = new PdfADocument(writer, getPdfAConformanceLevel(), outputIntent);
addPdfAMarkInfo(pdfADoc);
return pdfADoc;
}
private static PdfAConformanceLevel getPdfAConformanceLevel() {
switch (ServiceLocator.getInstance().getConfigurationService().getPdfAConformanceLevel()) {
case "PDFA_2_B":
return PdfAConformanceLevel.PDF_A_2B;
case "PDFA_3_A":
return PdfAConformanceLevel.PDF_A_3A;
default:
throw new IllegalStateException("Unsupported pdfA conformance level is set: " +
ServiceLocator.getInstance().getConfigurationService().getPdfAConformanceLevel());
}
}
private static void addPdfAMarkInfo(PdfADocument pdfDoc) {
PdfDictionary catalog = pdfDoc.getCatalog().getPdfObject();
PdfDictionary markInfo = catalog.getAsDictionary(PdfName.MarkInfo);
if (markInfo == null) {
markInfo = new PdfDictionary();
markInfo.put(PdfName.Marked, PdfBoolean.TRUE);
catalog.put(PdfName.MarkInfo, markInfo);
}
pdfDoc.setTagged();
PdfStructTreeRoot structTreeRoot = pdfDoc.getStructTreeRoot();
if (structTreeRoot == null) {
structTreeRoot = new PdfStructTreeRoot(pdfDoc);
pdfDoc.getCatalog().put(PdfName.StructTreeRoot, structTreeRoot.getPdfObject());
}
}
2