github.com/pdfcpu/pdfcpu@v0.11.1/pkg/api/pageMode.go (about)

     1  /*
     2  	Copyright 2023 The pdfcpu Authors.
     3  
     4  	Licensed under the Apache License, Version 2.0 (the "License");
     5  	you may not use this file except in compliance with the License.
     6  	You may obtain a copy of the License at
     7  
     8  		http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  	Unless required by applicable law or agreed to in writing, software
    11  	distributed under the License is distributed on an "AS IS" BASIS,
    12  	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  	See the License for the specific language governing permissions and
    14  	limitations under the License.
    15  */
    16  
    17  package api
    18  
    19  import (
    20  	"io"
    21  	"os"
    22  
    23  	"github.com/pdfcpu/pdfcpu/pkg/pdfcpu/model"
    24  	"github.com/pdfcpu/pdfcpu/pkg/pdfcpu/types"
    25  	"github.com/pkg/errors"
    26  )
    27  
    28  // PageMode returns rs's page mode.
    29  func PageMode(rs io.ReadSeeker, conf *model.Configuration) (*model.PageMode, error) {
    30  	if rs == nil {
    31  		return nil, errors.New("pdfcpu: PageMode: missing rs")
    32  	}
    33  
    34  	if conf == nil {
    35  		conf = model.NewDefaultConfiguration()
    36  	} else {
    37  		conf.ValidationMode = model.ValidationRelaxed
    38  	}
    39  	conf.Cmd = model.LISTPAGEMODE
    40  
    41  	ctx, err := ReadAndValidate(rs, conf)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	return ctx.PageMode, nil
    47  }
    48  
    49  // PageModeFile returns inFile's page mode.
    50  func PageModeFile(inFile string, conf *model.Configuration) (*model.PageMode, error) {
    51  	f, err := os.Open(inFile)
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	defer f.Close()
    56  
    57  	return PageMode(f, conf)
    58  }
    59  
    60  // ListPageMode lists rs's page mode.
    61  func ListPageMode(rs io.ReadSeeker, conf *model.Configuration) ([]string, error) {
    62  	if rs == nil {
    63  		return nil, errors.New("pdfcpu: ListPageMode: missing rs")
    64  	}
    65  
    66  	if conf == nil {
    67  		conf = model.NewDefaultConfiguration()
    68  	} else {
    69  		conf.ValidationMode = model.ValidationRelaxed
    70  	}
    71  	conf.Cmd = model.LISTPAGEMODE
    72  
    73  	ctx, err := ReadAndValidate(rs, conf)
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	if ctx.PageMode != nil {
    79  		return []string{ctx.PageMode.String()}, nil
    80  	}
    81  
    82  	return []string{"No page mode set, PDF viewers will default to \"UseNone\""}, nil
    83  }
    84  
    85  // ListPageModeFile lists inFile's page mode.
    86  func ListPageModeFile(inFile string, conf *model.Configuration) ([]string, error) {
    87  	f, err := os.Open(inFile)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  	defer f.Close()
    92  
    93  	return ListPageMode(f, conf)
    94  }
    95  
    96  // SetPageMode sets rs's page mode and writes the result to w.
    97  func SetPageMode(rs io.ReadSeeker, w io.Writer, val model.PageMode, conf *model.Configuration) error {
    98  	if rs == nil {
    99  		return errors.New("pdfcpu: SetPageMode: missing rs")
   100  	}
   101  
   102  	if conf == nil {
   103  		conf = model.NewDefaultConfiguration()
   104  	} else {
   105  		conf.ValidationMode = model.ValidationRelaxed
   106  	}
   107  	conf.Cmd = model.SETPAGEMODE
   108  
   109  	ctx, err := ReadAndValidate(rs, conf)
   110  	if err != nil {
   111  		return err
   112  	}
   113  
   114  	ctx.RootDict["PageMode"] = types.Name(val.String())
   115  
   116  	return Write(ctx, w, conf)
   117  }
   118  
   119  // SetPageModeFile sets inFile's page mode and writes the result to outFile.
   120  func SetPageModeFile(inFile, outFile string, val model.PageMode, conf *model.Configuration) (err error) {
   121  	var f1, f2 *os.File
   122  
   123  	if f1, err = os.Open(inFile); err != nil {
   124  		return err
   125  	}
   126  
   127  	tmpFile := inFile + ".tmp"
   128  	if outFile != "" && inFile != outFile {
   129  		tmpFile = outFile
   130  	}
   131  	if f2, err = os.Create(tmpFile); err != nil {
   132  		f1.Close()
   133  		return err
   134  	}
   135  
   136  	defer func() {
   137  		if err != nil {
   138  			f2.Close()
   139  			f1.Close()
   140  			os.Remove(tmpFile)
   141  			return
   142  		}
   143  		if err = f2.Close(); err != nil {
   144  			return
   145  		}
   146  		if err = f1.Close(); err != nil {
   147  			return
   148  		}
   149  		if outFile == "" || inFile == outFile {
   150  			err = os.Rename(tmpFile, inFile)
   151  		}
   152  	}()
   153  
   154  	return SetPageMode(f1, f2, val, conf)
   155  }
   156  
   157  // ResetPageMode resets rs's page mode and writes the result to w.
   158  func ResetPageMode(rs io.ReadSeeker, w io.Writer, conf *model.Configuration) error {
   159  	if rs == nil {
   160  		return errors.New("pdfcpu: ResetPageMode: missing rs")
   161  	}
   162  
   163  	if conf == nil {
   164  		conf = model.NewDefaultConfiguration()
   165  	} else {
   166  		conf.ValidationMode = model.ValidationRelaxed
   167  	}
   168  	conf.Cmd = model.RESETPAGEMODE
   169  
   170  	ctx, err := ReadAndValidate(rs, conf)
   171  	if err != nil {
   172  		return err
   173  	}
   174  
   175  	delete(ctx.RootDict, "PageMode")
   176  
   177  	return Write(ctx, w, conf)
   178  }
   179  
   180  // ResetPageModeFile resets inFile's page mode and writes the result to outFile.
   181  func ResetPageModeFile(inFile, outFile string, conf *model.Configuration) (err error) {
   182  	var f1, f2 *os.File
   183  
   184  	if f1, err = os.Open(inFile); err != nil {
   185  		return err
   186  	}
   187  
   188  	tmpFile := inFile + ".tmp"
   189  	if outFile != "" && inFile != outFile {
   190  		tmpFile = outFile
   191  	}
   192  	if f2, err = os.Create(tmpFile); err != nil {
   193  		f1.Close()
   194  		return err
   195  	}
   196  
   197  	defer func() {
   198  		if err != nil {
   199  			f2.Close()
   200  			f1.Close()
   201  			os.Remove(tmpFile)
   202  			return
   203  		}
   204  		if err = f2.Close(); err != nil {
   205  			return
   206  		}
   207  		if err = f1.Close(); err != nil {
   208  			return
   209  		}
   210  		if outFile == "" || inFile == outFile {
   211  			err = os.Rename(tmpFile, inFile)
   212  		}
   213  	}()
   214  
   215  	return ResetPageMode(f1, f2, conf)
   216  }