Ir al contenido
getnextpdf.com

Pro edición

Output Pipeline — Referencia detallada

Esta página es la referencia detallada de la superficie pública de NextPDF\Pro\OutputPipeline. Abarca la construcción y validación del manifiesto, el orden de ejecución topológico, la semántica de reintentos y tiempos de espera, el comportamiento de reanudación y la barrera de capacidad de packs fail-closed. Indica los parámetros, los valores predeterminados y los modos de fallo de cada símbolo público. Lea primero la página de capacidad de Output Pipeline para orientación sobre el flujo de trabajo.

Esta capacidad se incluye en NextPDF Pro (nextpdf/pro) y se activa con un sobre de licencia de nivel Pro. Un despliegue sin ese derecho no carga las clases de la capacidad. Compare ediciones y obtenga una licencia.

El ejecutor y siete de los diez tipos de paso no llevan ninguna marca por función. Tres tipos de paso requieren además una capacidad de Pack:

Tipo de pasoValor del manifiestoCapacidad requeridaPack
Redactredactpack.privacy.redactPrivacy Pack
Extractextractpack.intelligence.extractIntelligence Pack
OCR overlayocr_overlaypack.intelligence.searchable_pdfIntelligence Pack

La barrera se aplica en tiempo de ejecución, fail-closed, antes de que el paso llegue a su resolver. Un paso restringido sin licencia produce un resultado de paso Failed que lleva el código SPEC-LIC-001 y la capacidad requerida; el resolver nunca se invoca. Un pipeline sin resolver de capacidad inyectado rechaza todos los pasos restringidos.

Ventana de terminal
composer require nextpdf/pro:^3

El metapaquete nextpdf/premium instala el código de nextpdf/pro; este módulo reside en el espacio de nombres NextPDF\Pro\OutputPipeline.

