題 是否可以直接編輯PDF文件?


我有一個PDF文件,作為幫助文件編譯的一部分生成。總是有一些遲到的東西進入文本文件(例如“這個版本中的新功能”類型的東西),而幫助和手動允許您從文本文件中包含東西它只適用於CHM輸出而不適用於PDF。

我想知道我是否可以通過生成一個獨特的佔位符字符串,然後使用一些工具(我可能需要編寫一個)來執行搜索,並使用最新信息文本文件的內容替換該唯一字符串。

這可行嗎?還是會破壞某種內部結構?


4
2018-06-22 00:00


起源


當您用另一個文本字符串替換文本字符串時,您必須跟踪更改的文本長度。這會影響至少兩個內部PDF密鑰屬性和結構:(1) xref 表示對象內部ToC的表,記下對象起始點的字節偏移量; (2) /Length 包含已更改文本的流的鍵。否則該文件將被視為已損壞。此外,要編輯文本,必須將完整(非子集化)字體嵌入到PDF中。 - Kurt Pfeifle
也許是時候看看另一款產品,比如HelpNDoc或Precision Helper。還有用於處理可能做你需要的PDF的Delphi組件,比如 PowerPDF 或其中一項 About.com的清單 - afrazier
LibreOffice Draw適用於當今大多數事情。 - Nemo
@nemo - 請解釋如何使用LibreOffice Draw來執行此操作。 - rossmcm
@rossmcm我在使用LibreOffice Draw方面經驗有限。我只知道每次在LibreOffice中打開PDF文件時,我都會毫不費力地編輯或刪除我需要的部分。 - Nemo


答案:


“這取決於。”

你可能需要一些東西:首先,文本不能被柵格化。如果是這樣的話,那麼所有的賭注都會被取消。其次,必須嵌入整個字體。如果字體是子集(通常是這種情況),那麼您可能沒有所需的字形。最後,您可能希望將要修改的textarea的大小限制為盡可能小,以防止必須處理大量的回流。你想要盡可能多的空白圍繞著plcaeholder。

現在,這可能不會是你可以用簡單的文本編輯器做的事情,但可能有一些PDF動畫製作工具可以為你做替代。


5
2018-06-22 01:00



嗯....回流正是我不想要的。我想嵌入兩件事 - 一件是版本(1.2.3.456) - 這應該沒什麼大不了的。另一個是文本文件 - 即使用換行符格式化 - 我想我需要添加一些\ n。不幸的是,用文本編輯器戳了PDF,我看不到任何文本塊。我確定文件沒有光柵化 - 我可以用鼠標選擇文本。 - rossmcm
內容幾乎肯定是壓縮的,因此您將無法輕易找到您的文本。 - afrazier
是的,我想就是這樣。文件中有大量的二進製文件。我想我很難過。 - rossmcm


如果你願意弄髒你的手; iText的 應該管用。

例子 它涉及廣泛的主題,應該指向正確的方向。

請注意以下示例;使用 document.add 添加方法 Paragraph 到現有的PDF文檔。

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



我願意弄髒手,但不是那麼臟......我正在使用Delphi。遺憾的是沒有港口 - 它看起來非常全面。 - rossmcm
找一個自由職業者。在Java中工作,可以將其稱為進程 - tgkprog


你可以使用(開源) qpdf 實用程序(適用於Linux,Windows和MacOS X)將PDF解壓縮為更易讀的格式。從那裡你可以去嘗試其他答案的其他一些建議:

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

文件oUtput.pdf將包含未壓縮的對象流,所有對像都按升序重新編號和重新排序,並在文件中添加一些有用的註釋。該文件可以在文本編輯器中編輯(如果它沒有弄亂剩餘的二進制部分)。


3
2018-06-22 06:00





pdfedit 可能會做的伎倆 - 引用他們的sourceforge網站上的模糊

PDF文檔的免費編輯器。使用PDFedit可以完整地編輯PDF文檔。您可以更改原始pdf對象(對於高級用戶)或使用許多gui函數。使用腳本語言(ECMAScript)可以輕鬆擴展功能

截至2013年6月,有* nix和Windows版本。


2
2018-06-22 01:19



Windows不幸 - rossmcm
據稱它在cygwin或colinux / andlinux中工作,但我從來沒有讓它工作, - Journeyman Geek♦