Est-il possible de modifier un fichier PDF directement?


6

J'ai un fichier PDF qui est produit dans le cadre d'une compilation de fichier d'aide. Il y a toujours des informations de dernière minute qui sont insérées dans un fichier texte (par exemple, "Quoi de neuf dans cette version"), et si Aide et Manuel vous permet d'inclure des éléments d'un fichier texte, cela ne fonctionne que pour la sortie CHM et non pour la PDF.

Je me demande si je peux le faire en générant plutôt une chaîne de caractères générique puis en utilisant un outil (il se peut que je doive en écrire un) pour rechercher et remplacer cette chaîne unique par le contenu du fichier texte d'informations de dernière minute.

Est-ce faisable? Ou va-t-il briser une sorte de structure interne?


1
Lorsque vous remplacez une chaîne de texte par une autre, vous devez suivre l'évolution de la longueur du texte. Ceci influence au moins deux propriétés et structures de clé PDF internes: (1) la xref tableau représentant la table des matières interne des objets, en notant le décalage d'octet des points de départ de l'objet (2) le /Length clé pour le flux qui inclut le texte modifié. Sinon, le fichier sera considéré comme corrompu. De plus, pour éditer du texte, la police complète (non sous-définie) doit être intégrée au PDF.
Kurt Pfeifle

1
Peut-être qu'il est temps de regarder un autre produit, comme HelpNDoc ou Precision Helper. Il existe également des composants Delphi pour traiter les PDF qui peuvent faire ce dont vous avez besoin, comme PowerPDF ou l'un des éléments de La liste de About.com
afrazier

LibreOffice Draw fonctionne assez bien pour la plupart des choses de nos jours.
Nemo

@nemo - expliquez comment LibreOffice Draw pourrait être utilisé à cette fin.
rossmcm

@rossmcm J'ai une expérience limitée de l'utilisation de LibreOffice Draw. Je sais seulement que chaque fois que j'ouvre un fichier PDF dans LibreOffice, je parviens à modifier ou à supprimer les parties dont j'ai besoin sans effort.
Nemo

Réponses:


5

"Ça dépend."

Vous aurez probablement besoin de deux choses: Tout d’abord, le texte n’a pas pu être pixellisé. Si c'est le cas, tous les paris sont ouverts. Deuxièmement, la police entière doit avoir été incorporée. Si la police a été sous-configurée (ce qui est le plus souvent le cas), il se peut que vous n'ayez pas les glyphes requis. Enfin, vous voudrez probablement limiter la taille de la zone de texte à modifier à la taille la plus petite possible, juste pour éviter de devoir traiter de grandes quantités de refusion. Vous voudriez autant d’espace blanc que possible autour du titulaire.

Maintenant, ce ne sera probablement pas quelque chose que vous pourrez faire avec un simple éditeur de texte, mais il peut exister des outils de gestion de PDF pouvant effectuer la substitution à votre place.


Hmmmm .... Reflow est exactement ce que je ne veux pas. Il y a deux choses que je veux intégrer - l'une est la version (1.2.3.456) - cela ne devrait pas être grave. L’autre est un fichier texte - c’est-à-dire formaté avec des sauts de ligne - je suppose que j’aurais besoin d’ajouter des \ n. Malheureusement, en parcourant le PDF avec un éditeur de texte, je ne vois aucun bloc de texte. Je suis sûr que le fichier n'est pas pixellisé - je peux sélectionner du texte avec la souris par exemple.
rossmcm

Le contenu est presque certainement compressé, vous ne pourrez donc pas trouver votre texte aussi facilement.
afrazier

oui, je suppose que c'est ça. Il y a de gros morceaux de binaire dans le fichier. Je suppose que je suis perplexe.
rossmcm

4

Vous pouvez utiliser (Open Source) qpdf Utilitaire (disponible pour Linux, Windows et MacOS X) pour décompresser le PDF dans un format plus lisible. À partir de là, vous pouvez essayer quelques-uns des autres conseils proposés par les autres réponses:

qpdf.exe ^
   --qdf ^
     input.pdf ^
     output.pdf

