Sélectionnez le texte et l'arrière-plan pour l'ensemble du document pdf à l'aide de iText java


Je cherche à prendre un fichier pdf, à définir la couleur d'arrière-plan de chaque page sur noir et tout le texte sur blanc.

Quel est le moyen le plus simple pour moi de le faire? Existe-t-il un appel API pour sélectionner l'arrière-plan de chaque page et tout le texte du fichier? Ou dois-je parcourir chaque page d'une manière ou d'une autre?

Author: Tshepang, 2013-06-01

1 answers

Comme mentionné dans mon dernier commentaire à votre question, peindre un rectangle blanc en mode de fusion Différence devrait faire le travail tant que l'inversion de toutes les couleurs est une solution suffisante pour votre tâche:

void invert(File source, File target) throws IOException, DocumentException
{
    PdfReader reader = new PdfReader(source.getPath());
    OutputStream os = new FileOutputStream(target);
    PdfStamper stamper = new PdfStamper(reader, os);
    invert(stamper);
    stamper.close();
    os.close();
}

void invert(PdfStamper stamper)
{
    for (int i = stamper.getReader().getNumberOfPages(); i>0; i--)
    {
        invertPage(stamper, i);
    }
}

void invertPage(PdfStamper stamper, int page)
{
    Rectangle rect = stamper.getReader().getPageSize(page);

    PdfContentByte cb = stamper.getOverContent(page);
    PdfGState gs = new PdfGState();
    gs.setBlendMode(PdfGState.BM_DIFFERENCE);
    cb.setGState(gs);
    cb.setColorFill(new GrayColor(1.0f));
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
    cb.fill();

    cb = stamper.getUnderContent(page);
    cb.setColorFill(new GrayColor(1.0f));
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
    cb.fill();
}

invertPage dessine le reactangle blanc mentionné précédemment dans la différence de mode de fusion sur la page. De plus, il peint un rectangle blanc normalement sous la page; cela s'est avéré nécessaire au moins pour la version Acrobat Reader que j'ai à portée de main ici.

Vous voudrez peut-être modifier quelque peu le code pour améliorer la lecture du résultat. Peut-être l'exclusion du mode de fusion (BM_EXCLUSION) est plus approprié, ou peut-être d'autres réglages d'état graphique améliorent votre expérience de lecture. Juste être créatif! ;)

Pour certains arrière-plans sur le mode de fusion PDF, vous voudrez peut-être lire la section 11.3.5 Mode de fusion dans la spécification PDF ISO 32000-1 et étudier les exemples liés à la transparencede iText dans Action - 2e édition.

PS: Ce code inverse uniquement le contenu de la page. Les annotations ne sont pas affectées. Si cela s'avère nécessaire, vous pourriez faire quelque chose de similaire à leurs flux d'apparence.

 2
Author: mkl, 2013-06-06 05:51:41