SímboloParámetrosComportamiento predeterminadoDevuelveLanza o falla conNotas
PipelineExecutor::__constructStepResolverRegistry $registry, ?CapabilityResolverInterface $capabilityResolver = nullVincula el registro de resolvers integrado y la fuente de derechos opcionalPipelineExecutorNada declaradoUn resolver de capacidad null rechaza todos los pasos restringidos por Pack
PipelineExecutor::executePipelineManifest $manifest, array $variables = []Ejecuta los pasos en orden topológico y agrega los resultadosPipelineResultNada declarado; los fallos del resolver se capturan como resultados de paso FailedDiseñado para ejecutarse dentro de un worker de trabajos asíncrono
PipelineManifest::__constructstring $id, array $steps, PipelineOptions $options = new PipelineOptions(), ?string $resumeFromStepId = nullValida el grafo de pasos en la construcciónPipelineManifestInvalidArgumentException ante una lista de pasos vacía, IDs de paso duplicados, dependencias desconocidas, ciclos, incompatibilidad de tipos de salida o un paso de reanudación inexistente; OverflowException por encima de 10 000 pasosToda la validación se completa antes de cualquier ejecución
PipelineManifest::topologicalOrderningunoOrdena los pasos con las dependencias antes que los dependienteslist<PipelineStep>Nada declaradoDeterminista para un manifiesto dado
PipelineManifest::getStepstring $stepIdBúsqueda lineal por ID de paso?PipelineStepNada declaradonull para un ID desconocido
PipelineManifest::rootStepsningunoDevuelve los pasos sin dependenciaslist<PipelineStep>Nada declaradoLos pasos raíz se ejecutan primero
PipelineManifestBuilder::createstring $manifestIdInicia un nuevo builderselfNada declaradoEl constructor es privado; esta es la única entrada
PipelineManifestBuilder::addStepstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], ?StepOutputType $outputType = nullAñade un paso; un tipo de salida null se infiere a partir del tipo de pasoselfNada declaradoLa validación se aplaza a build()
PipelineManifestBuilder::stopOnErrorbool $stop = trueEstablece la detención en el primer falloselfNada declaradoPredeterminado a true
PipelineManifestBuilder::maxRetriesint $retriesEstablece el límite de reintentos por pasoselfNada declaradoPredeterminado a 0 (sin reintentos)
PipelineManifestBuilder::timeoutint $timeoutMsEstablece el tiempo de espera global del pipelineselfNada declarado0 desactiva el tiempo de espera
PipelineManifestBuilder::resumeFromstring $stepIdEstablece el punto de reanudaciónselfNada declaradoEl paso debe existir en el momento de build()
PipelineManifestBuilder::buildningunoConstruye el manifiesto validadoPipelineManifestIgual que PipelineManifest::__construct
PipelineOptions::__constructbool $stopOnError = true, int $maxRetries = 0, int $timeoutMs = 0Opciones de ejecución inmutablesPipelineOptionsNada declaradoObjeto de valor readonly
PipelineStep::__constructstring $id, PipelineStepType $type, array $parameters = [], array $dependsOn = [], StepOutputType $outputType = StepOutputType::PdfDefinición de paso inmutablePipelineStepNada declaradoLa construcción directa establece el tipo de salida a PDF de forma predeterminada para cada tipo
PipelineStep::isRootningunoTrue cuando el paso no tiene dependenciasboolNada declarado
PipelineStepType (enum)Diez casos respaldados por cadena: generate, merge, split, inspect, compress, sign, convert, más los restringidos redact, extract, ocr_overlayUn caso por operación integrada
PipelineStepType::requiresPackningunoTrue para Redact, Extract y OcrOverlayboolNada declaradoTodos los demás casos devuelven false
PipelineStepType::requiredCapabilityningunoAsigna los casos restringidos a sus códigos de capacidad?stringNada declaradonull para los casos no restringidos
PipelineStatus (enum)Cinco casos: pending, running, completed, failed, cancelledCompartido por los resultados de pipeline y de paso
PipelineStatus::isTerminalningunoTrue para Completed, Failed y CancelledboolNada declaradoPending y Running no son terminales
StepOutputType (enum)Tres casos: pdf, json, metadataImpulsa la validación de aristas en tiempo de construcción
StepOutputType::forStepTypePipelineStepType $stepTypeTipo de salida predeterminado para un tipo de pasoselfNada declaradoInspect y Extract se asignan a JSON; todos los demás tipos se asignan a PDF
StepOutputType::isCompatibleWithself $expectedInputTrue para una coincidencia del mismo tipo o una salida PDFboolNada declaradoAuxiliar; PDF es la entrada universal
PipelineContext::__constructstring $manifestId, array $variables = [], ?string $resumeFromStepId = nullContexto en memoria por ejecuciónPipelineContextNada declaradoSin TTL, caducidad, persistencia ni almacén de respaldo
PipelineContext::setStepResult / ::getStepResultstring $stepId (+ StepResult al establecer)Registra o lee un resultado de pasovoid / ?StepResultNada declaradonull para un paso aún no ejecutado
PipelineContext::setStepOutput / ::getStepOutputstring $stepId (+ mixed al establecer)Almacena o lee una salida intermediavoid / mixedNada declaradonull para una salida ausente
PipelineContext::hasStepResultstring $stepIdSi un paso ya se ejecutóboolNada declaradoAdmite comprobaciones de reanudación
PipelineContext::allStepResultsningunoTodos los resultados registrados hasta el momentoarray<string, StepResult>Nada declaradoIndexado por ID de paso
PipelineContext::isResumeningunoSi la ejecución se reanuda desde un pasoboolNada declarado
PipelineResult::isSuccessningunoTrue solo para el estado global CompletedboolNada declaradoEl resultado lo produce el ejecutor
PipelineResult::getStepResultstring $stepIdEncuentra un resultado de paso por ID?StepResultNada declaradonull para pasos omitidos o desconocidos
PipelineResult::failedStepsningunoFiltra los resultados de paso fallidoslist<StepResult>Nada declaradoLista vacía cuando todo tiene éxito
StepResult::isSuccessningunoTrue solo para el estado de paso CompletedboolNada declaradoLleva stepId, type, status, durationMs, error, output
CapabilityResolverInterface::hasCapabilitystring $capabilityPrueba afirmativa de derecho para un código de capacidadboolNo debe lanzarDenegación por omisión: false para códigos desconocidos, caducados o no asignados
final class PipelineExecutor
{
public function __construct(
private readonly StepResolverRegistry $registry,
private readonly ?CapabilityResolverInterface $capabilityResolver = null,
)
public function execute(PipelineManifest $manifest, array $variables = []): PipelineResult
}
final class PipelineManifestBuilder
{
public static function create(string $manifestId): self
public function addStep(
string $id,
PipelineStepType $type,
array $parameters = [],
array $dependsOn = [],
?StepOutputType $outputType = null,
): self
public function stopOnError(bool $stop = true): self
public function maxRetries(int $retries): self
public function timeout(int $timeoutMs): self
public function resumeFrom(string $stepId): self
public function build(): PipelineManifest
}
interface CapabilityResolverInterface
{
public function hasCapability(string $capability): bool;
}

