Multipage landscape printing with wkhtmltopdf and PDFKit - pdf

I run a web-based timeline maker and one of the most requested features is to allow users to print their timeline across multiple sheets of paper instead of squeezing it onto a single sheet.
For example, right now when a user exports his or her timeline to a PDF, it gets compressed onto a single page with landscape orientation so it can be easily printed:
I've been experimenting with the options in PDFKit (which uses wkhtmltopdf behind the scenes) to adjust the page size in the hope that it would allow me to print it across multiple sheets of paper. I was able to generate the same timeline on a single 36" wide page:
What I can't figure out -- and I'm not sure if I need to adjust wkhtmltopdf's properties or my printer's -- is how to print this 36"-wide PDF page across multiple sheets of paper. No matter what settings I adjust, the printer always tries to print it on a single piece of paper:
The code I use to generate the 36"-wide PDF, in case it's important, is:
kit = PDFKit.new(html,
:margin_top => 5,
:margin_right => 0,
:margin_bottom => 20,
:margin_left => 0,
:orientation => 'landscape',
:encoding => "UTF-8",
:page_width => '7in',
:page_height => '36in',
)
You can download the PDF here.
I'm open to ideas. Any feedback would be greatly appreciated. Thank you!

Related

Docx4J: Vertical text frame not exported to PDF

I'm using Docx4J to make an invoice model.
In the left-side of the page, it's usual to show a legal sentence as: Registered company in ... Book ... Page ...
I have inserted this in my template with a Word text frame.
Well, my issue is: when exporting to .docx, this legal text is shown perfect, but when exporting to .pdf, it's shown as an horizontal table under the other data.
The code to export to PDF is:
FOSettings foSettings = Docx4J.createFOSettings();
foSettings.setFoDumpFile(foDumpFile);
foSettings.setWmlPackage(template);
fos = new FileOutputStream(new File("/C:/mypath/prueba_OUT.pdf"));
Docx4J.toFO(foSettings, fos, Docx4J.FLAG_EXPORT_PREFER_XSL);
Any help would be very appreciated.
Thanks.
You'd need to extend the PDF via FO code; see further How to correctly position a header image with docx4j?
Float left may or may not be easy; similarly the rotated text.
In general, the way to work on this is to take the FO generated by docx4j, then hand edit it to something which FOP can convert to a PDF you are happy with. If you can do that, then its a matter of modifying docx4j to generate that FO.

PDF metadata to open document in Actual Size (100%) view

I am generating a PDF document using jsPDF. Is there a way to store metadata in the PDF document that will force Acrobat to open it in 100% view mode (Actual Size) vs sized to fit?
In other words does PDF document specification allow that to specify it in the document itself?
This is definitely possible, because a PDF document can contain information on how it should open.
You might create such a document in Acrobat and then find the opening information, and/or you might have a look at the Portable Document Format Reference, which is part of the Acrobat SDK, downloadable from the Adobe website.
However, I don't know whether you can insert that structure into the PDF with your tool.
I figured it out; in the Catalog section of the PDF document, there is a OpenAction section where we can specify how the view can show the file, among other things.
I changed this
putCatalog = function () {
out('/Type /Catalog');
out('/Pages 1 0 R');
// #TODO: Add zoom and layout modes
out('/OpenAction [3 0 R /FitH null]');
out('/PageLayout /OneColumn');
events.publish('putCatalog');
},
to this
putCatalog = function () {
out('/Type /Catalog');
out('/Pages 1 0 R');
// #TODO: Add zoom and layout modes
out('/OpenAction [3 0 R 1 100]'); //change from standard code to use zoom to 100 % instead of fit to width
out('/PageLayout /OneColumn');
events.publish('putCatalog');
},

Images display issue in Dynamics AX 2009 reports saved as pdf

When i saved a native Dynamics AX 2009 report as pdf or pdf-embed it doesn't show the images in the report i.e. company logo in header section, properly. The image comes very distorted, grayish and repeated.
On the other if i export the image in HTML format the image comes properly.
Had anyone experience a similar issue.
Please note that im saving the report as pdf using "file" option that comes when the report print dialog opens.
Any help would be highly appreciated.
Issue will go if the image format used is one of the following
1. 24bit Bitmap
2. TIFF
I have found a solution for this issue in AX 2009:
Bitmap getImageBitmap(ItemId _itemId)
{
HPLInventImages inventImages; // Column HPLInventImages.ItemImage is EDT:BlobData (which is a container)
Image image;
;
if (!_itemId) return inventImages.ItemImage; // Return null bitmap. The whole AX client crashes if you try to do the resizing code below on a null bitmap.
select firstonly inventImages where inventImages.ItemId==_itemId;
//return inventImages.ItemImage; // Would normally just do this, but see comments below.
// Ok, this next bit is weird!
// There is a known issue with AX reports with images in, getting saved as PDFs:
// In some cases, the images appear as garbage on the PDF.
// I have found that resizing the image before rendering it, causes the image to come out ok on the PDF.
// So the code below does a token resize (by 1.0 times!) operation on the image before returning it.
// That is enough to make the image on the PDF turn out ok.
image=new Image(inventImages.ItemImage);
image.resize(image.width()*1.0,image.height()*1.0,InterpolationMode::InterpolationModeHighQuality);
return image.getData();
}

Opencart thumbnail size

