Frage Ist es möglich, eine PDF-Datei direkt zu bearbeiten?


Ich habe eine PDF-Datei, die als Teil einer Hilfedatei Kompilierung erstellt wird. Es gibt immer spätzlegende Sachen, die in eine Textdatei gehen (zB "Was ist neu in dieser Version?") Und während die Hilfe und das Handbuch es erlaubt, Zeug aus einer Textdatei aufzunehmen, funktioniert es nur für die CHM Ausgabe und nicht für die PDF.

Ich frage mich, ob ich es schaffen kann, indem ich stattdessen eine eindeutige Platzhalterzeichenfolge erzeuge und dann ein Werkzeug verwende (ich muss vielleicht eines schreiben), um eine Suche und Ersetzung dieser eindeutigen Zeichenfolge durch den Inhalt der spät brechenden Infotextdatei durchzuführen.

Ist das machbar? Oder wird es eine Art interne Struktur brechen?


4
2018-06-22 00:00


Ursprung


Wenn Sie eine Textzeichenfolge durch eine andere ersetzen, müssen Sie die sich ändernde Textlänge verfolgen. Dies beeinflusst mindestens zwei interne PDF-Schlüsseleigenschaften und -strukturen: (1) die xref Tabelle, die die interne ToC der Objekte darstellt, wobei der Byte-Offset der Objektstartpunkte notiert wird; (2) die /Length Schlüssel für den Stream, der den geänderten Text enthält. Andernfalls wird die Datei als beschädigt angesehen. Um Text zu bearbeiten, muss die vollständige Schriftart (nicht Teilmenge) in die PDF-Datei eingebettet werden. - Kurt Pfeifle
Vielleicht ist es Zeit, sich ein anderes Produkt wie HelpNDoc oder Precision Helper anzuschauen. Es gibt auch Delphi-Komponenten für den Umgang mit PDFs, die möglicherweise das tun, was Sie brauchen PowerPDF oder eines der Elemente aus Die Liste von About.com - afrazier


Antworten:


"Es kommt darauf an."

Sie werden wahrscheinlich ein paar Dinge brauchen: Erstens, der Text konnte nicht gerastert werden. Wenn das der Fall ist, sind alle Wetten aus. Zweitens muss die gesamte Schriftart eingebettet worden sein. Wenn die Schriftart in einer Teilmenge enthalten war (was meistens der Fall ist), verfügen Sie möglicherweise nicht über die erforderlichen Glyphen. Schließlich möchten Sie wahrscheinlich die Größe der zu modifizierenden Textfläche so klein wie möglich halten, um zu verhindern, dass Sie mit großen Mengen von Reflow arbeiten müssen. Sie würden so viel Leerraum um den Platzhalter wie möglich haben wollen.

Nun, dies wird wahrscheinlich nicht mit einem einfachen Texteditor möglich sein, aber es könnte einige PDF-Maniulationswerkzeuge geben, die die Substitution für Sie übernehmen können.


5
2018-06-22 01:00



Hmmmm .... Reflow ist genau das, was ich nicht will. Es gibt zwei Dinge, die ich einbetten möchte - eine ist die Version (1.2.3.456) - das sollte keine große Sache sein. Das andere ist eine Textdatei - d. H. Formatiert mit Zeilenumbrüchen - ich denke, ich müsste einige \ n hinzufügen. Leider stoße ich mit einem Texteditor um das PDF herum, ich sehe keine Textblöcke. Ich bin sicher, dass die Datei nicht gerastert ist - ich kann zum Beispiel Text mit der Maus auswählen. - rossmcm
Der Inhalt ist fast sicher komprimiert, so dass Sie Ihren Text nicht so leicht finden können. - afrazier
Ja, ich denke, das war's. In der Datei befinden sich große Binärdateien. Ich denke, ich bin ratlos. - rossmcm


Wenn Sie bereit sind, Ihre Hände schmutzig zu machen; ich schreibe sollte arbeiten.

Es gibt Beispiele Sie decken ein breites Themenspektrum ab und sollen Sie in die richtige Richtung weisen.

Beachten Sie das Beispiel unten. Verwendung der document.add Methode zum Hinzufügen eines Paragraph in ein vorhandenes PDF-Dokument.

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();
    }

3
2018-06-22 04:31



Ich bin bereit, meine Hände schmutzig zu machen, aber nicht ganz so schmutzig ... Ich benutze Delphi. Es ist eine Schande, dass es keinen Hafen gibt - es sieht ziemlich umfassend aus. - rossmcm
Bekommen Sie einen Freiberufler. Funktioniert in Java, kann es als Prozess bezeichnen - tgkprog


Sie können (Open Source) verwenden qpdf Dienstprogramm (verfügbar für Linux, Windows und MacOS X), um das PDF in ein besser lesbares Format zu entpacken. Von dort aus können Sie einige der anderen Ratschläge aus den anderen Antworten ausprobieren:

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

Die Datei oUtput.pdf enthält unkomprimierte Objektströme, alle Objekte werden neu nummeriert und in aufsteigender Reihenfolge neu sortiert und einige hilfreiche Kommentare in die Datei eingestreut. Die Datei kann in einem Texteditor bearbeitet werden (wenn sie nicht mit den verbleibenden Binärabschnitten verschmutzt).


3
2018-06-22 06:00





pdfedit könnte den Trick machen - um den Klappentext auf ihrer Sourceforge-Seite zu zitieren

Kostenloser Editor für PDF-Dokumente. Die komplette Bearbeitung von PDF-Dokumenten ist mit PDFedit möglich. Sie können rohe PDF-Objekte (für fortgeschrittene Benutzer) ändern oder viele GUI-Funktionen verwenden. Funktionalität kann leicht mit einer Skriptsprache (ECMAScript) erweitert werden

Ab Juni 2013 gibt es * nix- und Windows-Versionen.


1
2018-06-22 01:19



Windows leider - rossmcm
Es funktioniert angeblich in Cygwin oder Colinux / Andlinux, aber ich habe es nie zur Arbeit gebracht, - Journeyman Geek♦