La validación se ejecuta en el constructor de PipelineManifest, antes de cualquier ejecución. En orden: la lista de pasos no debe estar vacía; el número de pasos está limitado a 10 000, lo que convierte cadenas de dependencias adversarialmente profundas en una OverflowException capturable en lugar de un agotamiento nativo de la pila; los IDs de paso deben ser únicos; toda referencia dependsOn debe resolverse; el grafo de dependencias debe ser acíclico; los tipos de salida deben ser compatibles; un paso de reanudación declarado debe existir. Cada infracción lanza InvalidArgumentException con un mensaje específico.

La comprobación de tipo de salida se aplica a los pasos cuyo tipo se asigna a salida PDF: toda dependencia de un paso así debe producir a su vez salida PDF. Las aristas de dependencia hacia tipos de paso que producen JSON (inspect, extract) no se comprueban por tipo en esta versión.

Orden de ejecución, reanudación y tiempo de espera

Sección titulada «Orden de ejecución, reanudación y tiempo de espera»

execute($manifest, $variables) construye un PipelineContext nuevo, calcula el orden topológico y ejecuta los pasos secuencialmente en ese orden. Con un punto de reanudación establecido, los pasos anteriores se omiten hasta alcanzar el paso indicado. Los predecesores omitidos no se vuelven a ejecutar y sus salidas no se restauran: el contexto es por ejecución y en memoria, de modo que un paso reanudado que lea la salida de un predecesor omitido observa null.

El tiempo de espera global, cuando es positivo, se evalúa entre pasos, antes de que comience cada paso. Al expirar, el estado del pipeline pasa a Failed y los pasos restantes no comienzan. Un paso que ya se está ejecutando nunca se interrumpe a mitad de ejecución, por lo que un paso largo puede exceder el presupuesto.

Cada paso recibe como máximo maxRetries + 1 intentos. Un intento con éxito retorna de inmediato. Cualquier intento fallido —un resultado Failed del resolver o un Throwable lanzado— se reintenta mientras queden intentos; se devuelve el resultado del último intento. Un Throwable lanzado dentro de un resolver se degrada a un resultado de paso Failed que lleva el mensaje de la excepción, o Unknown error cuando el mensaje está vacío. Por tanto, execute() siempre devuelve un PipelineResult; nunca propaga un fallo del resolver.

Un tipo de paso sin resolver registrado produce un resultado de paso Failed con un mensaje explícito; la ejecución no se aborta. Con stopOnError en true (el valor predeterminado), la ejecución se detiene en el primer paso fallido y el estado del pipeline es Failed. Con él en false, la ejecución continúa y el estado final es Failed si algún paso falló, y Completed en caso contrario.