I've just started to work with opencart so I don't very much. I want to change the thumbnail size of my products to a bigger size. So, I've researched on Google and an answer came up. Go to System>Settings, Edit Store and under the Image tab, choose the size I want. The thing is, that is not working and I don't know why. For example, on Best Sellers or on Featured Products, the thumbnail size is always the same, 80x80.
Any help?
Tiago Castro
In OpenCart 1.5.4 it's System > Settings > Edit > Image in the Admin panel.
Most of the modules use the "thumb" size for the home page position but have static image sizes coded for the left/right columns.
You have two options... Either switch the template to pull the thumbnail size:
Edit /catalog/view/theme//module/.tpl
(replace with your theme if you have one and with bestseller.tpl and/or featured.tpl)
replace $product['image'] with $product['thumb']
Although then your thumbnails may be oversized for your left/right columns...
The other option is to edit the controller and specify the size...
Edit /catalog/controller/module/.php (again either bestseller.php or featured.php)
In 1.4.9.x around line 67-68 you will find:
$this->data['products'][] = array( // From line 58
....
....
// Line 67
'image' => $this->model_tool_image->resize($image, 38, 38),
'thumb' => $this->model_tool_image->resize($image, $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')),
Just decide if you want to hardcode the new image size (in this example it is 38x38) or link the 'image' size to the thumbnail size.....
if you are hardcoding it, just c hange the "38, 38"...
If you want to link it to the thumbnail size, just copy the value from 'thumb'
In Admin panel, go to extensions>Features>Edit, in edit mode change 80x80 to anything you like, I assume you want it equal to the rest of the images, if so edit it to match. Repeat for Latest module.
No need to edit any code. Go to:
Extensions -> Modules ->Latest
and you can edit the image size from there.
extensions>features>edit also helped me to increase the size of image in thumbnail. thanks a lot.....
extensions>Features>Edit helped me, I just had to put the same image size that i put in System > Settings > Edit > Image (in Product Image Thumb Size).
I am using the version 1.5.6
For New Opencart version 2.3.0.2 , might help for new versions
you can go to Extensions > Extensions > choose Themes from the 'Choose the extension' type selector and then click > Edit on your theme, to view the Images section and change your image sizes.

Rebol/View: How to assign images to layout already created?

Using Rebol/View 2.7.7, I'm trying to create a card game based on Nick's Rebol tutorial at: http://re-bol.com/rebol.html#section-10.18. What I want to do though is read the cards from the binary file Nick created, discard some of the data, and use it to layout a tableau of cards, 4 rows of 3 columns, with the 2 center card locations not used.
Here's my code:
protect-system
random/seed now
do %cards.r ;--include the binary card data
the-tableau: [
size 320x480 backdrop 0.170.0
style tabstyle image 80x100 teal
style holdplace box 80x100 coal
across
at 30x20 tc1: tabstyle
tc2: tabstyle
tc3: tabstyle return
at 30x130 tc4: tabstyle
tc100: holdplace
tc5: tabstyle return
at 30x240 tc6: tabstyle
tc200: holdplace
tc7: tabstyle return
at 30x350 tc8: tabstyle
tc9: tabstyle
tc10: tabstyle
]
lc: copy []
lc: [tc1 tc2 tc3 tc4 tc5 tc6 tc7 tc8 tc9 tc10]
deck-cards: copy [] ; The deck holds all of the cards from the binary file
deck-cards-num: copy []
deck-cards-color: copy []
lay: layout the-tableau
foreach [card label num color pos] cards [
dimg: load to-binary decompress (card)
append deck-cards dimg ;feel movestyle
throw-away-label: label
append deck-cards-num num
append deck-cards-color color
throw-away-pos: pos
]
random-card: does [pick deck-cards random length? deck-cards]
foreach c lc [set-face get c deck-cards]
view lay
do-events
But this doesn't show the cards at all. I'm not even sure it's reading the correctly? Where is the problem?
Actually you didn't use the random-card function in your for loop at the end... :-)
foreach c lc [get c set-face get c random-card ]
You note that you are not sure if data was loaded correctly...
here is a simple way to find out... just print/probe the TYPE? of that data
dimg: load to-binary decompress (card)
probe type? dimg
In this case it will print out image! in the console... so yep... that's working. :-)
As an added little detail, I noticed you didn't compensate your random for the "back face" image in the card data (which is at its end), so the random-card function should be fixed like so:
random-card: does [pick deck-cards random (length? deck-cards) - 1] ; - 1 since we don't want the back face to be picked.
You only need 'do-events if the event loop is not started.
View/new does not start the event loop .. but View does
I'm not addressing your actual problem though :(
to make the do-events note clear, I added a little answer here so I can add some inline code....
here is an example where you'd want your do-events to be used.
view/new lay ; display the interface right now. (with no cards)
random-card: does [pick deck-cards random (length? deck-cards) - 1] ; - 1 since we don't want the back face to be picked.
; deal cards with a half second delay.
foreach c lc [f: get c set-face get c random-card wait 0.5]
do-events
here, any code you put after 'DO-EVENTS will be executed once all view windows have closed.
which can be things like tmp file cleanup, save on exit, "save changes" dialogs, etc.
additional note:
While building graphics code, its a good habit to place this at the very start of you application:
print " "
It will open up the console, and then any view windows will show up in front of it.
When ready to share, just comment the line and remove any print statements in your code.
this is useful for 3 things:
1) Its usually highly annoying when the console always pops-up over your application while its tracing (print/probe/etc) some stuff after your window opens.
2) This also has the more useful side-effect of showing you if your application quit correctly since the console will ALSO quit when all waits have terminated correctly.
In your original example, if you add the above print, then you'll see that the console never closes, so this means the application is still running with no more application windows listening to events.
3) It also has the advantage that you can terminate the graphic app directly by closing the console window. This effectively closes all windows and waits immediately and shortcuts any "on application quit" code you might have (code after do-events).