Compatibilidad de guardado por versión PDF

La versión 3.23.0 trata la versión PDF de guardado seleccionada 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 escriben una salida que coincide con el destino elegido o fallan antes de escribir la salida

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

La comprobación previa de guardado rechaza las funciones conocidas de versiones posteriores en lugar de producir un archivo con versiones mezcladas. Los límites comprobados incluyen cajas de página PDF 1.3, flujos de archivo 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 comprueban por separado de la cabecera PDF 1.7. AESV3, AES-256, RichMedia, Projection, diccionarios geoespaciales y subfiltros de firma ETSI deben tener una declaración Catalog /Extensions /ADBE /ExtensionLevel suficiente antes de aceptar el destino de guardado seleccionado. Los puntos de entrada writer que emiten esas funciones de nivel de extensión añaden automáticamente la declaración de extensión correspondiente cuando el destino seleccionado puede elevarse 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 analiza de inmediato; la detección se ejecuta la primera vez que se consume 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 trabajo de solo lectura que nunca consultan esos diagnósticos y nunca guardan pueden omitir por completo el análisis

Desde v3.67.1, el análisis de detección parsea de forma superficial los objetos stream. Inspecciona los diccionarios de objeto y la clasificación del stream mientras omite cuerpos de stream grandes, de modo que la detección de filtros, subtipos, espacios de color y claves sujetas a versión sigue siendo 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 elecciones explícitas de versión de guardado mantienen 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, por lo que un guardado o una consulta diagnóstica posterior no puede elevar el destino seleccionado a espaldas del llamador. Los documentos recién creados no se arman para detección del lado del cargador, lo que coincide con el comportamiento anterior de control de versión solo del escritor

Los llamadores de TPDFlib reciben LastErrorCode 602 cuando la versión de destino seleccionada es inferior a una función que aún está presente en el documento. Elija una versión de destino más reciente o elimine la función incompatible antes de guardar