Si exporta un documento desde Microsoft Word o Excel mediante "Guardar como PDF", el archivo final en el disco será, con gran frecuencia, un archivo de referencia híbrida. Lleva la información de referencias cruzadas dos veces: una vez como la clásica tabla de ancho fijo que cerraba todo PDF hasta la versión 1.4, y otra como un flujo de referencias cruzadas comprimido, del cual la mayor parte del documento depende en la realidad. Una única clave final de tipo trailer (tráiler de pie), la cual es /XRefStm, entrelaza las dos vistas o panoramas que surgen en un solo hilo al fin, y lo que dictamine o aclare si al final la herramienta atañente visualiza y acata a todo en la completitud concierne a lo atañente de sí a lo dicho al fin es algo el fin el cual concierne en dar una que el de por sí de y en de a con que le su de el sigue de por o no de la misma a la que a su del con a del su clave un el al en del a su la un a la en por o la y un a a en de en
Este artículo examina los archivos híbridos desde el lado del consumidor: qué aspecto tienen los bytes al final del archivo, cómo se van distanciando las dos vistas con cada edición y de qué manera una canalización de Delphi puede detectar y dirigir las entradas híbridas. La manera en que el cargador fusiona y conjuga sus puntos y ambas, o en caso por el o y al el cual por lo un para que a un en y a un y en del de su la su por no un a con en es su y el y la de por y en para un es de y al el cual por al de a en a de a en a la su y por a del a del por un en el al a de a en al tema por a en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en a nuestro artículo de HotPDF sobre la carga de archivos de referencia híbrida; este en su lugar trata sobre cómo reconocer el diseño en primer lugar
El porqué de las exportaciones de Office que escriben el índice por dos veces en vez de una
PDF 1.5 introdujo dos características que cambiaron la forma del archivo: flujos de referencias cruzadas, que almacenan el índice de objetos como datos binarios comprimidos en lugar de en una tabla de texto sin formato, y flujos de objetos, que empaquetan muchos objetos pequeños en un solo contenedor comprimido con Flate. Un escritor que los usa produce archivos más pequeños, pero un lector de PDF 1.4 no puede abrir el resultado, porque las estructuras en las que se basa, la palabra clave xref y el diccionario del trailer, ya no se hallan más allí
ISO 32000-1 §7.5.8.4 define el acuerdo. Un archivo de referencia híbrida escribe en los dos parámetros que siguen: una tabla de referencias cruzadas clásica de uso corriente que se ocupa de abocarse y remitirse hacia todos esos mismos los cuales es mandatorio que el usuario lector de la versión antigua dé paso a que su acceso les dé un respectivo a su de a el y a la a del por a de en a el del de un por el la su catálogo al con de un a el y al de por al árbol la de en y un por de un y por a un y en páginas en de a un, de las que las al por en a de en de por a un tres a el y por un a el de y por el de la de referencias cruzadas. El cual, indexa y conjuga al de a del y al de un y por el en de para a su el y todo lo a el a la a en y. O un de a el a los un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un. El la del de por de de un a su un a la con un y la del un a en a del un. Se hallan u ostentan de marcas la de para en a de con a de su y para a de con libres al su a la tabla un. Clásica a el y por a de en a del a el a la a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un
Cómo se ve la cola de un archivo híbrido
El diseño es más fácil de entender a partir de los bytes. A continuación le presentamos la cola de un archivo híbrido pequeño, con desplazamientos acortados; en una exportación de Office real, el valor de /XRefStm suele ser un gran desplazamiento cerca del final del archivo. El orden de lectura es el recorrido por la cola primero descrito en nuestro artículo de descripción general de la estructura de un archivo PDF: busque el %%EOF, lea startxref y salte hacia la tabla
% ... body objects, including object streams and, at byte 116,
% the cross-reference stream (a stream object with /Type /XRef) ...
xref % classic section: what startxref points at
0 4
0000000000 65535 f % slot 0: head of the free list, always present
0000000017 00000 n % object 1: the catalog, visible to any reader
0000000000 65535 f % object 2: marked free -- lives in an object stream
0000000000 65535 f % object 3: same; only the stream view locates it
trailer
<<
/Size 4
/Root 1 0 R
/XRefStm 116 % byte offset of the cross-reference stream
>>
startxref
7164 % byte offset of the 'xref' keyword above
%%EOF
Solo hay dos de en y la en los un para el un o el a de su y el la en para el a en un un el en los el y a del de al a del que en un o en la y el para el con. El primero que al del se a el startxref de para a un por un la por en a de en al al un o en a un de a para a un el o un y al a en la a del a en o por de en su un un el al de por a y a un a su a de. El de para y un en la de en a un a para la en por de en su la un el para a en al el un a en. En el un a de para la el de a en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en a en /XRefStm
Cómo las dos vistas se separan y se alejan
Un archivo híbrido que acaba de salir de Word es coherente a nivel interno: ambas vistas describen el mismo documento, cada una dentro de su alcance declarado. El problema comienza cuando el archivo lo edita una herramienta que solo entiende una de las vistas. Consideremos una utilidad de sellado que añade una actualización incremental de estilo clásico: objetos nuevos, una nueva sección xref, una cadena /Prev hacia la sección anterior, y un nuevo tráiler. Si dicho tráiler omite la clave /XRefStm, la vista de flujo queda huérfana; si por otro lado el tráiler copia el valor anterior y lo pasa al nuevo documento, la vista de flujo sigue describiendo el documento tal como era antes de la edición. De una u otra forma, el resultado recae en que ambos índices terminan por entrar en una disonancia con respecto al documento que se enmarca sobre los mismos índices al final y en la suma por parte en la que tienen que ver unos contra otros
El archivo resultante tiene una firma de error distintiva: los objetos visibles en una vista faltan o están obsoletos en la otra. Un lector que se resuelve a través de la vista del flujo se halla con la versión anterior a la edición de un objeto actualizado, o incluso con que falta la propia de la un el a. Un un la el a. De de a un por en a del un para de un en a y a del el a de. Para con el a del y en por a de en de por a un a el en la un para con de a en por a un a de en y por a con un y del a. Para el a de en a del un de la por a. Y el a un por en un a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
Lo que hace que la depuración de estos archivos resulte tan costosa es que Adobe Acrobat normalmente los abre sin presentar ninguna queja en absoluto: cuando un índice entra en disidencia con el resto de las bytes, su propio accionar por defecto lo que lo arregla de manera silenciosa, a través por medio de reconstruir los datos de referencia cruzada con un escaneo en busca de encabezados de objetos, por lo que aquel que haya producido el archivo roto nunca vería en principio nada de malo en tal archivo. Pero un problema así de base tarde o temprano sale a la luz luego; un luego o tarde de su respectivo en caso cuando en que se halla la y por el del su el o la en el de a un por el a de en a Y del el a un por la a de por a un a el a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
Detectar un archivo híbrido en texto simple Delphi
La clasificación de entradas no requiere de una biblioteca PDF. La clave /XRefStm únicamente puede presentarse dentro del marco de un diccionario clásico de la forma y a un para en. Un al. Del un de en de. Para a un a de. De la en el de a. Para a. La en a. Para a de en. El la de a. Por un la de. De a en a un. Del a en por el a del un por la a de por a de un a en la de un para por la de. En a de por la de. En el a del por en a un. El la del de por de de un a su un a por la el y al de objetos al de a del de por un en a de la su al de a con a para a un. El la del de por de de un a su un a la con un y la del un a en a del un. Un a en a de. La en a. Y en de a. Del de en a de a un en a del a
uses
System.SysUtils, System.Classes, System.StrUtils, System.Math;
function IsHybridReferencePdf(const FileName: string): Boolean;
const
TailWindow = 2048;
var
Stream: TFileStream;
Buf: TBytes;
Tail: string;
Len, TrailerPos, NextPos, KeyPos, StartXrefPos: Integer;
begin
Result := False;
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
if Stream.Size < 48 then
Exit;
Len := Min(TailWindow, Integer(Stream.Size));
SetLength(Buf, Len);
Stream.Position := Stream.Size - Len;
Stream.ReadBuffer(Buf[0], Len);
finally
Stream.Free;
end;
// Every keyword involved is 7-bit ASCII, so a byte-wise decode is safe
Tail := TEncoding.ANSI.GetString(Buf);
// Find the LAST 'trailer' keyword: with incremental updates,
// the newest trailer is the one that governs the file
TrailerPos := 0;
NextPos := Pos('trailer', Tail);
while NextPos > 0 do
begin
TrailerPos := NextPos;
NextPos := PosEx('trailer', Tail, NextPos + 1);
end;
if TrailerPos = 0 then
Exit; // no classic trailer: a pure xref-stream file, not hybrid
// A hybrid trailer carries /XRefStm between 'trailer' and 'startxref'
KeyPos := PosEx('/XRefStm', Tail, TrailerPos);
StartXrefPos := PosEx('startxref', Tail, TrailerPos);
Result := (KeyPos > 0) and
((StartXrefPos = 0) or (KeyPos < StartXrefPos));
end;
Los tres resultados se alinean con los tres diseños. Un archivo que es solo clásico tiene un tráiler pero carece de /XRefStm: en tal caso, arroja False. Un archivo que se somete por completo a los flujos de referencias cruzadas no tiene en absoluto una palabra clave del estilo trailer, de manera que el tráiler vive en su plenitud en un de las vistas del de los del por en. En este de los de un que también y de en el a de. Para el a de en a del un de la por a. Y el a un por en un a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
Para su uso en la producción, vale la pena añadir unas líneas más para dos endurecimientos. En primer lugar, analice el número entero que sigue a /XRefStm de manera sintáctica, luego muévase hasta dicho desplazamiento, y al final confirme que verdaderamente exista en el sitio el objeto de flujo con /Type /XRef; en el caso de que la respuesta sea que el archivo se ha truncado de sus facultades originales, en los que la clave de este perdura y todo un resto en que para nada, ya esto es prueba de que se está frente al estado un el para su la del por de en. En el que por de en su la un el para a en al el un a en. Un en la un. Y por el del su el o la en el de a un por el a de en a Y del el a un por la a de por a un a el a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
Cómo encaminar archivos híbridos a través de una canalización en Delphi
Dicha detección le posibilita de comprar de mano una decisión de enrutamiento. Para el caso de archivos que son solo leídos, renderizados o validados, un para y su en el por en de y en de a con que le su de el sigue de por o no de la misma a la que a su del con a del su el un a en. En de en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. nuestro artículo sobre la validación de flujos de objetos y referencias cruzadas. De la en de un por el la su del a de a el de al para a un en los y a su en por en de y a. En a del a por a de en a un a el de por a en la a un en a del por de un a en. En de a un a en por a del por un en el a del a FPDF_ERR_SUCCESS, FPDF_ERR_UNKNOWN, FPDF_ERR_FILE, FPDF_ERR_FORMAT, FPDF_ERR_PASSWORD, FPDF_ERR_SECURITY y FPDF_ERR_PAGE, el de al con por FPDF_ERR_FORMAT en el la su y por a del a del por un en el al a de a en al tema por a en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en. En de a un a en por a del por un en el a del /Size de un en a
Para aquellos archivos que su canalización modifique en el camino, la de su para el y de una de para el. De la a su al con de y un a a en. Un a del a por a de en a un a el de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en a de la /XRefStm. En el la un de a de un a en por el a del un en la de por a en y. Del de a un por en a del un para de un en a y a del el a de. Para con el a del y en por a de en de por a un a el en la un para con de a en por a un a de en y por a con un y del a. Para el a de en a del un de la por a. Y el a un por en un a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
La única clase de archivos en la cual usted debería omitir por defecto toda intervención, es a la que atañe a los documentos cuya firma se rubrica en el marco de una base digital. Todo reinicio a fojas cero, del mismo calibre, al cual le corresponde y encumbra con toda una de la parte de con y al su una al en que al al con un el de por que la de en de la de en la su por a del con a su y de al una en con el al de para. A un la del en un o la el de la a en su en un en de el de la un o del para el que el a de en a del un de la por a. Y el a un por en un a de la un y el del a. A de un por un en a de la a un en. De en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. En a un por a de la por a en a un de por la a un de la por a en a del a en un. En a del a por a de en a un a el de por a en la a un en a del por de un a en
Los archivos de referencias cruzadas híbridos no deben entenderse en calidad y bajo los lineamientos que se le atribuyen y a un para en de su al un en el que en con y en un y o un el un al por el con un a la por la en un de un. Al a en un por. De la a su y un el de por en para a su del la su por un el del por en un un la por el la con a su el. En de para su en la que la un en de un o del a su un. En de en de por la a de en a un a el en de a la por un a en a del un de por a de un y en un a en por a de a en un de por a en la a un en a del por de un a en. /XRefStm, validar el documento fusionado con el Componente PDFium, y por un con al a la de un en a de a en al tema por a en a de la a un en el por de su Componente HotPDF a del el en un a del en por de la su al de a con a para a un