Le fichier oUtput.pdf aura des flux d’objets non compressés, tous les objets seront renumérotés et triés dans un ordre croissant, ainsi que des commentaires utiles parsemés dans le fichier. Le fichier peut être édité dans un éditeur de texte (s'il ne gêne pas les sections binaires restantes).


3

Si vous êtes prêt à vous salir les mains; je Texte devrait marcher.

Il y a exemples qui couvrent un large éventail de sujets et devrait vous faire pointer dans la bonne direction.

Notez l'exemple ci-dessous. en utilisant le document.add méthode pour ajouter un Paragraph dans un document PDF existant.

protected void createPdf(String filename)
        throws IOException, DocumentException, SQLException {
        // Open the database connection
        DatabaseConnection connection = new HsqldbConnection("filmfestival");
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        // Add text with a local destination
        Paragraph p = new Paragraph();
        Chunk top = new Chunk("Country List", FilmFonts.BOLD);
        top.setLocalDestination("top");
        p.add(top);
        document.add(p);
        // Add text with a link to an external URL
        Chunk imdb = new Chunk("Internet Movie Database", FilmFonts.ITALIC);
        imdb.setAction(new PdfAction(new URL("http://www.imdb.com/")));
        p = new Paragraph(
            "Click on a country, and you'll get a list of movies, containing links to the ");
        p.add(imdb);
        p.add(".");
        document.add(p);
        // Add text with a remote goto
        p = new Paragraph("This list can be found in a ");
        Chunk page1 = new Chunk("separate document");
        page1.setAction(new PdfAction("movie_links_1.pdf", 1));
        p.add(page1);
        p.add(".");
        document.add(p);
        document.add(Chunk.NEWLINE);
        // Get a list with countries from the database
        Statement stm = connection.createStatement();
        ResultSet rs = stm.executeQuery(
            "SELECT DISTINCT mc.country_id, c.country, count(*) AS c "
            + "FROM film_country c, film_movie_country mc WHERE c.id = mc.country_id "
            + "GROUP BY mc.country_id, country ORDER BY c DESC");
        // Loop over the countries
        while (rs.next()) {
            Paragraph country = new Paragraph(rs.getString("country"));
            country.add(": ");
            Chunk link = new Chunk(String.format("%d movies", rs.getInt("c")));
            link.setAction(
                PdfAction.gotoRemotePage("movie_links_1.pdf", rs.getString("country_id"), false, true));
            country.add(link);
            document.add(country);
        }
        document.add(Chunk.NEWLINE);
        // Add text with a local goto
        p = new Paragraph("Go to ");
        top = new Chunk("top");
        top.setAction(PdfAction.gotoLocalPage("top", false));
        p.add(top);
        p.add(".");
        document.add(p);
        // step 5
        document.close();
        // Close the database connection
        connection.close();
    }

1
Je suis prêt à me salir les mains, mais pas aussi sale ... J'utilise Delphi. C'est dommage qu'il n'y ait pas de port - il semble assez complet.
rossmcm

Obtenez un pigiste. Fonctionne en Java, peut l'appeler comme un processus
tgkprog

2

pdfedit pourrait faire l'affaire - pour citer le texte de présentation sur leur site sourceforge

Editeur gratuit pour les documents PDF. La modification complète de documents PDF est possible avec PDFedit. Vous pouvez modifier des objets pdf bruts (pour les utilisateurs expérimentés) ou utiliser de nombreuses fonctions de l'interface graphique. La fonctionnalité peut être facilement étendue à l'aide d'un langage de script (ECMAScript)

Depuis juin 2013, il existe des versions * nix et Windows.


Windows malheureusement
rossmcm

cela fonctionnerait avec cygwin ou colinux / andlinux mais je ne l’ai jamais fait fonctionner,
Journeyman Geek

0

Foxit PDF Reader Enterprise Edition vous permet d’éditer des PDF. Il existe également un fichier PDF principal, mais la version gratuite ajoute un filigrane (dont vous ne voudrez certainement pas).

Alternativement, vous pouvez conserver votre copie maîtresse en tant que Word ( .docx ) ou OO Writer ( .odt ) documentez et utilisez un émulateur d’imprimante (tel que CutePDF Writer ) pour "imprimer" au format PDF. Office 365 et OO Writer offrent également la fonctionnalité "Exporter au format PDF", qui évite d'avoir à modifier des fichiers PDF.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.