Compatibilidad de guardado por versión PDF

La versión 3.23.0 trata la versión PDF seleccionada para guardar como un contrato estricto para guardados completos. Cuando una aplicación llama a SetInformation(0, "1.2"), "1.3", "1.4", "1.5", "1.6" o "1.7", SaveToFile, SaveToString y SaveToStream generan una salida que coincide con la versión objetivo o fallan antes de escribir nada

Los guardados completos eliminan los reemplazos Catalog /Version para que un documento cargado no pueda elevar silenciosamente la versión efectiva por encima del encabezado seleccionado. Los objetivos de versión inferior también eliminan entradas Catalog /Extensions no admitidas, y los objetivos PDF 1.3 omiten Catalog /Metadata y los flujos XMP Metadata, pero conservan el diccionario de información del documento

La comprobación previa al guardado rechaza funciones conocidas de versiones posteriores en lugar de crear un archivo con requisitos de versión mezclados. Los límites revisados incluyen cajas de página PDF 1.3, flujos de archivos incrustados, acciones JavaScript, espacios de color ICCBased y DeviceN y ToUnicode CMaps; transparencia PDF 1.4, estructuras Tagged PDF, output intents y claves de anotación; object streams PDF 1.5, contenido opcional, XFA, page tabs, marcas append-only de campos de firma y marcas avanzadas de campos de formulario; PDF 1.6 UserUnit, programas de fuente OpenType, diccionarios 3D, espacios de color NChannel y datos de viewport; y PDF 1.7 RichMedia, Projection, Redaction, anotaciones avanzadas y subfiltros de firma ETSI. El mismo conjunto de reglas también cubre la opacidad annotation /CA, JBIG2Decode, los flujos Metadata, el árbol de nombres EmbeddedFiles a nivel de documento, JPXDecode, xref streams, Crypt filters, AESV2 crypt filters y PDF 1.7 Requirements

Los requisitos de nivel de extensión Adobe de PDF 1.7 se revisan por separado del encabezado PDF 1.7. AESV3, AES-256, RichMedia, Projection, diccionarios geoespaciales y subfiltros de firma ETSI deben contar con una declaración Catalog /Extensions /ADBE /ExtensionLevel suficiente antes de aceptar la versión objetivo seleccionada. Los puntos de entrada writer que emiten esas funciones de nivel de extensión agregan automáticamente la declaración de extensión correspondiente cuando el objetivo seleccionado puede subir a PDF 1.7

Desde v3.67.0, la detección de funciones de contenido del lado del cargador es diferida. Un documento cargado no se escanea de inmediato; la detección se ejecuta la primera vez que se usa la versión efectiva o el diagnóstico de funciones de carga mediante GetInformation(0/101/103), GetPDFUADiagnostics, SaveToFile, SaveToString, SaveToStream o rutas append-save relacionadas. Los flujos de solo lectura que nunca consultan esos diagnósticos y nunca guardan pueden omitir el escaneo por completo

Desde v3.67.1, el escaneo de detección analiza superficialmente los objetos stream. Inspecciona diccionarios de objeto y la clasificación del stream mientras omite cuerpos de stream grandes, por lo que la detección de filtros, subtipos, espacios de color y claves que fuerzan una versión se mantiene equivalente mientras los grandes flujos de imagen dejan de dominar el análisis. Las lecturas normales de objetos y todas las rutas de guardado siguen leyendo el cuerpo completo del stream cuando la salida lo requiere

Desde v3.67.2, las selecciones explícitas de versión para guardar tienen prioridad sobre la detección diferida. En un documento cargado, SetInformation(0, ...) y LockSaveVersion ejecutan la instantánea de detección pendiente antes de aplicar la versión solicitada, así que un guardado o una consulta de diagnóstico posterior no puede elevar la versión objetivo a espaldas del llamador. Los documentos recién creados no se preparan para la detección del lado del cargador, igual que el comportamiento anterior de control de versión solo del escritor

Los llamadores de TPDFlib reciben LastErrorCode 602 cuando la versión objetivo seleccionada es inferior a una función que todavía existe en el documento. Elija una versión objetivo más reciente o quite la función incompatible antes de guardar