Antes de cualquier despacho de resolver, cada paso restringido por Pack (Redact, Extract, OcrOverlay) se comprueba contra el CapabilityResolverInterface inyectado. La barrera es fail-closed: un resolver ausente, una respuesta false o un código de capacidad no asignado rechazan el paso en todos los casos. El rechazo produce un resultado de paso Failed cuyo error lleva el código SPEC-LIC-001, el tipo de paso y la capacidad requerida. Un rechazo por barrera no consume intentos de reintento e informa una duración de 0.0. Las implementaciones del resolver deben devolver true únicamente para un derecho poseído de forma afirmativa y no deben lanzar.

PipelineResult informa el ID del manifiesto, el estado global, los resultados por paso en orden de ejecución, la duración total en milisegundos y los recuentos de pasos totales, completados y fallidos. stepsTotal cuenta todos los pasos del manifiesto, incluidos los pasos omitidos por reanudación o no alcanzados tras una detención; stepsCompleted y stepsFailed cuentan solo los pasos ejecutados.

  • El ejecutor está diseñado para ejecución asíncrona dentro de un worker de trabajos. El uso en línea bloquea al llamador durante toda la duración del pipeline.
  • El tiempo de espera global es una comprobación entre pasos. Un solo paso largo puede exceder el presupuesto; ningún paso se interrumpe a mitad de ejecución.
  • La reanudación omite pasos únicamente dentro de la misma ejecución. No restaura salidas de ningún almacén; la reanudación entre ejecuciones con salidas en caché no está implementada.
  • Construir PipelineStep directamente establece el tipo de salida a PDF de forma predeterminada para cada tipo de paso. Utilice el builder, o pase el tipo de salida de forma explícita, para que los pasos inspect y extract declaren salida JSON y la validación de aristas siga siendo significativa.
  • Una excepción del resolver con un mensaje vacío se normaliza a Unknown error en el resultado del paso.
  • Los resultados de paso Failed producidos por la barrera o por un resolver ausente informan una duración de 0.0.
  • PipelineResult::getStepResult() devuelve null tanto para IDs desconocidos como para pasos omitidos por reanudación o por una detención; distíngalos mediante stepsTotal frente a la longitud de la lista de resultados.
  • Este módulo no realiza operaciones criptográficas ni define ningún comportamiento específico de FIPS. La postura FIPS para el paso sign se rige por el módulo de firma, no por el pipeline.

El pipeline no realiza ningún trabajo de conformidad de formato por sí mismo. La conformidad de cada artefacto producido corresponde al módulo que hay detrás del paso en ejecución —firma, optimización, conversión, etc.— y se documenta en las páginas de referencia de esos módulos. Esta página no reivindica identificadores de cláusula externos; toda afirmación se fundamenta en el código fuente del producto. NextPDF no formula ninguna afirmación de certificación.

  • El código fuente del módulo lleva @since 2.2.0; esta referencia documenta la superficie tal como se distribuye en nextpdf/pro 3.1.0.
  • Todas las clases son final; los tipos de manifiesto, opciones, paso y resultado son objetos de valor readonly. Construya nuevas instancias en lugar de mutarlas.
  • StepResolverInterface y StepResolverRegistry son @internal. Los resolvers de paso son solo integrados; los manejadores de paso personalizados definidos por el usuario no se admiten en esta versión.
  • CapabilityResolverInterface es la costura pública de derechos. Las implementaciones deben ser de denegación por omisión y no deben permitir por defecto.
  • Este ejecutor de PHP es la ruta de validación del manifiesto y ejecución secuencial; los despliegues de producción pueden despachar a través del sidecar para orquestación paralela. La barrera de capacidad en la ruta de PHP es fail-closed de forma independiente en cualquier caso.
  • El detalle del mecanismo interno permanece en la documentación interna del repositorio de código fuente y queda fuera del alcance de este manual.

Esta página documenta únicamente el comportamiento observable externamente y la superficie de la API pública admitida. Las rutas de espacios de nombres internas, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de ticket quedan fuera del alcance.