emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orgmode] Blorgit > Adding PDF export


From: Francesco Pizzolante
Subject: [Orgmode] Blorgit > Adding PDF export
Date: Mon, 23 Nov 2009 13:58:54 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (windows-nt)

Eric,

> Also, rather than using a shell script, would it be possible to use the
> built in `org-export-as-pdf' function.  This may obviate the need for a
> shell script at all.  In this case you probably wouldn't need to remove
> the leading "." in the file names, and if you did, it could be done in
> elisp right around export with the `rename-file' function.

Regarding the addition of an extra link in order to get the PDF export, I took
your remarks into account and here's what I finally went to.

First, add the ".pdf" link to the page:

--8<---------------cut here---------------start------------->8---
diff --git a/blorgit.rb b/blorgit.rb
index 077b5d9..93bea47 100644
--- a/blorgit.rb
+++ b/blorgit.rb
@@ -197,6 +197,8 @@ __END__
         %a{ :href => path_for(@blog, :format => 'org'), :title => 'download as 
org-mode' } .org
       %li
         %a{ :href => path_for(@blog, :format => 'tex'), :title => 'download as 
LaTeX' } .tex
+      %li
+        %a{ :href => path_for(@blog, :format => 'pdf'), :title => 'download as 
PDF' } .pdf
 #title_separator

 @@ sidebar
--8<---------------cut here---------------end--------------->8---


In "acts_as_org.rb", call a "org-file-to-pdf" emacs function:

--8<---------------cut here---------------start------------->8---
diff --git a/lib/acts_as_org.rb b/lib/acts_as_org.rb
index 458741d..8e027fc 100644
--- a/lib/acts_as_org.rb
+++ b/lib/acts_as_org.rb
@@ -80,6 +80,24 @@ PREAMBLE
           l_path = self.latex_path(path)
           File.exist?(l_path) and File.mtime(l_path) > File.mtime(path)
         end
+
+        def pdf_path(path)
+          File.join(File.dirname(path),
+                    ActiveFile::Acts::Org::EXP_PREFIX + File.basename(path) + 
".pdf")
+        end
+
+        def to_pdf(path, options = {})
+          p_path = self.pdf_path(path)
+          options = {:postamble => false}.merge(options)
+          self.emacs_run("(org-file-to-pdf  \"#{path}\")") unless 
self.clean_pdf?(path)
+          return nil unless File.exist?(p_path)
+          html = File.read(p_path)
+        end
+
+        def clean_pdf?(path)
+          p_path = self.pdf_path(path)
+          File.exist?(p_path) and File.mtime(p_path) > File.mtime(path)
+        end
       end

       module InstanceMethods
@@ -107,6 +125,19 @@ PREAMBLE
           self.class.to_latex(self.full_path, options)
         end
         alias :to_tex :to_latex
+
+        def pdf_path
+          self.class.pdf_path(self.full_path)
+        end
+
+        def clean_pdf?
+          self.class.clean_pdf?(self.full_path)
+        end
+
+        def to_pdf(options = {})
+          self.class.to_pdf(self.full_path, options)
+        end
+
       end
     end
   end
--8<---------------cut here---------------end--------------->8---


In "org-interaction.el", added the "org-file-to-pdf" function:

--8<---------------cut here---------------start------------->8---
diff --git a/elisp/org-interaction.el b/elisp/org-interaction.el
index 2311156..9b0d695 100644
--- a/elisp/org-interaction.el
+++ b/elisp/org-interaction.el
@@ -24,6 +24,7 @@ evaluating BODY."
        ,temp-result)))

 (defvar org-interaction-prefix ".exported_")
+(defvar tmp-prefix "exported_")

 (defun org-file-to-html (file-path)
   "Open up an org file, publish it to html, and then return the
@@ -65,6 +66,31 @@ latex as a string."
         (write-file latex-path)
         (kill-buffer (current-buffer)))))))

+(defun org-file-to-pdf (file-path)
+  "Open up an org file and export it as pdf."
+  (let* ((file-name (file-name-nondirectory file-path))
+        (file-dir (file-name-directory file-path))
+        (org-tmp-path (expand-file-name (concat tmp-prefix file-name ".org") 
"/tmp/"))
+        (pdf-tmp-path (expand-file-name (concat tmp-prefix file-name ".pdf") 
"/tmp/"))
+        (tex-tmp-path (expand-file-name (concat tmp-prefix file-name ".tex") 
"/tmp/"))
+        (pdf-path (expand-file-name (concat org-interaction-prefix file-name 
".pdf") file-dir)))
+    (if (and (file-exists-p pdf-path)
+            (< 0 (time-to-seconds
+                  (time-subtract
+                   (nth 5 (file-attributes pdf-path))
+                   (nth 5 (file-attributes file-path))))))
+       pdf-path
+      (with-temp-filebuffer
+       file-path
+       (write-file org-tmp-path)
+       (org-mode)
+       (save-window-excursion
+        (org-export-as-pdf nil)
+        (rename-file pdf-tmp-path pdf-path)
+        (delete-file org-tmp-path)
+        (delete-file tex-tmp-path)
+        (kill-buffer (current-buffer)))))))
+
 ;; customization
 (setq org-export-blocks-witheld '(hidden comment))
--8<---------------cut here---------------end--------------->8---

Note that I use the /tmp folder to store temporary files without the leading
dot (the export do PDF does not work with a leading dot).

What do you think?

Thanks for your feedback.

Regards,
Francesco




reply via email to

[Prev in Thread] Current Thread [Next in Thread]