es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tamaño de fuente del campo de formulario PDF: Apariencia predeterminada vs. flujo de apariencia.

Extraigo el tamaño de fuente de un campo de formulario para obtener información sobre su tamaño (usando iText). Esto funciona bien para la mayoría de los documentos; sin embargo, en algunos obtengo un tamaño de fuente de 1 porque en la apariencia el tamaño de fuente es 1. Sin embargo, si abro el PDF en varios visores diferentes, el tamaño de este campo de texto siempre es 8. Pensé que un campo de formulario debería renderizarse según su apariencia. Entonces, ¿por qué los visores de PDF usan la apariencia predeterminada y no el tamaño de fuente definido en la secuencia de apariencia?

Actualización: Como mencionó MKL, olvidé considerar la matriz de texto.
Implementé mi propio RenderListener para la fuente. ¿Alguien sabe cómo aplicar la escala?

public class PdfStreamFontExtractor implements RenderListener{

    @Override
    public void usedFont(DocumentFont font, float fontSize) {
        this.font=font;
        this.fontSize=fontSize;
    }

    @Override
    public void renderText(TextRenderInfo renderInfo) {
     //¿Cómo obtener el factor de escala de textToUserSpaceTransformMatrix?
    }
...
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que los visores de PDF utilizan el aspecto predeterminado en lugar del tamaño de fuente definido en el flujo de apariencia puede ser debido al factor de escala de la matriz de texto. El factor de escala de la matriz de texto es responsable de escalar el texto en el flujo de apariencia, y si no se establece correctamente, el tamaño de fuente puede parecer más pequeño o más grande de lo deseado.

    Para aplicar el factor de escala, puedes recuperar la matriz de texto utilizando el método getTextMatrix() en TextRenderInfo y luego extraer el factor de escala de la textToUserSpaceTransformMatrix. Una vez que tengas el factor de escala, puedes utilizarlo para calcular el tamaño real de la fuente.

    Aquí hay una versión actualizada de la clase PdfStreamFontExtractor que tiene en cuenta el factor de escala de la matriz de texto:

    public class PdfStreamFontExtractor implements RenderListener{
        private DocumentFont font;
        private float fontSize;
    
        @Override
        public void usedFont(DocumentFont font, float fontSize) {
            this.font=font;
            this.fontSize=fontSize;
        }
    
        @Override
        public void renderText(TextRenderInfo renderInfo) {
            // Obtener la matriz de texto
            Matrix textMatrix = renderInfo.getTextMatrix();
    
            // Obtener el factor de escala de la matriz de texto
            float scalingFactor = textMatrix.get(Matrix.I11);
    
            // Calcular el tamaño real de la fuente
            float actualFontSize = fontSize * scalingFactor;
    
            // Hacer algo con el tamaño real de la fuente
            System.out.println("Tamaño de la fuente: " + actualFontSize);
        }
        //...
    }
    

    Con esta implementación, deberías poder extraer el tamaño de fuente correcto incluso si se define en el flujo de apariencia con un factor de escala aplicado.

Comments are closed.