Skip to main content

import - Difficulties with Importing PDFs in Mathematica


I am trying to import a group of PDFs that I have downloaded (it is in the realm of 1,000+). They are a group of doctoral dissertations that I'm trying to automatically extract bibliographic information from. They open perfectly in Preview and Adobe Acrobat Reader. Unfortunately, when I go to Import[] them, I receive the following errors like so:


Import["1997-01.pdf","Elements"]

Import::general: Expected cross reference table >>
Import::general: Expected cross reference table >>
Import::general: Could not find document trailer >>
General::stop: Further output of Import::general will be suppressed during this calculation. >>


I have never encountered this with Elements before, which is normally my first step in figuring out how to tackle a file. The same holds for Plaintext, etc. If I Import["1997-01.pdf","Text"] it generates a file akin to this:


%PDF-1.2
%BHIL-SC:0014503155,00391,00004,00008,00399,00790,00004,00004,00009,00400,00791,00004,00004,00010,00401,00792,00004 ... etc. etc.

The file itself is downloaded from an online repository, however, but is of high quality.


enter image description here


My end goal is to try TextRecognize[] on it, but I cannot even get to that stage. Does Mathematica offer any workarounds for PDFs like this? FWIW, the PDF claims that I have full permissions to edit, alter, etc., but there is no built-in text layer.


--- Edited to Clarify ---


The PDF is version 1.2. It is an image layer, not a text layer. Hope that this helps!




Answer



If it's really scanned images, then you could try this:


pages = Import["yourfile.pdf", {"PDF", "Images"}]

Otherwise, I'd suggest running the file through ghostscript or another distiller to clean up the potentially malformed PDF code first. The command would look like this:


gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=newfile.pdf badfile.pdf

Edit


Since you mentioned that you're on Mac OS X and also appear to be able to view the PDF file in Preview.app, there is an even simpler way:


If you're on Lion: Open the PDF in Preview, and export it as multipage TIFF. This can be done under the File > Export menu. The resulting file can be imported in Mathematica and yields a list of images.



Another possible approach that works for all OS X versions is to open the PDF in Preview and print it to a file. With that method, you could also select only the pages you really need by highlighting them in the Thumbnail view, and then choosing File > Print Selected Pages.... The PDF-printed file would hopefully have been processed to get rid of the errors.


Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....